بنقرة واحدة
puppetmaster
Operate Puppetmaster multi-agent orchestrator via MCP verbs (edit, swarm, implement, route, monitor).
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Operate Puppetmaster multi-agent orchestrator via MCP verbs (edit, swarm, implement, route, monitor).
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | puppetmaster |
| description | Operate Puppetmaster multi-agent orchestrator via MCP verbs (edit, swarm, implement, route, monitor). |
| version | 1.2.0 |
| author | professorpalmer |
| license | MIT |
| platforms | ["linux","macos","windows"] |
| metadata | {"hermes":{"tags":["orchestrator","multi-agent","swarm","mcp","routing","codegraph"],"category":"autonomous-ai-agents","related_skills":["codex","claude-code","opencode"]}} |
Multi-agent orchestrator that runs adapter workers (Cursor SDK / Claude Code /
Codex / Hermes) as durable, SQLite-backed subprocesses with leases, structured
JSON artifacts, per-task model routing, and isolated git worktrees. Published on
PyPI as puppetmaster-ai; the CLI mirrors every MCP verb.
Prefer Puppetmaster verbs over a solo grep/read loop or the built-in delegation for: single focused edits that benefit from CodeGraph or cheap-model routing, broad investigation, multi-file audits, and cross-cutting changes.
mcp_puppetmaster_puppetmaster_*. Use
tool_search to find a verb, tool_describe to load its schema, tool_call
to invoke. This is the primary path.python -m puppetmaster ...) when MCP isn't connected. The
MCP server shells out to its own resolved interpreter, so MCP can work even
when python -m puppetmaster fails in the current venv.| Task shape | Verb | Why |
|---|---|---|
| One focused edit ("fix this fn", "add a flag", "wire up retries") | edit | Cheapest sufficient model + CodeGraph + in-place edit + synchronous diff. The snappy path between editing inline and a full implement job. |
| One coupled multi-file feature | start_implement | Isolated clean worktree, one coherent PATCH artifact. |
| Broad read-only analysis (audit, review, "find all X") | start_swarm / start_cursor_swarm | Parallel roles over read-only analysis. |
| Live-site browser QA (drive a real browser, capture real network payloads) | start_browser_swarm | N parallel Hermes browser workers with React-input/network-truth/strong-model guardrails. Hermes-only; ACTING AGENT (side effects). |
| "Where is X / what calls Y" | codegraph_search | Structural lookup before reading files. |
| "What model / how much?" | route_task | Pure decision, no spend. |
label (3–6 words) to any start_* / edit
verb so the dashboard and jobs list stay scannable instead of showing bare
job_<hash> ids. Omitted labels fall back to a title derived from the goal.edit verb (lightweight single in-place edit)puppetmaster_edit "<instruction>" — the daily-driver verb for one focused
change:
routing_policy=cheap); pin with
model to override routing.allow_dirty) — no isolated worktree.job_id to poll.require_diff gate fails a
no-op edit closed, so a "done" edit that changed nothing can't pass.Use start_implement instead when the change is coupled/multi-file and wants an
isolated worktree.
For any "where is X / what calls Y / what implements Z" question, query
CodeGraph first, then read only the files it points to. Verbs: codegraph_search,
codegraph_context, codegraph_affected, codegraph_files, codegraph_status,
codegraph_init.
cwd=<workspace> explicitly. The codegraph tools default cwd to
$HOME, not the repo — without it, codegraph_status reports "Not initialized"
even for a healthy index..codegraph/ doesn't exist, run codegraph_init once first.codegraph_search.
(Plain text matches — log strings, config values — may still use ripgrep.)auto_route: true enables per-task model routing (default true when no model
is pinned).routing_policy: balanced (cheapest sufficient — default), cheap,
quality, escalating. Optional caps: max_cost_usd, min_capability.~/.puppetmaster/models.json (puppetmaster models init
seeds it). route_task dry-runs a decision and shows rejected alternatives.~/.puppetmaster/platform.json, a denylist) restricts which
adapters the router may pick. Lock rejections mid-migration are expected, not
failures.Workers can be told to write tighter. Off by default. Shapes form, not reasoning, so it never lowers answer quality — the win is readability and latency, with a small cost bonus on output-heavy roles (output tokens are a minority of an agentic bill).
PUPPETMASTER_OUTPUT_STYLE=terse (or lithic).payload.output_style = "terse" | "lithic" | "off". An
explicit payload value wins over the env; "off" opts one spec out.terse — drop ceremony, filler, hedging, restatement; one claim per line;
state uncertainty as fact (unconfirmed: X). Safe; recommended tier.lithic — terse plus telegraphic glue-dropping (articles/copulas). Marginal
extra savings, mild quality risk; best for machine-consumed artifacts, not a
human-facing summary.payload.output_style_text, or globally with PUPPETMASTER_OUTPUT_STYLE_TEXT
/ PUPPETMASTER_OUTPUT_STYLE_FILE. Custom text wins over the tiers; the spec
is stamped output_style: "custom".Full reference: docs/OUTPUT_STYLE.md.
start_* verbs)start_* returns immediately with job_id. Then:
status (pass cwd) → check task_counts, stale_task_ids, and the
outcome block.show (pass cwd) → read the stitched synthesis once complete. Prefer show
over feed/live_artifacts for results (the feed buries findings in routing
JSON).await_job blocks only ~45s per call and returns timed_out=true — expect to
call it several times for a multi-minute swarm; that's normal, not a stall.Always pass cwd to status/show/logs — without it they resolve to $HOME state
and return "job not found" for a live job.
Don't report success off "job complete" alone. Assert on status.outcome:
outcome.trustworthy == true
outcome.quality == "ok"
stale_task_ids == []
outcome.patch_artifact_emitted == true # for edit / implement runs
tool_search for the verbs.route_task → confirm a model_id + rejected list.edit "<instruction>" --cwd <repo> → confirm the diff lands and
patch_artifact_emitted./tmp), start_swarm with
cwd=<fixture>, then status (trust gate green) + show (stitched summary).codegraph
shim can short-circuit code paths CI exercises. Defer to the actual CI run.pip upgrade until restarted —
it imports the package once at startup. If MCP and CLI disagree after an
upgrade, restart the MCP server (toggle it in Hermes MCP settings / restart
Hermes). The CLI forks fresh and shows the new behavior.outcome.trustworthy and stale_task_ids.launcher_pid is not the worker — monitor via job_id + status/logs/feed.hermes worker persists a
source=tool session; Puppetmaster prunes the ended ones after every run (via
hermes sessions prune, race-safe — only ended sessions). Set
PUPPETMASTER_HERMES_PRUNE_SESSIONS=0 to keep them for debugging, or clean up
manually with hermes sessions prune --source tool --older-than 0 --yes.