mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-09-30 12:39:42 +02:00
Rebased onto current master (the one real conflict was the import line
in docker-hosts.ts Ark0N flagged; kept both), then addressed every
point from the review:
**1. Rebase.** Done — this branch now sits on current upstream/master.
**2. Agent-image special cases are data now, not an id-keyed table
outside stock.ts.** `AGENT_IMAGE_SPECIAL_CASE_IDS`/`AGENT_IMAGE_SPECIAL_CASES`
are gone. `CliDiscovery.install.agentImageLayer?: { kind: 'dedicated';
reason: string }` is a field on the registry entry itself (pi,
deepseek), `reason` is required by schema.ts, both producers
(docker-hosts.ts and cli-catalog.mjs) filter on its presence instead
of an id, and the coverage test reads it from the generated catalogue.
Also added the npm-package-name validation to the TS producer, which
only the .mjs one had — same SAFE_PACKAGE regex, duplicated
(necessarily, one side can't import the other) and now pinned
byte-identical by a new parity test.
**3. Changeset said five, it's eight.** (Not nine — see the DeepSeek
point below, which changes the true count.) Reworded to state it
structurally rather than pin a number that will go stale again.
Then the four behavior-changing findings:
- **DeepSeek was offered as a normal install option but can't actually
drive a pane.** `npm install -g @deepseek-ai/dsh` installs the
launcher only; DeepSeek ships no profile that can run standalone.
The generator now emits an empty install command for any
`launcherProfile` entry, so install.sh's menu (which requires a
non-empty command) skips it and falls through to its docs URL hint
instead — matching what the old hand-written code did before this
PR replaced it.
- **wget-only hosts lost every automatic install, including the npm
ones that never needed curl.** The menu-building loop now filters
PER ENTRY (only a command starting with `curl ` is held back) rather
than wiping the whole menu when DOWNLOADER != curl.
- **The DISPLAY/TRUSTED split and the catalogue refresh didn't hold up
under review** (refresh's only real write was the label; it ran
before the Node existence check; its own eval-detection test was
tripped by the word "eval'd" in a comment). Dropped entirely per
your own recommendation — embedded catalogue only, no network
fetch, no second array. install-sh-invariants.test.ts now asserts
the refresh/DISPLAY machinery does not exist rather than testing its
internals.
The three take-or-leave items, applied:
- `dsh_banner_probe`'s bash 3.2 empty-array bug: `${runner[@]}` →
`${runner[@]+"${runner[@]}"}`. Verified live in a real `bash:3.2.57`
container with `timeout` removed from PATH — crashed before, clean
now, full `detect_all_clis` path exercised end to end.
- `docker-agent-image-coverage.test.ts` now anchors on each layer's
`<binary> --version` proof line instead of `Dockerfile.includes(binary)`,
which stayed true if a layer were deleted but its comment survived.
- Doc drift: docs/docker-cases.md (four → five, and now describes the
data field), docker/agent.Dockerfile's "other four CLIs" comment (no
longer a magic number — CLI_NPM_PACKAGES is generated and can grow),
CLAUDE.md's install.sh size (104KB → ~112KB) and its stale mention of
the now-dropped refresh.
Verified: tsc clean, prettier clean, the full targeted suite (142
tests across the 8 affected files) green, and the full `npm test` gate
diffed BY TEST NAME against a clean upstream/master baseline run on
this same machine — identical 201-name failure set both sides (168
tests / 67 files, all pre-existing Windows-environment noise: symlinks,
PTY spawning, POSIX permission bits — none of it touching anything
this PR changes), zero new failures either side of the diff.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R9ZSTEenc8soSu9bTi8Xru
282 lines
6.3 KiB
JSON
282 lines
6.3 KiB
JSON
[
|
|
{
|
|
"id": "claude",
|
|
"label": "Claude",
|
|
"shortBadge": "CC",
|
|
"enabled": true,
|
|
"order": 0,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"claude"
|
|
],
|
|
"searchDirs": [
|
|
"~/.local/bin",
|
|
"~/.claude/local",
|
|
"/usr/local/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
"darwin": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
"wsl": "curl -fsSL https://claude.ai/install.sh | bash"
|
|
},
|
|
"npmPackage": "@anthropic-ai/claude-code",
|
|
"docsUrl": "https://docs.claude.com/claude-code"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "shell",
|
|
"label": "Shell",
|
|
"shortBadge": "SH",
|
|
"enabled": true,
|
|
"order": 1,
|
|
"kind": "shell",
|
|
"discovery": {
|
|
"binaries": [],
|
|
"searchDirs": [],
|
|
"install": {
|
|
"command": {}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "opencode",
|
|
"label": "OpenCode",
|
|
"shortBadge": "OC",
|
|
"enabled": true,
|
|
"order": 10,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"opencode"
|
|
],
|
|
"searchDirs": [
|
|
"~/.opencode/bin",
|
|
"~/.local/bin",
|
|
"/usr/local/bin",
|
|
"~/go/bin",
|
|
"~/.bun/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "curl -fsSL https://opencode.ai/install | bash",
|
|
"darwin": "curl -fsSL https://opencode.ai/install | bash"
|
|
},
|
|
"npmPackage": "opencode-ai",
|
|
"docsUrl": "https://opencode.ai/docs"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "codex",
|
|
"label": "Codex",
|
|
"shortBadge": "CX",
|
|
"enabled": true,
|
|
"order": 20,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"codex"
|
|
],
|
|
"searchDirs": [
|
|
"~/.codex/bin",
|
|
"~/.local/bin",
|
|
"/usr/local/bin",
|
|
"~/.bun/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "npm install -g @openai/codex",
|
|
"darwin": "npm install -g @openai/codex"
|
|
},
|
|
"npmPackage": "@openai/codex",
|
|
"docsUrl": "https://developers.openai.com/codex/cli"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "gemini",
|
|
"label": "Gemini",
|
|
"shortBadge": "GM",
|
|
"enabled": true,
|
|
"order": 30,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"gemini"
|
|
],
|
|
"searchDirs": [
|
|
"~/.gemini/bin",
|
|
"~/.local/bin",
|
|
"/usr/local/bin",
|
|
"~/.bun/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "npm install -g @google/gemini-cli",
|
|
"darwin": "npm install -g @google/gemini-cli"
|
|
},
|
|
"npmPackage": "@google/gemini-cli",
|
|
"docsUrl": "https://github.com/google-gemini/gemini-cli"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "antigravity",
|
|
"label": "Antigravity",
|
|
"shortBadge": "AG",
|
|
"enabled": true,
|
|
"order": 40,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"agy"
|
|
],
|
|
"searchDirs": [
|
|
"~/.local/bin",
|
|
"~/.antigravity/bin",
|
|
"/usr/local/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "curl -fsSL https://antigravity.google/cli/install.sh | bash",
|
|
"darwin": "curl -fsSL https://antigravity.google/cli/install.sh | bash"
|
|
},
|
|
"docsUrl": "https://antigravity.google/cli"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "pi",
|
|
"label": "Pi",
|
|
"shortBadge": "PI",
|
|
"enabled": true,
|
|
"order": 50,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"pi"
|
|
],
|
|
"searchDirs": [
|
|
"~/.local/bin",
|
|
"/usr/local/bin",
|
|
"~/.bun/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "npm install -g --ignore-scripts @earendil-works/pi-coding-agent",
|
|
"darwin": "npm install -g --ignore-scripts @earendil-works/pi-coding-agent"
|
|
},
|
|
"npmPackage": "@earendil-works/pi-coding-agent",
|
|
"docsUrl": "https://pi.dev",
|
|
"agentImageLayer": {
|
|
"kind": "dedicated",
|
|
"reason": "installed with --ignore-scripts in its own layer, so the flag cannot leak to the shared block"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "grok",
|
|
"label": "Grok",
|
|
"shortBadge": "GK",
|
|
"enabled": true,
|
|
"order": 70,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"grok"
|
|
],
|
|
"searchDirs": [
|
|
"~/.grok/bin",
|
|
"~/.local/bin",
|
|
"/usr/local/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "curl -fsSL https://x.ai/cli/install.sh | bash",
|
|
"darwin": "curl -fsSL https://x.ai/cli/install.sh | bash"
|
|
},
|
|
"docsUrl": "https://github.com/xai-org/grok-build"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "deepseek",
|
|
"label": "DeepSeek",
|
|
"shortBadge": "DS",
|
|
"enabled": true,
|
|
"order": 80,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"dsh"
|
|
],
|
|
"searchDirs": [
|
|
"~/.local/bin",
|
|
"/usr/local/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"identity": {
|
|
"arg": "--help",
|
|
"regex": "DeepSeek\\s+Harness"
|
|
},
|
|
"install": {
|
|
"command": {
|
|
"linux": "npm install -g @deepseek-ai/dsh",
|
|
"darwin": "npm install -g @deepseek-ai/dsh"
|
|
},
|
|
"npmPackage": "@deepseek-ai/dsh",
|
|
"docsUrl": "https://github.com/deepseek-ai/deepseek-harness",
|
|
"agentImageLayer": {
|
|
"kind": "dedicated",
|
|
"reason": "needs pnpm alongside it (dsh plugin, issue #352) and a dsh-tui profile install"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "omp",
|
|
"label": "OMP",
|
|
"shortBadge": "OM",
|
|
"enabled": true,
|
|
"order": 90,
|
|
"kind": "agent",
|
|
"discovery": {
|
|
"binaries": [
|
|
"omp"
|
|
],
|
|
"searchDirs": [
|
|
"~/.local/bin",
|
|
"~/.omp/bin",
|
|
"/usr/local/bin",
|
|
"~/.bun/bin",
|
|
"~/.npm-global/bin",
|
|
"~/bin"
|
|
],
|
|
"install": {
|
|
"command": {
|
|
"linux": "curl -fsSL https://omp.sh/install | sh",
|
|
"darwin": "brew install can1357/tap/omp"
|
|
},
|
|
"docsUrl": "https://omp.sh"
|
|
}
|
|
}
|
|
}
|
|
]
|