Skip to content

feat(agents): detect installed CLIs across launchers and limits - #52

Merged
howdeploy merged 1 commit into
howdeploy:mainfrom
cododel:feat/detect-agent-cli-launchers
Sep 22, 2026
Merged

howdeploy merged 1 commit into
howdeploy:mainfrom
cododel:feat/detect-agent-cli-launchers

Conversation

@cododel

@cododel cododel commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Goal

Show agent launchers and HOME limit rows only when an executable CLI is detected. Missing agents remain visible in Settings for installation and configuration. Detecting a CLI later does not change the user's saved selection.

Behavior

  • providerCliRegistry remains the source of truth for the nine agents: Codex, Claude Code, Qwen Code, Kimi Code, OpenCode, Hermes, Grok Build, OMP, and Pi. An agent without a detected CLI is hidden from HOME, the canvas context launcher, and the radial launcher.
  • On a new profile, only detected agents are selected in the four independent lists: HOME launcher, canvas context launcher, radial launcher, and HOME limits. The limit list is restricted to its six supported providers. Loading an existing profile removes missing agents from these lists and persists the result. After installation and recheck, an agent stays disabled until the user selects it in each desired list.
  • Agents Settings shows a missing CLI status and an Install button instead of an enable control in all four lists. The button opens that project's official installation guide in the external browser; CanvasTTY does not install software. Check again rescans paths available to the app without a restart.
  • Recheck updates future launches, invalidates the Kimi capability probe and stale limit snapshot, and requests fresh limit data. Running sessions continue unaffected.
  • An empty limit selection shows the empty state. A detected CLI does not prove authentication or quota API support: Qwen Code still reports unsupported-protocol when the user selects its row.

Documentation

Updated the existing UI_CONTRACT, ARCHITECTURE, and getting-started documents in English, Russian, and Simplified Chinese. No separate contract or ADR was added.

Verification

  • Focused tests cover CLI appearance and removal; new and existing profiles; independent selection in the four lists; remaining disabled after rediscovery; an empty limit selection; limit cache invalidation; Qwen unsupported-protocol; and Kimi reprobe after a CLI update.
  • Full suite before the final focused change: 658/658 passed. Focused run after that change: 88/88 passed. Typecheck passed.
  • The macOS arm64 production package and packaged-app CLI discovery smoke passed. The app's strict code-signature check and DMG/ZIP integrity checks passed.
  • An isolated Electron window reached its first rendered frame. Visual inspection of the Settings UI in that window remains unverified.

Recheck searches the inherited PATH and known installation directories. It does not pick up changes to the running app's own PATH.

@howdeploy
howdeploy merged commit 1289bf7 into howdeploy:main Sep 22, 2026
3 checks passed
@cododel
cododel deleted the feat/detect-agent-cli-launchers branch September 22, 2026 20:46
BIackFIame added a commit to BIackFIame/CanvasTTY that referenced this pull request Sep 23, 2026
Provider CLI resolution is driven by declarative command definitions
instead of assuming the executable matches the provider id. MiniMax
Code (`mcode`), Antigravity (`agy`) and Cursor resolve through the same
registry, known install directories, recheck and install links that howdeploy#52
introduced. Cursor prefers `cursor-agent`; a generic `agent` is accepted
only when its real path is verified as Cursor, because Grok also
installs an `agent` executable.

Each new agent gets normal and resume launches where the CLI documents
them, its YOLO flag only where one exists, launcher entries with a
settings migration, its provider mark and session restore. MiniMax Code
has no permission-bypass flag, so its YOLO profile launches the stock
CLI and says so. Antigravity restores as a fresh session because it has
no resumable id that CanvasTTY can persist.

Provider ids, labels and launcher order live in a dependency-free
`providerCatalog.ts` that `contracts.ts` re-exports, so the Even G2
companion bundle stays free of URLs outside its network whitelist; its
phone launcher lists the new agents too.

Lifecycle hooks are prepared only for providers that have a hook adapter, so
the new agents never write Grok's shared hook configuration.

ADR: docs/adr/ADR-20260921-provider-cli-command-definitions.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kootik pushed a commit to kootik/CanvasTTY that referenced this pull request Sep 27, 2026
Provider CLI resolution is driven by declarative command definitions
instead of assuming the executable matches the provider id. MiniMax
Code (`mcode`), Antigravity (`agy`) and Cursor resolve through the same
registry, known install directories, recheck and install links that howdeploy#52
introduced. Cursor prefers `cursor-agent`; a generic `agent` is accepted
only when its real path is verified as Cursor, because Grok also
installs an `agent` executable.

Each new agent gets normal and resume launches where the CLI documents
them, its YOLO flag only where one exists, launcher entries with a
settings migration, its provider mark and session restore. MiniMax Code
has no permission-bypass flag, so its YOLO profile launches the stock
CLI and says so. Antigravity restores as a fresh session because it has
no resumable id that CanvasTTY can persist.

Provider ids, labels and launcher order live in a dependency-free
`providerCatalog.ts` that `contracts.ts` re-exports, so the Even G2
companion bundle stays free of URLs outside its network whitelist; its
phone launcher lists the new agents too.

Lifecycle hooks are prepared only for providers that have a hook adapter, so
the new agents never write Grok's shared hook configuration.

ADR: docs/adr/ADR-20260921-provider-cli-command-definitions.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants