command_program/command_tool whitespace-split and only skipped whole wrapper words, so quoted paths broke, sudo -u/env -i/nohup/time/npx --yes/pnpm|yarn --silent dlx/bun x were rejected, and pnpm claude / yarn claude (a package.json script, not `dlx claude`) resolved as a Claude launch. Replace it with a tokenizer that honours quoting and escaping without evaluating any expansion, and per-wrapper option tables (env, sudo, command, nohup, time, npx, pnpm, yarn, bun) that require dlx/x before looking through a package-manager wrapper. Ambiguous shell grammar (pipelines, list operators, redirections, substitution, unterminated quotes) is rejected outright rather than guessed through; command_program still degrades to the naive first word for display, but command_tool returns None. Mirror the same resolver in web/src/toolIcon.ts and add fixtures/command-resolution.json as a parity fixture both test suites assert against.
51 lines
3.8 KiB
JSON
51 lines
3.8 KiB
JSON
{
|
|
"_description": "the parity fixture for #199's command resolver — every case here is asserted identically by crates/maestro-protocol/src/display.rs (command_program/command_tool) and web/src/toolIcon.ts (splitCommand). `program` is the resolved, basenamed program; `tool` is the icon id it maps to, or null when unrecognised/ambiguous.",
|
|
"cases": [
|
|
{ "command": "claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "claude --resume", "program": "claude", "tool": "claude" },
|
|
{ "command": "CLAUDE", "program": "CLAUDE", "tool": "claude" },
|
|
{ "command": "/usr/local/bin/claude -p hi", "program": "claude", "tool": "claude" },
|
|
{ "command": "./bin/claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "FOO=1 BAR=2 claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "FOO=\"bar baz\" claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "'/usr/local/bin/claude'", "program": "claude", "tool": "claude" },
|
|
{ "command": "\"/opt/my agent/claude\" --resume", "program": "claude", "tool": "claude" },
|
|
{ "command": "env -i claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "env --ignore-environment claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "sudo -u root claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "sudo --user=root claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "sudo -- claude --resume", "program": "claude", "tool": "claude" },
|
|
{ "command": "nohup claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "time claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "time -o /tmp/t.log claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "command claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "npx --yes claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "npx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "pnpm --silent dlx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "pnpm -C ./pkg dlx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "pnpm dlx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "yarn --silent dlx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "bun x claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "bunx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "uvx claude-code", "program": "claude-code", "tool": "claude" },
|
|
{ "command": "sudo env -i claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "FOO=1 sudo BAR=2 claude", "program": "claude", "tool": "claude" },
|
|
{ "command": "npx opencode", "program": "opencode", "tool": "opencode" },
|
|
{ "command": "pnpm dlx opencode run", "program": "opencode", "tool": "opencode" },
|
|
{ "command": "pnpm claude", "program": "pnpm", "tool": null },
|
|
{ "command": "yarn claude", "program": "yarn", "tool": null },
|
|
{ "command": "claude-code-acp", "program": "claude-code-acp", "tool": null },
|
|
{ "command": "hx src/main.rs", "program": "hx", "tool": null },
|
|
{ "command": "bash", "program": "bash", "tool": "shell" },
|
|
{ "command": "opencode", "program": "opencode", "tool": "opencode" },
|
|
{ "command": "sudo", "program": "sudo", "tool": null },
|
|
{ "command": "", "program": "", "tool": null },
|
|
{ "command": "npx --unknown-flag claude-code", "program": "npx", "tool": null },
|
|
{ "command": "claude | tee log.txt", "program": "claude", "tool": null },
|
|
{ "command": "claude; echo done", "program": "claude;", "tool": null },
|
|
{ "command": "claude && echo done", "program": "claude", "tool": null },
|
|
{ "command": "echo hi $(claude)", "program": "echo", "tool": null },
|
|
{ "command": "claude \"unterminated", "program": "claude", "tool": null }
|
|
]
|
|
}
|