pincer-workflow 0.2.1 → 0.2.3
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.
- package/README.md +14 -22
- package/bin/pincer.js +10 -13
- package/package.json +1 -1
- package/template/{.codex/prompts/pincer-code.md → .agents/skills/pincer-code/SKILL.md} +9 -5
- package/template/{.codex/prompts/pincer-evaluate.md → .agents/skills/pincer-evaluate/SKILL.md} +7 -3
- package/template/{.codex/prompts/pincer-narrow.md → .agents/skills/pincer-narrow/SKILL.md} +8 -4
- package/template/{.codex/prompts/pincer-plan.md → .agents/skills/pincer-plan/SKILL.md} +10 -6
- package/template/{.codex/prompts/pincer-release.md → .agents/skills/pincer-release/SKILL.md} +7 -3
- package/template/{.codex/prompts/pincer-status.md → .agents/skills/pincer-status/SKILL.md} +6 -2
- package/template/.claude/commands/pincer-code.md +2 -2
- package/template/.codex/README.md +22 -18
- package/template/.github/prompts/pincer-code.prompt.md +2 -2
- package/template/AGENTS.md +1 -1
- package/template/docs/dry-run-checklist.md +1 -1
- package/template/scripts/sync-prompts.sh +16 -8
package/README.md
CHANGED
|
@@ -27,10 +27,9 @@ Then follow the chain — the same five steps on every platform:
|
|
|
27
27
|
`/pincer-status` shows where the workflow stands at any point (PRD, tickets,
|
|
28
28
|
receipts, elapsed time, next command) — run it first in a new session.
|
|
29
29
|
|
|
30
|
-
On Codex CLI the
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
and `/prompts:pincer-status`.
|
|
30
|
+
On Codex CLI the commands are skills, invoked by mention rather than slash:
|
|
31
|
+
`$pincer-plan <brief>` → `$pincer-narrow` → `$pincer-code` → `$pincer-evaluate`
|
|
32
|
+
→ `$pincer-release`, and `$pincer-status`.
|
|
34
33
|
|
|
35
34
|
### Claude Code
|
|
36
35
|
|
|
@@ -40,20 +39,13 @@ the destructive-command and ticket-guard hooks install to `.claude/`. Start
|
|
|
40
39
|
|
|
41
40
|
### Codex CLI
|
|
42
41
|
|
|
43
|
-
`AGENTS.md` loads natively,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
Then `/prompts:pincer-plan <brief>` and the rest of the chain are available in
|
|
53
|
-
every Codex session. The playbooks refer to each other by their short names
|
|
54
|
-
(`/pincer-narrow` etc.) — read those as `/prompts:pincer-narrow` in Codex.
|
|
55
|
-
Re-run the copy after `npx pincer-workflow@latest update` or after editing a
|
|
56
|
-
playbook; `update` prints the reminder.
|
|
42
|
+
Works immediately as well: `AGENTS.md` loads natively, and the six commands
|
|
43
|
+
install as skills under `.agents/skills/`, which Codex discovers from the repo
|
|
44
|
+
(no copying into your home directory — Codex removed custom prompts and
|
|
45
|
+
`~/.codex/prompts/` in early 2026). Start `codex` in the repo, then type
|
|
46
|
+
`$pincer-plan <brief>`; `$` opens the skill picker and `/skills` lists what
|
|
47
|
+
loaded. Inside the Codex skills every cross-reference already reads
|
|
48
|
+
`$pincer-narrow`, `$pincer-status` and so on.
|
|
57
49
|
|
|
58
50
|
Codex has no PreToolUse hooks, so the guardrail posture lives in
|
|
59
51
|
`~/.codex/config.toml` instead — `approval_policy = "on-request"` and
|
|
@@ -61,7 +53,7 @@ Codex has no PreToolUse hooks, so the guardrail posture lives in
|
|
|
61
53
|
ticket scripts (`scripts/pincer-ticket.sh`, `scripts/pincer-status.sh`) are
|
|
62
54
|
plain bash and work unchanged; the rule in `AGENTS.md` against hand-editing
|
|
63
55
|
ticket state carries the weight the hook carries on Claude Code, and
|
|
64
|
-
|
|
56
|
+
`$pincer-status` flags any ticket marked done without a receipt.
|
|
65
57
|
Full notes in `.codex/README.md`.
|
|
66
58
|
|
|
67
59
|
### GitHub Copilot (VS Code)
|
|
@@ -94,7 +86,7 @@ want the repo-side rules too can copy `AGENTS.md` from the
|
|
|
94
86
|
npx pincer-workflow@latest update
|
|
95
87
|
```
|
|
96
88
|
|
|
97
|
-
Files you never touched are refreshed in place. (Installs older than v0.2.0 gain the ticket state machine, the status report and the ticket-guard hook on update; `.claude/settings.json` conflicts if you edited it — merge the new hook entry from the `.new` file. v0.2.
|
|
89
|
+
Files you never touched are refreshed in place. (Installs older than v0.2.0 gain the ticket state machine, the status report and the ticket-guard hook on update; `.claude/settings.json` conflicts if you edited it — merge the new hook entry from the `.new` file. v0.2.2 replaces the Codex adapter: the commands are now skills in `.agents/skills/` invoked as `$pincer-*`, since Codex no longer loads `~/.codex/prompts/` — you can delete the copies there. v0.2.3 ships the playbooks, rubrics and templates under `.claude/` on every platform, which Codex- and Copilot-only installs were missing.) Files you edited are left
|
|
98
90
|
alone — the new version lands next to them as `<file>.new` for a manual merge.
|
|
99
91
|
`npx pincer-workflow doctor` checks the health of an install (hook executable,
|
|
100
92
|
`.gitignore` covering `.env*`, no unmerged `*.new` files, version current).
|
|
@@ -104,12 +96,12 @@ alone — the new version lands next to them as `<file>.new` for a manual merge.
|
|
|
104
96
|
| Piece | Purpose |
|
|
105
97
|
| --- | --- |
|
|
106
98
|
| `AGENTS.md` | Project rules, single cross-platform source (workflow order, security defaults, secrets, untrusted-content and dependency rules) |
|
|
107
|
-
| `.claude/commands/` | The five playbooks plus `/pincer-status` (canonical — adapters are generated from them) |
|
|
99
|
+
| `.claude/commands/` | The five playbooks plus `/pincer-status` (canonical — adapters are generated from them; ships on every platform together with `agents/` and `references/`) |
|
|
108
100
|
| `.claude/agents/` | `codebase-explorer` and `code-quality-reviewer` subagents, with inline fallbacks for platforms without subagents |
|
|
109
101
|
| `scripts/pincer-ticket.sh` | The ticket state machine: `start` (enforces dependency order) → `verify` (runs the ticket's check, stamps a receipt only on green) → `done` (refuses without a matching receipt or with unticked criteria) |
|
|
110
102
|
| `scripts/pincer-status.sh` | Read-only state report: PRD, every ticket with clock-based elapsed time, blocked tickets, build time vs budget, next command |
|
|
111
103
|
| `.claude/hooks/` + `settings.json` | Mechanical guardrails: `.env` files unreadable, destructive commands blocked, ticket state fields writable only through the script |
|
|
112
|
-
| `.codex/` · `.github/` | Generated Codex and Copilot
|
|
104
|
+
| `.agents/skills/` · `.codex/` · `.github/` | Generated Codex skills and Copilot prompt files + platform wiring (`.codex/README.md` covers the Codex posture) |
|
|
113
105
|
| `scripts/sync-prompts.sh` | Regenerates the adapters after you edit a playbook |
|
|
114
106
|
| `scripts/build-plugin.sh` | Regenerates the Claude Code plugin (`plugin/`) from the template |
|
|
115
107
|
| `docs/dry-run-checklist.md` | The workflow's own test — audited by `/pincer-release` |
|
package/bin/pincer.js
CHANGED
|
@@ -20,10 +20,14 @@ const TEMPLATE = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '
|
|
|
20
20
|
const VERSION = createRequire(import.meta.url)('../package.json').version;
|
|
21
21
|
const MANIFEST = '.pincer.json';
|
|
22
22
|
|
|
23
|
+
// The playbooks, subagent rubrics and PRD/ticket templates under .claude/ are
|
|
24
|
+
// the canonical kit and are read by every platform's adapter (the Codex skills
|
|
25
|
+
// and Copilot prompts point at them), so they ship everywhere; only Claude
|
|
26
|
+
// Code's own wiring (CLAUDE.md, settings.json, hooks) is platform-specific.
|
|
23
27
|
const PLATFORM_ROOTS = {
|
|
24
|
-
common: ['AGENTS.md', 'docs/dry-run-checklist.md', 'scripts/sync-prompts.sh', 'scripts/pincer-ticket.sh', 'scripts/pincer-status.sh'],
|
|
25
|
-
claude: ['CLAUDE.md', '.claude'],
|
|
26
|
-
codex: ['.codex'],
|
|
28
|
+
common: ['AGENTS.md', 'docs/dry-run-checklist.md', 'scripts/sync-prompts.sh', 'scripts/pincer-ticket.sh', 'scripts/pincer-status.sh', '.claude/commands', '.claude/agents', '.claude/references'],
|
|
29
|
+
claude: ['CLAUDE.md', '.claude/settings.json', '.claude/hooks'],
|
|
30
|
+
codex: ['.codex', '.agents'],
|
|
27
31
|
copilot: ['.github'],
|
|
28
32
|
};
|
|
29
33
|
const EXECUTABLES = ['scripts/sync-prompts.sh', 'scripts/pincer-ticket.sh', 'scripts/pincer-status.sh', '.claude/hooks/block-dangerous.sh', '.claude/hooks/ticket-guard.sh'];
|
|
@@ -123,24 +127,20 @@ function report({ written, skipped, conflicted }) {
|
|
|
123
127
|
}
|
|
124
128
|
}
|
|
125
129
|
|
|
126
|
-
// Codex loads custom prompts from ~/.codex/prompts/ only and never creates that
|
|
127
|
-
// directory itself — a bare `cp` there fails with "Not a directory" on a fresh machine.
|
|
128
|
-
const CODEX_INSTALL = 'mkdir -p ~/.codex/prompts && cp .codex/prompts/*.md ~/.codex/prompts/';
|
|
129
|
-
|
|
130
130
|
function nextSteps(platforms) {
|
|
131
131
|
console.log('\nNext steps:');
|
|
132
132
|
if (platforms.includes('claude')) {
|
|
133
133
|
console.log(' Claude Code start `claude` in this repo and run /pincer-plan <brief>');
|
|
134
134
|
}
|
|
135
135
|
if (platforms.includes('codex')) {
|
|
136
|
-
console.log(
|
|
137
|
-
console.log(' (once; Codex has no repo-local prompts) then `codex` and /prompts:pincer-plan <brief> — posture notes in .codex/README.md');
|
|
136
|
+
console.log(' Codex CLI start `codex` in this repo and type $pincer-plan <brief> (skills load from .agents/skills/; posture notes in .codex/README.md)');
|
|
138
137
|
}
|
|
139
138
|
if (platforms.includes('copilot')) {
|
|
140
139
|
console.log(' Copilot enable "chat.promptFiles": true in VS Code settings, then /pincer-plan in chat');
|
|
141
140
|
}
|
|
142
141
|
console.log(' All rules live in AGENTS.md — fill in its Conventions section once you know the stack.');
|
|
143
|
-
|
|
142
|
+
const statusCmd = platforms.every((p) => p === 'codex') ? '$pincer-status' : platforms.includes('codex') ? '/pincer-status, $pincer-status on Codex' : '/pincer-status';
|
|
143
|
+
console.log(` Any session scripts/pincer-status.sh shows where the workflow stands (also ${statusCmd})`);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
async function askPlatforms() {
|
|
@@ -185,9 +185,6 @@ async function cmdUpdate() {
|
|
|
185
185
|
if (!manifest) fail(`no ${MANIFEST} here — run \`pincer init\` first.`);
|
|
186
186
|
console.log(`\nUpdating PINCER ${manifest.version} -> ${VERSION} for: ${manifest.platforms.join(', ')}\n`);
|
|
187
187
|
report(install(dir, manifest.platforms, manifest.files));
|
|
188
|
-
if (manifest.platforms.includes('codex')) {
|
|
189
|
-
console.log(`\n Codex uses global prompts — re-run: ${CODEX_INSTALL}`);
|
|
190
|
-
}
|
|
191
188
|
}
|
|
192
189
|
|
|
193
190
|
function cmdDoctor() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pincer-workflow",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "PINCER — a PRD-driven agentic delivery workflow for Claude Code, Codex CLI, and GitHub Copilot. Plan · Investigate · Narrow · Code · Evaluate · Release.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"pincer": "bin/pincer.js"
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pincer-code
|
|
3
|
+
description: "Implement tickets sequentially with verification and one commit per ticket"
|
|
4
|
+
---
|
|
1
5
|
<!-- Generated from .claude/commands/pincer-code.md by scripts/sync-prompts.sh — edit the source, not this file -->
|
|
2
6
|
|
|
3
7
|
|
|
4
|
-
#
|
|
8
|
+
# $pincer-code — Ticket Implementation
|
|
5
9
|
|
|
6
10
|
You are implementing the tickets in `tickets/` sequentially. Mostly autonomous: after the
|
|
7
11
|
user confirms the starting point, run continuously and report progress between tickets.
|
|
8
12
|
|
|
9
|
-
**Initial request:**
|
|
13
|
+
**Initial request:** the text that follows the `$pincer-code` mention in the user's message (ask for it if there is none)
|
|
10
14
|
|
|
11
15
|
Ticket state lives in the ticket file's frontmatter and is written **only** by
|
|
12
16
|
`scripts/pincer-ticket.sh` (`start` → `verify` → `done`). `verify` runs the ticket's
|
|
@@ -26,7 +30,7 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
26
30
|
1. **Start:** `scripts/pincer-ticket.sh start T-{NN}` — refuses while a `depends_on` ticket
|
|
27
31
|
isn't done, and stamps the start time. Read the ticket and the files it references.
|
|
28
32
|
Announce: "Starting T-{NN}: {title}."
|
|
29
|
-
2. **Implement.** Follow the conventions in `
|
|
33
|
+
2. **Implement.** Follow the conventions in `AGENTS.md` and the PRD's architecture and
|
|
30
34
|
visual direction. Installing a dependency not named in the PRD's architecture is a
|
|
31
35
|
stop-and-ask: verify it's the real package on the registry (linked repo, downloads —
|
|
32
36
|
hallucinated names get typosquatted), say why it earns its place, and wait for a yes.
|
|
@@ -45,7 +49,7 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
45
49
|
`.env.example` as a blocker.
|
|
46
50
|
- External input touched by this diff is validated server-side, and untrusted
|
|
47
51
|
content (user input, LLM output) is escaped where rendered — per the
|
|
48
|
-
Security defaults in `
|
|
52
|
+
Security defaults in `AGENTS.md`.
|
|
49
53
|
- No error path leaks internals (stack traces, key names with values) to the client.
|
|
50
54
|
If the review changed code, run `verify` again — the receipt must match the code you commit.
|
|
51
55
|
5. **Close the ticket:** tick every verified acceptance-criteria checkbox (`- [ ]` → `- [x]`;
|
|
@@ -67,4 +71,4 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
67
71
|
## When all tickets are done
|
|
68
72
|
|
|
69
73
|
Update the PRD to `status: built`, then finish with:
|
|
70
|
-
"All tickets built. Run
|
|
74
|
+
"All tickets built. Run `$pincer-evaluate` for a final quality pass."
|
package/template/{.codex/prompts/pincer-evaluate.md → .agents/skills/pincer-evaluate/SKILL.md}
RENAMED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pincer-evaluate
|
|
3
|
+
description: "Final quality pass over everything built — high-confidence findings only"
|
|
4
|
+
---
|
|
1
5
|
<!-- Generated from .claude/commands/pincer-evaluate.md by scripts/sync-prompts.sh — edit the source, not this file -->
|
|
2
6
|
|
|
3
7
|
|
|
4
|
-
#
|
|
8
|
+
# $pincer-evaluate — Final Quality Pass
|
|
5
9
|
|
|
6
10
|
You are reviewing all work built this session against the PRD and tickets. Autonomous —
|
|
7
11
|
run the pipeline, then present results.
|
|
@@ -10,7 +14,7 @@ run the pipeline, then present results.
|
|
|
10
14
|
|
|
11
15
|
1. Run `scripts/pincer-status.sh`. Every ticket should be `done` with a receipt; if one
|
|
12
16
|
is still open or in progress, stop and ask whether it was cut (then it goes in the
|
|
13
|
-
PRD's Out of Scope) or should be finished first via
|
|
17
|
+
PRD's Out of Scope) or should be finished first via `$pincer-code`. Then get the full
|
|
14
18
|
diff of the session: `git log --oneline` and `git diff <first-commit>..HEAD`.
|
|
15
19
|
2. Dispatch a `code-quality-reviewer` agent with: the diff, the PRD's Success Criteria and
|
|
16
20
|
Scope sections, and the list of tickets. If the diff is large, split by area and
|
|
@@ -44,5 +48,5 @@ run the pipeline, then present results.
|
|
|
44
48
|
its place, and what breaks first as the code ages (the riskiest assumption, the
|
|
45
49
|
least-tested path). Commit it. This is the first document a reviewer of this repo
|
|
46
50
|
should read.
|
|
47
|
-
10. Suggest
|
|
51
|
+
10. Suggest `$pincer-release` as the final step: "Run `$pincer-release` for a pass/fail audit of the
|
|
48
52
|
whole workflow's artifacts."
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pincer-narrow
|
|
3
|
+
description: "Turn the approved PRD into local, AI-ready ticket files"
|
|
4
|
+
---
|
|
1
5
|
<!-- Generated from .claude/commands/pincer-narrow.md by scripts/sync-prompts.sh — edit the source, not this file -->
|
|
2
6
|
|
|
3
7
|
|
|
4
|
-
#
|
|
8
|
+
# $pincer-narrow — PRD to Local Tickets
|
|
5
9
|
|
|
6
10
|
You are decomposing the PRD into small, independently verifiable tickets stored as local
|
|
7
11
|
markdown files (no external tracker needed). Target: 4–7 tickets that fit a ~75-minute
|
|
8
12
|
build window.
|
|
9
13
|
|
|
10
|
-
**Initial request:**
|
|
14
|
+
**Initial request:** the text that follows the `$pincer-narrow` mention in the user's message (ask for it if there is none)
|
|
11
15
|
|
|
12
16
|
## Steps
|
|
13
17
|
|
|
14
18
|
1. Run `scripts/pincer-status.sh`. If tickets already exist, ask before adding to them —
|
|
15
19
|
new tickets continue the numbering, existing ones are never renumbered. Then read the
|
|
16
|
-
PRD (`$
|
|
20
|
+
PRD (`the text that follows the `$pincer-narrow` mention in the user's message (ask for it if there is none)` or the latest `.prd/prd-v*.md`). If its status isn't `draft`, ask
|
|
17
21
|
which PRD to use.
|
|
18
22
|
2. Decompose into tickets. Rules:
|
|
19
23
|
- Each ticket is one coherent unit: sized S or M, never L. Split anything larger.
|
|
@@ -46,4 +50,4 @@ build window.
|
|
|
46
50
|
|
|
47
51
|
5. After approval, update the PRD frontmatter to `status: ticketed`, commit the tickets
|
|
48
52
|
(`git add .prd tickets && git commit`), and finish with:
|
|
49
|
-
"Tickets ready in `tickets/`. Run
|
|
53
|
+
"Tickets ready in `tickets/`. Run `$pincer-code` to start implementing."
|
|
@@ -1,21 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pincer-plan
|
|
3
|
+
description: "Create a PRD through brief discovery, codebase scan, and an architecture gate"
|
|
4
|
+
---
|
|
1
5
|
<!-- Generated from .claude/commands/pincer-plan.md by scripts/sync-prompts.sh — edit the source, not this file -->
|
|
2
6
|
|
|
3
7
|
|
|
4
|
-
#
|
|
8
|
+
# $pincer-plan — PRD Creation
|
|
5
9
|
|
|
6
10
|
You are turning a task brief into a compact PRD. This runs inside a short delivery
|
|
7
11
|
timebox (~2 hours total), so discovery is brief and the PRD is lean. The PRD feeds
|
|
8
|
-
|
|
12
|
+
`$pincer-narrow` next.
|
|
9
13
|
|
|
10
|
-
**Initial request:**
|
|
14
|
+
**Initial request:** the text that follows the `$pincer-plan` mention in the user's message (ask for it if there is none)
|
|
11
15
|
|
|
12
16
|
First run `scripts/pincer-status.sh`. If a PRD already exists, say so and ask whether
|
|
13
17
|
this is a new version of it (`.prd/prd-v{N+1}.md` — old versions are never overwritten)
|
|
14
|
-
or a fresh start; if tickets are in progress, stop and point at
|
|
18
|
+
or a fresh start; if tickets are in progress, stop and point at `$pincer-code` instead.
|
|
15
19
|
|
|
16
20
|
## Phase 1: Discovery (~5 min)
|
|
17
21
|
|
|
18
|
-
1. If `$
|
|
22
|
+
1. If `the text that follows the `$pincer-plan` mention in the user's message (ask for it if there is none)` contains the brief, extract what you can before asking anything.
|
|
19
23
|
Never ask a question the brief already answers.
|
|
20
24
|
2. Ask only the questions whose answers would change the architecture or scope.
|
|
21
25
|
Batch them (max 3–4 at once). Typical ones:
|
|
@@ -74,4 +78,4 @@ Propose the architecture: components, data flow, integration points, and key dec
|
|
|
74
78
|
4. If `.git/` doesn't exist, run `git init` and make an initial commit containing the
|
|
75
79
|
PRD and this `.claude/` setup — planning should be visible in the history.
|
|
76
80
|
|
|
77
|
-
Finish with: "PRD saved to `.prd/prd-v1.md`. Run
|
|
81
|
+
Finish with: "PRD saved to `.prd/prd-v1.md`. Run `$pincer-narrow` to break it into work items."
|
package/template/{.codex/prompts/pincer-release.md → .agents/skills/pincer-release/SKILL.md}
RENAMED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pincer-release
|
|
3
|
+
description: "Audit the repo against the workflow checklist — pass/fail per item, no fixes"
|
|
4
|
+
---
|
|
1
5
|
<!-- Generated from .claude/commands/pincer-release.md by scripts/sync-prompts.sh — edit the source, not this file -->
|
|
2
6
|
|
|
3
7
|
|
|
4
|
-
#
|
|
8
|
+
# $pincer-release — Workflow Audit
|
|
5
9
|
|
|
6
10
|
You are auditing the current repo state against `docs/dry-run-checklist.md`. Read-only:
|
|
7
11
|
report pass/fail, never fix anything — fixes belong to the stage commands.
|
|
8
12
|
|
|
9
|
-
**Requested stage:**
|
|
13
|
+
**Requested stage:** the text that follows the `$pincer-release` mention in the user's message (ask for it if there is none)
|
|
10
14
|
|
|
11
15
|
## Steps
|
|
12
16
|
|
|
13
17
|
1. Read `docs/dry-run-checklist.md` — it is the source of truth for what to check.
|
|
14
18
|
2. Run `scripts/pincer-status.sh` to determine which stages have run (it reads `.prd/`,
|
|
15
|
-
`tickets/`, `NOTES.md`; add `git log`). If `$
|
|
19
|
+
`tickets/`, `NOTES.md`; add `git log`). If `the text that follows the `$pincer-release` mention in the user's message (ask for it if there is none)` names a stage, check only up
|
|
16
20
|
to that stage.
|
|
17
21
|
3. Check every applicable item mechanically where possible:
|
|
18
22
|
- File existence and frontmatter: read the files.
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pincer-status
|
|
3
|
+
description: "Where the workflow stands — PRD, tickets, receipts, elapsed time, next action"
|
|
4
|
+
---
|
|
1
5
|
<!-- Generated from .claude/commands/pincer-status.md by scripts/sync-prompts.sh — edit the source, not this file -->
|
|
2
6
|
|
|
3
7
|
|
|
4
|
-
#
|
|
8
|
+
# $pincer-status — Where are we?
|
|
5
9
|
|
|
6
10
|
You are orienting in a repo that uses PINCER, typically after a context reset or at the
|
|
7
11
|
start of a session. Read-only: change nothing.
|
|
@@ -15,5 +19,5 @@ start of a session. Read-only: change nothing.
|
|
|
15
19
|
2. Report in three lines: where the workflow is, what is in progress or blocked, and the
|
|
16
20
|
next command. Quote the `Next` line as-is.
|
|
17
21
|
3. If a ticket is `in_progress`, read it and `git status`, then offer to resume it with
|
|
18
|
-
|
|
22
|
+
`$pincer-code T-{NN}`. If the script printed a warning, surface it — a done ticket
|
|
19
23
|
without a receipt was marked by hand and needs `scripts/pincer-ticket.sh verify T-{NN}`.
|
|
@@ -28,7 +28,7 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
28
28
|
1. **Start:** `scripts/pincer-ticket.sh start T-{NN}` — refuses while a `depends_on` ticket
|
|
29
29
|
isn't done, and stamps the start time. Read the ticket and the files it references.
|
|
30
30
|
Announce: "Starting T-{NN}: {title}."
|
|
31
|
-
2. **Implement.** Follow the conventions in `
|
|
31
|
+
2. **Implement.** Follow the conventions in `AGENTS.md` and the PRD's architecture and
|
|
32
32
|
visual direction. Installing a dependency not named in the PRD's architecture is a
|
|
33
33
|
stop-and-ask: verify it's the real package on the registry (linked repo, downloads —
|
|
34
34
|
hallucinated names get typosquatted), say why it earns its place, and wait for a yes.
|
|
@@ -47,7 +47,7 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
47
47
|
`.env.example` as a blocker.
|
|
48
48
|
- External input touched by this diff is validated server-side, and untrusted
|
|
49
49
|
content (user input, LLM output) is escaped where rendered — per the
|
|
50
|
-
Security defaults in `
|
|
50
|
+
Security defaults in `AGENTS.md`.
|
|
51
51
|
- No error path leaks internals (stack traces, key names with values) to the client.
|
|
52
52
|
If the review changed code, run `verify` again — the receipt must match the code you commit.
|
|
53
53
|
5. **Close the ticket:** tick every verified acceptance-criteria checkbox (`- [ ]` → `- [x]`;
|
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
# PINCER on Codex CLI
|
|
2
2
|
|
|
3
3
|
Codex reads `AGENTS.md` at the repo root natively — the project rules apply
|
|
4
|
-
with no setup. The workflow commands
|
|
5
|
-
|
|
4
|
+
with no setup. The workflow commands ship as **skills** in `.agents/skills/`,
|
|
5
|
+
which Codex discovers from the repo on its own (Codex removed custom prompts
|
|
6
|
+
and `~/.codex/prompts/` in early 2026 — openai/codex#16115 — so there is
|
|
7
|
+
nothing to copy into your home directory).
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
Skills are invoked by mention: type `$` and pick from the list, or write the
|
|
10
|
+
name directly:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
$pincer-plan <brief>
|
|
14
|
+
$pincer-narrow → $pincer-code → $pincer-evaluate → $pincer-release
|
|
15
|
+
$pincer-status
|
|
9
16
|
```
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
`/prompts:pincer-narrow`, `/prompts:pincer-code`, `/prompts:pincer-evaluate`,
|
|
15
|
-
`/prompts:pincer-release` and `/prompts:pincer-status` in any Codex session.
|
|
16
|
-
The playbooks refer to each other by their short names (`/pincer-narrow` etc.);
|
|
17
|
-
read those as `/prompts:pincer-narrow` here.
|
|
18
|
+
The skills point at the canonical playbooks, the two subagent rubrics and the
|
|
19
|
+
PRD/ticket templates under `.claude/` — those ship on every platform, so the
|
|
20
|
+
directory is expected here even without Claude Code.
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
`/skills` lists what Codex has loaded — the six `pincer-*` entries should be
|
|
23
|
+
there whenever you start `codex` inside this repo. The skills are generated
|
|
24
|
+
from `.claude/commands/` by `scripts/sync-prompts.sh` (cross-references are
|
|
25
|
+
rewritten from `/pincer-*` to `$pincer-*`, and the argument placeholder becomes
|
|
26
|
+
"the text after the mention") — edit the source playbooks, re-run the script,
|
|
27
|
+
commit the result.
|
|
24
28
|
|
|
25
29
|
## Recommended posture (`~/.codex/config.toml`)
|
|
26
30
|
|
|
@@ -35,10 +39,10 @@ sandbox_mode = "workspace-write" # writes confined to the repo; no network by
|
|
|
35
39
|
The ticket scripts are plain bash and work here unchanged:
|
|
36
40
|
`scripts/pincer-ticket.sh start|verify|done T-NN` and `scripts/pincer-status.sh`.
|
|
37
41
|
What Codex lacks is the hook that stops an agent hand-editing ticket state, so the
|
|
38
|
-
rule in `AGENTS.md` carries that weight;
|
|
42
|
+
rule in `AGENTS.md` carries that weight; `$pincer-status` warns about any ticket
|
|
39
43
|
marked done without a receipt.
|
|
40
44
|
|
|
41
45
|
Never run with approvals disabled. The destructive-command rule in `AGENTS.md`
|
|
42
46
|
(no force-pushes, absolute-path deletes, or `curl | sh` by an agent) applies as
|
|
43
|
-
a standing instruction here;
|
|
47
|
+
a standing instruction here; `$pincer-release` audits the git artifacts
|
|
44
48
|
afterwards, which is platform-independent by design.
|
|
@@ -30,7 +30,7 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
30
30
|
1. **Start:** `scripts/pincer-ticket.sh start T-{NN}` — refuses while a `depends_on` ticket
|
|
31
31
|
isn't done, and stamps the start time. Read the ticket and the files it references.
|
|
32
32
|
Announce: "Starting T-{NN}: {title}."
|
|
33
|
-
2. **Implement.** Follow the conventions in `
|
|
33
|
+
2. **Implement.** Follow the conventions in `AGENTS.md` and the PRD's architecture and
|
|
34
34
|
visual direction. Installing a dependency not named in the PRD's architecture is a
|
|
35
35
|
stop-and-ask: verify it's the real package on the registry (linked repo, downloads —
|
|
36
36
|
hallucinated names get typosquatted), say why it earns its place, and wait for a yes.
|
|
@@ -49,7 +49,7 @@ from wherever the receipt says you are. Confirm the starting point with the user
|
|
|
49
49
|
`.env.example` as a blocker.
|
|
50
50
|
- External input touched by this diff is validated server-side, and untrusted
|
|
51
51
|
content (user input, LLM output) is escaped where rendered — per the
|
|
52
|
-
Security defaults in `
|
|
52
|
+
Security defaults in `AGENTS.md`.
|
|
53
53
|
- No error path leaks internals (stack traces, key names with values) to the client.
|
|
54
54
|
If the review changed code, run `verify` again — the receipt must match the code you commit.
|
|
55
55
|
5. **Close the ticket:** tick every verified acceptance-criteria checkbox (`- [ ]` → `- [x]`;
|
package/template/AGENTS.md
CHANGED
|
@@ -22,7 +22,7 @@ the next command — run it first in any new session. Do not write feature code
|
|
|
22
22
|
a PRD exists and tickets are approved.
|
|
23
23
|
|
|
24
24
|
The commands live as playbooks in `.claude/commands/` (canonical), with
|
|
25
|
-
generated adapters in `.
|
|
25
|
+
generated adapters in `.agents/skills/` (Codex) and `.github/prompts/` (Copilot). If your
|
|
26
26
|
platform has no slash commands, read the playbook file and follow it directly.
|
|
27
27
|
|
|
28
28
|
## Conventions
|
|
@@ -72,7 +72,7 @@ Use a throwaway copy of this repo and a cheap model (`claude --model sonnet`).
|
|
|
72
72
|
- [ ] Brownfield only: untested load-bearing code got a characterization test
|
|
73
73
|
before being modified
|
|
74
74
|
- [ ] Platform adapters in sync: `scripts/sync-prompts.sh` then `git status`
|
|
75
|
-
shows no changes in `.
|
|
75
|
+
shows no changes in `.agents/skills/` or `.github/prompts/`
|
|
76
76
|
- [ ] `scripts/pincer-status.sh` says `Next /pincer-release` and its build elapsed
|
|
77
77
|
figure fit the ~75-minute build budget (note where time went if not)
|
|
78
78
|
- [ ] Total wall-clock time fit the ~2-hour budget
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
# PINCER playbooks in .claude/commands/. The playbooks are the single source
|
|
4
4
|
# of truth: edit them, re-run this script, commit the result.
|
|
5
5
|
#
|
|
6
|
-
# .
|
|
7
|
-
#
|
|
8
|
-
#
|
|
6
|
+
# .agents/skills/pincer-*/SKILL.md — Codex CLI skills (repo-local; Codex
|
|
7
|
+
# removed custom prompts in 0.9x, see
|
|
8
|
+
# openai/codex#16115). Invoke by typing
|
|
9
|
+
# $pincer-plan <brief> in a Codex session.
|
|
9
10
|
# .github/prompts/pincer-*.prompt.md — VS Code Copilot prompt files
|
|
10
11
|
# (enable: "chat.promptFiles": true)
|
|
11
12
|
set -euo pipefail
|
|
12
13
|
cd "$(dirname "$0")/.."
|
|
13
14
|
|
|
14
|
-
mkdir -p .
|
|
15
|
+
mkdir -p .agents/skills .github/prompts
|
|
15
16
|
|
|
16
17
|
count=0
|
|
17
18
|
for src in .claude/commands/pincer-*.md; do
|
|
@@ -19,11 +20,18 @@ for src in .claude/commands/pincer-*.md; do
|
|
|
19
20
|
desc=$(sed -n 's/^description: *"\{0,1\}\([^"]*\)"\{0,1\}$/\1/p' "$src" | head -1)
|
|
20
21
|
body=$(awk 'flag; /^---$/ { if (++c == 2) flag = 1 }' "$src")
|
|
21
22
|
|
|
22
|
-
# Codex:
|
|
23
|
+
# Codex: one skill directory per playbook. Skills have no $ARGUMENTS
|
|
24
|
+
# substitution and are invoked as $name mentions, so the argument placeholder
|
|
25
|
+
# becomes prose and cross-references to /pincer-* become $pincer-* (the
|
|
26
|
+
# leading-context guard keeps paths like scripts/pincer-status.sh intact).
|
|
27
|
+
mkdir -p ".agents/skills/$name"
|
|
23
28
|
{
|
|
29
|
+
printf -- '---\nname: %s\ndescription: "%s"\n---\n' "$name" "$desc"
|
|
24
30
|
printf '<!-- Generated from %s by scripts/sync-prompts.sh — edit the source, not this file -->\n\n' "$src"
|
|
25
|
-
printf '%s\n' "$body"
|
|
26
|
-
|
|
31
|
+
printf '%s\n' "$body" \
|
|
32
|
+
| sed "s/\$ARGUMENTS/the text that follows the \`\$$name\` mention in the user's message (ask for it if there is none)/g" \
|
|
33
|
+
| sed -e 's#^/pincer-\([a-z]*\)#$pincer-\1#' -e 's#\([^A-Za-z0-9_./]\)/pincer-\([a-z]*\)#\1$pincer-\2#g'
|
|
34
|
+
} > ".agents/skills/$name/SKILL.md"
|
|
27
35
|
|
|
28
36
|
# Copilot: prompt-file frontmatter; $ARGUMENTS becomes an input variable.
|
|
29
37
|
{
|
|
@@ -35,4 +43,4 @@ for src in .claude/commands/pincer-*.md; do
|
|
|
35
43
|
count=$((count + 1))
|
|
36
44
|
done
|
|
37
45
|
|
|
38
|
-
echo "Synced $count playbooks -> .
|
|
46
|
+
echo "Synced $count playbooks -> .agents/skills/ and .github/prompts/"
|