pincer-workflow 0.2.0 → 0.2.2

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
@@ -18,7 +18,7 @@ cd your-project
18
18
  npx pincer-workflow init # asks which platform(s) you use
19
19
  ```
20
20
 
21
- Then follow the chain — identical on every platform:
21
+ Then follow the chain — the same five steps on every platform:
22
22
 
23
23
  ```
24
24
  /pincer-plan <brief> → /pincer-narrow → /pincer-code → /pincer-evaluate → /pincer-release
@@ -27,14 +27,39 @@ Then follow the chain — identical 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
- Per-platform notes printed by `init`:
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`.
31
33
 
32
- - **Claude Code** — works immediately; commands, subagents, permission deny
33
- rules, and a destructive-command hook install to `.claude/`.
34
- - **Codex CLI** rules load natively from `AGENTS.md`; copy the prompts once:
35
- `cp .codex/prompts/*.md ~/.codex/prompts/` (posture notes in `.codex/README.md`).
36
- - **Copilot (VS Code)** enable `"chat.promptFiles": true`, then run
37
- `/pincer-plan` in chat; `.github/copilot-instructions.md` is wired to `AGENTS.md`.
34
+ ### Claude Code
35
+
36
+ Works immediately: the commands, the two subagents, the `.env` deny rules and
37
+ the destructive-command and ticket-guard hooks install to `.claude/`. Start
38
+ `claude` in the repo and run `/pincer-plan <brief>`.
39
+
40
+ ### Codex CLI
41
+
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.
49
+
50
+ Codex has no PreToolUse hooks, so the guardrail posture lives in
51
+ `~/.codex/config.toml` instead — `approval_policy = "on-request"` and
52
+ `sandbox_mode = "workspace-write"`; never run with approvals disabled. The
53
+ ticket scripts (`scripts/pincer-ticket.sh`, `scripts/pincer-status.sh`) are
54
+ plain bash and work unchanged; the rule in `AGENTS.md` against hand-editing
55
+ ticket state carries the weight the hook carries on Claude Code, and
56
+ `$pincer-status` flags any ticket marked done without a receipt.
57
+ Full notes in `.codex/README.md`.
58
+
59
+ ### GitHub Copilot (VS Code)
60
+
61
+ Enable `"chat.promptFiles": true` in VS Code settings, then run `/pincer-plan`
62
+ in chat. `.github/copilot-instructions.md` is wired to `AGENTS.md`.
38
63
 
39
64
  ## Claude Code plugin (alternative)
40
65
 
@@ -61,7 +86,7 @@ want the repo-side rules too can copy `AGENTS.md` from the
61
86
  npx pincer-workflow@latest update
62
87
  ```
63
88
 
64
- 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.) 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.) Files you edited are left
65
90
  alone — the new version lands next to them as `<file>.new` for a manual merge.
66
91
  `npx pincer-workflow doctor` checks the health of an install (hook executable,
67
92
  `.gitignore` covering `.env*`, no unmerged `*.new` files, version current).
@@ -76,7 +101,7 @@ alone — the new version lands next to them as `<file>.new` for a manual merge.
76
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) |
77
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 |
78
103
  | `.claude/hooks/` + `settings.json` | Mechanical guardrails: `.env` files unreadable, destructive commands blocked, ticket state fields writable only through the script |
79
- | `.codex/` · `.github/` | Generated Codex and Copilot adapters + platform wiring |
104
+ | `.agents/skills/` · `.codex/` · `.github/` | Generated Codex skills and Copilot prompt files + platform wiring (`.codex/README.md` covers the Codex posture) |
80
105
  | `scripts/sync-prompts.sh` | Regenerates the adapters after you edit a playbook |
81
106
  | `scripts/build-plugin.sh` | Regenerates the Claude Code plugin (`plugin/`) from the template |
82
107
  | `docs/dry-run-checklist.md` | The workflow's own test — audited by `/pincer-release` |
package/bin/pincer.js CHANGED
@@ -23,7 +23,7 @@ const MANIFEST = '.pincer.json';
23
23
  const PLATFORM_ROOTS = {
24
24
  common: ['AGENTS.md', 'docs/dry-run-checklist.md', 'scripts/sync-prompts.sh', 'scripts/pincer-ticket.sh', 'scripts/pincer-status.sh'],
25
25
  claude: ['CLAUDE.md', '.claude'],
26
- codex: ['.codex'],
26
+ codex: ['.codex', '.agents'],
27
27
  copilot: ['.github'],
28
28
  };
29
29
  const EXECUTABLES = ['scripts/sync-prompts.sh', 'scripts/pincer-ticket.sh', 'scripts/pincer-status.sh', '.claude/hooks/block-dangerous.sh', '.claude/hooks/ticket-guard.sh'];
@@ -129,13 +129,14 @@ function nextSteps(platforms) {
129
129
  console.log(' Claude Code start `claude` in this repo and run /pincer-plan <brief>');
130
130
  }
131
131
  if (platforms.includes('codex')) {
132
- console.log(' Codex CLI cp .codex/prompts/*.md ~/.codex/prompts/ (once; posture notes in .codex/README.md)');
132
+ 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)');
133
133
  }
134
134
  if (platforms.includes('copilot')) {
135
135
  console.log(' Copilot enable "chat.promptFiles": true in VS Code settings, then /pincer-plan in chat');
136
136
  }
137
137
  console.log(' All rules live in AGENTS.md — fill in its Conventions section once you know the stack.');
138
- console.log(' Any session scripts/pincer-status.sh shows where the workflow stands (also /pincer-status)');
138
+ const statusCmd = platforms.every((p) => p === 'codex') ? '$pincer-status' : platforms.includes('codex') ? '/pincer-status, $pincer-status on Codex' : '/pincer-status';
139
+ console.log(` Any session scripts/pincer-status.sh shows where the workflow stands (also ${statusCmd})`);
139
140
  }
140
141
 
141
142
  async function askPlatforms() {
@@ -180,9 +181,6 @@ async function cmdUpdate() {
180
181
  if (!manifest) fail(`no ${MANIFEST} here — run \`pincer init\` first.`);
181
182
  console.log(`\nUpdating PINCER ${manifest.version} -> ${VERSION} for: ${manifest.platforms.join(', ')}\n`);
182
183
  report(install(dir, manifest.platforms, manifest.files));
183
- if (manifest.platforms.includes('codex')) {
184
- console.log('\n Codex uses global prompts — re-run: cp .codex/prompts/*.md ~/.codex/prompts/');
185
- }
186
184
  }
187
185
 
188
186
  function cmdDoctor() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pincer-workflow",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
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
@@ -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}`.
@@ -1,17 +1,26 @@
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
- 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
- Then `/pincer-plan`, `/pincer-narrow`, `/pincer-code`, `/pincer-evaluate`,
12
- and `/pincer-release` are available in any Codex session. These files are
13
- generated from `.claude/commands/` by `scripts/sync-prompts.sh` edit the
14
- source playbooks, not these copies, and re-copy after a re-sync.
18
+ `/skills` lists what Codex has loaded — the six `pincer-*` entries should be
19
+ there whenever you start `codex` inside this repo. The skills are generated
20
+ from `.claude/commands/` by `scripts/sync-prompts.sh` (cross-references are
21
+ rewritten from `/pincer-*` to `$pincer-*`, and the argument placeholder becomes
22
+ "the text after the mention") — edit the source playbooks, re-run the script,
23
+ commit the result.
15
24
 
16
25
  ## Recommended posture (`~/.codex/config.toml`)
17
26
 
@@ -26,10 +35,10 @@ sandbox_mode = "workspace-write" # writes confined to the repo; no network by
26
35
  The ticket scripts are plain bash and work here unchanged:
27
36
  `scripts/pincer-ticket.sh start|verify|done T-NN` and `scripts/pincer-status.sh`.
28
37
  What Codex lacks is the hook that stops an agent hand-editing ticket state, so the
29
- rule in `AGENTS.md` carries that weight; `/pincer-status` warns about any ticket
38
+ rule in `AGENTS.md` carries that weight; `$pincer-status` warns about any ticket
30
39
  marked done without a receipt.
31
40
 
32
41
  Never run with approvals disabled. The destructive-command rule in `AGENTS.md`
33
42
  (no force-pushes, absolute-path deletes, or `curl | sh` by an agent) applies as
34
- a standing instruction here; `/pincer-release` audits the git artifacts
43
+ a standing instruction here; `$pincer-release` audits the git artifacts
35
44
  afterwards, which is platform-independent by design.
@@ -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,14 +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: cp .codex/prompts/*.md ~/.codex/prompts/)
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.
8
10
  # .github/prompts/pincer-*.prompt.md — VS Code Copilot prompt files
9
11
  # (enable: "chat.promptFiles": true)
10
12
  set -euo pipefail
11
13
  cd "$(dirname "$0")/.."
12
14
 
13
- mkdir -p .codex/prompts .github/prompts
15
+ mkdir -p .agents/skills .github/prompts
14
16
 
15
17
  count=0
16
18
  for src in .claude/commands/pincer-*.md; do
@@ -18,11 +20,18 @@ for src in .claude/commands/pincer-*.md; do
18
20
  desc=$(sed -n 's/^description: *"\{0,1\}\([^"]*\)"\{0,1\}$/\1/p' "$src" | head -1)
19
21
  body=$(awk 'flag; /^---$/ { if (++c == 2) flag = 1 }' "$src")
20
22
 
21
- # 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"
22
28
  {
29
+ printf -- '---\nname: %s\ndescription: "%s"\n---\n' "$name" "$desc"
23
30
  printf '<!-- Generated from %s by scripts/sync-prompts.sh — edit the source, not this file -->\n\n' "$src"
24
- printf '%s\n' "$body"
25
- } > ".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"
26
35
 
27
36
  # Copilot: prompt-file frontmatter; $ARGUMENTS becomes an input variable.
28
37
  {
@@ -34,4 +43,4 @@ for src in .claude/commands/pincer-*.md; do
34
43
  count=$((count + 1))
35
44
  done
36
45
 
37
- echo "Synced $count playbooks -> .codex/prompts/ and .github/prompts/"
46
+ echo "Synced $count playbooks -> .agents/skills/ and .github/prompts/"