Conversation
DX-786: Replaced monolithic globalFlags (16 flags on every command) with composable flag groups. Utility commands like `ably version` now only show --verbose/--json. Auth flags (--api-key, --access-token, --token) removed entirely — auth is via `ably login` or env vars (ABLY_API_KEY, ABLY_TOKEN, ABLY_ACCESS_TOKEN). Moved --endpoint to login/switch only, stored per-account in config. Removed --env and --host. Kept --client-id on presence commands.
|
You have run out of free Bugbot PR reviews for this billing cycle. This will reset on April 4. To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
WalkthroughA new utility module standardizes CLI output formatting using four helpers (progress, success, listening, resource). Flag descriptions are systematically updated for consistency, and success messages are simplified across 80+ command files. Some commands have json flags removed or duration flag descriptions updated. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (2)
src/commands/spaces/members/subscribe.ts (1)
168-168: Use a listening-state message withlistening(...).At Line 168,
listening("Subscribing to member events.")mixes states. Consider changing to “Listening for member events.” (and ideally emit it right after subscribe succeeds) for consistent semantics.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/commands/spaces/members/subscribe.ts` at line 168, Change the mixed-state message to a proper listening-state message and emit it after the subscribe call succeeds: replace the current this.log(`\n${listening("Subscribing to member events.")}\n`) usage with this.log(`\n${listening("Listening for member events.")}\n`) and move that line so it runs only after the subscribe promise/operation completes successfully (locate the subscribe invocation inside the subscribe command handler and place the listening(...) log in its success callback / after await).test/e2e/channels/channels-e2e.test.ts (1)
482-492: Consider asserting the channel name in count publish outputThese checks verify progress wording, but not the output’s target channel. Adding one assertion improves contract coverage.
Proposed tweak
expect(countPublishResult.stdout).toContain( "3/3 messages published to channel", ); + expect(countPublishResult.stdout).toContain(countChannel);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/e2e/channels/channels-e2e.test.ts` around lines 482 - 492, Add an assertion that the publish output includes the target channel name: update the test around the existing expects that check countPublishResult.stdout (the lines asserting "Message 1/2/3 published to channel" and "3/3 messages published to channel") to also assert that countPublishResult.stdout contains the channel identifier (use the test's channel variable, e.g., channelName or channel, whichever is declared in this test) so the output verifies both progress text and the actual channel target.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/commands/auth/keys/current.ts`:
- Line 19: The --app flag description overpromises name support because the
command reads flags.app directly into appId; either update the flag text to say
"app ID (defaults to current app)" or implement name→ID resolution before lookup
by calling your existing resolver (e.g., resolveAppNameToId or getAppByName) and
assign its result to appId when flags.app is not already an ID; modify the code
path in current.ts that sets appId from flags.app to perform resolution and
handle resolution errors, or simply change the description string to be ID-only
to keep behavior consistent.
In `@src/commands/auth/keys/list.ts`:
- Line 19: The flag description says "ID or name" but the command passes
flags.app straight through as appId without resolving names; update the handling
in the list command so flags.app is normalized to an ID before use (e.g., call
your app-resolution helper such as resolveAppNameToId/lookupAppByName and assign
the result to appId) or else change the flag description back to "ID" only;
specifically modify the code that reads flags.app and sets appId in the list
command (reference: flags.app and the variable appId) to perform name-to-ID
lookup and use the resolved ID where keys listing occurs.
In `@src/commands/auth/keys/revoke.ts`:
- Line 26: The flag description says names are allowed but the code in revoke.ts
passes flags.app straight into getKey/revokeKey as an appId; either resolve
names to IDs before those calls or update the flag text to only claim IDs. Fix
by adding an app-id resolution step (e.g., call a resolver like
resolveAppId(flags.app) or lookup the app by name and use its id) and then pass
that resolved id into getKey and revokeKey, or change the description string for
flags.app to "The app ID (defaults to current app)" so behavior and docs match;
update references to flags.app, getKey, and revokeKey accordingly.
In `@src/commands/auth/keys/update.ts`:
- Line 24: The description for the update command's --app flag claims it accepts
an "app ID or name" but the code uses flags.app as an ID without resolving
names; update the implementation so that when flags.app is provided it is
resolved to an app ID (e.g., call the existing app name→ID resolver or helper
used elsewhere) before use, or change the description to only say "app ID" if
you prefer not to add resolution; specifically modify the code paths in
src/commands/auth/keys/update.ts that reference flags.app to either invoke the
app resolution function (same resolver used by other commands) or update the
description string to remove "or name" to keep behavior and wording consistent.
In `@src/commands/bench/subscriber.ts`:
- Around line 37-38: The duration option's short flag was accidentally changed
to "D"; revert the option object's char value from "D" back to "d" in the
subscriber command definition (the duration option entry with description
"Automatically exit after N seconds (0 = run indefinitely)") so existing
scripts/tests expecting -d continue to work, and run the unit tests to confirm
the -d flag is recognized in help/output.
In `@src/commands/logs/push/subscribe.ts`:
- Around line 77-79: The success log is emitted before the actual subscribe
call; change the pre-subscribe message to a progress/info message (use this.log
with a progress or info helper instead of success) near where channelName is
referenced, then move the this.log(success(`Subscribed to
${resource(channelName)}.`)) and this.log(listening("Listening for push logs."))
lines into the post-subscribe path after channel.subscribe(...) completes
successfully so the success/listening messages are only logged once
channel.subscribe resolves.
In `@src/commands/rooms/occupancy/subscribe.ts`:
- Around line 118-120: The current success message `success(\`Subscribed to
occupancy in room: ${resource(this.roomName!)}.\`)` is emitted on room attach
before the occupancy subscription is actually set up; move or change this so it
only runs after the occupancy subscription promise completes (or after the
method that configures the subscription returns successfully). Locate the attach
branch where `this.roomName` is used and the occupancy subscription setup (e.g.,
the function/method that registers occupancy events or
`subscribeToOccupancy`/similar), await that operation and emit the success
message only after it resolves (or emit a separate "attached" message if you
need an immediate acknowledgement but keep the definitive "subscribed" message
after successful setup).
In `@src/commands/rooms/presence/subscribe.ts`:
- Around line 59-65: The code currently logs success and listening before the
subscription is actually established; change the flow in subscribe.ts so you
first emit a progress/connecting message (e.g., this.log with a connecting
message) before calling currentRoom.presence.subscribe(...) and completing auth,
then await/handle the subscription result and only after
currentRoom.presence.subscribe(...) resolves successfully call
this.log(success(`Subscribed to presence in room:
${resource(this.roomName!)}.`)) and this.log(listening("Listening for presence
events.")); ensure any errors from the subscribe call are caught and result in
an appropriate error log instead of emitting success.
---
Nitpick comments:
In `@src/commands/spaces/members/subscribe.ts`:
- Line 168: Change the mixed-state message to a proper listening-state message
and emit it after the subscribe call succeeds: replace the current
this.log(`\n${listening("Subscribing to member events.")}\n`) usage with
this.log(`\n${listening("Listening for member events.")}\n`) and move that line
so it runs only after the subscribe promise/operation completes successfully
(locate the subscribe invocation inside the subscribe command handler and place
the listening(...) log in its success callback / after await).
In `@test/e2e/channels/channels-e2e.test.ts`:
- Around line 482-492: Add an assertion that the publish output includes the
target channel name: update the test around the existing expects that check
countPublishResult.stdout (the lines asserting "Message 1/2/3 published to
channel" and "3/3 messages published to channel") to also assert that
countPublishResult.stdout contains the channel identifier (use the test's
channel variable, e.g., channelName or channel, whichever is declared in this
test) so the output verifies both progress text and the actual channel target.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: c75c5829-046c-4a18-a45b-7907b5c8e122
📒 Files selected for processing (82)
.claude/CLAUDE.md.cursor/rules/AI-Assistance.mdcsrc/commands/apps/channel-rules/create.tssrc/commands/apps/channel-rules/delete.tssrc/commands/apps/channel-rules/update.tssrc/commands/apps/create.tssrc/commands/apps/delete.tssrc/commands/auth/issue-ably-token.tssrc/commands/auth/issue-jwt-token.tssrc/commands/auth/keys/create.tssrc/commands/auth/keys/current.tssrc/commands/auth/keys/get.tssrc/commands/auth/keys/list.tssrc/commands/auth/keys/revoke.tssrc/commands/auth/keys/switch.tssrc/commands/auth/keys/update.tssrc/commands/auth/revoke-token.tssrc/commands/bench/publisher.tssrc/commands/bench/subscriber.tssrc/commands/channels/history.tssrc/commands/channels/inspect.tssrc/commands/channels/list.tssrc/commands/channels/occupancy/subscribe.tssrc/commands/channels/presence/enter.tssrc/commands/channels/presence/subscribe.tssrc/commands/channels/publish.tssrc/commands/channels/subscribe.tssrc/commands/integrations/create.tssrc/commands/integrations/delete.tssrc/commands/integrations/get.tssrc/commands/integrations/list.tssrc/commands/integrations/update.tssrc/commands/logs/channel-lifecycle/subscribe.tssrc/commands/logs/connection-lifecycle/history.tssrc/commands/logs/connection-lifecycle/subscribe.tssrc/commands/logs/history.tssrc/commands/logs/push/history.tssrc/commands/logs/push/subscribe.tssrc/commands/logs/subscribe.tssrc/commands/queues/create.tssrc/commands/queues/delete.tssrc/commands/queues/list.tssrc/commands/rooms/list.tssrc/commands/rooms/messages/history.tssrc/commands/rooms/messages/reactions/subscribe.tssrc/commands/rooms/messages/send.tssrc/commands/rooms/messages/subscribe.tssrc/commands/rooms/occupancy/subscribe.tssrc/commands/rooms/presence/enter.tssrc/commands/rooms/presence/subscribe.tssrc/commands/rooms/reactions/subscribe.tssrc/commands/rooms/typing/keystroke.tssrc/commands/rooms/typing/subscribe.tssrc/commands/spaces/cursors/get-all.tssrc/commands/spaces/cursors/set.tssrc/commands/spaces/list.tssrc/commands/spaces/locations/set.tssrc/commands/spaces/locks/acquire.tssrc/commands/spaces/members/enter.tssrc/commands/spaces/members/subscribe.tssrc/commands/stats/account.tssrc/commands/stats/app.tssrc/utils/output.tstest/e2e/channels/channel-history-e2e.test.tstest/e2e/channels/channel-occupancy-e2e.test.tstest/e2e/channels/channel-presence-e2e.test.tstest/e2e/channels/channel-subscribe-e2e.test.tstest/e2e/channels/channels-e2e.test.tstest/e2e/rooms/rooms-e2e.test.tstest/e2e/spaces/spaces-e2e.test.tstest/unit/commands/apps/create.test.tstest/unit/commands/auth/keys/create.test.tstest/unit/commands/channels/publish.test.tstest/unit/commands/integrations/create.test.tstest/unit/commands/integrations/delete.test.tstest/unit/commands/logs/channel-lifecycle/subscribe.test.tstest/unit/commands/logs/connection-lifecycle/subscribe.test.tstest/unit/commands/logs/subscribe.test.tstest/unit/commands/queues/create.test.tstest/unit/commands/rooms/features.test.tstest/unit/commands/rooms/messages.test.tstest/unit/commands/spaces/spaces.test.ts
…ng, resource) Introduce src/utils/output.ts with shared formatting helpers and apply them across all commands for consistent user-facing output: green ✓ for success, cyan for resource names, dim for listening prompts. Also updates examples to use kebab-case flags and adjusts tests to match.
8e08112 to
89335e2
Compare
a3cc7fa to
07dc49c
Compare
Resolved conflicts keeping main's new features (clientIdFlag, json flags, hidden endpoint, env var approach in tests, v0.16.0) while preserving this branch's consistency changes (output helpers, kebab-case flags). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Standardizes Ably CLI human-readable output and common flag/help text across Channels, Rooms, Spaces, Logs, Control, and Bench commands by introducing shared formatting helpers and aligning tests/docs accordingly.
Changes:
- Added
src/utils/output.tshelper functions (progress,success,listening,resource) and adopted them across commands. - Standardized common flag descriptions (
--app,--limit,--duration) and renamed--autoTypeto--auto-type. - Updated unit/e2e tests and documentation (README + AI assistant guidance) to match the new output/flag conventions.
Reviewed changes
Copilot reviewed 84 out of 84 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| test/unit/commands/spaces/spaces.test.ts | Update output assertions |
| test/unit/commands/rooms/messages.test.ts | Update output assertions |
| test/unit/commands/rooms/features.test.ts | Update output assertions |
| test/unit/commands/queues/create.test.ts | Update output assertions |
| test/unit/commands/logs/subscribe.test.ts | Update output assertions |
| test/unit/commands/logs/connection-lifecycle/subscribe.test.ts | Update output assertions |
| test/unit/commands/logs/channel-lifecycle/subscribe.test.ts | Update output assertions |
| test/unit/commands/integrations/delete.test.ts | Update output assertions |
| test/unit/commands/integrations/create.test.ts | Update output assertions |
| test/unit/commands/channels/publish.test.ts | Update output assertions |
| test/unit/commands/auth/keys/create.test.ts | Update output assertions |
| test/unit/commands/apps/create.test.ts | Update output assertions |
| test/e2e/spaces/spaces-e2e.test.ts | Update ready signals/messages |
| test/e2e/rooms/rooms-e2e.test.ts | Update ready signals/messages |
| test/e2e/channels/channels-e2e.test.ts | Update publish assertions |
| test/e2e/channels/channel-subscribe-e2e.test.ts | Update subscribe ready signal |
| test/e2e/channels/channel-presence-e2e.test.ts | Update presence output assertion |
| test/e2e/channels/channel-occupancy-e2e.test.ts | Update subscribe ready signal |
| test/e2e/channels/channel-history-e2e.test.ts | Update publish assertions |
| src/utils/output.ts | New output helpers |
| src/commands/stats/app.ts | Standardize --limit help |
| src/commands/stats/account.ts | Standardize --limit help |
| src/commands/spaces/members/subscribe.ts | Use output helpers |
| src/commands/spaces/members/enter.ts | Use output helpers |
| src/commands/spaces/locks/acquire.ts | Use output helpers |
| src/commands/spaces/locations/set.ts | Use output helpers + help tweaks |
| src/commands/spaces/list.ts | Standardize --limit help |
| src/commands/spaces/cursors/set.ts | Standardize --duration help |
| src/commands/spaces/cursors/get-all.ts | Use output helpers |
| src/commands/rooms/typing/subscribe.ts | Use output helpers |
| src/commands/rooms/typing/keystroke.ts | Rename flag + use output helpers |
| src/commands/rooms/reactions/subscribe.ts | Use output helpers |
| src/commands/rooms/presence/subscribe.ts | Use output helpers |
| src/commands/rooms/presence/enter.ts | Use output helpers |
| src/commands/rooms/occupancy/subscribe.ts | Use output helpers |
| src/commands/rooms/messages/subscribe.ts | Use output helpers |
| src/commands/rooms/messages/send.ts | Use output helpers |
| src/commands/rooms/messages/reactions/subscribe.ts | Standardize --duration help |
| src/commands/rooms/messages/history.ts | Standardize --limit help |
| src/commands/rooms/list.ts | Standardize --limit help |
| src/commands/queues/list.ts | Standardize --app help |
| src/commands/queues/delete.ts | Standardize --app help |
| src/commands/queues/create.ts | Use output helpers + --app help |
| src/commands/logs/subscribe.ts | Use output helpers |
| src/commands/logs/push/subscribe.ts | Use output helpers |
| src/commands/logs/push/history.ts | Standardize --limit help |
| src/commands/logs/history.ts | Standardize --limit help |
| src/commands/logs/connection-lifecycle/subscribe.ts | Use output helpers |
| src/commands/logs/connection-lifecycle/history.ts | Standardize --limit help |
| src/commands/logs/channel-lifecycle/subscribe.ts | Use output helpers |
| src/commands/integrations/update.ts | Standardize --app help |
| src/commands/integrations/list.ts | Standardize --app help |
| src/commands/integrations/get.ts | Standardize --app help |
| src/commands/integrations/delete.ts | Use output helpers + --app help |
| src/commands/integrations/create.ts | Use output helpers + --app help |
| src/commands/channels/subscribe.ts | Use output helpers |
| src/commands/channels/publish.ts | Use output helpers + messages |
| src/commands/channels/presence/subscribe.ts | Use output helpers |
| src/commands/channels/presence/enter.ts | Use output helpers |
| src/commands/channels/occupancy/subscribe.ts | Use output helpers |
| src/commands/channels/list.ts | Standardize --limit help |
| src/commands/channels/inspect.ts | Standardize --app help |
| src/commands/channels/history.ts | Standardize --limit help |
| src/commands/bench/subscriber.ts | Use output helpers + -D |
| src/commands/bench/publisher.ts | Use output helpers |
| src/commands/auth/revoke-token.ts | Standardize --app help |
| src/commands/auth/keys/update.ts | Standardize --app help |
| src/commands/auth/keys/switch.ts | Standardize --app help |
| src/commands/auth/keys/revoke.ts | Standardize --app help |
| src/commands/auth/keys/list.ts | Standardize --app help |
| src/commands/auth/keys/get.ts | Standardize --app help |
| src/commands/auth/keys/current.ts | Standardize --app help |
| src/commands/auth/keys/create.ts | Use output helpers + --app help |
| src/commands/auth/issue-jwt-token.ts | Standardize --app help |
| src/commands/auth/issue-ably-token.ts | Standardize --app help |
| src/commands/apps/delete.ts | Standardize --app help |
| src/commands/apps/create.ts | Use output helpers |
| src/commands/apps/channel-rules/update.ts | Standardize --app help |
| src/commands/apps/channel-rules/delete.ts | Standardize --app help |
| src/commands/apps/channel-rules/create.ts | Standardize --app help |
| align-cli.md | Add conventions plan doc |
| README.md | Update command docs/examples |
| .cursor/rules/AI-Assistance.mdc | Document conventions |
| .claude/CLAUDE.md | Document conventions |
Comments suppressed due to low confidence (5)
src/commands/spaces/locations/set.ts:41
- The
--durationflag description says0 = run indefinitely, but this command has a specialduration === 0fast-path (shouldExitImmediately) that exits immediately after setting the location (used for E2E mode). Update the flag description to reflect the actual behavior (or remove the special-case so0truly means indefinite).
src/commands/spaces/cursors/set.ts:66 - The
--durationflag description says0 = run indefinitely, but this command explicitly treatsflags.duration === 0as an immediate-exit mode (this.exit(0)after setting the cursor). Please align the description with the implemented semantics (or adjust the logic if the new standard is0 = run indefinitely).
README.md:231 - These autogenerated
See codelinks were changed from.../blob/v0.16.0/...to.../blob/v0.15.0/..., butpackage.jsondeclares version0.16.0. This makes the README point at the wrong tag across many sections; regenerate the README (e.g., viaoclif readme) or update the links to match the current version.
See code: src/commands/accounts/index.ts
**README.md:3356**
* This README example uses a `--position` flag for `spaces cursors set`, but the command implementation (src/commands/spaces/cursors/set.ts) only supports `--x/--y` (or `--data` containing `position`). Update the example to use supported flags so users can copy/paste it successfully.
EXAMPLES
$ ably spaces cursors set my-space --position '{"x": 100, "y": 200}' --data '{"color": "red"}'
$ ably spaces cursors subscribe my-space
**README.md:3914**
* In the newly added `ably stats account` docs, the `--limit` flag description still says "Maximum number of stats records to return", but the command source was updated to "Maximum number of results to return (default: 10)". Regenerating the README from the updated command help output should fix this mismatch.
--json Output in JSON format
--limit=<value> [default: 10] Maximum number of stats records to return
--live Subscribe to live stats updates (uses minute interval)
--pretty-json Output in colorized JSON format
</details>
---
💡 <a href="/ably/ably-cli/new/main?filename=.github/instructions/*.instructions.md" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Add Copilot custom instructions</a> for smarter, more guided reviews. <a href="https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Learn how to get started</a>.
a2eff4e to
4d2013f
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 105 out of 105 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (7)
src/help.ts:150
- In
showCommandHelp(), the extra COMMANDS section is written withchalk.*viathis.log(...)but it bypassesformatHelpOutput()/stripAnsihandling. When generating README/help withstripAnsienabled, this can leak ANSI styling into the output. Consider routing these lines through the sameformatHelpOutput()/stripAnsipath (or avoid chalk whenopts.stripAnsi/GENERATING_READMEis set).
src/commands/spaces/locations/set.ts:46 - The
--durationhelp text says0 = run indefinitely, but this command treatsduration === 0as a special “exit immediately” E2E path (shouldExitImmediately). This makes the flag description misleading for users and inconsistent with actual behavior. Update the description to reflect the real semantics (or change the logic so 0 truly means indefinite).
src/commands/spaces/cursors/set.ts:67 - The
--durationflag description says0 = run indefinitely, but this command explicitly exits early whenflags.duration === 0(immediate exit mode after a short delay). The help text should match the implemented behavior (e.g.,0 = exit immediately after setting the cursor).
src/commands/rooms/presence/subscribe.ts:73 - This prints a success message (
✓ Subscribed to presence...) before any connection/attach has happened, and it is emitted even when auth fails (the command later warns and just waits). That’s user-visible misinformation. Consider usingprogress(...)/listening(...)for the early readiness signal, and only loggingsuccess("Subscribed...")once the room is attached and presence subscription is active.
src/commands/rooms/presence/subscribe.ts:279 - After
presence.subscribe(...)completes, the code logslistening("Subscribing to presence events."). This is both redundant (a listening message is already printed at startup) and the wording is inaccurate at this point (it’s no longer “subscribing”). Consider removing this line or changing it to a single consistent listening hint (e.g.,Listening for presence events.) that’s only printed once.
src/commands/spaces/locks/get.ts:68 - This success message doesn’t follow the new output conventions introduced in this PR: it includes “Successfully …” and doesn’t end with a period. For consistency with other updated commands and the documented conventions, consider changing it to something like “Entered space: .” (no “Successfully”, with trailing period).
README.md:231 - The README “See code” links were updated from
blob/v0.16.0toblob/v0.15.0, butpackage.jsonin this PR is stillversion: 0.16.0. This makes the documentation links point at the wrong tag. Regenerate the README (or update the link version) so it matches the current CLI version/tag.
_See code: [src/commands/accounts/index.ts](https://github.com/ably/ably-cli/blob/v0.15.0/src/commands/accounts/index.ts)_
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Minor color issues -> channel subscribe
channel message publish
channel message history
|
sacOO7
left a comment
There was a problem hiding this comment.
LGTM ( you can check failing CI for session tests )
Unify CLI output with consistent helpers (progress, success, listening, resource)
Introduce src/utils/output.ts with shared formatting helpers and apply
them across all commands for consistent user-facing output: green ✓ for
success, cyan for resource names, dim for listening prompts. Also updates
examples to use kebab-case flags and adjusts tests to match.
Summary by CodeRabbit
Release Notes
New Features
Documentation
Refactor
--appflag descriptions for consistency.--auto-typeflag for consistency.Tests