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 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 same commands carry the `/prompts:` prefix Codex gives every
31
- custom prompt: `/prompts:pincer-plan <brief>` → `/prompts:pincer-narrow` →
32
- `/prompts:pincer-code` `/prompts:pincer-evaluate` `/prompts:pincer-release`,
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, so the rules apply with no setup. Codex reads
44
- custom prompts only from `~/.codex/prompts/` (there is no repo-local location)
45
- and does not create that directory itself, so install the prompts once:
46
-
47
- ```bash
48
- mkdir -p ~/.codex/prompts && cp .codex/prompts/*.md ~/.codex/prompts/
49
- codex
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
- `/prompts:pincer-status` flags any ticket marked done without a receipt.
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.1 corrects the Codex install step: `~/.codex/prompts/` must be created first, and the commands are invoked as `/prompts:pincer-*`.) Files you edited are left
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 adapters + platform wiring (`.codex/README.md` covers the Codex install and posture) |
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(` Codex CLI ${CODEX_INSTALL}`);
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
- console.log(' Any session scripts/pincer-status.sh shows where the workflow stands (also /pincer-status)');
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.1",
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
- # /pincer-code — Ticket Implementation
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:** $ARGUMENTS
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 `CLAUDE.md` and the PRD's architecture and
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 `CLAUDE.md`.
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 `/pincer-evaluate` for a final quality pass."
74
+ "All tickets built. Run `$pincer-evaluate` for a final quality pass."
@@ -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
- # /pincer-evaluate — Final Quality Pass
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 `/pincer-code`. Then get the full
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 `/pincer-release` as the final step: "Run `/pincer-release` for a pass/fail audit of the
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
- # /pincer-narrow — PRD to Local Tickets
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:** $ARGUMENTS
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 (`$ARGUMENTS` or the latest `.prd/prd-v*.md`). If its status isn't `draft`, ask
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 `/pincer-code` to start implementing."
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
- # /pincer-plan — PRD Creation
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
- `/pincer-narrow` next.
12
+ `$pincer-narrow` next.
9
13
 
10
- **Initial request:** $ARGUMENTS
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 `/pincer-code` instead.
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 `$ARGUMENTS` contains the brief, extract what you can before asking anything.
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 `/pincer-narrow` to break it into work items."
81
+ Finish with: "PRD saved to `.prd/prd-v1.md`. Run `$pincer-narrow` to break it into work items."
@@ -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
- # /pincer-release — Workflow Audit
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:** $ARGUMENTS
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 `$ARGUMENTS` names a stage, check only up
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
- # /pincer-status — Where are we?
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
- `/pincer-code T-{NN}`. If the script printed a warning, surface it — a done ticket
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 `CLAUDE.md` and the PRD's architecture and
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 `CLAUDE.md`.
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 need one install step, because Codex
5
- loads custom prompts from your home directory, not the repo:
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
- ```bash
8
- mkdir -p ~/.codex/prompts && cp .codex/prompts/*.md ~/.codex/prompts/
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
- (`mkdir -p` matters: Codex does not create `~/.codex/prompts/` on its own, and
12
- `cp` into a missing directory fails with "Not a directory".) Codex exposes custom
13
- prompts under a `/prompts:` prefix, so the commands are `/prompts:pincer-plan`,
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
- The copy is not tracked by `pincer update`: after `npx pincer-workflow@latest update`
20
- (or after editing a playbook and re-running `scripts/sync-prompts.sh`), run the
21
- `mkdir -p && cp …` line again so `~/.codex/prompts/` matches the repo. These files are
22
- generated from `.claude/commands/` by `scripts/sync-prompts.sh` edit the
23
- source playbooks, not these copies, and re-copy after a re-sync.
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; `/pincer-status` warns about any ticket
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; `/pincer-release` audits the git artifacts
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 `CLAUDE.md` and the PRD's architecture and
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 `CLAUDE.md`.
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]`;
@@ -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 `.codex/prompts/` and `.github/prompts/`. If your
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 `.codex/prompts/` or `.github/prompts/`
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
- # .codex/prompts/pincer-*.md — Codex CLI custom prompts
7
- # (install: mkdir -p ~/.codex/prompts && cp .codex/prompts/*.md ~/.codex/prompts/;
8
- # invoked as /prompts:pincer-*)
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 .codex/prompts .github/prompts
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: plain markdown prompt; $ARGUMENTS is supported natively.
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
- } > ".codex/prompts/$name.md"
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 -> .codex/prompts/ and .github/prompts/"
46
+ echo "Synced $count playbooks -> .agents/skills/ and .github/prompts/"