playmaker-cli 0.7.2__tar.gz → 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/.gitignore +2 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/CHANGELOG.md +81 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/PKG-INFO +45 -7
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/README.md +44 -6
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/pyproject.toml +1 -1
- playmaker_cli-0.9.0/skills/playmaker-coach/SKILL.md +211 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/references/agent-gotchas.md +73 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/references/commands.md +42 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/references/lanes.md +95 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/references/prompt-templates.md +103 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/references/quotas.md +55 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/references/review-board.md +143 -0
- playmaker_cli-0.9.0/skills/playmaker-coach/scripts/review-board.sh +235 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/opencode.py +10 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/cli.py +231 -59
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/quotas.py +117 -0
- playmaker_cli-0.9.0/src/playmaker/state.py +489 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/watcher.py +3 -2
- playmaker_cli-0.9.0/tests/test_no_changes.py +360 -0
- playmaker_cli-0.9.0/tests/test_quotas_freshness.py +111 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_skill.py +21 -0
- playmaker_cli-0.7.2/skills/playmaker-coach/SKILL.md +0 -293
- playmaker_cli-0.7.2/src/playmaker/state.py +0 -217
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/LICENSE +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/__init__.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/__main__.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/__init__.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/agy.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/base.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/claude.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/codex.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/agents/gemini.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/config.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/notify.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/src/playmaker/registry.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/__init__.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_agy.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_batch.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_binary.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_claude.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_codex.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_opencode.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_permissions.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_quotas_antigravity.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_quotas_zai.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_registry.py +0 -0
- {playmaker_cli-0.7.2 → playmaker_cli-0.9.0}/tests/test_state.py +0 -0
|
@@ -5,6 +5,87 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.9.0] - 2026-08-24
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`playmaker quotas` keeps itself fresh.** The snapshot in `quotas.json` is
|
|
13
|
+
re-probed automatically once it is older than `[quotas] max_age` (default
|
|
14
|
+
5m), and the header now prints how old the numbers are. A stale table was
|
|
15
|
+
worse than no table: the coach quotes it when it decides where to send work,
|
|
16
|
+
and nothing warned that "62% left" was four days old. `--refresh` still
|
|
17
|
+
probes on demand and `--cached` prints the stored snapshot without probing.
|
|
18
|
+
|
|
19
|
+
- **`skill install` copies the whole skill directory.** The bundled skill has
|
|
20
|
+
outgrown a single file — `references/` the coach reads on demand, `scripts/`
|
|
21
|
+
it runs — and install only ever copied `SKILL.md`, so none of that reached
|
|
22
|
+
`~/.claude/skills`. It now walks the bundle, keeps the executable bit on
|
|
23
|
+
scripts, and deletes nothing the bundle does not own, so `--force` is an
|
|
24
|
+
upgrade rather than a reset of whatever you keep alongside it.
|
|
25
|
+
|
|
26
|
+
- **The coach skill is a protocol plus references, and it ships a review board.**
|
|
27
|
+
`SKILL.md` was a 315-line monolith that cost 35 KB of context to activate,
|
|
28
|
+
which is its own argument against activating it. It is now a ~200-line
|
|
29
|
+
protocol, with the lanes, quota rules, per-agent traps, prompt templates and
|
|
30
|
+
command surface moved into `references/` and read on demand.
|
|
31
|
+
|
|
32
|
+
- **`scripts/review-board.sh` — automatic multi-agent review of a work package.**
|
|
33
|
+
It snapshots the WP's diff, builds one refute-the-implementation prompt per
|
|
34
|
+
reviewer (distinct lens each: correctness, contracts, risk, conventions),
|
|
35
|
+
dispatches them `--read-only` under a single `--batch`, and collects their
|
|
36
|
+
verdicts as JSON with `--collect`. The roster comes from
|
|
37
|
+
`.playmaker/reviewers.conf` (repo) or `~/.playmaker/reviewers.conf` (global),
|
|
38
|
+
keyed by risk class, so which lanes review what is configuration rather than
|
|
39
|
+
something the coach improvises each round. The implementing lane is excluded
|
|
40
|
+
with `--impl-agent`.
|
|
41
|
+
|
|
42
|
+
- **Policy overlay.** The coach reads `./.playmaker/policy.md` then
|
|
43
|
+
`~/.playmaker/policy.md` before planning, and lets them override the skill's
|
|
44
|
+
defaults — which quotas to spare, which lanes are contended, what juniors may
|
|
45
|
+
never touch in this repo, which commands are the acceptance gates. Personal
|
|
46
|
+
routing rules used to survive only as local edits to the installed
|
|
47
|
+
`SKILL.md`, which made upgrading the bundled skill destructive.
|
|
48
|
+
|
|
49
|
+
- **Write-task no-change detection.** Every dispatch and continuation now takes
|
|
50
|
+
a before/after working-tree snapshot: git directories compare porcelain
|
|
51
|
+
state plus `HEAD`, while ordinary directories use a bounded mtime walk. A
|
|
52
|
+
successful write task that changed zero paths is stored as `no_changes`,
|
|
53
|
+
with the count and snapshot hashes available from `get`/`summary` and JSON.
|
|
54
|
+
`--expect-changes` forces the check; `--read-only` suppresses it for recon
|
|
55
|
+
and answer-only work.
|
|
56
|
+
|
|
57
|
+
### Changed
|
|
58
|
+
|
|
59
|
+
- **The skill's activation threshold is much lower.** It used to require 3+
|
|
60
|
+
independent work-streams and a >2x parallel speedup, which read as "not this
|
|
61
|
+
task" for most real requests; it now activates on any code change spanning
|
|
62
|
+
more than one file, anything that deserves an independent review pass, or any
|
|
63
|
+
request with two parallelizable parts — a single reviewed work package is an
|
|
64
|
+
expected shape, not overhead.
|
|
65
|
+
|
|
66
|
+
- **`no_changes` is terminal but not success.** It appears as a warning in
|
|
67
|
+
watch and list filtering, pings immediately with the failure sound even in
|
|
68
|
+
a batch, and makes the batch report its agent as `⚠ no_changes` rather than
|
|
69
|
+
counting it among the completed workers.
|
|
70
|
+
|
|
71
|
+
- **`summary --json` now wraps turns in `summary`.** Snapshot diagnostics share
|
|
72
|
+
the object with the former bare turn list, so JSON consumers should read
|
|
73
|
+
`summary` for the messages.
|
|
74
|
+
|
|
75
|
+
## [0.8.0] - 2026-08-18
|
|
76
|
+
|
|
77
|
+
### Added
|
|
78
|
+
|
|
79
|
+
- **Ollama in the quota table.** `playmaker quotas` now carries an `ollama`
|
|
80
|
+
provider for work dispatched through `opencode -m ollama/<tag>`. It is an
|
|
81
|
+
availability signal rather than a quota: `ok` at 100% with the pulled chat
|
|
82
|
+
models listed when the daemon is up and a completion-capable model is
|
|
83
|
+
present; `unsupported` — naming the exact `ollama pull` to run — when Ollama
|
|
84
|
+
is down or holds only embedding models, so an idle daemon with
|
|
85
|
+
`nomic-embed-text` never reads as free 27B capacity. Models are classified by
|
|
86
|
+
`/api/show` `capabilities`, not by name. The renderer for the provider
|
|
87
|
+
shipped in 0.7.2 ahead of the probe.
|
|
88
|
+
|
|
8
89
|
## [0.7.2] - 2026-08-18
|
|
9
90
|
|
|
10
91
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: playmaker-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Playing-coach CLI for orchestrating Claude Code, Codex, Antigravity and opencode sub-agents in parallel.
|
|
5
5
|
Project-URL: Homepage, https://github.com/vladsafedev/playmaker
|
|
6
6
|
Project-URL: Repository, https://github.com/vladsafedev/playmaker
|
|
@@ -196,12 +196,45 @@ reviewing it is cheap — lives in
|
|
|
196
196
|
that ships with the package:
|
|
197
197
|
|
|
198
198
|
```bash
|
|
199
|
-
playmaker skill install # ~/.claude/skills/playmaker-coach/
|
|
199
|
+
playmaker skill install # ~/.claude/skills/playmaker-coach/
|
|
200
200
|
```
|
|
201
201
|
|
|
202
|
-
Then give any Claude Code session a
|
|
203
|
-
proposes a split with per-model quota rationale, waits for
|
|
204
|
-
out, and
|
|
202
|
+
Then give any Claude Code session a task that changes code and it activates:
|
|
203
|
+
proposes a split into work packages with per-model quota rationale, waits for
|
|
204
|
+
your approval, fans out, and — this is the second half of the loop — puts every
|
|
205
|
+
resulting diff through a **review board** before it lands.
|
|
206
|
+
|
|
207
|
+
The skill installs as a directory: `SKILL.md` is the protocol, `references/`
|
|
208
|
+
holds the parts the coach loads on demand, and `scripts/review-board.sh` is the
|
|
209
|
+
review fan-out.
|
|
210
|
+
|
|
211
|
+
### The review board
|
|
212
|
+
|
|
213
|
+
Reviewing a diff carefully is the most expensive thing a coach can do with its
|
|
214
|
+
own context, and it has an objective output — findings with evidence. So it is
|
|
215
|
+
delegated too. One command snapshots the work package's diff, hands it to
|
|
216
|
+
independent reviewer agents on different lanes (each with a distinct lens:
|
|
217
|
+
correctness, contracts, risk, conventions), and asks each to *refute* the
|
|
218
|
+
implementation against its acceptance criteria:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
review-board.sh <wp> <base-ref> --risk normal --gate "npm run typecheck" --impl-agent codex
|
|
222
|
+
review-board.sh --collect <wp>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Reviewers run `--read-only` and return a fixed JSON verdict — severity, file,
|
|
226
|
+
line, and a concrete failure scenario per finding. The coach reads verdicts
|
|
227
|
+
rather than code, arbitrates, and sends a numbered fix list back into the
|
|
228
|
+
implementer's live session with `playmaker continue`. Which lanes review which
|
|
229
|
+
risk class is configuration, in `.playmaker/reviewers.conf`.
|
|
230
|
+
|
|
231
|
+
### Policy lives outside the skill
|
|
232
|
+
|
|
233
|
+
Before planning, the coach reads `./.playmaker/policy.md` (repo) and
|
|
234
|
+
`~/.playmaker/policy.md` (personal) and lets them override the skill's defaults
|
|
235
|
+
— which quotas to spare, which lanes are contended, what juniors may never
|
|
236
|
+
touch in this repo, which commands are the acceptance gates. Keep your own
|
|
237
|
+
rules there and `playmaker skill install --force` stays a safe upgrade.
|
|
205
238
|
|
|
206
239
|
## Commands
|
|
207
240
|
|
|
@@ -213,13 +246,14 @@ playmaker dispatch <agent> --prompt "..." # detached by default
|
|
|
213
246
|
[--model NAME] # forwarded to the agent's own CLI
|
|
214
247
|
[--cwd DIR]
|
|
215
248
|
[--files PATH...]
|
|
249
|
+
[--expect-changes|--read-only]
|
|
216
250
|
[--sync] # block and print the final answer
|
|
217
251
|
[--parent ID] # link lineage to an earlier session
|
|
218
252
|
[--batch LABEL] # group a fan-out; one summary ping
|
|
219
253
|
playmaker continue <id> --prompt "..." # follow-up inside the live session
|
|
220
|
-
[--model NAME] [--files PATH...] [--sync]
|
|
254
|
+
[--model NAME] [--files PATH...] [--expect-changes|--read-only] [--sync]
|
|
221
255
|
|
|
222
|
-
playmaker list [--status running|done|failed] [--agent NAME] [--limit N]
|
|
256
|
+
playmaker list [--status running|done|failed|no_changes] [--agent NAME] [--limit N]
|
|
223
257
|
playmaker get <id> [--wait] [--poll SECONDS]
|
|
224
258
|
playmaker summary <id> # last 2 assistant messages
|
|
225
259
|
playmaker thread <id> [--last N] [--all] [--role assistant|user|tool]
|
|
@@ -233,6 +267,10 @@ playmaker skill install [--dir PATH] [--force]
|
|
|
233
267
|
`dispatch`, `continue`, `list`, `get`, `thread` and `quotas` all take `--json`
|
|
234
268
|
for scripting.
|
|
235
269
|
|
|
270
|
+
Write-shaped prompts are checked for file changes at completion. A zero-change
|
|
271
|
+
write task becomes `no_changes`; use `--read-only` for recon or answer-only
|
|
272
|
+
work, or `--expect-changes` to force the check for an otherwise ambiguous prompt.
|
|
273
|
+
|
|
236
274
|
**`continue` vs a fresh `dispatch`.** `continue` sends a follow-up into the
|
|
237
275
|
agent's existing session, so its reasoning, tool history and file context are
|
|
238
276
|
still live — that's the cheap path for "almost right, fix Y". Start fresh with
|
|
@@ -169,12 +169,45 @@ reviewing it is cheap — lives in
|
|
|
169
169
|
that ships with the package:
|
|
170
170
|
|
|
171
171
|
```bash
|
|
172
|
-
playmaker skill install # ~/.claude/skills/playmaker-coach/
|
|
172
|
+
playmaker skill install # ~/.claude/skills/playmaker-coach/
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
-
Then give any Claude Code session a
|
|
176
|
-
proposes a split with per-model quota rationale, waits for
|
|
177
|
-
out, and
|
|
175
|
+
Then give any Claude Code session a task that changes code and it activates:
|
|
176
|
+
proposes a split into work packages with per-model quota rationale, waits for
|
|
177
|
+
your approval, fans out, and — this is the second half of the loop — puts every
|
|
178
|
+
resulting diff through a **review board** before it lands.
|
|
179
|
+
|
|
180
|
+
The skill installs as a directory: `SKILL.md` is the protocol, `references/`
|
|
181
|
+
holds the parts the coach loads on demand, and `scripts/review-board.sh` is the
|
|
182
|
+
review fan-out.
|
|
183
|
+
|
|
184
|
+
### The review board
|
|
185
|
+
|
|
186
|
+
Reviewing a diff carefully is the most expensive thing a coach can do with its
|
|
187
|
+
own context, and it has an objective output — findings with evidence. So it is
|
|
188
|
+
delegated too. One command snapshots the work package's diff, hands it to
|
|
189
|
+
independent reviewer agents on different lanes (each with a distinct lens:
|
|
190
|
+
correctness, contracts, risk, conventions), and asks each to *refute* the
|
|
191
|
+
implementation against its acceptance criteria:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
review-board.sh <wp> <base-ref> --risk normal --gate "npm run typecheck" --impl-agent codex
|
|
195
|
+
review-board.sh --collect <wp>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Reviewers run `--read-only` and return a fixed JSON verdict — severity, file,
|
|
199
|
+
line, and a concrete failure scenario per finding. The coach reads verdicts
|
|
200
|
+
rather than code, arbitrates, and sends a numbered fix list back into the
|
|
201
|
+
implementer's live session with `playmaker continue`. Which lanes review which
|
|
202
|
+
risk class is configuration, in `.playmaker/reviewers.conf`.
|
|
203
|
+
|
|
204
|
+
### Policy lives outside the skill
|
|
205
|
+
|
|
206
|
+
Before planning, the coach reads `./.playmaker/policy.md` (repo) and
|
|
207
|
+
`~/.playmaker/policy.md` (personal) and lets them override the skill's defaults
|
|
208
|
+
— which quotas to spare, which lanes are contended, what juniors may never
|
|
209
|
+
touch in this repo, which commands are the acceptance gates. Keep your own
|
|
210
|
+
rules there and `playmaker skill install --force` stays a safe upgrade.
|
|
178
211
|
|
|
179
212
|
## Commands
|
|
180
213
|
|
|
@@ -186,13 +219,14 @@ playmaker dispatch <agent> --prompt "..." # detached by default
|
|
|
186
219
|
[--model NAME] # forwarded to the agent's own CLI
|
|
187
220
|
[--cwd DIR]
|
|
188
221
|
[--files PATH...]
|
|
222
|
+
[--expect-changes|--read-only]
|
|
189
223
|
[--sync] # block and print the final answer
|
|
190
224
|
[--parent ID] # link lineage to an earlier session
|
|
191
225
|
[--batch LABEL] # group a fan-out; one summary ping
|
|
192
226
|
playmaker continue <id> --prompt "..." # follow-up inside the live session
|
|
193
|
-
[--model NAME] [--files PATH...] [--sync]
|
|
227
|
+
[--model NAME] [--files PATH...] [--expect-changes|--read-only] [--sync]
|
|
194
228
|
|
|
195
|
-
playmaker list [--status running|done|failed] [--agent NAME] [--limit N]
|
|
229
|
+
playmaker list [--status running|done|failed|no_changes] [--agent NAME] [--limit N]
|
|
196
230
|
playmaker get <id> [--wait] [--poll SECONDS]
|
|
197
231
|
playmaker summary <id> # last 2 assistant messages
|
|
198
232
|
playmaker thread <id> [--last N] [--all] [--role assistant|user|tool]
|
|
@@ -206,6 +240,10 @@ playmaker skill install [--dir PATH] [--force]
|
|
|
206
240
|
`dispatch`, `continue`, `list`, `get`, `thread` and `quotas` all take `--json`
|
|
207
241
|
for scripting.
|
|
208
242
|
|
|
243
|
+
Write-shaped prompts are checked for file changes at completion. A zero-change
|
|
244
|
+
write task becomes `no_changes`; use `--read-only` for recon or answer-only
|
|
245
|
+
work, or `--expect-changes` to force the check for an otherwise ambiguous prompt.
|
|
246
|
+
|
|
209
247
|
**`continue` vs a fresh `dispatch`.** `continue` sends a follow-up into the
|
|
210
248
|
agent's existing session, so its reasoning, tool history and file context are
|
|
211
249
|
still live — that's the cheap path for "almost right, fix Y". Start fresh with
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playmaker-coach
|
|
3
|
+
description: Team-lead mode for coding work. Decompose the task into work packages, dispatch them to Claude/Codex/Antigravity(agy)/opencode workers through the `playmaker` CLI, then run an automatic multi-agent review board over every diff before it lands, and drive the fix cycles. Use for ANY request that will change code in more than one place, needs an independent review pass, or has two or more parts that can run at once — "implement", "add", "fix", "refactor", "wire up", "сделай", "почини", "добавь", "реализуй", "собери". NOT for answering a question, reading or explaining code, a single-line edit, or a git/ops command.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# playmaker-coach — you are the tech lead, not the typist
|
|
7
|
+
|
|
8
|
+
`playmaker` dispatches sub-tasks to Codex / Antigravity (`agy`) / opencode / a sibling Claude,
|
|
9
|
+
tracks them, and returns their threads. This skill is the judgment on top: what to split,
|
|
10
|
+
who gets which slice, how to size it so verifying is cheap, and **how the review board runs**.
|
|
11
|
+
|
|
12
|
+
**The coach produces plans, prompts, verdicts and integration — not feature diffs.** Your context
|
|
13
|
+
window is the most expensive resource on the table. Every file you read yourself and every line you
|
|
14
|
+
type yourself is one a cheaper worker could have produced. Push out implementation, recon,
|
|
15
|
+
summarization, and even the drafting of worker prompts when the task is big enough.
|
|
16
|
+
|
|
17
|
+
Two loops run under your hand, always both:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
decompose → dispatch → prove on disk → REVIEW BOARD → adjudicate → continue → land
|
|
21
|
+
↑______________________|
|
|
22
|
+
max 2 cycles
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 1. Activation gate
|
|
26
|
+
|
|
27
|
+
Run this gate on every request that touches code. It has three questions:
|
|
28
|
+
|
|
29
|
+
1. **Will this change code in more than one file, or in one file in a way that deserves a second pair of eyes?**
|
|
30
|
+
2. **Are there ≥2 slices that could run at the same time** (backend + frontend, code + tests, two modules)?
|
|
31
|
+
3. **Is there a durable artefact** (a diff someone will have to live with), as opposed to an answer?
|
|
32
|
+
|
|
33
|
+
**Any "yes" → activate.** The default is delegation; doing it yourself is the exception you justify.
|
|
34
|
+
|
|
35
|
+
**Skip the skill** only for: a question, an explanation, reading/searching code, a one-line or
|
|
36
|
+
one-symbol edit, a git/ops command, or a task the user explicitly asked you to do by hand
|
|
37
|
+
("сам", "solo", "не делегируй", "just do it yourself").
|
|
38
|
+
|
|
39
|
+
Borderline single-WP tasks still activate — with **one** worker and the review board. The board is
|
|
40
|
+
the point: a single reviewed WP is a legitimate, common shape, not overhead.
|
|
41
|
+
|
|
42
|
+
## 2. Load policy before planning
|
|
43
|
+
|
|
44
|
+
Defaults in this file are the *mechanism*. The *policy* — which quota to spare, which lanes are
|
|
45
|
+
contended, what this repo forbids juniors to touch, which commands are the objective gates — lives
|
|
46
|
+
outside the skill so it survives `playmaker skill install --force`. Read, in this order, and let
|
|
47
|
+
later files override earlier ones:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cat ./.playmaker/policy.md 2>/dev/null # repo policy (gates, protected paths, conventions)
|
|
51
|
+
cat ~/.playmaker/policy.md 2>/dev/null # personal policy (quota economics, lane defaults)
|
|
52
|
+
ls ./.playmaker/agents/*.md 2>/dev/null || ls ~/.playmaker/agents/*.md 2>/dev/null
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Agent profiles describe each lane's strengths, ceiling, and quota position — trust a profile over
|
|
56
|
+
the generic defaults here. If no policy file exists, say so once in the plan and use these defaults.
|
|
57
|
+
|
|
58
|
+
## 3. Protocol
|
|
59
|
+
|
|
60
|
+
### 3.1 Recon — delegate it
|
|
61
|
+
|
|
62
|
+
Codebase exploration is the highest-leverage thing to delegate: raw reading is exactly what the
|
|
63
|
+
cheapest model does as well as you do. Before your own `grep`/`Read` sweep, dispatch a read-only
|
|
64
|
+
recon with an explicit deliverable and `--sync`, and read a 200-word report instead of ten files:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
playmaker dispatch agy --model <cheap-tier> --cwd "$(pwd)" --sync --read-only \
|
|
68
|
+
--prompt "Recon only — change nothing. Locate (a) …, (b) …, (c) …. Report under 200 words as a numbered list with file paths and line ranges."
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Skip it for one-file, one-symbol lookups — just `Grep`.
|
|
72
|
+
|
|
73
|
+
### 3.2 Quotas
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
playmaker quotas # capacity per MODEL, not per agent; re-probes itself when stale
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Read at model granularity: separate buckets inside one provider are separate capacity. The aim is
|
|
80
|
+
**level-loading** — finish the week with every pool drawn down evenly, except the one reserved for
|
|
81
|
+
the coach — not hoarding the pools other people also use. Details and per-provider quirks:
|
|
82
|
+
`references/quotas.md`.
|
|
83
|
+
|
|
84
|
+
### 3.3 Decompose into work packages
|
|
85
|
+
|
|
86
|
+
2–5 WPs on the first pass. A WP is dispatchable only when all five hold — this is what makes review
|
|
87
|
+
cheap and re-prompting rare:
|
|
88
|
+
|
|
89
|
+
1. **Hard file boundary.** "Edit only `x.ts` and its spec" — never "do the backend part".
|
|
90
|
+
2. **A gate the worker runs itself** — `tsc --noEmit`, a named spec file, a lint pass. It must exit 0
|
|
91
|
+
before the worker reports done, and its output goes in the final answer.
|
|
92
|
+
3. **A one-sentence done-condition** you can confirm in seconds. Can't write it? The WP isn't sized
|
|
93
|
+
yet — split or specify first.
|
|
94
|
+
4. **The context it lacks** pasted in: the spec excerpt, the neighbouring file to mirror, exact paths
|
|
95
|
+
of any notes worth reading.
|
|
96
|
+
5. **Match to the lane's ceiling.** Pattern-following inside a tight scope → juniors. Architectural
|
|
97
|
+
judgment, cross-module integration, spec interpretation → senior lane or you.
|
|
98
|
+
|
|
99
|
+
Smell test before dispatching: *"if this comes back done, do I verify it by running one command and
|
|
100
|
+
reading one paragraph — or by reading the whole diff and thinking hard?"* If the latter, re-scope.
|
|
101
|
+
|
|
102
|
+
Lane and tier selection: `references/lanes.md`. Risk classes and what juniors may never touch: repo
|
|
103
|
+
policy first, then `references/lanes.md`.
|
|
104
|
+
|
|
105
|
+
### 3.4 Propose, then wait
|
|
106
|
+
|
|
107
|
+
Post the plan as: WP → lane+model → why → gate → done-condition, plus the reviewer pair per WP and
|
|
108
|
+
the current per-model capacity. **Dispatch nothing until the user approves.** Approval may be
|
|
109
|
+
partial ("go but reroute tests"); restate the modified plan in one line, then dispatch.
|
|
110
|
+
|
|
111
|
+
### 3.5 Dispatch
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
B=<short-batch-label>
|
|
115
|
+
playmaker dispatch <agent> --model <name> --batch "$B" --cwd "$(pwd)" --prompt "<WP prompt>"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Detached by default — that is the point; never `--sync` a whole fan-out. Always pass `--cwd`,
|
|
119
|
+
`--batch` (one summary ping for the batch), and `--model` unless the profile says otherwise.
|
|
120
|
+
Prompt shape: `references/prompt-templates.md`. Per-agent traps (agy scratch dir, opencode relative
|
|
121
|
+
paths, codex model roster): `references/agent-gotchas.md`.
|
|
122
|
+
|
|
123
|
+
Parallel WPs that touch the same files go in **git worktrees**, one per WP, or they will collide.
|
|
124
|
+
|
|
125
|
+
### 3.6 Prove it on disk before you believe it
|
|
126
|
+
|
|
127
|
+
`done` means "the process exited cleanly with text", not "code changed". playmaker ≥0.9 marks a
|
|
128
|
+
zero-change write task `no_changes` — treat it exactly as a failure. On older builds, check yourself:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
git -C "<cwd>" status --short # empty tree on a write WP = NOT done
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Then run the WP's own gate yourself, once, cheaply. A WP that fails its gate never reaches the
|
|
135
|
+
review board — it goes straight back to the worker.
|
|
136
|
+
|
|
137
|
+
### 3.7 Review board — the mandatory second loop
|
|
138
|
+
|
|
139
|
+
**Every WP that changes code gets reviewed by agents, not by you reading the diff.** You read
|
|
140
|
+
verdicts, not code. Composition, prompts, the verdict contract and the cycle rules are in
|
|
141
|
+
`references/review-board.md`; the fan-out itself is one command:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
pm-review <wp-label> <base-ref> [--risk routine|normal|high] --gate "<cmd>" --impl-agent <lane>
|
|
145
|
+
pm-review --collect <wp-label> # once the review batch drains
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
(`pm-review` is `scripts/review-board.sh` from this skill; without the shortcut on `PATH`, call
|
|
149
|
+
`~/.claude/skills/playmaker-coach/scripts/review-board.sh` directly.)
|
|
150
|
+
|
|
151
|
+
Non-negotiables:
|
|
152
|
+
|
|
153
|
+
- **The implementer never reviews its own WP**, and reviewers do not see each other's verdicts.
|
|
154
|
+
- Reviewers are **`--read-only`** and prompted to **refute** the WP against its acceptance criteria,
|
|
155
|
+
not to summarize it.
|
|
156
|
+
- Every finding carries `file:line` + a concrete failure scenario. **No evidence → dropped.** You
|
|
157
|
+
arbitrate, and a reviewer's confidence is an input, not a verdict.
|
|
158
|
+
- Fixes go back via `playmaker continue <impl-id>` as a numbered list — the worker still has its
|
|
159
|
+
context. Re-review runs on the **delta only**.
|
|
160
|
+
- **Two cycles maximum.** Still blocking after two → stop and escalate to the user with both
|
|
161
|
+
verdicts. A third round at the same lane is the most expensive way to use a cheap model.
|
|
162
|
+
- Land only at **zero blocking findings**.
|
|
163
|
+
|
|
164
|
+
### 3.8 Keep a board file
|
|
165
|
+
|
|
166
|
+
Long fan-outs outlive your context. Maintain `./.playmaker/board.md` — one row per WP:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
| WP | lane/model | impl id | gate | reviewers (ids) | verdict | cycle | state |
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Update it at dispatch, at gate, after each review round. On resume, read the board before anything
|
|
173
|
+
else. It is also what you paste back to the user as the status report.
|
|
174
|
+
|
|
175
|
+
### 3.9 Failures
|
|
176
|
+
|
|
177
|
+
Surface them; never silently retry. A failed dispatch (missing binary, bad auth, rejected model)
|
|
178
|
+
gets a re-routed plan proposed to the user, not a second attempt at the same string. Diagnosis per
|
|
179
|
+
agent: `references/agent-gotchas.md`.
|
|
180
|
+
|
|
181
|
+
## 4. What the coach may still type by hand
|
|
182
|
+
|
|
183
|
+
Allowed: integration glue between WPs, conflict resolution, config/one-liners smaller than the
|
|
184
|
+
prompt that would describe them, and the final commit. Everything else — including "it's faster if
|
|
185
|
+
I just do it" — is the anti-pattern this skill exists to kill. If you catch yourself opening an
|
|
186
|
+
editor on product code, ask whether that is a WP you failed to write.
|
|
187
|
+
|
|
188
|
+
## 5. Reference index
|
|
189
|
+
|
|
190
|
+
| File | Read it when |
|
|
191
|
+
|---|---|
|
|
192
|
+
| `references/lanes.md` | choosing an agent/model, junior-vs-senior routing, escalation |
|
|
193
|
+
| `references/review-board.md` | any review round — composition, prompts, verdict contract, cycles |
|
|
194
|
+
| `references/prompt-templates.md` | writing a WP, reviewer, or follow-up prompt |
|
|
195
|
+
| `references/quotas.md` | reading `playmaker quotas`, per-provider bucket structure |
|
|
196
|
+
| `references/agent-gotchas.md` | a dispatch behaved strangely, or before a first dispatch to a lane |
|
|
197
|
+
| `references/commands.md` | exact CLI surface and flags |
|
|
198
|
+
|
|
199
|
+
## 6. Anti-patterns
|
|
200
|
+
|
|
201
|
+
- **Doing the work "because it's faster".** It isn't, once review is counted — and it burns the
|
|
202
|
+
scarcest bucket in the room.
|
|
203
|
+
- **Skipping the review board on a small WP.** Small WPs are where unreviewed bugs hide; the board
|
|
204
|
+
costs one command.
|
|
205
|
+
- **Reading diffs instead of verdicts.** Reviewers exist to keep the diff out of your context.
|
|
206
|
+
- **Reviewing with the implementer's own lane**, or letting reviewers see each other's output.
|
|
207
|
+
- **Trusting `done`** without a disk check and a gate.
|
|
208
|
+
- **A third fix cycle.** Escalate instead.
|
|
209
|
+
- **Dispatching a WP you cannot verify in one command and one paragraph.**
|
|
210
|
+
- **Omitting `--model`** and letting a CLI default drain a top-tier bucket.
|
|
211
|
+
- **Reading whole agent threads** when `summary` answers the question.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Per-agent traps
|
|
2
|
+
|
|
3
|
+
Read the entry for a lane before your first dispatch to it in a session, and whenever a dispatch
|
|
4
|
+
behaves strangely.
|
|
5
|
+
|
|
6
|
+
## Universal: proof on disk, not status
|
|
7
|
+
|
|
8
|
+
`playmaker` marks a session `done` when the process exits cleanly with text output. On builds with
|
|
9
|
+
the no-change check, a write task that touched nothing lands as **`no_changes`** — terminal, but not
|
|
10
|
+
success: it pings immediately even inside a batch and is excluded from the batch's completed count.
|
|
11
|
+
On older builds, check it yourself after every write task:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git -C "<cwd>" status --short # empty tree on a write WP = NOT done
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Batch summaries (`N/N done`) are transport truth, not result truth. Treat an empty tree exactly like
|
|
18
|
+
a failure: read `summary`, then decide `continue` versus a re-dispatch to another lane.
|
|
19
|
+
|
|
20
|
+
## Bad `--model` is the classic silent failure
|
|
21
|
+
|
|
22
|
+
playmaker catches both known shapes — a codex model/auth failure raises `codex turn failed: …`, and
|
|
23
|
+
an unknown agy model raises with the valid roster *before* dispatch. So a dispatch that comes back
|
|
24
|
+
failed with a model message means: fix the string, do not retry it. For agy and opencode, copy the
|
|
25
|
+
line from `agy models` / `opencode models` rather than typing it.
|
|
26
|
+
|
|
27
|
+
## claude (sibling)
|
|
28
|
+
|
|
29
|
+
- Runs with `--permission-mode acceptEdits`: it edits and runs commands freely **inside `--cwd`** and
|
|
30
|
+
is refused outside it. A WP that legitimately needs a sibling repo or a dotfile in `$HOME` comes
|
|
31
|
+
back refused — the fix is a different `--cwd`, not a re-prompt.
|
|
32
|
+
- Zero changes usually means one of: it tried to write outside `--cwd`, or the run needed a
|
|
33
|
+
permission the configured mode does not grant (an "I need your permission" answer, not a crash).
|
|
34
|
+
- Default `--model sonnet`; omitting `--model` can put mid-tier work on the scarce top bucket.
|
|
35
|
+
|
|
36
|
+
## agy (Antigravity)
|
|
37
|
+
|
|
38
|
+
- The agent's shell lives in a **private scratch directory**, not the workspace. playmaker prepends a
|
|
39
|
+
workspace preamble, but reinforce it: phrase file instructions as workspace-relative or absolute
|
|
40
|
+
paths, **never "the current directory"**.
|
|
41
|
+
- A `done` with no file changes usually means the files landed in agy's scratch dir
|
|
42
|
+
(`~/.gemini/antigravity-cli/scratch/`). Re-dispatch with explicit paths.
|
|
43
|
+
- Its own default model is top tier, so **always pass `--model`** on a dispatch meant to be cheap.
|
|
44
|
+
- Its **5-hour** windows are what a fan-out drains first; the Gemini family and the Claude/GPT family
|
|
45
|
+
have separate ones.
|
|
46
|
+
|
|
47
|
+
## codex
|
|
48
|
+
|
|
49
|
+
- The model roster depends on the account plan, and an unavailable name fails the whole dispatch.
|
|
50
|
+
**Omitting `--model` is the safe default here** — it uses whatever the account actually has.
|
|
51
|
+
|
|
52
|
+
## opencode
|
|
53
|
+
|
|
54
|
+
- Models are `provider/model` and the default is invisible: without `--model` it falls through to
|
|
55
|
+
opencode's own last interactive pick, which is not written to its config file. Pin
|
|
56
|
+
`[agents.opencode] model` in `~/.playmaker/config.toml`, or pass `--model` every time.
|
|
57
|
+
- **GLM drops the leading `/` of absolute paths.** `/tmp/x/hello.txt` becomes `tmp/x/hello.txt` and
|
|
58
|
+
lands under `<cwd>/tmp/x/…`, while the agent reports "Wrote file successfully". So: never put an
|
|
59
|
+
absolute path in an opencode prompt, open with *"Working directory is the repo root; use paths
|
|
60
|
+
RELATIVE to it for every file operation, never absolute"*, still pass `--cwd`, and after `done`
|
|
61
|
+
check for a directory named after the cwd's own path components (`<cwd>/Users/…`, `<cwd>/private/…`)
|
|
62
|
+
— that is where the writes went.
|
|
63
|
+
- Second failure mode: on a large task it may produce ten minutes of good analysis and exit `done`
|
|
64
|
+
with zero writes. Size opencode write tasks to roughly 100 lines of output or split them.
|
|
65
|
+
- Neither trap applies to **review** dispatches, which write nothing — which makes opencode a
|
|
66
|
+
perfectly good reviewer even where it is a shaky implementer.
|
|
67
|
+
|
|
68
|
+
## Worktrees
|
|
69
|
+
|
|
70
|
+
Parallel WPs that touch the same files collide. Give each its own git worktree and dispatch with
|
|
71
|
+
`--cwd <worktree>`. In JS monorepos remember the worktree needs its `node_modules` (symlink the
|
|
72
|
+
store and repoint workspace packages) or the WP's gate silently cannot run — and a gate that cannot
|
|
73
|
+
run is a WP that was never verified.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Command surface
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
playmaker agents # who is installed and reachable
|
|
5
|
+
playmaker quotas [--refresh] # capacity, per provider and per model
|
|
6
|
+
playmaker dispatch <agent> --prompt "..." # detached by default
|
|
7
|
+
[--model NAME] [--cwd DIR] [--files PATH...]
|
|
8
|
+
[--batch LABEL] # group a fan-out into one summary ping
|
|
9
|
+
[--parent ID] # link lineage to an earlier session
|
|
10
|
+
[--read-only|--expect-changes]
|
|
11
|
+
[--sync] # block and print the final answer
|
|
12
|
+
playmaker continue <id> --prompt "..." # follow-up inside the live session
|
|
13
|
+
[--model NAME] [--files ...] [--read-only|--expect-changes] [--sync]
|
|
14
|
+
playmaker list [--status running|done|failed|no_changes] [--agent NAME] [--limit N]
|
|
15
|
+
playmaker get <id> [--wait] [--poll SECONDS]
|
|
16
|
+
playmaker summary <id> # last 2 assistant messages
|
|
17
|
+
playmaker thread <id> [--last N] [--all] [--role assistant|user|tool]
|
|
18
|
+
[--include-tools] [--max-bytes N] [--follow]
|
|
19
|
+
playmaker logs <id> [--follow] # subprocess stdout for detached runs
|
|
20
|
+
playmaker kill <id>
|
|
21
|
+
playmaker watch # live TUI
|
|
22
|
+
playmaker skill install [--dir PATH] [--force]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Every command takes `--json`.
|
|
26
|
+
|
|
27
|
+
- `--model` is forwarded verbatim to the agent's own CLI and stored on the session row, so
|
|
28
|
+
`continue` and detached re-runs inherit it; `continue --model X` overrides one turn.
|
|
29
|
+
- `--batch LABEL` on every dispatch of one fan-out suppresses per-agent success pings and fires a
|
|
30
|
+
single "N/N done" summary when the batch drains. Failures still ping immediately.
|
|
31
|
+
- `--read-only` marks recon and review dispatches so the zero-change check does not flag them;
|
|
32
|
+
`--expect-changes` forces the check on an ambiguous write prompt.
|
|
33
|
+
- `continue` beats a fresh `dispatch` for "almost right, fix Y" — the session still holds the
|
|
34
|
+
worker's reasoning, tool history and file context. Start fresh with `--parent <id>` only when that
|
|
35
|
+
context has become a liability (requirements moved, the worker is looping).
|
|
36
|
+
|
|
37
|
+
## Reading discipline
|
|
38
|
+
|
|
39
|
+
`summary` first — it usually answers "is it done and what does it claim". Escalate to
|
|
40
|
+
`thread <id> --last N` only when summary is insufficient, and to `--all --include-tools` only when
|
|
41
|
+
actively debugging why a worker went sideways. A long thread is tens of thousands of tokens;
|
|
42
|
+
`--max-bytes` is a safety cap, not a substitute for deciding what you need first.
|