Multi cli spawn
Fan out one brief to multiple coding CLIs in parallel (agy, grok, claude, codex, kimi, qwen) via spawn.sh with PID-file / process-group kill safety and per-seat .status files (RUNNING → DONE|BLOCKED). Use for multi-LLM council, parallel second opinions, or cross-provider review. Prefer foreground wait; for --no-wait poll terminal .status — never treat missing .md alone as failure. Always --no-git; orchestrator owns commits.From its SKILL.md
npx -y skills add ImL1s/agent-cli-skills --skill multi-cli-spawnAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
3.6 KB, 947 tokens by cl100k_base, as published. Nobody here has run it
Multi-CLI Spawn (cross-provider parallel seats)
When to use
- Need several providers to answer the same brief in parallel
- Multi-LLM council / second opinions / cross-vendor review
- You already have (or will install) the per-CLI
*-cli-agentwrappers
This is not a substitute for vendor-native multi-agent inside one CLI (-T / ultracode /
teamwork). Use those for fan-out within one provider; use this skill to fan-out across providers.
Why
Each vendor has native multi-agent inside one CLI (agy teamwork, Claude ultracode, Codex subagents, Grok spawn_subagent, …). This skill is the cross-CLI layer: one brief → N providers → N answer files.
Usage
./spawn.sh --outdir /tmp/council-$$ \
-f /tmp/brief.md \
--seat agy:readonly \
--seat claude:ultracode \
--seat codex:team \
--seat grok \
--seat kimi:readonly \
--seat qwen:readonly \
-C /path/to/repo \
-t 1200s
Seat forms: name, name:readonly, name:ultracode|team, name:readonly,team, name@label
(unique output key when duplicating a CLI).
Seat modifiers (comma-separated after :): readonly/r, team/ultracode/T.
Outputs
| File | Meaning |
|---|---|
<key>.log | Live CLI stdout/stderr |
<key>.md | Final answer, or BLOCKED:… stub (written when the seat finishes) |
<key>.pid | Seat process-group id (kill target) |
<key>.rc | Seat exit code |
<key>.status | RUNNING → DONE rc=0 | BLOCKED rc=N (atomic) |
spawn.pid / spawn.status | Parent: RUNNING → DONE, or SPAWNED if --no-wait |
brief.md | Copied/normalized brief inside outdir |
Waiting contract
- Default: do not poll. Run
spawn.shin the foreground (wait mode). Its exit code andCLI_AGENT_RESULT: PASS|BLOCKED <seat>lines are the completion signal. --no-wait/ external watcher: wait until every seat.statusis terminal (DONE/BLOCKED), e.g.:
Do not treat missingwhile grep -qlE '^RUNNING' "$OUTDIR"/*.status 2>/dev/null; do sleep 15; done*.mdor a dead*.pidalone as "no answer" —.mdappears only when the seat finishes; pidfiles can look dead if the parent spawn was killed while seats continue.- Kill only via numeric PIDs in seat
*.pidfiles (process groups). Skipspawn.pidwhen iterating kill targets unless you intend to stop the parent. Neverpkill -flong patterns.
Hard rules
- PID files only — never
pkill -fwith a pattern that also appears in the launcher argv - Quota fail-open — provider errors / empty output →
BLOCKEDstub; do not retry-loop - agy needs PTY — handled inside
agy-exec.sh - Orchestrator owns git — spawn always passes
--no-git - Parallel writers should use separate worktrees (
-Cper seat) to avoid collisions - Seat
rc != 0isBLOCKED(missing binary is not a council vote)
Synthesize
Read *.md only for seats whose .status is terminal. Strictest blockers win. Divergent
findings are high value. Re-run only BLOCKED seats after the user refreshes quota/auth.
See also: docs/CORRECTNESS.md, docs/FEATURES.md.
What ships with it: 4 files
19.8 KB alongside SKILL.md, 4 of them executable
lib/
- common.shruns6.8 KB
- parse_stream_json.pyruns3.5 KB
- pty_run.pyruns1.7 KB
- spawn.shruns7.7 KB
Gives 0 of the 12 instructions most context ai engineering skills give in 947 tokens
Counted across 1,328 of the 2,349 authors here whose files we hold, read 2026-09-06
- Dispatch a fresh subagent for each taskin 76 of 1328, across 59 files
- Perform spec compliance review before code quality reviewin 44 of 1328, across 34 files
- Dispatch a final code reviewer after all tasksin 38 of 1328, across 26 files
- Answer subagent questions before allowing implementationin 36 of 1328, across 26 files
- Use the least powerful model capable of the taskin 33 of 1328, across 26 files
- Create a TodoWrite list for all tasksin 32 of 1328, across 22 files
- Perform a task review after each implementationin 31 of 1328, across 24 files
- Extract all tasks and context from the planin 29 of 1328, across 20 files
- Provide full task text to subagentsin 28 of 1328, across 20 files
- Use git worktrees for isolated workspacesin 25 of 1328, across 20 files
- Specify the model explicitly when dispatching a subagentin 23 of 1328, across 18 files
- Execute all tasks from the plan without stoppingin 21 of 1328, across 16 files
Said here and by no other author read
- Run spawn.sh in foreground by default
- Use --no-git for all spawned agents
- Use separate worktrees for parallel writers
- Poll .status files for terminal state when using --no-wait
- Read .md files only when .status is terminal
- Treat seat exit code non-zero as BLOCKED
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.