-
Notifications
You must be signed in to change notification settings - Fork 0
Set up repository for better AI assistance #7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis update is a comprehensive refactor and documentation enhancement across the project. The majority of changes are stylistic, focusing on codebase consistency—primarily converting single quotes to double quotes, standardizing semicolon usage, and improving indentation and whitespace. Several new documentation files are added, including detailed project structure, development guidelines, testing strategies, and a TODO list. The Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant CLI
participant TerminalServer
participant DockerContainer
User->>CLI: Initiate Web CLI Session
CLI->>TerminalServer: Open WebSocket Connection
TerminalServer->>CLI: Request Authentication
CLI->>TerminalServer: Send JWT Token
TerminalServer->>TerminalServer: Validate Token (JWT structure, expiration)
TerminalServer->>DockerContainer: Create & Start Container
TerminalServer->>DockerContainer: Exec Restricted Shell
TerminalServer->>CLI: Forward stdout (demuxed) via WebSocket
CLI->>TerminalServer: Send input/data or resize events
TerminalServer->>DockerContainer: Forward input/data or resize PTY
TerminalServer-->>CLI: On session end, send termination message
TerminalServer->>DockerContainer: Stop and cleanup container
TerminalServer->>CLI: Close WebSocket
Poem
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
🧹 Nitpick comments (17)
docs/Project-Structure.md (2)
75-77: Nitpick: ASCII tree formatting consistency
In the.cursor/rules/subsection, two entries use└──instead of using├──for all but the last item. Adjust to:- │ ├── project.mdc - │ └── ably.mdc - │ └── development.mdc + │ ├── project.mdc + │ ├── ably.mdc + │ └── development.mdc🧰 Tools
🪛 LanguageTool
[style] ~76-~76: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...└── ably.mdc # Rules specific to Ably concepts and APIs. │ └── developm...(ADVERB_REPETITION_PREMIUM)
88-88: Nitpick: Clarify “installs” terminology
Consider replacing “deterministic installs” with “deterministic installations” to avoid confusion between verb and noun usage.🧰 Tools
🪛 LanguageTool
[grammar] ~88-~88: The word ‘installs’ is not a noun.
Context: ... # pnpm lock file for deterministic installs. ├── pnpm-workspace.yaml # Defines ...(A_INSTALL)
LICENSE (1)
1-4: Nitpick: Add copyright notice
It’s customary to prepend the license text with:Copyright © 2024 Ablyto clearly state the copyright owner and year.
src/commands/auth/keys/list.ts (1)
58-67: Use Optional Chaining for String Check
Refactor suggestion: replacecurrentKeyId && currentKeyId.includes(".")withcurrentKeyId?.includes(".")for clarity.🧰 Tools
🪛 Biome (1.9.4)
[error] 63-63: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/auth/revoke-token.ts (1)
144-144: Consider using optional chaining.The conditional check for error message inclusion could be simplified using optional chaining.
- if (error.message && error.message.includes("token_not_found")) { + if (error.message?.includes("token_not_found")) {🧰 Tools
🪛 Biome (1.9.4)
[error] 144-144: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/auth/keys/switch.ts (1)
42-42: Consider using optional chaining for better defensive programming.The current code properly checks for existence before accessing
.includes()but optional chaining would make it more concise and future-proof.-if (args.keyNameOrValue && args.keyNameOrValue.includes(".")) { +if (args.keyNameOrValue?.includes(".")) {🧰 Tools
🪛 Biome (1.9.4)
[error] 42-42: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/bench/publisher.ts (1)
886-887: Use optional chaining for cleaner null checking.Replace the explicit
tracker && tracker.publishTimecheck with optional chaining for more concise code.-if (tracker && tracker.publishTime) { +if (tracker?.publishTime) {🧰 Tools
🪛 Biome (1.9.4)
[error] 886-887: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/channels/batch-publish.ts (1)
234-235: Consider avoiding the delete operator for better performance.The
deleteoperator can impact performance, especially with objects that have many properties. Consider using an undefined assignment instead.-delete messageData.name; +messageData.name = undefined;🧰 Tools
🪛 Biome (1.9.4)
[error] 234-234: Avoid the delete operator which can impact performance.
Unsafe fix: Use an undefined assignment instead.
(lint/performance/noDelete)
docs/TODO.md (2)
8-10: Improve punctuation for clarity in TODO documentation.
Add missing commas in compound sentences and before “i.e.” for consistency:
- Insert a comma before “and” when joining independent clauses.
- Place a comma before “i.e.” and consider commas around the example phrase.
🧰 Tools
🪛 LanguageTool
[uncategorized] ~8-~8: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...lity is not available to anonymous users and they should sign up / login. - [ ] Conn...(COMMA_COMPOUND_SENTENCE)
[typographical] ~10-~10: Consider putting a comma before the abbreviation “i.e.”.
Context: ...ace, and should tell the user to reauth appropriately i.e. usingably loginfor access tokens, o...(IE_COMMA)
29-29: Strengthen tone by removing hedge phrasing.
Replace “sort of broken” with “broken” to make the statement more direct and professional.🧰 Tools
🪛 LanguageTool
[style] ~29-~29: To make your writing sound more confident, consider removing the phrase ‘sort of’.
Context: ...ce to show it. As such, the terminal is sort of broken once full as the bottom line is always ...(SORT_OF_NP)
[uncategorized] ~29-~29: If this is a question, use a question mark.
Context: ...ys visible at the bottom of the terminal. ## Security - [ ] The Docker web term...(QUESTION_MARK)
docs/Testing.md (3)
22-22: Add missing preposition in documentation.
Change “Secret credetials to be stored GitHub Actions” to “Secret credentials to be stored in GitHub Actions (e.g., via repository secrets).”
78-78: Hyphenate compound adjectives for consistency.
Replace “human readable” with “human-readable” to match style, e.g., “Local CLI human-readable (primary use case…).”🧰 Tools
🪛 LanguageTool
[misspelling] ~78-~78: This word is normally spelled with a hyphen.
Context: ... for the following modes: - Local CLI human readable - primary use case for the CLI is users...(EN_COMPOUNDS_HUMAN_READABLE)
[misspelling] ~78-~78: This word is normally spelled with a hyphen.
Context: ...executing the CLI locally and expecting human readable responses - Local JSON mode (--json...(EN_COMPOUNDS_HUMAN_READABLE)
81-82: Hyphenate “end-to-end” in testing context.
Use “end-to-end tests” instead of “end to end tests” for clarity and to follow common practice.🧰 Tools
🪛 LanguageTool
[uncategorized] ~81-~81: Possible missing comma found.
Context: ...olour coded. - Web CLI mode - in this mode the CLI is invoked from a Docker contai...(AI_HYDRA_LEO_MISSING_COMMA)
[grammar] ~81-~81: Did you mean the adjective “end-to-end” (spelled with hyphens)?
Context: ...ands. In addition, we should have a few end to end tests that execute commands directly to...(END_TO_END_HYPHEN)
[uncategorized] ~82-~82: Possible missing comma found.
Context: ...r. - For tests that subscribe or run on indefinitely waiting for events, the test suite will...(AI_HYDRA_LEO_MISSING_COMMA)
packages/react-web-cli/src/AblyCliTerminal.tsx (2)
148-162: Browser‑safe timeout type
NodeJS.Timeoutis only available when the Node typings are in scope; in browser‑only builds (e.g. Vite) this produces aCannot find name 'NodeJS'error.
Prefer the cross‑platform utility type:- let timeout: NodeJS.Timeout | null = null; + let timeout: ReturnType<typeof setTimeout> | null = null;Apply the same replacement for every
NodeJS.Timeoutin this component.
500-508: Effect dependency uses an expression, not the source variableThe dependency array contains
sessionState === "inactive".
React treats this as a boolean value; it will only trigger when that boolean toggles, but it hides the real dependency (sessionState) from linters and future readers.- ], [ - ablyApiKey, - ablyAccessToken, - websocketUrl, - sessionState === "inactive", + ], [ + ablyApiKey, + ablyAccessToken, + websocketUrl, + sessionState, // let the expression run inside the hook bodyThis keeps ESLint/React‑Hook rules happy and avoids surprises if more states are added later.
scripts/terminal-server.ts (1)
597-606: Optional chain for safer resizeStatic‑analysis hint:
currentSession && currentSession.execInstancecan be shortened:-currentSession && currentSession.execInstance +currentSession?.execInstanceUse the same pattern for the follow‑up call to avoid accidental
undefinedchecks peppered throughout the file.🧰 Tools
🪛 Biome (1.9.4)
[error] 597-597: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
docs/Product-Requirements.md (1)
214-216: Minor grammar – missing article“We need ensure we treat the Ably config file as sensitive”
Insert “to” after “need”:
- - We need ensure we treat the Ably config file as sensitive … + - We need to ensure we treat the Ably config file as sensitive …(Similar small typos are flagged by LanguageTool around lines 216, 220, 278, etc.)
🧰 Tools
🪛 LanguageTool
[uncategorized] ~214-~214: Possible missing preposition found.
Context: ...g the path~/.ably/config- We need ensure we treat the Ably config file as sensit...(AI_HYDRA_LEO_MISSING_TO)
[uncategorized] ~216-~216: Possible missing comma found.
Context: ...TOML format will be used for the config file as this is human readable and easy to u...(AI_HYDRA_LEO_MISSING_COMMA)
[misspelling] ~216-~216: This word is normally spelled with a hyphen.
Context: ... be used for the config file as this is human readable and easy to use. - The configuration fi...(EN_COMPOUNDS_HUMAN_READABLE)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
examples/web-cli/pnpm-lock.yamlis excluded by!**/pnpm-lock.yamlpackages/react-web-cli/pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (82)
.cursor/rules/ably.mdc(1 hunks).cursor/rules/development.mdc(1 hunks).cursor/rules/project.mdc(1 hunks).cursor/rules/typescript-cli.mdc(0 hunks).editorconfig(1 hunks).github/workflows/test.yml(2 hunks).mocharc.json(1 hunks).npmignore(1 hunks).prettierrc.json(1 hunks)CHANGELOG.md(1 hunks)LICENSE(1 hunks)README.md(3 hunks)bin/development.js(1 hunks)bin/run.js(1 hunks)docs/Product-Requirements.md(11 hunks)docs/Project-Structure.md(1 hunks)docs/TODO.md(1 hunks)docs/Testing.md(1 hunks)eslint.config.js(2 hunks)examples/web-cli/README.md(1 hunks)examples/web-cli/eslint.config.js(1 hunks)examples/web-cli/src/App.tsx(5 hunks)examples/web-cli/src/main.tsx(1 hunks)examples/web-cli/vite.config.ts(1 hunks)notes.md(0 hunks)packages/react-web-cli/README.md(3 hunks)packages/react-web-cli/src/AblyCliTerminal.tsx(9 hunks)packages/react-web-cli/src/index.ts(1 hunks)packages/react-web-cli/tsconfig.json(1 hunks)scripts/terminal-server.ts(2 hunks)scripts/terminal-test-client.ts(1 hunks)src/base-command.ts(12 hunks)src/chat-base-command.ts(1 hunks)src/commands/accounts/current.ts(1 hunks)src/commands/accounts/index.ts(2 hunks)src/commands/accounts/list.ts(1 hunks)src/commands/accounts/login.ts(1 hunks)src/commands/accounts/logout.ts(1 hunks)src/commands/accounts/stats/README.md(2 hunks)src/commands/accounts/stats/index.ts(1 hunks)src/commands/accounts/switch.ts(1 hunks)src/commands/apps/channel-rules/create.ts(1 hunks)src/commands/apps/channel-rules/delete.ts(1 hunks)src/commands/apps/channel-rules/index.ts(1 hunks)src/commands/apps/channel-rules/list.ts(2 hunks)src/commands/apps/channel-rules/update.ts(1 hunks)src/commands/apps/create.ts(1 hunks)src/commands/apps/current.ts(1 hunks)src/commands/apps/delete.ts(3 hunks)src/commands/apps/index.ts(1 hunks)src/commands/apps/list.ts(1 hunks)src/commands/apps/logs/history.ts(1 hunks)src/commands/apps/logs/index.ts(1 hunks)src/commands/apps/logs/subscribe.ts(1 hunks)src/commands/apps/set-apns-p12.ts(1 hunks)src/commands/apps/stats/index.ts(1 hunks)src/commands/apps/switch.ts(1 hunks)src/commands/apps/update.ts(1 hunks)src/commands/auth/index.ts(1 hunks)src/commands/auth/issue-ably-token.ts(1 hunks)src/commands/auth/issue-jwt-token.ts(1 hunks)src/commands/auth/keys/create.ts(2 hunks)src/commands/auth/keys/current.ts(1 hunks)src/commands/auth/keys/get.ts(1 hunks)src/commands/auth/keys/index.ts(1 hunks)src/commands/auth/keys/list.ts(1 hunks)src/commands/auth/keys/revoke.ts(1 hunks)src/commands/auth/keys/switch.ts(1 hunks)src/commands/auth/keys/update.ts(1 hunks)src/commands/auth/revoke-token.ts(1 hunks)src/commands/bench/index.ts(1 hunks)src/commands/bench/publisher.ts(7 hunks)src/commands/bench/subscriber.ts(5 hunks)src/commands/channel-rule/create.ts(1 hunks)src/commands/channel-rule/delete.ts(1 hunks)src/commands/channel-rule/index.ts(1 hunks)src/commands/channel-rule/list.ts(1 hunks)src/commands/channel-rule/update.ts(1 hunks)src/commands/channels/batch-publish.ts(3 hunks)src/commands/channels/history.ts(1 hunks)src/commands/channels/index.ts(1 hunks)src/commands/channels/list.ts(2 hunks)
💤 Files with no reviewable changes (2)
- .cursor/rules/typescript-cli.mdc
- notes.md
🧰 Additional context used
🧬 Code Graph Analysis (3)
src/chat-base-command.ts (1)
src/types/cli.ts (1)
BaseFlags(7-24)
src/commands/apps/channel-rules/list.ts (2)
src/services/control-api.ts (1)
Namespace(45-62)test/hooks/command_not_found/did-you-mean.test.ts (2)
error(109-122)error(207-219)
src/commands/accounts/current.ts (2)
src/services/control-api.ts (1)
ControlApi(163-561)test/hooks/command_not_found/did-you-mean.test.ts (2)
error(109-122)error(207-219)
🪛 Biome (1.9.4)
src/commands/auth/keys/list.ts
[error] 63-63: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/bench/publisher.ts
[error] 886-887: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/auth/revoke-token.ts
[error] 144-144: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/auth/keys/switch.ts
[error] 42-42: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/commands/channels/batch-publish.ts
[error] 234-234: Avoid the delete operator which can impact performance.
Unsafe fix: Use an undefined assignment instead.
(lint/performance/noDelete)
scripts/terminal-server.ts
[error] 597-597: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
[error] 620-621: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
🪛 LanguageTool
examples/web-cli/README.md
[misspelling] ~63-~63: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ... into your web application. It provides an Xterm.js-based terminal interface that ...
(EN_A_VS_AN)
src/commands/accounts/stats/README.md
[uncategorized] ~77-~77: Possible missing comma found.
Context: ... available Peak rates are reported per second and values between 0 and 1 are displaye...
(AI_HYDRA_LEO_MISSING_COMMA)
CHANGELOG.md
[uncategorized] ~107-~107: Loose punctuation mark.
Context: ...with the AI agent. - ably help contact, ably help support, ably help status...
(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~145-~145: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ...rs, locks). ### Changed - Upgraded ably-js` dependency. ### Fixed - Graceful han...
(HYPHENATED_LY_ADVERB_ADJECTIVE)
[uncategorized] ~156-~156: Loose punctuation mark.
Context: ...blishcommand. -ably rooms occupancy, presence, and reactions` commands. -...
(UNLIKELY_OPENING_PUNCTUATION)
[style] ~167-~167: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...iases (e.g., ably app list works like ably apps list). - Improved live stats UI f...
(ADVERB_REPETITION_PREMIUM)
[uncategorized] ~183-~183: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ...arning about installation issues due to ably-js typing problems (at the time). ## [0....
(HYPHENATED_LY_ADVERB_ADJECTIVE)
docs/TODO.md
[uncategorized] ~8-~8: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...lity is not available to anonymous users and they should sign up / login. - [ ] Conn...
(COMMA_COMPOUND_SENTENCE)
[typographical] ~10-~10: Consider putting a comma before the abbreviation “i.e.”.
Context: ...ace, and should tell the user to reauth appropriately i.e. using ably login for access tokens, o...
(IE_COMMA)
[style] ~29-~29: To make your writing sound more confident, consider removing the phrase ‘sort of’.
Context: ...ce to show it. As such, the terminal is sort of broken once full as the bottom line is always ...
(SORT_OF_NP)
[uncategorized] ~29-~29: If this is a question, use a question mark.
Context: ...ys visible at the bottom of the terminal. ## Security - [ ] The Docker web term...
(QUESTION_MARK)
docs/Project-Structure.md
[style] ~76-~76: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...└── ably.mdc # Rules specific to Ably concepts and APIs. │ └── developm...
(ADVERB_REPETITION_PREMIUM)
[grammar] ~88-~88: The word ‘installs’ is not a noun.
Context: ... # pnpm lock file for deterministic installs. ├── pnpm-workspace.yaml # Defines ...
(A_INSTALL)
docs/Product-Requirements.md
[uncategorized] ~214-~214: Possible missing preposition found.
Context: ...g the path ~/.ably/config - We need ensure we treat the Ably config file as sensit...
(AI_HYDRA_LEO_MISSING_TO)
[uncategorized] ~216-~216: Possible missing comma found.
Context: ...TOML format will be used for the config file as this is human readable and easy to u...
(AI_HYDRA_LEO_MISSING_COMMA)
[misspelling] ~216-~216: This word is normally spelled with a hyphen.
Context: ... be used for the config file as this is human readable and easy to use. - The configuration fi...
(EN_COMPOUNDS_HUMAN_READABLE)
[grammar] ~220-~220: A verb may be missing. Did you mean “we have” or “we do”?
Context: ...en is scoped to only one account, so if we a user has access to multiple accounts,...
(IF_YOU_ANY)
[grammar] ~278-~278: Possible typo. Did you mean “the” or “me”?
Context: ...he current account information by using the me control API request, but needs to assum...
(DT_PRP)
[uncategorized] ~282-~282: Did you just mean “,” or “.”?
Context: ...e control API to get the app information,. - ably auth keys switch -> should tel...
(COMMA_PERIOD)
[grammar] ~396-~396: ‘follow up’ seems to be a compound adjective before a noun. Use a hyphen: “follow-up”.
Context: ... Suggest to the user that they can do a follow up question with syntax `ably help ask --c...
(CA_FOLLOW_UP)
[grammar] ~417-~417: The word ‘install’ is not a noun.
Context: .../getting-started/quickstart#step-2) Or install via NPM: npm install ably [(1...
(A_INSTALL)
[misspelling] ~425-~425: Did you mean “too”?
Context: ...-started/quickstart#step-2) 3. Connect to Ably: ```javascript const ably = new A...
(TO_TOO)
docs/Testing.md
[uncategorized] ~42-~42: Possible missing preposition found.
Context: ...ens. - Secret credetials to be stored GitHub Actions (e.g., via repository secrets)....
(AI_HYDRA_LEO_MISSING_IN)
[style] ~72-~72: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...s, but generally mocking out network. - test/e2e has real environment-dependent test...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[style] ~72-~72: This wording could be more concise.
Context: ...l environment-dependent tests, possibly fewer in number, but ensuring real interactions. ## Te...
(ADJECTIVE_IN_ATTRIBUTE)
[misspelling] ~78-~78: This word is normally spelled with a hyphen.
Context: ... for the following modes: - Local CLI human readable - primary use case for the CLI is users...
(EN_COMPOUNDS_HUMAN_READABLE)
[misspelling] ~78-~78: This word is normally spelled with a hyphen.
Context: ...executing the CLI locally and expecting human readable responses - Local JSON mode (--json...
(EN_COMPOUNDS_HUMAN_READABLE)
[uncategorized] ~81-~81: Possible missing comma found.
Context: ...olour coded. - Web CLI mode - in this mode the CLI is invoked from a Docker contai...
(AI_HYDRA_LEO_MISSING_COMMA)
[grammar] ~81-~81: Did you mean the adjective “end-to-end” (spelled with hyphens)?
Context: ...ands. In addition, we should have a few end to end tests that execute commands directly to...
(END_TO_END_HYPHEN)
[uncategorized] ~82-~82: Possible missing comma found.
Context: ...r. - For tests that subscribe or run on indefinitely waiting for events, the test suite will...
(AI_HYDRA_LEO_MISSING_COMMA)
[style] ~83-~83: Consider using “impractical” to avoid wordiness.
Context: ...re Realtime Ably clients are used, it's not practical to stub the network requests as the und...
(NOT_ABLE_PREMIUM)
[uncategorized] ~83-~83: Possible missing comma found.
Context: ...as the underlying websocket protocol is complicated which would result in this test suite b...
(AI_HYDRA_LEO_MISSING_COMMA)
[grammar] ~84-~84: Did you mean the adjective “end-to-end” (spelled with hyphens)?
Context: ...K interfaces themselves instead. - Some end to end tests will exist that concurrent perfor...
(END_TO_END_HYPHEN)
[grammar] ~84-~84: The verb ‘perform’ is plural. Did you mean: “performs”? Did you use a verb instead of a noun?
Context: ...to end tests will exist that concurrent perform actions like publishing and subscribing...
(PLURAL_VERB_AFTER_THIS)
🪛 markdownlint-cli2 (0.17.2)
examples/web-cli/README.md
58-58: Spaces inside code span elements
null
(MD038, no-space-in-code)
docs/Product-Requirements.md
46-46: Spaces inside code span elements
null
(MD038, no-space-in-code)
419-419: Fenced code blocks should have a language specified
null
(MD040, fenced-code-language)
470-470: Fenced code blocks should have a language specified
null
(MD040, fenced-code-language)
🔇 Additional comments (248)
.prettierrc.json (1)
4-4: Ensure consistent file ending
A newline was added at the end of.prettierrc.jsonto align with project-wide formatting conventions.packages/react-web-cli/tsconfig.json (1)
18-18: Maintain consistent file ending
Added a newline at the end and removed a trailing space to keep JSON files clean and consistent.src/commands/accounts/stats/README.md (2)
24-24: Improve readability with blank lines
Blank lines were inserted before each code block in the Examples section to enhance visual separation and consistency across documentation.Also applies to: 30-30, 36-36, 42-42, 48-48, 54-54, 60-60
77-77: Remove trailing space at end of file
Trailing whitespace was removed for cleanliness and to prevent formatting diffs.🧰 Tools
🪛 LanguageTool
[uncategorized] ~77-~77: Possible missing comma found.
Context: ... available Peak rates are reported per second and values between 0 and 1 are displaye...(AI_HYDRA_LEO_MISSING_COMMA)
bin/development.js (2)
1-1: Standardize import formatting
Converted quotes to double quotes and added a semicolon to align with the project's style guidelines.
3-3: Standardize function call formatting
Reformatted theexecutecall with consistent spacing and a semicolon for style uniformity..npmignore (2)
19-19: Include.cursordirectory in package
Replaced individual docs excludes with a single.cursorentry to ensure new rule documents are published.
23-23: Fix.env*ignore pattern
Removed the trailing space from the.env*pattern to correctly ignore environment files.src/chat-base-command.ts (6)
1-4: Consistent import formatting and semicolon usage applied
The updated import statements now use double quotes and include semicolons, aligning perfectly with the project's style rules.
10-12: Refactored method signature for readability
ThecreateChatClientmethod signature has been reformatted to a clean, multi-line style with a trailing comma, improving clarity and matching other command implementations.
14-14: Ensured semicolon after async call
Adding a semicolon afterawait this.createAblyClient(flags)keeps statement termination consistent across the codebase.
17-17: Return statement semicolon
Thereturn null;statement now includes a semicolon, adhering to the established coding conventions.
21-21: Return ChatClient with semicolon
Thereturn new ChatClient(realtimeClient);line now has a semicolon, ensuring uniform statement endings.
23-23: Trivial closing brace change; no action needed..editorconfig (1)
1-12: Add EditorConfig for consistent code style
The new.editorconfigdefines project-wide formatting rules (LF line endings, 2-space indentation, UTF‑8 encoding, trimming trailing whitespace), complementing ESLint and Prettier settings to enforce uniform styling across all editors.examples/web-cli/README.md (4)
11-15: Standardize feature list formatting
Feature bullet points were converted to hyphens with consistent indentation, aligning with the project’s Markdown conventions and improving readability.
19-22: Uniform prerequisites list style
Prerequisite items now use hyphens and consistent indentation, matching the formatting conventions used elsewhere in the documentation.
28-29: Refine setup instructions formatting
Setup steps for the.envfile have been reformatted with hyphens and proper indentation, clarifying the instructions.
35-35: Italic syntax consistency
Switched from asterisks to underscores for italicized text in the alternative instructions, ensuring uniform Markdown styling.bin/run.js (2)
3-3: Apply consistent import style
Updated the import to use double quotes and added spaces inside braces, conforming to the project's stylistic standards.
5-5: Formatexecuteinvocation
Added spaces around the object literal argument and ensured a semicolon is present, enhancing readability..cursor/rules/ably.mdc (2)
8-8: Update documentation reference to official site
Clarified that Ably docs should be consulted online at https://ably.com/docs, removing outdated file-based references for better guidance.
16-16: Clarify Control API SDK guidance
Explicitly stating that raw HTTP requests are used for the Control API due to the lack of an official SDK helps avoid confusion..github/workflows/test.yml (4)
6-6: Approve: Consistent quoting for branch filters
The change from single to double quotes inbranches: ["**"]aligns with the repository’s YAML style guidelines and has no impact on workflow behavior.
9-9: Approve: Consistent quoting for PR branch filters
Updatingbranches: ["**"]underpull_requestmirrors the push trigger change for consistency. No semantic change.
27-28: Approve: Standardize Node.js setup inputs
Quoting thenode-versionandcachevalues is purely stylistic and matches the rest of the CI configurations.
34-34: Approve: Clean up test command line
The removal of trailing whitespace inrun: pnpm testimproves readability and consistency.docs/Project-Structure.md (1)
1-91: Approve: New project structure documentation
This file provides a clear, hierarchical overview of the Ably CLI repo layout. It will serve as a valuable reference for new contributors and aligns with the new project rules.🧰 Tools
🪛 LanguageTool
[style] ~76-~76: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...└── ably.mdc # Rules specific to Ably concepts and APIs. │ └── developm...(ADVERB_REPETITION_PREMIUM)
[grammar] ~88-~88: The word ‘installs’ is not a noun.
Context: ... # pnpm lock file for deterministic installs. ├── pnpm-workspace.yaml # Defines ...(A_INSTALL)
CHANGELOG.md (1)
1-221: Approve: Comprehensive changelog update
The CHANGELOG follows the Keep a Changelog format and semantic versioning correctly. Entries are well organized and clearly describe added features, fixes, and changes per version.🧰 Tools
🪛 LanguageTool
[uncategorized] ~107-~107: Loose punctuation mark.
Context: ...with the AI agent. -ably help contact,ably help support,ably help status...(UNLIKELY_OPENING_PUNCTUATION)
[uncategorized] ~145-~145: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ...rs,locks). ### Changed - Upgradedably-js` dependency. ### Fixed - Graceful han...(HYPHENATED_LY_ADVERB_ADJECTIVE)
[uncategorized] ~156-~156: Loose punctuation mark.
Context: ...blishcommand. -ably rooms occupancy,presence, andreactions` commands. -...(UNLIKELY_OPENING_PUNCTUATION)
[style] ~167-~167: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...iases (e.g.,ably app listworks likeably apps list). - Improved live stats UI f...(ADVERB_REPETITION_PREMIUM)
[uncategorized] ~183-~183: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ...arning about installation issues due toably-jstyping problems (at the time). ## [0....(HYPHENATED_LY_ADVERB_ADJECTIVE)
LICENSE (1)
1-177: Approve: Adding Apache 2.0 license text
Including the full Apache License 2.0 terms establishes clear usage and contribution guidelines for the project.packages/react-web-cli/src/index.ts (1)
1-1: Approve: String literal quoting standardized
Switching to double quotes for the export path and ensuring a trailing newline aligns with the project’s style rules.examples/web-cli/src/main.tsx (3)
1-2: Stylistic: Consistent quoting in imports
Import statements have been standardized to use double quotes and semicolons for consistency with project style guidelines. No functional change.
4-5: Stylistic: Asset import formatting
CSS import updated to double quotes and semicolon usage. Behavior remains the same; aligns with broader formatting rules.
7-7: Stylistic: Condensed render invocation
ThecreateRoot(...).render(<App />);call is now on a single line with consistent quoting. No logic or interface changes.src/commands/channel-rule/index.ts (4)
1-3: Stylistic: Double quotes in imports
Replaced single quotes with double quotes in import paths and added semicolons. No impact on functionality.
6-9: Stylistic: Static property formatting
Standardized quoting inargs,description,flags, andhiddenstatic overrides with semicolons. Behavior unchanged.
12-13: Stylistic: Alias flag property
static isAlias = true;remains functionally identical; formatting updated for consistency.
16-17: Stylistic: Run method formatting
The forwarding call toChannelRules.runnow follows the project's semicolon and quoting conventions. No change in execution flow.src/commands/channel-rule/delete.ts (5)
1-3: Stylistic: Uniform import quoting
Imports now use double quotes and terminate with semicolons. This adheres to the updated linting rules without altering behavior.
6-9: Stylistic: Static override consistency
args,description,flags, andhiddenstatic properties have been reformatted with double quotes and semicolons. No logic change.
12-13: Stylistic: Alias marker formatting
static isAlias = true;is unchanged in effect; formatting adjusted for style uniformity.
16-17: Stylistic: Method invocation formatting
Forwarding call to the delete command is formatted with semicolons and double quotes. Functionality remains the same.
19-20: Stylistic: Closing brace and newline
Trailing newline and brace formatting updated to conform to editorconfig settings. No effect on parsing.src/commands/channel-rule/update.ts (5)
1-3: Stylistic: Import statement formatting
Double quotes applied and semicolons added to imports. No change to module resolution or functionality.
6-9: Stylistic: Static property updates
args,description,flags, andhiddenstatic overrides now follow the project's quoting and semicolon conventions. Behavior unchanged.
12-13: Stylistic: Alias indicator formatting
static isAlias = true;formatting aligned with style guide; logic unaffected.
16-17: Stylistic: Run logic formatting
Forwarding invocation to the update command is reformatted for consistency; no functional change.
19-20: Stylistic: File termination formatting
Adjusted closing brace and ensured trailing newline per editorconfig. No behavior impact..mocharc.json (1)
2-11: Stylistic: JSON formatting and array condensing
Configuration values remain unchanged. Reformattedrequire,watch-extensions, andnode-optionarrays onto single lines and adjusted brace placement to match project-wide style.examples/web-cli/vite.config.ts (3)
1-3: Consistent import quoting
Imports have been updated to use double quotes, aligning with the repository’s ESLint/Prettier rules.
7-7: Normalize plugin array format
Thepluginsarray is now on a single line with a trailing comma, matching the project’s formatting conventions.
10-12: Enforce trailing commas and semicolons
Theserverblock and closing brace include trailing commas and a semicolon to satisfy style guidelines.src/commands/channel-rule/list.ts (3)
1-3: Standardize import statements
Imports now use double quotes and include semicolons per the updated code style rules.
6-9: Align static properties formatting
Theargs,description,flags, andhiddenproperties are consistently quoted and terminated with semicolons.
16-17: Uniform command instantiation syntax
Instantiation and invocation ofChannelRulesListare now formatted with consistent quoting and semicolons.src/commands/channel-rule/create.ts (3)
1-3: Standardize import statements
Imports updated to double quotes with semicolons, matching the repository-wide style.
6-9: Align static properties formatting
Theargs,description,flags, andhiddenproperties now follow the standardized quoting and semicolon usage.
16-17: Uniform command instantiation syntax
Creating and runningChannelRulesCreateuses the consistent style for semicolons and quotes.src/commands/apps/logs/index.ts (3)
1-4: Update import and description quoting
The import and classdescriptionnow use double quotes and include semicolons per style guidelines.
7-10: Standardize examples array formatting
Example strings now uniformly use double quotes and the array has a trailing comma.
13-22: Consistent logging formatting
Allthis.logcalls have been reformatted to use double-quoted strings, semicolons, and proper indentation.src/commands/apps/channel-rules/index.ts (3)
1-4: Standardize import and description
Import path andstatic descriptionare updated to double quotes with semicolons, aligning with the style guide.
7-11: Normalize examples array
Example entries consistently use double-quoted strings and the array ends with a trailing comma.
14-19: Harmonize run-time logging
Allthis.logcalls withinrun()now follow the double-quote and semicolon conventions with uniform indentation.Also applies to: 21-21, 23-23
src/commands/apps/delete.ts (4)
1-5: Styling: Normalize import formatting and quoting
The imports have been updated to use double quotes consistently and align with the project’s ESLint/Prettier rules. No functional impact.
8-33: Styling: Standardize static property formatting
Thestatic args,description,examples, andflagsproperties were reformatted with consistent double quotes, trailing commas, and indentation per the new style guide.
35-161: Styling: Reformatrun()method for readability
The method signature, parsing logic, error‐handling branches, logging, and prompting blocks have been reformatted (quotes, semicolons, blank lines) without any change to behavior.
183-212: Styling: Normalize helper methods formatting
ThepromptForAppNameandpromptForConfirmationhelper methods now use consistent quoting, semicolons, and indentation. Functionality remains identical.src/commands/apps/set-apns-p12.ts (3)
1-4: Styling: Normalize import formatting
Imports have been converted to double quotes and cleaned up for consistent module paths. No logic changes.
7-38: Styling: Standardize class metadata
Thestatic args,description,examples, andflagsblocks were reformatted with trailing commas, semicolons, and consistent indentation per the repository’s style rules.
40-84: Styling: Reformatrun()method
All logging statements, file existence checks, base64 encoding, API invocation, and output formatting have been reformatted for readability and consistency. No functional changes introduced.examples/web-cli/eslint.config.js (2)
1-5: Styling: Standardize ESLint config imports
Converted all import statements to use double quotes and added semicolons, aligning with the new linting conventions.
7-40: Styling: Update ESLint configuration structure
Thetseslint.configcall (ignores, overrides, plugins, rules) has been reformatted with consistent quoting, trailing commas, and indentation. No behavioral changes in linting.src/commands/apps/index.ts (2)
1-5: Styling: Normalize imports and description
The import andstatic descriptionhave been reformatted to use double quotes and adhere to the project’s formatting rules.
6-41: Styling: Reformat examples andrun()output
Updated thestatic examplesarray and allthis.logcalls for consistent quoting, trailing commas, and indentation within therun()method. Functionality unchanged.src/commands/apps/logs/history.ts (3)
1-4: Styling: Normalize imports
Reformatted import declarations to use double quotes and consistent semicolons. No logic changes.
7-33: Styling: Standardize class metadata and flags
Thestatic override description,examples, andflagsobjects were reformatted with trailing commas, double quotes, and proper indentation following the style guide.
35-121: Styling: Reformatrun()method
The authentication logic, client initialization, history retrieval, and both JSON and non-JSON output branches have been reformatted for readability. No changes to behavior.scripts/terminal-test-client.ts (1)
1-78: Stylistic consistency across WebSocket test client
All changes in this script are purely formatting (consistent double‑quote usage, added semicolons, adjusted indentation/spacing) with no functional modifications. The client’s behavior and event handlers remain unchanged.src/commands/auth/keys/index.ts (1)
1-38: Formatting-only updates for auth keys command
This file’s changes—switching single quotes to double quotes, adding trailing commas and semicolons, and reflowing log strings—are purely stylistic. No logic or behavior was altered.src/commands/accounts/current.ts (1)
1-203: Styling refactor—no functional changes
All modifications in this command (double‑quoting literals, adding semicolons, consistent template‑string formatting) are for code style alignment. The control‑flow, error handling, and API calls remain intact.examples/web-cli/src/App.tsx (1)
1-87: Purely stylistic adjustments in App.tsx
Only quoting style, type‑annotation formatting, and JSX spacing were updated. No component logic, hooks, or rendering behavior has changed.README.md (5)
7-9: Ensure consistent note formatting
The note block now uses the Markdown[!NOTE]syntax with proper>quoting, aligning with the rest of the documentation style.
14-20: Standardize table of contents markers
The TOC items have been reformatted (marker and indentation) for better readability; no content changes.
47-49: Uniform warning block styling
The warning note uses[!WARNING]with correct quoting. This matches other warning blocks.
55-58: Additional note block styling
The second note block has been reformatted to follow the same style conventions.
63-1697: Approve commands list reformatting
The extensive commands list has been stylistically reformatted (spacing, indentation) with no changes to the actual command entries or their links.🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
192-192: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
219-219: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
254-254: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
289-289: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
332-332: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
373-373: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
427-427: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
467-467: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
498-498: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
521-521: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
573-573: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
617-617: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
640-640: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
695-695: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
733-733: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
768-768: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
813-813: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
848-848: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
869-869: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
912-912: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
946-946: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
988-988: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1051-1051: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1087-1087: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1130-1130: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1161-1161: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1213-1213: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1263-1263: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1290-1290: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1342-1342: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1380-1380: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1422-1422: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1460-1460: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1504-1504: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1544-1544: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1586-1586: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1627-1627: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1645-1645: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
1690-1690: Fenced code blocks should have a language specified
null(MD040, fenced-code-language)
src/commands/apps/channel-rules/list.ts (6)
1-5: Standardize imports and types
Imports now uniformly use double quotes and semicolons, matching the repository’s style guide.
26-33: Refine static examples formatting
Theexamplesarray has been reformatted for consistent indentation and string quoting; functionality remains unchanged.
35-37: Clean up flags declaration
The flags spread now has uniform spacing and a trailing comma, improving readability.
69-99: JSON output styling
The block that formats JSON output has been re-indented and rebased for clarity without altering its structure or output.
102-192: CLI table output styling
The tabular console output branch has been reflowed (indentation, blank lines) purely as a stylistic change.
195-207: Consistent error formatting
The catch block’s JSON error response now follows the same indentation and quoting conventions as the success branch.src/commands/apps/channel-rules/delete.ts (9)
1-6: Normalize imports and modules
Imports have been updated to double quotes and semicolon usage is now consistent.
9-23: Reformat args, examples, and description
Command metadata (args,examples, anddescription) has been restyled for indentation and quoting consistency.
25-37: Standardize flags declaration
Flags are now defined with uniform spacing and trailing commas, adhering to style guidelines.
39-52: Clean up app ID resolution block
The logic for resolvingappIdhas been re-indented and reformatted without any behavioral changes.
51-64: Handle missing app ID formatting
The JSON and error outputs for missingappIdare now uniformly indented and quoted.
72-95: Uniform namespace lookup handling
Lookup and “not found” logic retains its behavior; only style and spacing were adjusted.
97-192: Reformat deletion confirmation flow
The interactive prompt and associated logs have been re-indented and consistently quoted. No logic changes.
213-231: Standardize deletion error handling
The catch block and JSON error output now follow the project’s standard formatting conventions.
234-246: Format prompt helper
ThepromptForConfirmationhelper has been restyled (spacing, trailing commas) for readability.src/commands/bench/index.ts (3)
1-5: Standardize imports and description
Import statement and static description now use consistent double-quote and semicolon style.
6-8: Refine examples formatting
Removed inconsistent indentation in theexamplesarray and standardized quoting.
11-22: Clean up run method output
The output logs inrun()have been reflowed with uniform quoting, improving readability. No logic changes.src/commands/channels/list.ts (13)
1-6: Approve formatting consistency in imports
The import statements have been standardized to use double quotes and semicolons, matching the project’s ESLint and Prettier rules. No functional impact.
32-34: Approve standardized description formatting
The multiline description string now uses consistent double quotes and indentation, improving readability. Behavior unchanged.
36-42: Approve expanded examples formatting
Example usages have been reformatted with double quotes, semicolons, and trailing commas for consistency. No logic changes.
44-54: Approve flags block style updates
The flags definitions now uniformly use double quotes, trailing commas, and semicolons. This aligns with the new style guide without altering functionality.
56-63: Approve run method signature formatting
Therunmethod’s initial lines and client creation have been reformatted for consistent spacing and semicolon usage. No semantic changes.
65-73: Approve REST client instantiation and params formatting
Parameter object and REST client call formatting now follow multiline conventions with trailing commas. Functionality remains the same.
77-83: Approve HTTP request call formatting
Therest.requestcall has been refactored to a multiline style with trailing commas—purely stylistic.
85-88: Approve error handling formatting
The status code check and error invocation now use template literals with backticks and semicolons. Behavior unchanged.
90-108: Approve JSON output block formatting
JSON serialization logic has been reformatted into a consistent indentation and trailing-comma style. No impact on output.
110-118: Approve empty-result logging formatting
The conditional for empty channel lists now follows the project’s whitespace and semicolon conventions. Functionality intact.
119-148: Approve channel listing loop style changes
The loop over channels and occupancy logging have been reformatted with double quotes, template literals, and consistent indentation. No logic alterations.
152-157: Approve limit-reached message formatting
Trailing comma style and multilinechalk.yellowusage improve readability. Output behavior remains the same.
159-178: Approve catch/finally block formatting
Error handling in JSON and non-JSON branches, as well as thefinallycleanup, have been restyled. Semantics are unaffected.src/commands/apps/list.ts (10)
1-4: Approve import formatting
Imports now uniformly use double quotes and semicolons, aligning with the repository’s style guidelines. No changes in behavior.
5-7: Approve class description formatting
The static description line has been updated with double quotes and consistent line breaks. Purely stylistic.
8-12: Approve examples array formatting
Example entries now include trailing commas and double quotes in a multiline format. Functionality is unchanged.
14-16: Approve flags block style update
The flags object has been reformatted for consistent spacing and punctuation. No semantic alterations.
18-23: Approve run method invocation formatting
The initial parsing and control command invocation have been restyled with semicolons and template literal consistency. Behavior unaffected.
24-37: Approve JSON output mapping formatting
Mapping of apps with theisCurrentflag is now formatted in multiline with trailing commas. No functional changes.
40-43: Approve empty-apps case formatting
The conditional early return for zero apps retains its logic but is restyled to match the new guidelines.
45-56: Approve sorting logic style changes
The sort comparator and array spread now use multiline formatting and semicolons. Logic remains identical.
57-79: Approve apps listing loop formatting
The for-loop and individual field logs have been reformatted for consistent indentation, template literals, and semicolons. No behavior change.
80-83: Approve error message invocation formatting
Error message passed torunControlCommandhas been restyled. Functionally equivalent.src/commands/channels/history.ts (11)
1-7: Approve import statements formatting
All imports now use double quotes and semicolons, with blank-line separation adjusted for clarity. No effect on functionality.
9-26: Approve args, description, and examples formatting
Theargs,description, andexamplesblocks have been reformatted into a consistent multiline style. Behavioral semantics unchanged.
27-48: Approve flags block style standardization
Flag definitions now uniformly use double quotes, trailing commas, and semicolons. No changes to flag behaviors.
50-69: Approve run startup and client creation formatting
The parsing ofargs/flags, authentication checks, and REST client instantiation have been restyled without altering logic.
83-96: Approve historyParams construction styling
The history query parameters are now defined in a multiline object literal with trailing commas. Functionality maintained.
98-101: Approve history fetch call formatting
The call tochannel.historyand assignment tomessageshave been restyled for consistent punctuation. No semantic change.
103-105: Approve JSON output formatting
The JSON output path now uses a standardized one-linerthis.logcall with semicolons. Behavior is identical.
106-114: Approve empty-history case formatting
The early return for no messages follows the project’s whitespace and semicolon conventions. Function unchanged.
116-136: Approve messages listing loop formatting
The loop over messages, timestamp formatting, and conditional clientId block have been reformatted consistently. Logic remains correct.
138-143: Approve limit-reached warning formatting
The final warning message useschalk.yellowin a multiline style, matching the new formatting rules. No impact on functionality.
146-150: Approve error handling formatting
The catch block’sthis.errorcall now uses backticks and a template literal. Behavior is unchanged.packages/react-web-cli/README.md (3)
41-65: Approve example JSX snippet formatting
The example React component has been restyled to use double quotes in imports/JSX attributes and compact indentation in props. Improves consistency without altering meaning.
69-77: Approve props table formatting
The markdown props table now has aligned columns and consistent spacing. Enhances readability in documentation only.
109-112: Approve license line adjustment
Removed trailing space and ensured a final newline. This is purely a documentation cleanup.src/commands/auth/keys/revoke.ts (11)
1-4: Approve import formatting
Imports have been normalized to double quotes and semicolons, matching the repository style guide. No functional change.
6-21: Approve args, description, and examples styling
Theargs,description, andexamplesblocks have been reformatted with trailing commas and consistent quotes. Semantics remain the same.
23-34: Approve flags definitions formatting
Flag properties now uniformly use double quotes, semicolons, and trailing commas. Behavior unaffected.
36-43: Approve run startup and control API creation formatting
Initial parsing,createControlApi, and argument normalization have been restyled. No logic changes.
44-53: Approve keyName parsing block formatting
The logic splittingappIdandkeyIdis unchanged but now uses consistent indentation, semicolons, and double quotes.
54-72: Approve missing-app error handling formatting
The branch handling missingappIdnow consistently formats JSON and non-JSON error messages. No change in behavior.
75-110: Approve key details display formatting
User-facing logs for key details and capabilities are restyled into multiline template literals with trailing commas. Functionality unchanged.
112-119: Approve confirmation prompt formatting
The confirmation prompt flow and interactive logic have been reformatted for consistent semicolons and quotes. No semantic changes.
139-146: Approve revokeKey call and success output formatting
The actual revocation call and subsequent JSON or plain-text success messages are now styled with trailing commas and consistent quotes. Logic intact.
156-169: Approve post-revocation cleanup formatting
The check for the current key and possible removal from configuration uses consistent style. No behavior change.
171-188: Approve catch block error handling formatting
The catch block’s JSON and non-JSON error outputs use backticks, template literals, and semicolons. Behavior remains correct.src/commands/auth/index.ts (8)
1-1: Consistent Quotation in Import Statement
The import statement has been updated to use double quotes, aligning with project-wide style settings.
4-6: StandardizedescriptionFormatting
The multi-linedescriptionproperty now uses double quotes and a trailing semicolon, improving readability and consistency.
8-16: NormalizeexamplesArray Notation
Converted examples to double-quoted strings with trailing commas, matching ESLint and Prettier rules.
19-23: Refactor Logging Statements for Readability
Lines split and uniformly quoted for consistent CLI help output formatting.
26-28: Consistent Wrapping oflogCalls
Wrapped longlogentries into multi-line calls with trailing commas.
29-34: Uniform Indentation and Quotation for Extended Logs
Applied double quotes and split long messages to adhere to line length and style guidelines.
35-35: Apply Double Quotes and Semicolon
Ensured single-line logs use double quotes and end with a semicolon.
37-39: End-of-Help Instruction Formatting
Formatted the final help instruction with double quotes and a trailing comma for consistency.src/commands/accounts/stats/index.ts (17)
1-2: Standardize Import Quotation
Converted import paths and dependencies to double-quoted strings, aligning with project-wide style.
4-7: Consistent Module Imports
Applied double quotes and semicolons to all service and type imports for uniformity.
10-11: Description Property Styling
Reformatted thedescriptionassignment to use double quotes and a trailing semicolon.
13-21: NormalizeexamplesArray Formatting
Converted examples array entries to double-quoted strings with trailing commas and aligned indentation.
25-53: Consistent Flag Definitions Formatting
Applied double quotes, semicolons, trailing commas, and aligned indentation across all flag definitions.
55-57: Private Property Initialization Styling
Standardized initialization of private properties with trailing semicolons and consistent formatting.
63-67: Live Stats Interval Enforcement Formatting
Uniformly formatted the conditional warning and assignment for enforcing minute intervals.
71-74: Style Control Flow Initiation Calls
Applied consistent formatting toshowAuthInfoIfNeededandcreateControlApicalls.
77-83: AlignStatsDisplayConfiguration Object Styling
Standardized indentation, type assertions, and trailing commas in theStatsDisplayinstantiation.
85-88: Ternary Operator Formatting Consistency
Wrapped theawaitcall in parentheses and formatted the multi-line ternary to improve readability.
95-103: Format Date Computation and API Call Parameters
Reformatted date calculation and request object properties with consistent indentation and trailing comma.
109-112: Standardize Error Message Logging
Converted error logging to use template literals and consistent trailing comma formatting.
120-138: Consistent Styling inpollStats
Applied uniform indentation, trailing commas, and template literals across polling logic, including debug logs and error handling.
147-152: Format Live Stats Subscription Message
Standardized logging of subscription details with double quotes and trailing commas.
168-184: StylesetIntervalPolling Logic
Refactored polling boundaries, using multi-line formatting, arrow functions, and consistent type assertions.
191-198: Uniform Error Handling in Live Stats Setup
Converted error handling to template literals and ensured resource cleanup follows style guidelines.
207-233: Consistent Formatting inrunOneTimeStats
Aligned default date calculations, API call parameters, loop display formatting, and error handling with project style guidelines.src/commands/accounts/list.ts (10)
1-3: Standardize Import Statements
Converted all imports to use double quotes and semicolons, ensuring consistency with project conventions.
6-6: Description Property Styling
Updated thedescriptionto use double quotes and a trailing semicolon.
9-12: NormalizeexamplesArray Formatting
Refactored example entries to double-quoted strings with trailing commas and aligned indentation.
16-16: Flags Object Closure Styling
Ensured the flags object ends with a semicolon and consistent indentation.
18-19: FormatrunSignature and Parsing
Applied consistent formatting to therunmethod signature andthis.parsecall.
27-36: Style No-Accounts JSON Response
Aligned JSON response formatting, including object literals, trailing commas, and indentation.
39-42: Format No-Accounts CLI Message
Standardized quotation and indentation for the non-JSON error message block.
48-76: Format Accounts JSON Output Block
Refactored the mapping and JSON serialization block with uniform indentation and trailing commas.
79-79: Plain Listing Header Styling
Converted the header log to a template literal and ensured trailing newline formatting.
82-109: Consistent CLI Output in Listing Loop
Applied uniformchalkusage, template literals, and indentation throughout the account listing loop.src/commands/channels/index.ts (4)
1-1: Consistent Quotation in Import
Updated theCommandimport to use double quotes and a semicolon.
4-4: Description Property Formatting
Refactored thedescriptionassignment to double quotes with a trailing semicolon.
8-12: NormalizeexamplesArray Formatting
Converted example entries to double-quoted strings with trailing commas and aligned indentation.
15-49: UnifyrunMethod Output Formatting
Applied consistent double quotes, semicolons, trailing commas, and aligned indentation across allthis.loghelp messages.src/commands/auth/keys/list.ts (8)
1-5: Consistent Imports Formatting
Standardized import statements to use double quotes and semicolons, aligning with repository style guidelines.
7-14: Normalize Class Properties
Applied double quotes, trailing commas, and consistent indentation todescriptionandexamplesstatic properties.
16-23: StandardizeflagsDefinition
Refactored flag definitions with consistent formatting, including double-quoted descriptions and trailing commas.
25-34: Format Run Method Signature and Initial Logic
Ensuredrunsignature and initialparsecall use consistent quotation and indentation.
36-54: Style App ID Validation Error Handling
Uniform formatting of JSON and CLI error outputs, including template literals and trailing commas.
69-88: Format Keys Listing for JSON Output
Aligned object mapping, trailing commas, and indentation in the JSON serialization block.
90-133: Consistent CLI Output in Listing Loop
Standardized template literals,chalkusage, and indentation within the key listing loop.
135-152: Uniform Error Handling in Catch Block
Converted error responses to template literals and uniform formatting in JSON and CLI error paths.src/commands/auth/issue-jwt-token.ts (1)
1-161: Stylistic formatting changes approved. All modifications in this file are purely stylistic—converting single quotes to double quotes, adding semicolons, normalizing trailing commas, and whitespace/indentation adjustments—consistent with the newly introduced formatting rules. No logic, control flow, or error handling has been altered.src/commands/accounts/switch.ts (1)
1-202: Stylistic formatting changes approved. This file only received formatting updates (double-quote normalization, semicolons, trailing commas, whitespace tweaks). No behavioral or functional changes were made.src/commands/apps/stats/index.ts (1)
1-256: Stylistic formatting changes approved. The updates here are exclusively formatting—double-quote conversion, semicolons, consistent indentation, and reordered signal handlers for clarity. No application logic or API interactions were modified.src/commands/apps/switch.ts (1)
1-70: Stylistic formatting changes approved. All changes are non-functional formatting updates—string quoting, trailing commas, semicolons, and indentation—aligning with project style guidelines. Command behavior remains identical.src/commands/apps/create.ts (1)
1-98: Stylistic formatting changes approved. The file was updated only for style consistency (double quotes, semicolons, trailing commas, whitespace). No changes to logic, error handling, or API calls.src/commands/auth/keys/current.ts (1)
1-154: Style standardization looks great!The conversion from single to double quotes, addition of semicolons, and improved code formatting greatly enhances readability and consistency. These changes align with the project's goal of standardizing code style throughout the codebase.
src/commands/apps/current.ts (1)
1-218: Formatting improvements look good!The style standardization (double quotes, semicolons, consistent spacing) improves code readability and maintainability. These changes maintain consistent style with other files in the codebase.
src/commands/auth/revoke-token.ts (1)
1-246: Code style standardization is well implemented.The formatting changes (double quotes, semicolons, consistent indentation) match the style updates applied to other files, maintaining consistency across the codebase.
🧰 Tools
🪛 Biome (1.9.4)
[error] 144-144: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
.cursor/rules/project.mdc (1)
1-16: Great addition of project guidelines!This new file provides clear instructions for contributors and references essential documentation needed before making changes. The structured approach to documentation will make the repository more maintainable and easier to understand for both developers and AI assistants.
eslint.config.js (2)
1-148: ESLint configuration updates look good.The style standardization to double quotes throughout the configuration and the reorganization of imports improves consistency.
140-145: Good addition of MCP file override.The specific ESLint rule override for Model Context Protocol files is a thoughtful addition that will prevent false positives when working with these specialized files.
src/commands/auth/issue-ably-token.ts (1)
1-131: Stylistic consistency and formatting improvements approved
The updates converting to double quotes, adding semicolons, and normalizing whitespace across imports, static properties, and therunmethod align perfectly with the new project-wide style guidelines without altering existing behavior.src/commands/auth/keys/create.ts (1)
1-170: Formatting cleanup aligns with style rules
All changes—double‑quote normalization, semicolon additions, and improved indentation—adhere to the updated ESLint and Prettier configurations and keep the command logic intact.src/commands/apps/logs/subscribe.ts (1)
1-49: Consistent quoting and spacing applied correctly
The switch to double quotes and uniform trailing commas enhances readability and matches the repository’s new formatting standards, with no functional changes.src/commands/apps/update.ts (1)
1-136: Style standardization approved
The refactored object literals, string quoting, and multiline formatting conform to the established style guidelines and preserve the original command behavior.src/commands/accounts/logout.ts (1)
1-168: Formatting refinements are in line with guidelines
Replaced single quotes with double quotes, added semicolons, and adjusted whitespace to meet the project’s formatting rules, with no impact on functionality.src/commands/accounts/index.ts (5)
1-1: Style consistency update: Double quotes for importsThe change from single to double quotes for imports aligns with the repository's new style standards. This consistency will help with better code maintainability.
4-27: Well-structured execution tracking implementationThe execution tracker code is now better formatted with appropriate spacing and consistent formatting. The parentheses around the anonymous class instantiation improve code clarity.
30-30: Style consistency: Double quotes for static stringsUpdated string delimiter from single to double quotes for consistency.
32-39: Improved readability with consistent formattingThe example commands are now formatted with double quotes and trailing commas, which improves consistency throughout the codebase.
49-64: Enhanced log statement formattingLog statements have been reformatted with proper indentation and line breaks for improved readability, especially for longer strings.
src/commands/auth/keys/update.ts (7)
1-3: Consistent import formattingImport statements now use double quotes consistently, aligning with the project's style guidelines.
7-11: Improved argument definition formattingThe argument definitions have been reformatted with consistent indentation and double quotes, enhancing readability.
13-19: Consistent string formatting for descriptionsDescription strings now use double quotes with proper indentation for multi-line text.
21-36: Well-structured flag definitionsFlag definitions are now consistently formatted with improved indentation and double quotes for string values.
38-68: Enhanced parsing and validation logic formattingThe run method's initial setup, argument parsing, and validation checks are now formatted with consistent spacing and indentation.
69-127: Improved API interaction and output formattingThe key update logic and response formatting have been improved with consistent spacing, indentation, and string delimiters.
131-147: Well-structured helper methodThe formatCapability helper method has improved formatting with consistent indentation for the method signature and implementation.
src/commands/auth/keys/get.ts (7)
1-3: Consistent import formattingImport statements now use double quotes consistently, aligning with the project's style guidelines.
7-12: Well-formatted argument definitionsThe argument definitions now use proper indentation for multi-line descriptions and consistent double quotes.
14-21: Consistent example formattingThe description and examples now use double quotes with consistent formatting and indentation.
23-30: Improved flag definition formattingFlag definitions now have consistent indentation and string quoting style.
32-72: Better structured command initialization and validationThe initial command setup, authentication checks, and validation logic now have consistent formatting with proper indentation.
74-123: Enhanced API response handlingThe key details retrieval and display logic have improved formatting with consistent indentation for conditional blocks and multi-line statements.
124-142: Consistent error handlingError handling now follows consistent formatting practices with well-indented JSON output and clear error messages.
src/commands/apps/channel-rules/create.ts (7)
1-4: Consistent import formattingImport statements now use double quotes consistently, with proper spacing between imports and code.
7-13: Standardized description and examples formattingThe command description and examples now use double quotes with consistent indentation and trailing commas.
15-86: Well-structured flag definitionsThe extensive flag definitions have been reformatted with consistent indentation, proper line breaks for descriptions, and standardized quoting style.
88-121: Improved command initialization and validationThe run method setup, app ID resolution, and validation logic now have consistent formatting with proper spacing and indentation.
122-142: Consistent data preparation and API interactionThe namespace data preparation and API call formatting have been improved with consistent indentation and property naming.
143-243: Enhanced output formattingThe JSON output and console logging have been reformatted with consistent indentation, proper line breaks, and standardized string quoting.
244-262: Consistent error handlingError handling now follows consistent formatting practices with well-indented JSON output and clear error messages.
.cursor/rules/development.mdc (1)
1-34: Great development guidelines!The development guidelines are comprehensive and cover all essential aspects including TypeScript practices, linting, testing, dependency management, and code quality standards. This will help ensure consistency across the codebase.
src/commands/accounts/login.ts (2)
11-38: Alias validation logic is clear and robust.
ThevalidateAndGetAliasfunction correctly trims input, enforces starting-letter and character rules, and logs errors appropriately via the injected logger.
81-90: Control-host URL construction is appropriate.
The conditional logic to switch between HTTP and HTTPS based onflags["control-host"]is clear and maintains backward compatibility for local testing.src/commands/apps/channel-rules/update.ts (1)
1-96: Stylistic refactor aligns with project conventions.
All string quoting, semicolon usage, and indentation have been standardized. No functional changes were introduced and the behavior remains unchanged.src/commands/bench/subscriber.ts (1)
1-40: Code style updates applied correctly.
The move to consistent semicolon usage, double quotes, and multiline formatting improves readability without altering logic.src/base-command.ts (1)
770-776: Possible unknown flag:format
shouldOutputJsonalso checksflags.format === "json", butformatdoes not appear inBaseFlagsor any global flag definition.
Either add the flag (e.g.--format=json) or remove this branch to avoid dead code.
| private openBrowser(url: string): void { | ||
| try { | ||
| const command = process.platform === 'darwin' ? 'open' : | ||
| process.platform === 'win32' ? 'start' : | ||
| 'xdg-open' | ||
|
|
||
| execSync(`${command} ${url}`) | ||
| const command = | ||
| process.platform === "darwin" | ||
| ? "open" | ||
| : process.platform === "win32" | ||
| ? "start" | ||
| : "xdg-open"; | ||
|
|
||
| execSync(`${command} ${url}`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Prevent potential shell injection when opening the browser.
Using execSync(\${command} ${url}`)may allow malicious input inurlto execute unintended commands. Consider switching toexecFileSync` with arguments to avoid shell interpolation:
import { execSync, execFileSync } from "node:child_process";
...
- execSync(`${command} ${url}`);
+ execFileSync(command, [url]);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private openBrowser(url: string): void { | |
| try { | |
| const command = process.platform === 'darwin' ? 'open' : | |
| process.platform === 'win32' ? 'start' : | |
| 'xdg-open' | |
| execSync(`${command} ${url}`) | |
| const command = | |
| process.platform === "darwin" | |
| ? "open" | |
| : process.platform === "win32" | |
| ? "start" | |
| : "xdg-open"; | |
| execSync(`${command} ${url}`); | |
| // At the top of the file, update the import: | |
| import { execSync, execFileSync } from "node:child_process"; | |
| private openBrowser(url: string): void { | |
| try { | |
| const command = | |
| process.platform === "darwin" | |
| ? "open" | |
| : process.platform === "win32" | |
| ? "start" | |
| : "xdg-open"; | |
| execFileSync(command, [url]); |
| let appId: string | undefined; | ||
|
|
||
| try { | ||
| let appId = flags.app | ||
| let appId = flags.app; | ||
| if (!appId) { | ||
| appId = await this.resolveAppId(flags) | ||
| appId = await this.resolveAppId(flags); | ||
| } | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Eliminate shadowed variable for appId.
Currently appId is declared twice—once above the try, then re-declared inside. Remove the inner let to assign directly to the outer variable:
- let appId = flags.app;
+ appId = flags.app;This ensures subsequent code references the intended variable.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| let appId: string | undefined; | |
| try { | |
| let appId = flags.app | |
| let appId = flags.app; | |
| if (!appId) { | |
| appId = await this.resolveAppId(flags) | |
| appId = await this.resolveAppId(flags); | |
| } | |
| let appId: string | undefined; | |
| try { | |
| appId = flags.app; | |
| if (!appId) { | |
| appId = await this.resolveAppId(flags); | |
| } |
| import { FitAddon } from "@xterm/addon-fit"; | ||
| import { Terminal } from "@xterm/xterm"; | ||
| import React, { useCallback, useEffect, useRef, useState } from "react"; // Step 4: Re-enable FitAddon import | ||
| import "@xterm/xterm/css/xterm.css"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Incorrect Xterm import paths break compilation
@xterm/xterm and @xterm/xterm/css/xterm.css do not exist on NPM – the canonical packages are xterm and xterm/css/xterm.css.
Trying to build the React app will therefore fail with Cannot resolve module '@xterm/xterm'.
Fix the imports:
-import { Terminal } from "@xterm/xterm";
-import "@xterm/xterm/css/xterm.css";
+import { Terminal } from "xterm";
+import "xterm/css/xterm.css";📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| import { FitAddon } from "@xterm/addon-fit"; | |
| import { Terminal } from "@xterm/xterm"; | |
| import React, { useCallback, useEffect, useRef, useState } from "react"; // Step 4: Re-enable FitAddon import | |
| import "@xterm/xterm/css/xterm.css"; | |
| import { FitAddon } from "@xterm/addon-fit"; | |
| import { Terminal } from "xterm"; | |
| import React, { useCallback, useEffect, useRef, useState } from "react"; // Step 4: Re-enable FitAddon import | |
| import "xterm/css/xterm.css"; |
| ): Promise<void> { | ||
| return new Promise((resolve, reject) => { | ||
| let cleanupTimedOut = false; | ||
| const timeout = setTimeout(() => { | ||
| cleanupTimedOut = true; | ||
| // Log timeout only if not in JSON mode | ||
| if (!this.shouldOutputJson({})) { // TODO: Pass actual flags here | ||
| this.log(chalk.yellow('Cleanup operation timed out.')); | ||
| if (!this.shouldOutputJson({})) { | ||
| // TODO: Pass actual flags here | ||
| this.log(chalk.yellow("Cleanup operation timed out.")); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shouldOutputJson({}) is unreliable – wire real flags
Inside setupCleanupHandler you call
if (!this.shouldOutputJson({})) { … }Passing an empty object defeats feature‑detection (--json, --pretty-json, etc.) and will always return false.
Propagate the original flags instead:
- if (!this.shouldOutputJson({})) {
+ if (!this.shouldOutputJson(flags)) {You will need to thread flags into setupCleanupHandler (or store it on the instance) to make this work.
scripts/terminal-server.ts
Outdated
| try { | ||
| // 1. Create & Start Container | ||
| container = await createContainer( | ||
| credentials.apiKey!, | ||
| credentials.accessToken!, | ||
| credentials.environmentVariables || {}, | ||
| ); | ||
| sessionId = container.id; | ||
| await container.start(); | ||
| log(`Main container ${sessionId} started.`); | ||
|
|
||
| // 2. Execute the restricted shell script directly via exec | ||
| log(`Executing restricted shell in container ${sessionId}...`); | ||
| const exec = await container.exec({ | ||
| AttachStderr: true, | ||
| AttachStdin: true, | ||
| AttachStdout: true, | ||
| // Explicitly run the restricted shell script | ||
| Cmd: ["/bin/bash", "/scripts/restricted-shell.sh"], | ||
| // Set critical environment variables FOR the restricted shell process | ||
| Env: [ | ||
| "TERM=xterm-256color", | ||
| "LANG=en_US.UTF-8", | ||
| "LC_ALL=en_US.UTF-8", | ||
| "LC_CTYPE=en_US.UTF-8", | ||
| "CLICOLOR=1", | ||
| "PS1=$ ", // Ensure prompt is set for this exec context | ||
| ], | ||
| Tty: true, // Use TTY for the exec process | ||
| }); | ||
| const execAttachOptions = { hijack: true, stdin: true }; // Keep hijack: true | ||
| execStream = (await exec.start(execAttachOptions)) as Duplex; | ||
| log(`Attached to exec stream for ${sessionId} (restricted shell).`); | ||
|
|
||
| if (credentials.type !== 'auth' || !credentials.apiKey || !credentials.accessToken) { | ||
| logError('Invalid auth message content'); | ||
| ws.send('Invalid authentication credentials provided.\r\n'); | ||
| ws.close(1008, 'Invalid credentials'); | ||
| return false; | ||
| // Resize the PTY to a default size initially | ||
| try { | ||
| await exec.resize({ h: 24, w: 80 }); | ||
| log(`Resized exec PTY for ${sessionId} to default 80x24.`); | ||
| } catch (resizeError) { | ||
| logError(`[${sessionId}] Failed to resize PTY initially: ${resizeError}`); | ||
| // Continue connection even if resize fails initially | ||
| } | ||
|
|
||
| log('Client authenticated. Creating container and exec process...'); | ||
| let container: Docker.Container | null = null; | ||
| let sessionId: null | string = null; | ||
| let execStream: Duplex | null = null; | ||
| let sessionTerminated = false; | ||
| const cleanupAndTerminate = async (reason: string) => { | ||
| if (sessionTerminated) return; | ||
| sessionTerminated = true; | ||
| log(`Triggering session termination for ${sessionId} due to: ${reason}`); | ||
| if (sessionId) { | ||
| await terminateSession(sessionId, reason); | ||
| } | ||
| // 3. Create WS Stream in RAW BINARY mode | ||
| // Omit stream options entirely to get default Buffer behavior | ||
| const websocketStream = createWebSocketStream(ws); | ||
|
|
||
| // Ensure WS is closed if session termination didn't catch it | ||
| if(ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) { | ||
| ws.close(1011, reason); | ||
| } | ||
| }; | ||
|
|
||
| try { | ||
| // 1. Create & Start Container | ||
| container = await createContainer(credentials.apiKey!, credentials.accessToken!, credentials.environmentVariables || {}); | ||
| sessionId = container.id; | ||
| await container.start(); | ||
| log(`Main container ${sessionId} started.`); | ||
|
|
||
| // 2. Execute the restricted shell script directly via exec | ||
| log(`Executing restricted shell in container ${sessionId}...`); | ||
| const exec = await container.exec({ | ||
| AttachStderr: true, | ||
| AttachStdin: true, | ||
| AttachStdout: true, | ||
| // Explicitly run the restricted shell script | ||
| Cmd: ['/bin/bash', '/scripts/restricted-shell.sh'], | ||
| // Set critical environment variables FOR the restricted shell process | ||
| Env: [ | ||
| 'TERM=xterm-256color', | ||
| 'LANG=en_US.UTF-8', | ||
| 'LC_ALL=en_US.UTF-8', | ||
| 'LC_CTYPE=en_US.UTF-8', | ||
| 'CLICOLOR=1', | ||
| 'PS1=$ ' // Ensure prompt is set for this exec context | ||
| ], | ||
| Tty: true // Use TTY for the exec process | ||
| }); | ||
| const execAttachOptions = { hijack: true, stdin: true }; // Keep hijack: true | ||
| execStream = await exec.start(execAttachOptions) as Duplex; | ||
| log(`Attached to exec stream for ${sessionId} (restricted shell).`); | ||
| // Removed: , { decodeStrings: true } or other encoding options | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate exec leads to unrestricted shell inside the container
You already start the restricted shell with:
Cmd: ["/bin/bash", "/scripts/restricted-shell.sh"]attachToContainer later executes another bash:
Cmd: ["/bin/bash"] // unrestrictedThis second exec bypasses the restrictions you carefully set up, allowing arbitrary commands.
Reuse the original exec instance instead of spawning a new one, e.g.:
- const execOptions: Docker.ExecCreateOptions = {
- … Cmd: ["/bin/bash"], …
- };
- const exec = await session.container.exec(execOptions);
- session.execInstance = exec;
+ const exec = session.execInstance; // reuse restricted-shell exec
+ if (!exec) throw new Error("execInstance missing on session");Failing to fix this nullifies the security model.
scripts/terminal-server.ts
Outdated
| ws: WebSocket, | ||
| req: http.IncomingMessage, | ||
| ): Promise<boolean> { | ||
| if (ws.readyState !== WebSocket.OPEN) { | ||
| logError("WebSocket is not open during handleAuth."); | ||
| return false; | ||
| } | ||
|
|
||
| let credentials: { | ||
| accessToken?: string; | ||
| apiKey?: string; | ||
| environmentVariables?: Record<string, string>; | ||
| type?: string; | ||
| } = {}; | ||
| try { | ||
| // Treat req as unknown; extract headers if available | ||
| const headers = (req as { headers?: Record<string, string> }).headers || {}; | ||
| credentials = JSON.parse(headers.authorization || ""); | ||
| } catch { | ||
| logError("Failed to parse auth message"); | ||
| ws.send("Invalid authentication message format.\r\n"); | ||
| ws.close(1008, "Invalid auth message"); | ||
| return false; | ||
| } | ||
|
|
||
| if ( | ||
| credentials.type !== "auth" || | ||
| !credentials.apiKey || | ||
| !credentials.accessToken | ||
| ) { | ||
| logError("Invalid auth message content"); | ||
| ws.send("Invalid authentication credentials provided.\r\n"); | ||
| ws.close(1008, "Invalid credentials"); | ||
| return false; | ||
| } | ||
|
|
||
| log("Client authenticated. Creating container and exec process..."); | ||
| let container: Docker.Container | null = null; | ||
| let sessionId: null | string = null; | ||
| let execStream: Duplex | null = null; | ||
| let sessionTerminated = false; | ||
| const cleanupAndTerminate = async (reason: string) => { | ||
| if (sessionTerminated) return; | ||
| sessionTerminated = true; | ||
| log(`Triggering session termination for ${sessionId} due to: ${reason}`); | ||
| if (sessionId) { | ||
| await terminateSession(sessionId, reason); | ||
| } | ||
|
|
||
| let credentials: { accessToken?: string; apiKey?: string; environmentVariables?: Record<string, string>; type?: string } = {}; | ||
| try { | ||
| // Treat req as unknown; extract headers if available | ||
| const headers = (req as { headers?: Record<string, string> }).headers || {}; | ||
| credentials = JSON.parse(headers.authorization || ''); | ||
| } catch { | ||
| logError('Failed to parse auth message'); | ||
| ws.send('Invalid authentication message format.\r\n'); | ||
| ws.close(1008, 'Invalid auth message'); | ||
| return false; | ||
| // Ensure WS is closed if session termination didn't catch it | ||
| if ( | ||
| ws.readyState === WebSocket.OPEN || | ||
| ws.readyState === WebSocket.CONNECTING | ||
| ) { | ||
| ws.close(1011, reason); | ||
| } | ||
| }; | ||
|
|
||
| try { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Dead code: _handleAuth is unused and diverges from the real flow
_handleAuth parses credentials from the HTTP headers, whereas the active connection logic expects them in the first WebSocket message.
Because the function is never called, keeping it around is misleading and risks future maintenance bugs.
-async function _handleAuth( … ) {
- …lots of code…
-}Delete the function or integrate its checks into the main path.
Committable suggestion skipped: line range outside the PR's diff.
…escript/lint fixes - Encoding/decoding of control chars unnecessary given Xterm can handle this - Improved handling of shutdown - Consistent container naming
…sizes work correctly
$ prompt was disappearing after resizes
Fixes an issue identified in PR #7 where the _handleAuth function was unused and contained an implementation that diverged from the actual authentication logic
Various tasks tracked
Getting started at ensuring this project has clear documentation for developers and AI agents alike
This enables us to build test coverage methodically with a plan (to be reviewed in more depth at each stage)
Run `pnpm dlx prettier --write .`
Reflect on whether the docs are up to date with the spec, and update
Fixes an issue identified in PR #7 where the _handleAuth function was unused and contained an implementation that diverged from the actual authentication logic
Fixed the redeclaration of appId variable which was shadowing the earlier declaration
Enhanced WebSocket error handling with more consistent patterns and better cleanup logic
1f67bba to
9efa113
Compare
9efa113 to
c3229b5
Compare
Fixes an issue identified in PR #7 where the _handleAuth function was unused and contained an implementation that diverged from the actual authentication logic
This PR improves docs, rules, strucuture etc. so that AI assistants can be more effective in upcoming tasks.
Summary by CodeRabbit
Documentation
Style
Refactor
Chores
No changes to user-facing features or command behavior.