feat(ai-tools): catalog of AI coding CLIs, detection, enable/default, lanes for any tool (#40 A1)

server/lib/ai-tools.js loads server/data/ai-tools/*.json (38 tools, data from
Orca, MIT) plus DASHBOARD_AI_TOOLS_DIR, detects each CLI by walking PATH, and
keeps enable/default in <data dir>/ai-tools.json. shell-path.js merges the
login shell's PATH at startup and on Refresh. /api/ai-tools lists, refreshes
and toggles; /api/run/binary resolves through the catalog.

Lanes accept any catalog id (EDISABLED for a disabled one on creation, ENOTOOL
at start once a tool left the catalog). pty-run keeps the Claude/Codex
builders and builds every other tool's argv from its catalog file, pasting an
after-start prompt through a tmux buffer; every pane gets the hydrated PATH.
A per-run bypass switch appends the catalog's bypass args (Codex included).
POST /api/run now forwards sandbox/approval/resumeLast, which it dropped.
agenthub lanes add gains --tool.
This commit is contained in:
2026-09-28 10:57:10 +07:00
parent 0aa7fc232e
commit 77917203fd
59 changed files with 1804 additions and 84 deletions
+15
View File
@@ -0,0 +1,15 @@
# AI Tools catalog
One JSON file per AI coding CLI AgentHub can run in a lane. Loaded by
`server/lib/ai-tools.js`; the fields are described in
`docs/superpowers/specs/2026-09-28-ai-tools-a1-design.md` § 1. A file in
`DASHBOARD_AI_TOOLS_DIR` with the same `id` replaces the built-in one (it may
not set `launcher`).
## Attribution
The commands, prompt modes, permission-bypass flags and homepages of the tools
other than Claude Code, Codex and Antigravity come from Orca
(<https://github.com/stablyai/orca>, MIT License, Copyright (c) Stably AI):
`src/renderer/src/lib/agent-catalog.tsx`, `src/shared/tui-agent-config.ts` and
`src/shared/tui-agent-permissions.ts`.
+15
View File
@@ -0,0 +1,15 @@
{
"id": "aider",
"label": "Aider",
"detect": [
"aider"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yes-always"
],
"homepageUrl": "https://aider.chat/docs/"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "amp",
"label": "Amp",
"detect": [
"amp"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--dangerously-allow-all"
],
"homepageUrl": "https://ampcode.com/manual#install",
"faviconDomain": "ampcode.com"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "ante",
"label": "Ante",
"detect": [
"ante"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://github.com/AntigmaLabs/ante-preview",
"faviconDomain": "antigma.ai"
}
+19
View File
@@ -0,0 +1,19 @@
{
"id": "antigravity",
"label": "Antigravity",
"detect": [
"agy"
],
"prompt": {
"mode": "flag",
"flag": "-i"
},
"resume": [
"--continue"
],
"bypass": [
"--dangerously-skip-permissions"
],
"homepageUrl": "https://antigravity.google/docs/cli/overview",
"faviconDomain": "antigravity.google"
}
+13
View File
@@ -0,0 +1,13 @@
{
"id": "aug",
"label": "Auggie",
"detect": [
"auggie"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"homepageUrl": "https://docs.augmentcode.com/cli/overview",
"faviconDomain": "augmentcode.com"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "autohand",
"label": "Autohand Code",
"detect": [
"autohand"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--unrestricted"
],
"homepageUrl": "https://github.com/autohandai/code-cli",
"faviconDomain": "autohand.ai"
}
+9
View File
@@ -0,0 +1,9 @@
{
"id": "claude",
"label": "Claude Code",
"detect": [
"claude"
],
"launcher": "claude",
"homepageUrl": "https://code.claude.com/docs"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "cline",
"label": "Cline",
"detect": [
"cline"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--auto-approve",
"true"
],
"homepageUrl": "https://docs.cline.bot/cline-cli/overview",
"faviconDomain": "cline.bot"
}
+13
View File
@@ -0,0 +1,13 @@
{
"id": "codebuff",
"label": "Codebuff",
"detect": [
"codebuff"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"homepageUrl": "https://www.codebuff.com/docs/help/quick-start",
"faviconDomain": "codebuff.com"
}
+12
View File
@@ -0,0 +1,12 @@
{
"id": "codex",
"label": "Codex",
"detect": [
"codex"
],
"launcher": "codex",
"bypass": [
"--dangerously-bypass-approvals-and-sandbox"
],
"homepageUrl": "https://github.com/openai/codex"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "command-code",
"label": "Command Code",
"detect": [
"command-code"
],
"args": [
"--trust"
],
"prompt": {
"mode": "argv"
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://commandcode.ai/docs/quickstart"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "continue",
"label": "Continue",
"detect": [
"cn"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--allow",
"*"
],
"homepageUrl": "https://docs.continue.dev/guides/cli",
"faviconDomain": "continue.dev"
}
+15
View File
@@ -0,0 +1,15 @@
{
"id": "copilot",
"label": "GitHub Copilot",
"detect": [
"copilot"
],
"prompt": {
"mode": "flag",
"flag": "-i"
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "crush",
"label": "Charm Crush",
"detect": [
"crush"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://github.com/charmbracelet/crush",
"faviconDomain": "charm.sh"
}
+15
View File
@@ -0,0 +1,15 @@
{
"id": "cursor",
"label": "Cursor",
"detect": [
"cursor-agent"
],
"prompt": {
"mode": "argv"
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://cursor.com/cli",
"faviconDomain": "cursor.com"
}
+19
View File
@@ -0,0 +1,19 @@
{
"id": "devin",
"label": "Devin",
"detect": [
"devin"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--permission-mode",
"bypass",
"--respect-workspace-trust",
"false"
],
"homepageUrl": "https://devin.ai/cli",
"faviconDomain": "devin.ai"
}
+15
View File
@@ -0,0 +1,15 @@
{
"id": "droid",
"label": "Droid",
"detect": [
"droid"
],
"prompt": {
"mode": "argv"
},
"bypass": [
"--auto",
"high"
],
"homepageUrl": "https://docs.factory.ai/cli/getting-started/quickstart"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "gemini",
"label": "Gemini",
"detect": [
"gemini"
],
"prompt": {
"mode": "flag",
"flag": "--prompt-interactive"
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://github.com/google-gemini/gemini-cli",
"faviconDomain": "gemini.google.com"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "goose",
"label": "Goose",
"detect": [
"goose"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypassEnv": {
"GOOSE_MODE": "auto"
},
"homepageUrl": "https://block.github.io/goose/docs/quickstart/",
"faviconDomain": "goose-docs.ai"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "grok",
"label": "Grok",
"detect": [
"grok"
],
"prompt": {
"mode": "argv",
"separator": "--"
},
"bypass": [
"--permission-mode",
"bypassPermissions"
],
"homepageUrl": "https://x.ai/cli",
"faviconDomain": "x.ai"
}
+19
View File
@@ -0,0 +1,19 @@
{
"id": "hermes",
"label": "Hermes",
"detect": [
"hermes"
],
"args": [
"--tui"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://hermes-agent.nousresearch.com/docs/",
"faviconDomain": "nousresearch.com"
}
+12
View File
@@ -0,0 +1,12 @@
{
"id": "kilo",
"label": "Kilocode",
"detect": [
"kilo"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"homepageUrl": "https://kilo.ai/docs/cli"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "kimi",
"label": "Kimi",
"detect": [
"kimi",
"kimi-code"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://www.kimi.com/code/docs/en/kimi-code-cli/getting-started.html",
"faviconDomain": "moonshot.cn"
}
+19
View File
@@ -0,0 +1,19 @@
{
"id": "kiro",
"label": "Kiro",
"detect": [
"kiro-cli"
],
"args": [
"chat",
"--tui"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--trust-all-tools"
],
"homepageUrl": "https://kiro.dev/docs/cli/"
}
+13
View File
@@ -0,0 +1,13 @@
{
"id": "mimo-code",
"label": "MiMo Code",
"detect": [
"mimo"
],
"prompt": {
"mode": "flag",
"flag": "--prompt"
},
"homepageUrl": "https://mimo.xiaomi.com/coder",
"faviconDomain": "mimo.xiaomi.com"
}
+18
View File
@@ -0,0 +1,18 @@
{
"id": "mistral-vibe",
"label": "Mistral Vibe",
"detect": [
"vibe",
"mistral-vibe"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--agent",
"auto-approve"
],
"homepageUrl": "https://github.com/mistralai/mistral-vibe",
"faviconDomain": "mistral.ai"
}
+19
View File
@@ -0,0 +1,19 @@
{
"id": "muse",
"label": "Muse",
"detect": [
"muse"
],
"args": [
"--trust-workspace"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://dev.meta.ai/docs/muse-code",
"faviconDomain": "dev.meta.ai"
}
+11
View File
@@ -0,0 +1,11 @@
{
"id": "omp",
"label": "Oh My Pi (OMP)",
"detect": [
"omp"
],
"prompt": {
"mode": "argv"
},
"homepageUrl": "https://omp.sh"
}
+14
View File
@@ -0,0 +1,14 @@
{
"id": "openclaude",
"label": "OpenClaude",
"detect": [
"openclaude"
],
"prompt": {
"mode": "argv"
},
"bypass": [
"--dangerously-skip-permissions"
],
"homepageUrl": "https://openclaude.gitlawb.com/"
}
+13
View File
@@ -0,0 +1,13 @@
{
"id": "openclaw",
"label": "OpenClaw",
"detect": [
"openclaw"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"homepageUrl": "https://github.com/openclaw/openclaw",
"faviconDomain": "openclaw.ai"
}
+12
View File
@@ -0,0 +1,12 @@
{
"id": "opencode",
"label": "OpenCode",
"detect": [
"opencode"
],
"prompt": {
"mode": "flag",
"flag": "--prompt"
},
"homepageUrl": "https://opencode.ai/docs/cli/"
}
+15
View File
@@ -0,0 +1,15 @@
{
"id": "opencode2",
"label": "OpenCode 2",
"detect": [
"opencode2"
],
"args": [
"--standalone"
],
"prompt": {
"mode": "flag",
"flag": "--prompt"
},
"homepageUrl": "https://opencode.ai/v2/docs/"
}
+11
View File
@@ -0,0 +1,11 @@
{
"id": "pi",
"label": "Pi",
"detect": [
"pi"
],
"prompt": {
"mode": "argv"
},
"homepageUrl": "https://pi.dev"
}
+13
View File
@@ -0,0 +1,13 @@
{
"id": "prime-agent",
"label": "Prime Agent",
"detect": [
"prime-agent"
],
"prompt": {
"mode": "argv",
"separator": "--"
},
"homepageUrl": "https://github.com/PrimeIntellect-ai/prime-agent",
"faviconDomain": "primeintellect.ai"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "qwen-code",
"label": "Qwen Code",
"detect": [
"qwen"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--approval-mode",
"yolo"
],
"homepageUrl": "https://github.com/QwenLM/qwen-code",
"faviconDomain": "qwenlm.github.io"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "rovo",
"label": "Rovo Dev",
"detect": [
"rovo"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/",
"faviconDomain": "atlassian.com"
}
+16
View File
@@ -0,0 +1,16 @@
{
"id": "trae",
"label": "Trae",
"detect": [
"traecli"
],
"prompt": {
"mode": "argv",
"separator": "--"
},
"bypass": [
"--yolo"
],
"homepageUrl": "https://docs.trae.cn/cli_get-started-with-trae-cli",
"faviconDomain": "www.trae.cn"
}
+17
View File
@@ -0,0 +1,17 @@
{
"id": "zcode",
"label": "ZCode",
"detect": [
"zcode"
],
"prompt": {
"mode": "after-start",
"delayMs": 3000
},
"bypass": [
"--mode",
"yolo"
],
"homepageUrl": "https://zcode.z.ai/en/docs",
"faviconDomain": "zcode.z.ai"
}