openplanr 1.4.2 → 1.5.0

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.
Files changed (83) hide show
  1. package/README.md +256 -250
  2. package/dist/cli/commands/init.d.ts.map +1 -1
  3. package/dist/cli/commands/init.js +14 -1
  4. package/dist/cli/commands/init.js.map +1 -1
  5. package/dist/cli/commands/linear.d.ts.map +1 -1
  6. package/dist/cli/commands/linear.js +5 -1
  7. package/dist/cli/commands/linear.js.map +1 -1
  8. package/dist/cli/commands/quick.d.ts.map +1 -1
  9. package/dist/cli/commands/quick.js +30 -6
  10. package/dist/cli/commands/quick.js.map +1 -1
  11. package/dist/cli/commands/rules.d.ts.map +1 -1
  12. package/dist/cli/commands/rules.js +10 -1
  13. package/dist/cli/commands/rules.js.map +1 -1
  14. package/dist/cli/commands/spec.js +1 -1
  15. package/dist/cli/commands/spec.js.map +1 -1
  16. package/dist/cli/commands/task.d.ts.map +1 -1
  17. package/dist/cli/commands/task.js +32 -6
  18. package/dist/cli/commands/task.js.map +1 -1
  19. package/dist/cli/commands/update.d.ts.map +1 -1
  20. package/dist/cli/commands/update.js +48 -2
  21. package/dist/cli/commands/update.js.map +1 -1
  22. package/dist/cli/helpers/bulk-checkbox-update.d.ts +41 -0
  23. package/dist/cli/helpers/bulk-checkbox-update.d.ts.map +1 -0
  24. package/dist/cli/helpers/bulk-checkbox-update.js +56 -0
  25. package/dist/cli/helpers/bulk-checkbox-update.js.map +1 -0
  26. package/dist/generators/base-generator.d.ts +15 -1
  27. package/dist/generators/base-generator.d.ts.map +1 -1
  28. package/dist/generators/base-generator.js +21 -0
  29. package/dist/generators/base-generator.js.map +1 -1
  30. package/dist/generators/claude-generator.d.ts.map +1 -1
  31. package/dist/generators/claude-generator.js +25 -8
  32. package/dist/generators/claude-generator.js.map +1 -1
  33. package/dist/generators/codex-generator.d.ts.map +1 -1
  34. package/dist/generators/codex-generator.js +17 -2
  35. package/dist/generators/codex-generator.js.map +1 -1
  36. package/dist/generators/cursor-generator.d.ts +4 -0
  37. package/dist/generators/cursor-generator.d.ts.map +1 -1
  38. package/dist/generators/cursor-generator.js +67 -8
  39. package/dist/generators/cursor-generator.js.map +1 -1
  40. package/dist/models/types.d.ts +11 -0
  41. package/dist/models/types.d.ts.map +1 -1
  42. package/dist/services/linear/body-formatters.d.ts +15 -4
  43. package/dist/services/linear/body-formatters.d.ts.map +1 -1
  44. package/dist/services/linear/body-formatters.js +16 -23
  45. package/dist/services/linear/body-formatters.js.map +1 -1
  46. package/dist/services/linear/plan-builders.d.ts +3 -2
  47. package/dist/services/linear/plan-builders.d.ts.map +1 -1
  48. package/dist/services/linear/plan-builders.js +9 -4
  49. package/dist/services/linear/plan-builders.js.map +1 -1
  50. package/dist/services/linear/task-status-aggregation.d.ts +25 -0
  51. package/dist/services/linear/task-status-aggregation.d.ts.map +1 -0
  52. package/dist/services/linear/task-status-aggregation.js +40 -0
  53. package/dist/services/linear/task-status-aggregation.js.map +1 -0
  54. package/dist/services/linear-pull-service.d.ts.map +1 -1
  55. package/dist/services/linear-pull-service.js +5 -8
  56. package/dist/services/linear-pull-service.js.map +1 -1
  57. package/dist/services/linear-push-service.d.ts +18 -2
  58. package/dist/services/linear-push-service.d.ts.map +1 -1
  59. package/dist/services/linear-push-service.js +114 -23
  60. package/dist/services/linear-push-service.js.map +1 -1
  61. package/dist/templates/rules/claude/CLAUDE.md.hbs +14 -0
  62. package/dist/templates/rules/claude/openplanr-pipeline.md.hbs +68 -0
  63. package/dist/templates/rules/codex/_pipeline-section.md.hbs +150 -0
  64. package/dist/templates/rules/cursor/agents/backend-agent.md +299 -0
  65. package/dist/templates/rules/cursor/agents/db-agent.md +163 -0
  66. package/dist/templates/rules/cursor/agents/designer-agent.md +219 -0
  67. package/dist/templates/rules/cursor/agents/devops-agent.md +197 -0
  68. package/dist/templates/rules/cursor/agents/doc-gen-agent.md +203 -0
  69. package/dist/templates/rules/cursor/agents/frontend-agent.md +220 -0
  70. package/dist/templates/rules/cursor/agents/qa-agent.md +170 -0
  71. package/dist/templates/rules/cursor/agents/specification-agent.md +282 -0
  72. package/dist/templates/rules/cursor/openplanr-pipeline-plan.mdc.hbs +194 -0
  73. package/dist/templates/rules/cursor/openplanr-pipeline-ship.mdc.hbs +242 -0
  74. package/dist/templates/rules/cursor/openplanr-pipeline.mdc.hbs +134 -0
  75. package/dist/utils/constants.d.ts +21 -0
  76. package/dist/utils/constants.d.ts.map +1 -1
  77. package/dist/utils/constants.js +21 -0
  78. package/dist/utils/constants.js.map +1 -1
  79. package/dist/utils/markdown.d.ts +8 -0
  80. package/dist/utils/markdown.d.ts.map +1 -1
  81. package/dist/utils/markdown.js +22 -0
  82. package/dist/utils/markdown.js.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,194 @@
1
+ ---
2
+ description: "OpenPlanr Pipeline — PO Phase orchestration (plan {feature}). Decomposes a spec into User Stories + Tasks. STOPS at the human-review gate."
3
+ globs: []
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # /plan {feature} — PO Phase orchestration (Cursor)
8
+
9
+ When the user says **"plan {feature}"** (or "decompose {feature}", or
10
+ similar), follow this rule end-to-end. The argument `{feature}` is the
11
+ feature slug (no `feat-` or `spec-` prefix).
12
+
13
+ **Hard rule R1: this command STOPS after writing US/Task files.** The user
14
+ must review and explicitly say "ship {feature}" before any DEV-Phase work.
15
+
16
+ ---
17
+
18
+ ## Step 1 — Mode detection + input validation
19
+
20
+ ### 1a — Detect planr spec mode
21
+
22
+ Before any other checks, look for `.planr/config.json` at the project root:
23
+
24
+ 1. If `.planr/config.json` exists AND its `idPrefix.spec` field is set,
25
+ assume **spec-driven mode**.
26
+ 2. In spec-driven mode, scan `.planr/specs/` for a directory matching
27
+ `^[A-Z]+-\d{3}-{feature}$`. The first match resolves to
28
+ `SPEC_DIR = .planr/specs/<that-dir>` (e.g.,
29
+ `.planr/specs/SPEC-001-auth-flow/` for `feature=auth-flow`).
30
+ 3. Otherwise, fall through to **default mode**
31
+ (`output/feats/feat-{feature}/`).
32
+
33
+ For the rest of this rule, internally maintain `MODE = "spec-driven"` or
34
+ `"default"`.
35
+
36
+ ### 1b — Validate required inputs
37
+
38
+ Required (default mode):
39
+ - `input/specs/spec-{feature}.md` — fail with: "spec-{feature}.md not found.
40
+ Create it (or use spec-driven mode by adding `idPrefix.spec` to
41
+ `.planr/config.json` and re-running)."
42
+ - `input/tech/stack.md` — fail with: "input/tech/stack.md not found. Create
43
+ it from `{{cursorRulesRoot}}/templates/stack.md.tpl`."
44
+
45
+ Required (spec-driven mode):
46
+ - `<SPEC_DIR>/SPEC-NNN-{feature}.md` — if missing, **auto-scaffold** (see below).
47
+ - `input/tech/stack.md` — see **Self-healing** below.
48
+
49
+ ### Auto-scaffolding the spec shell
50
+
51
+ When `<SPEC_DIR>/SPEC-NNN-{feature}.md` is missing, scaffold instead of aborting:
52
+
53
+ 1. Ensure `.planr/config.json` exists. If absent, write:
54
+ ```json
55
+ {
56
+ "projectName": "<derive from package.json name or repo dir>",
57
+ "outputPaths": { "agile": ".planr" },
58
+ "idPrefix": { "spec": "SPEC" }
59
+ }
60
+ ```
61
+ 2. Ensure `.planr/specs/` exists.
62
+ 3. Determine the next SPEC ID. Scan `.planr/specs/` for `SPEC-NNN-*/` dirs,
63
+ take the highest NNN, increment. Three-digit format (`SPEC-001`).
64
+ 4. Create `.planr/specs/SPEC-NNN-{feature}/{stories,tasks,design}/`.
65
+ 5. Read `{{cursorRulesRoot}}/templates/spec-driven.md.tpl` (if present;
66
+ otherwise inline a minimal v1.0.0 spec template). Substitute `{{SPEC_ID}}`,
67
+ `{{TITLE}}`, `{{SLUG}}`, `{{DATE}}`. Write to
68
+ `<SPEC_DIR>/SPEC-NNN-{feature}.md`.
69
+ 6. Print and abort:
70
+ ```
71
+ ✓ Scaffolded SPEC-NNN-{feature} at .planr/specs/SPEC-NNN-{feature}/
72
+ Edit the spec body, then re-run: plan {feature}
73
+ ```
74
+ 7. **Do not invoke any role.** Decomposition runs only on the second
75
+ invocation, after the user has filled in the body.
76
+
77
+ If the spec body exists but contains only placeholder text (detect via
78
+ `_Describe the problem this feature solves` or any `_…_` template hint),
79
+ apply the same abort.
80
+
81
+ ### Self-healing in spec mode
82
+
83
+ In spec-driven mode, when `input/tech/stack.md` is missing:
84
+
85
+ 1. Read `{{cursorRulesRoot}}/templates/stack.md.tpl` (or inline the template
86
+ if absent) and write it verbatim to `input/tech/stack.md`. Create
87
+ `input/tech/` if absent.
88
+ 2. Print:
89
+ ```
90
+ ✓ Created input/tech/stack.md from template (Cursor pipeline self-heal)
91
+ Next: edit input/tech/stack.md to declare your real stack:
92
+ - AppName, Language, Framework, ORM (or DatabaseType if no ORM)
93
+ - BuildCommand, TestCommand (used by the 3-iteration correction loop)
94
+ Then re-run: plan {feature}
95
+ ```
96
+ 3. Abort gracefully — exit Step 1 here.
97
+
98
+ In default mode, missing `stack.md` aborts with the same template guidance
99
+ (no auto-create — default mode missing stack typically means missing the
100
+ entire scaffolding).
101
+
102
+ ### Conditional inputs
103
+
104
+ - **Default mode:** `input/ui/feat-{feature}/*.png` OR PNGs listed in spec's
105
+ `UIFiles:` block → triggers designer role.
106
+ - **Spec mode:** PNGs in `<SPEC_DIR>/design/*.png` → triggers designer role.
107
+ - `input/tech/stack.md` has non-empty `DatabaseType` AND DB env vars present →
108
+ triggers db role.
109
+ - `output/db/schema.json` already up to date → skip db role.
110
+
111
+ ---
112
+
113
+ ## Step 2 — Dispatch roles in dependency order
114
+
115
+ Run roles **sequentially as Composer subagents**. Each role's output feeds
116
+ the next.
117
+
118
+ ### 2.1 — db role (conditional)
119
+
120
+ - **Skip** if `output/db/schema.json` exists AND was generated within the
121
+ last 24h.
122
+ - **Skip** if no `DatabaseType` in `stack.md`.
123
+ - Otherwise: dispatch the **db** subagent with system prompt
124
+ `{{cursorRulesRoot}}/agents/db-agent.md`. Pass MODE, feature, stack.md.
125
+ - Output: `output/db/schema.json`.
126
+
127
+ ### 2.2 — designer role (conditional)
128
+
129
+ - PNG resolution depends on MODE:
130
+ - **Default mode:** PNGs from `UIFiles:` in spec → `input/ui/feat-{feature}/*.png` → `input/ui/*.png`.
131
+ - **Spec-driven mode:** PNGs from `<SPEC_DIR>/design/*.png`.
132
+ - **Skip silently** if zero PNGs resolve.
133
+ - Otherwise: dispatch the **designer** subagent with system prompt
134
+ `{{cursorRulesRoot}}/agents/designer-agent.md`. Pass MODE, feature, SPEC_DIR.
135
+ - Output:
136
+ - **Default:** `output/feats/feat-{feature}/design-spec.md`
137
+ - **Spec-driven:** `<SPEC_DIR>/design/design-spec.md`
138
+
139
+ ### 2.3 — specification role (always, with skip optimization)
140
+
141
+ - **Spec-driven mode optimization:** if `<SPEC_DIR>/stories/` is non-empty
142
+ (the user already ran `planr spec decompose`), skip role invocation. Print:
143
+ "Decomposition already exists; skipping specification-agent."
144
+ - Otherwise: dispatch the **specification** subagent with system prompt
145
+ `{{cursorRulesRoot}}/agents/specification-agent.md`. Pass MODE, feature,
146
+ SPEC_DIR, plus reads of:
147
+ - **Default:** `input/specs/spec-{feature}.md`, `input/tech/stack.md`,
148
+ optional `output/feats/feat-{feature}/design-spec.md`, optional
149
+ `output/db/schema.json`
150
+ - **Spec-driven:** `<SPEC_DIR>/SPEC-NNN-{feature}.md`,
151
+ `input/tech/stack.md`, optional `<SPEC_DIR>/design/design-spec.md`,
152
+ optional `output/db/schema.json`
153
+ - Output:
154
+ - **Default:** `output/feats/feat-{feature}/us-{N}/us-{N}.md` and
155
+ `tasks/task-{M}.md`
156
+ - **Spec-driven:** `<SPEC_DIR>/stories/US-NNN-{slug}.md` and
157
+ `<SPEC_DIR>/tasks/T-NNN-{slug}.md`
158
+
159
+ ---
160
+
161
+ ## Step 3 — STOP
162
+
163
+ After the specification role completes, **STOP**. Do NOT invoke any DEV role.
164
+
165
+ Print a summary:
166
+
167
+ ```
168
+ ✓ PO Phase complete for {feature}
169
+ Mode: <default | spec-driven>
170
+ Output dir: <output/feats/feat-{feature}/ | .planr/specs/SPEC-NNN-{feature}/>
171
+ Design spec: <created | skipped (no PNGs) | reused>
172
+ DB schema: <created | reused | skipped>
173
+ US created: N
174
+ Tasks: M
175
+ Next step: review the generated US/task files, then say "ship {feature}".
176
+ ```
177
+
178
+ The user must explicitly say "ship {feature}" to proceed. Do not auto-chain.
179
+
180
+ ---
181
+
182
+ ## Failure modes
183
+
184
+ | Condition | Action |
185
+ |---|---|
186
+ | Spec missing (default) | Abort, suggest creating `input/specs/spec-{feature}.md` or switching to spec-driven mode |
187
+ | stack.md missing (default) | Abort, suggest copying from `{{cursorRulesRoot}}/templates/stack.md.tpl` |
188
+ | db role fails (connection) | Continue without schema, flag in summary |
189
+ | designer role fails (corrupt PNG) | Continue without design-spec, flag in summary |
190
+ | specification role fails | Abort, surface the role's error verbatim |
191
+
192
+ ---
193
+
194
+ *Generated by `planr rules generate --target cursor --scope pipeline`. Pairs with `openplanr-pipeline-ship.mdc` for the DEV phase.*
@@ -0,0 +1,242 @@
1
+ ---
2
+ description: "OpenPlanr Pipeline — DEV Phase orchestration (ship {feature}). Frontend ‖ backend → qa → devops ‖ doc-gen → snapshot → marker."
3
+ globs: []
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # /ship {feature} — DEV Phase orchestration (Cursor)
8
+
9
+ When the user says **"ship {feature}"** (or "implement {feature}", "build
10
+ {feature}"), follow this rule end-to-end. The argument `{feature}` is the
11
+ feature slug.
12
+
13
+ **Per R1, this command MUST NOT be auto-chained from "plan {feature}".**
14
+ The user must explicitly invoke it after reviewing the PO-phase output.
15
+
16
+ ---
17
+
18
+ ## Step 0 — Snapshot sentinel
19
+
20
+ Cursor has no Stop hook (unlike Claude Code). To approximate the same
21
+ "reminder if /ship aborts before snapshot" guarantee, write
22
+ `.cursor/.snapshot-pending` (empty file) at the start of this rule. If a
23
+ later run encounters this sentinel, surface a one-line reminder to refresh
24
+ `CLAUDE.md` (Step 5) before proceeding.
25
+
26
+ ---
27
+
28
+ ## Step 1 — Mode detection + input validation
29
+
30
+ ### 1a — Detect planr spec mode
31
+
32
+ Same as `openplanr-pipeline-plan.mdc` Step 1a:
33
+
34
+ 1. If `.planr/config.json` has `idPrefix.spec` set, **spec-driven mode**.
35
+ 2. `SPEC_DIR = .planr/specs/<SPEC-NNN-{feature}>/`.
36
+ 3. Otherwise, **default mode** (`output/feats/feat-{feature}/`).
37
+
38
+ | Concept | Default | Spec-driven |
39
+ |---|---|---|
40
+ | Feature root | `output/feats/feat-{feature}/` | `<SPEC_DIR>/` |
41
+ | US files | `output/feats/feat-{feature}/us-*/us-*.md` | `<SPEC_DIR>/stories/US-*.md` |
42
+ | Task files | `output/feats/feat-{feature}/us-*/tasks/task-*.md` | `<SPEC_DIR>/tasks/T-*.md` |
43
+ | Error report | `output/feats/feat-{feature}/us-{N}/tasks/error-report.md` | `<SPEC_DIR>/tasks/error-report.md` |
44
+ | QA report | `output/feats/feat-{feature}/qa-report.md` | `<SPEC_DIR>/qa-report.md` |
45
+
46
+ ### 1b — Validate required inputs
47
+
48
+ Verify these exist (mode-appropriate). Abort with clear errors if missing.
49
+
50
+ Required (default mode):
51
+ - `output/feats/feat-{feature}/` — fail: "feat-{feature}/ not found. Run plan {feature} first."
52
+ - ≥1 `output/feats/feat-{feature}/us-*/us-*.md`
53
+ - ≥1 `output/feats/feat-{feature}/us-*/tasks/task-*.md`
54
+ - `input/tech/stack.md`
55
+
56
+ Required (spec-driven mode):
57
+ - `<SPEC_DIR>/` — fail: "Spec for slug '{feature}' not found under .planr/specs/. Run plan {feature} first."
58
+ - ≥1 `<SPEC_DIR>/stories/US-*.md`
59
+ - ≥1 `<SPEC_DIR>/tasks/T-*.md`
60
+ - `input/tech/stack.md` — see self-heal below.
61
+
62
+ ### Self-healing in spec mode
63
+
64
+ When MODE=spec-driven AND `input/tech/stack.md` is missing:
65
+
66
+ 1. Read `{{cursorRulesRoot}}/templates/stack.md.tpl` and write to `input/tech/stack.md`.
67
+ 2. Print "edit and re-run" message.
68
+ 3. Abort gracefully. Do NOT invoke any role.
69
+
70
+ In default mode, missing `stack.md` aborts with the same template guidance.
71
+
72
+ ---
73
+
74
+ ## Step 2 — Iterate User Stories in topological order
75
+
76
+ In default mode, iterate each `us-{N}` directory under
77
+ `output/feats/feat-{feature}/` (sorted by US number). In spec-driven mode,
78
+ iterate each `<SPEC_DIR>/stories/US-*.md` (sorted by ID); tasks live in the
79
+ **flat** `<SPEC_DIR>/tasks/` directory and link to their parent story via
80
+ the `storyId` frontmatter field.
81
+
82
+ For each story, run its tasks:
83
+
84
+ 1. Read the US file to identify which tasks belong to it.
85
+ 2. For each task:
86
+ - Read frontmatter `Type` field.
87
+ - If `Type: UI` → dispatch the **frontend** subagent
88
+ (`{{cursorRulesRoot}}/agents/frontend-agent.md`).
89
+ - If `Type: Tech` → dispatch the **backend** subagent
90
+ (`{{cursorRulesRoot}}/agents/backend-agent.md`).
91
+ - frontend and backend tasks within the SAME US may run in parallel
92
+ (Cursor's Composer supports parallel subagent dispatch — use it).
93
+ 3. Each subagent applies the **3-iteration correction loop** (R6):
94
+ - Iteration 1: direct fix on build/test failure.
95
+ - Iteration 2: re-read task spec + design-spec/schema, fix holistically.
96
+ - Iteration 3: minimal safe fix, flag remaining issues.
97
+ - On 3rd failure: write `error-report.md` (default mode:
98
+ `output/feats/feat-{feature}/us-{N}/tasks/error-report.md`; spec mode:
99
+ `<SPEC_DIR>/tasks/error-report.md`). Then STOP that task.
100
+ 4. If a task fails after 3 iterations, ship continues with other independent
101
+ tasks but flags the failed task in the final summary.
102
+
103
+ ---
104
+
105
+ ## Step 3 — QA Gate
106
+
107
+ After all US tasks complete (or fail with error-reports), dispatch the
108
+ **qa** subagent (`{{cursorRulesRoot}}/agents/qa-agent.md`).
109
+
110
+ The qa subagent verifies, for each task:
111
+ - All "Create" files exist
112
+ - All "Modify" files were updated (and only as described)
113
+ - All "Preserve" files are unchanged (`git diff` vs base)
114
+ - Tests pass (`BuildCommand` + `TestCommand` from `stack.md`)
115
+ - DoD checklist items satisfied
116
+
117
+ If QA fails: flag in summary; **still proceed to Step 5 snapshot** so state
118
+ is recorded; skip Step 4 (devops + doc-gen) until the underlying task is fixed.
119
+
120
+ ---
121
+
122
+ ## Step 4 — devops + doc-gen subagents (parallel, optional)
123
+
124
+ Run only if QA passes.
125
+
126
+ - Dispatch **devops** subagent
127
+ (`{{cursorRulesRoot}}/agents/devops-agent.md`) — generates
128
+ `docker-compose.yml`, `.env.example`, Dockerfiles, CI workflow stubs.
129
+ **No `Bash` whatsoever** (prompt-level enforcement on Cursor).
130
+ - Dispatch **doc-gen** subagent
131
+ (`{{cursorRulesRoot}}/agents/doc-gen-agent.md`) — writes
132
+ `Docs/feat-{feature}/` from US, tasks, generated source code.
133
+
134
+ ---
135
+
136
+ ## Step 5 — Snapshot
137
+
138
+ Refresh `CLAUDE.md` at the project root. Read
139
+ `{{cursorRulesRoot}}/templates/CLAUDE.md.tpl` and write a populated copy.
140
+
141
+ Capture in this order:
142
+
143
+ 1. **Project Identity** — `AppName`, `Version`, `DatabaseType`, `Framework`,
144
+ `Language` from `input/tech/stack.md`. Include ISO 8601 UTC timestamp.
145
+ 2. **Phase Status** — scan filesystem to determine actual state.
146
+ 3. **Feature Registry** — for each feature folder.
147
+ 4. **Active Roles** — list the 8 roles with their model tier.
148
+ 5. **Build Log** — append latest build/test outcomes (append-only — never truncate).
149
+ 6. **Known Issues** — scan all `error-report.md` files.
150
+ 7. **Stack Summary** — embed `input/tech/stack.md` content.
151
+
152
+ ### Snapshot integrity rules
153
+
154
+ - ✅ Always write a complete, valid `CLAUDE.md` — never partial.
155
+ - ✅ Always include the generation timestamp.
156
+ - ✅ Preserve existing build log entries (append only).
157
+ - ✅ If a scan section fails, write `[scan error]` rather than empty.
158
+ - ❌ Never delete `CLAUDE.md`.
159
+ - ❌ Never leave `CLAUDE.md` partially written.
160
+
161
+ ### Coexistence with planr-managed CLAUDE.md
162
+
163
+ If the existing `CLAUDE.md` opens with `> Generated by OpenPlanr` or contains
164
+ `## Context-Gathering Protocol`, do **not** overwrite. Print:
165
+ *"CLAUDE.md is planr-managed; pipeline state recorded via .pipeline-shipped
166
+ marker (Step 5.5) and qa-report.md."* Continue to Step 5.5.
167
+
168
+ After writing (or skipping), remove `.cursor/.snapshot-pending`.
169
+
170
+ ---
171
+
172
+ ## Step 5.5 — Write the `.pipeline-shipped` marker
173
+
174
+ After Step 5 succeeds, write a marker file recording the pipeline run.
175
+
176
+ **Default mode:** `output/feats/feat-{feature}/.pipeline-shipped`
177
+ **Spec-driven mode:** `<SPEC_DIR>/.pipeline-shipped`
178
+
179
+ YAML contents:
180
+
181
+ ```yaml
182
+ shipped_at: "<ISO 8601 UTC timestamp>"
183
+ pipeline_version: "<runtime adapter writes its own version, e.g. 0.6.0>"
184
+ protocol_version: "{{protocolVersion}}"
185
+ runtime: "cursor"
186
+ mode: "<default | spec-driven>"
187
+ feature: "{feature}"
188
+ tasks_executed: <integer>
189
+ tasks_failed: <integer>
190
+ qa_gate_status: "<passed | failed | skipped>"
191
+ duration_seconds: <integer>
192
+ agents_invoked:
193
+ - frontend-agent # only list roles that actually ran
194
+ - backend-agent
195
+ - qa-agent
196
+ - devops-agent
197
+ - doc-gen-agent
198
+ devops_status: "<generated | skipped>"
199
+ docs_status: "<generated | skipped>"
200
+ snapshot_status: "<refreshed | skipped>"
201
+ error_reports: # paths to any error-report.md files; [] if none
202
+ - <path>
203
+ ```
204
+
205
+ If Step 5 (snapshot) was skipped due to planr-managed CLAUDE.md, set
206
+ `snapshot_status: skipped` so the partial-success state is recorded.
207
+
208
+ ---
209
+
210
+ ## Step 6 — Print summary
211
+
212
+ ```
213
+ ✓ DEV Phase complete for {feature}
214
+ Runtime: cursor
215
+ Mode: <default | spec-driven>
216
+ Output dir: <output/feats/feat-{feature}/ | .planr/specs/SPEC-NNN-{feature}/>
217
+ Tasks succeeded: X / Y
218
+ Tasks failed: Z (see error-report.md files)
219
+ QA gate: <passed | failed>
220
+ DevOps config: <generated | skipped>
221
+ Docs: <generated | skipped>
222
+ CLAUDE.md: <refreshed | skipped (planr-managed)>
223
+ Marker: <SPEC_DIR>/.pipeline-shipped
224
+ ```
225
+
226
+ If any task failed, list paths to error-report.md files.
227
+
228
+ ---
229
+
230
+ ## Failure modes
231
+
232
+ | Condition | Action |
233
+ |---|---|
234
+ | feat folder / spec dir missing | Abort, suggest plan {feature} first |
235
+ | No tasks | Abort, suggest re-running plan |
236
+ | Single task fails 3x | Continue with other tasks, surface in summary |
237
+ | All tasks fail | Skip QA + DevOps + Doc-Gen; still run snapshot |
238
+ | QA gate fails | Skip DevOps + Doc-Gen; still run snapshot |
239
+
240
+ ---
241
+
242
+ *Generated by `planr rules generate --target cursor --scope pipeline`. Pairs with `openplanr-pipeline-plan.mdc` for the PO phase.*
@@ -0,0 +1,134 @@
1
+ ---
2
+ description: "OpenPlanr Pipeline orchestration — PO/DEV phase rules, R1 human gate, mode detection, runtime parity for {{projectName}}"
3
+ globs: [".planr/specs/**", "input/specs/**", "output/feats/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # OpenPlanr Pipeline (Cursor edition — Protocol v{{protocolVersion}})
8
+
9
+ You are operating inside an OpenPlanr-pipeline-aware project on **Cursor**.
10
+ The pipeline is a two-phase factory:
11
+
12
+ ```
13
+ PO Phase (planning) → HUMAN REVIEW → DEV Phase (implementation)
14
+ ```
15
+
16
+ **Hard rule R1: NEVER auto-chain PO Phase to DEV Phase.** A human review step
17
+ gates them. Two distinct user invocations are required: "plan {feature}" and
18
+ "ship {feature}".
19
+
20
+ ---
21
+
22
+ ## Mode detection
23
+
24
+ Before doing anything, decide the project mode:
25
+
26
+ 1. If `.planr/config.json` exists AND its `idPrefix.spec` field is set,
27
+ the project is in **spec-driven mode**. Spec dir lives at
28
+ `.planr/specs/SPEC-NNN-{slug}/`.
29
+ 2. Otherwise, **default mode**: `output/feats/feat-{name}/`.
30
+
31
+ | Concept | Default mode | Spec-driven mode |
32
+ |---|---|---|
33
+ | Spec source | `input/specs/spec-{name}.md` | `.planr/specs/SPEC-NNN-{slug}/SPEC-NNN-{slug}.md` |
34
+ | Design spec | `output/feats/feat-{name}/design-spec.md` | `<SPEC_DIR>/design/design-spec.md` |
35
+ | US output | `output/feats/feat-{name}/us-{N}/us-{N}.md` | `<SPEC_DIR>/stories/US-NNN-{slug}.md` |
36
+ | Task output | `output/feats/feat-{name}/us-{N}/tasks/task-{M}.md` | `<SPEC_DIR>/tasks/T-NNN-{slug}.md` |
37
+
38
+ ---
39
+
40
+ ## Routing
41
+
42
+ When the user says **"plan {feature}"** (or "decompose {feature}", "spec {feature}"):
43
+ follow `.cursor/rules/openplanr-pipeline-plan.mdc`.
44
+
45
+ When the user says **"ship {feature}"** (or "implement {feature}", "build {feature}"):
46
+ follow `.cursor/rules/openplanr-pipeline-ship.mdc`.
47
+
48
+ ---
49
+
50
+ ## Subagents (8 named roles)
51
+
52
+ The pipeline ships 8 specialised role prompts. On Cursor, dispatch each as a
53
+ **Composer subagent** with the role's body as the system prompt. The bodies
54
+ live in `{{cursorRulesRoot}}/agents/{role}.md`:
55
+
56
+ {{#each agentNames}}
57
+ - `{{this}}` — see `{{../cursorRulesRoot}}/agents/{{this}}.md`
58
+ {{/each}}
59
+
60
+ When invoking a role, prefix the dispatch with the project context:
61
+ `MODE: {default|spec-driven}`, `SPEC_DIR` (if spec mode), `feature/slug`.
62
+
63
+ ---
64
+
65
+ ## Tool restrictions (Cursor parity)
66
+
67
+ The Claude Code plugin enforces tool restrictions at the manifest layer
68
+ (`tools: Read, Glob, Grep, Edit, Write, Bash(npm:*)` etc.). Cursor uses a
69
+ different permission model — these restrictions are **prompt-level only**
70
+ on Cursor and must be respected by you, the model, voluntarily:
71
+
72
+ - **db-agent** — read-only DB introspection. Never write SQL DDL/DML. Output
73
+ goes to `output/db/schema.json` only.
74
+ - **designer-agent** — `Read`, `Glob`, `Write` only. No shell access.
75
+ Output: `<SPEC_DIR>/design/design-spec.md` (spec mode) or
76
+ `output/feats/feat-{name}/design-spec.md` (default).
77
+ - **specification-agent** — `Read`, `Glob`, `Grep`, `Write`. Decomposes the
78
+ spec into US + Task files. No shell.
79
+ - **frontend-agent** — `Read`, `Edit`, `Write`, `Bash(npm:*)` family. Writes
80
+ UI files only (`src/features/{name}/` UI layer, components, pages, styles).
81
+ Never touches services, controllers, DTOs, entities.
82
+ - **backend-agent** — same shell tools as frontend, but writes services,
83
+ DTOs, entities, controllers, DB queries. Never touches UI files.
84
+ - **qa-agent** — read-only on `src/`. Runs build + test commands. Writes only
85
+ `qa-report.md`.
86
+ - **devops-agent** — `Read`, `Glob`, `Write`, `Edit`. **No `Bash` whatsoever.**
87
+ Generates `docker-compose.yml`, Dockerfiles, CI workflow stubs. Never deploys.
88
+ - **doc-gen-agent** — `Read`, `Glob`, `Grep`, `Write`. Writes `Docs/feat-{name}/`.
89
+
90
+ If you, as the model, violate these restrictions on Cursor, the conformance
91
+ test will catch it via the post-ship `git diff` check on each task's "Preserve"
92
+ list. **Treat the restrictions as binding.**
93
+
94
+ ---
95
+
96
+ ## Hard rules (cross-runtime)
97
+
98
+ - **R1** — Never auto-chain PO → DEV. Two user invocations required.
99
+ - **R2** — Max 2 tasks per US (1 if no PNG, 2 if PNG present).
100
+ - **R3** — Model assignments: roles using `Sonnet 4.6` are analysis/decomposition;
101
+ roles using `Opus 4.7` are codegen. On Cursor, use the runtime's tier
102
+ selector (Cursor's "Composer model" setting) and pick the equivalent.
103
+ - **R5** — Files in any task's `Preserve:` list MUST NOT be touched.
104
+ - **R6** — Max 3 correction iterations per task. After 3, write
105
+ `error-report.md` and stop that task.
106
+ - **R7** — Refresh CLAUDE.md (or coexist with planr-managed CLAUDE.md) at end
107
+ of `/ship`. Cursor has no Stop hook — see `openplanr-pipeline-ship.mdc`
108
+ Step 5 for the alternative.
109
+ - **R8** — db-agent role is read-only. Never DDL/DML.
110
+ - **R9** — frontend role only writes UI files; backend role only writes
111
+ services/DTOs/entities. No crossover.
112
+
113
+ ---
114
+
115
+ ## Conformance proof
116
+
117
+ On a successful `/ship` run, write the `.pipeline-shipped` YAML marker file
118
+ (see `openplanr-pipeline-ship.mdc` Step 5.5). The marker is the audit-grade
119
+ proof that the pipeline executed; the conformance test harness (in the
120
+ `openplanr-pipeline` repo at `conformance/runner.mjs`) verifies it.
121
+
122
+ ---
123
+
124
+ ## Compatibility matrix
125
+
126
+ This rule represents the **Cursor adapter** to the OpenPlanr Protocol v1.0.0.
127
+ Other supported runtimes:
128
+
129
+ - **Claude Code** — install the `openplanr-pipeline` plugin (canonical surface)
130
+ - **Codex** — see the AGENTS.md generated by `planr rules generate --target codex --scope pipeline`
131
+
132
+ Full parity table: `openplanr-pipeline/docs/compatibility-matrix.md`.
133
+
134
+ *Generated by `planr rules generate --target cursor --scope pipeline`.*
@@ -2,6 +2,27 @@ import type { ArtifactType } from '../models/types.js';
2
2
  export declare const CONFIG_FILENAME = ".planr/config.json";
3
3
  export declare const DEFAULT_AGILE_DIR = ".planr";
4
4
  export declare const DEFAULT_CURSOR_RULES_DIR = ".cursor/rules";
5
+ /**
6
+ * OpenPlanr Protocol version that the `--scope pipeline` rule generators
7
+ * conform to. The protocol is the runtime-agnostic contract for spec-driven
8
+ * mode artifacts (SPEC, US, Task schemas; PLAN/SHIP command contracts; agent
9
+ * roles). Bumps RARELY — only on artifact-schema breaks or workflow
10
+ * contract changes, NOT on pipeline plugin patches.
11
+ *
12
+ * NOT to be confused with the openplanr-pipeline plugin version (which moves
13
+ * fast and is tracked in the marketplace pin file, not here). Generated rule
14
+ * files reference the protocol contract; the runtime adapter (Claude Code
15
+ * plugin / Cursor MDC / Codex AGENTS.md) writes its own actual version into
16
+ * the `.pipeline-shipped` marker at execution time.
17
+ *
18
+ * Read by:
19
+ * - CursorGenerator (renders into Cursor MDC headers)
20
+ * - ClaudeGenerator (renders into the sibling `openplanr-pipeline.md` reference card)
21
+ * - CodexGenerator (renders into the AGENTS.md pipeline section)
22
+ *
23
+ * See `openplanr-pipeline/docs/protocol/` for the full protocol spec.
24
+ */
25
+ export declare const OPENPLANR_PROTOCOL_VERSION = "1.0.0";
5
26
  export declare const ARTIFACT_DIRS: {
6
27
  readonly epics: "epics";
7
28
  readonly features: "features";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAC1C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AAExD,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC,CAQ3E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,2GAQtB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,yBAAyB,yDAA0D,CAAC;AACjG,eAAO,MAAM,wBAAwB,wDAAyD,CAAC;AAE/F,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAC1C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,0BAA0B,UAAU,CAAC;AAElD,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC,CAQ3E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,2GAQtB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,yBAAyB,yDAA0D,CAAC;AACjG,eAAO,MAAM,wBAAwB,wDAAyD,CAAC;AAE/F,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -5,6 +5,27 @@ const __dirname = path.dirname(__filename);
5
5
  export const CONFIG_FILENAME = '.planr/config.json';
6
6
  export const DEFAULT_AGILE_DIR = '.planr';
7
7
  export const DEFAULT_CURSOR_RULES_DIR = '.cursor/rules';
8
+ /**
9
+ * OpenPlanr Protocol version that the `--scope pipeline` rule generators
10
+ * conform to. The protocol is the runtime-agnostic contract for spec-driven
11
+ * mode artifacts (SPEC, US, Task schemas; PLAN/SHIP command contracts; agent
12
+ * roles). Bumps RARELY — only on artifact-schema breaks or workflow
13
+ * contract changes, NOT on pipeline plugin patches.
14
+ *
15
+ * NOT to be confused with the openplanr-pipeline plugin version (which moves
16
+ * fast and is tracked in the marketplace pin file, not here). Generated rule
17
+ * files reference the protocol contract; the runtime adapter (Claude Code
18
+ * plugin / Cursor MDC / Codex AGENTS.md) writes its own actual version into
19
+ * the `.pipeline-shipped` marker at execution time.
20
+ *
21
+ * Read by:
22
+ * - CursorGenerator (renders into Cursor MDC headers)
23
+ * - ClaudeGenerator (renders into the sibling `openplanr-pipeline.md` reference card)
24
+ * - CodexGenerator (renders into the AGENTS.md pipeline section)
25
+ *
26
+ * See `openplanr-pipeline/docs/protocol/` for the full protocol spec.
27
+ */
28
+ export const OPENPLANR_PROTOCOL_VERSION = '1.0.0';
8
29
  export const ARTIFACT_DIRS = {
9
30
  epics: 'epics',
10
31
  features: 'features',
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAqD;IAC9E,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IAC5C,KAAK,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;IACvC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC;CAC5C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS;IACT,SAAS;IACT,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,aAAa;IACb,MAAM;CACE,CAAC;AAIX,wEAAwE;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AACjG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE/F,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAElD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAqD;IAC9E,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IAC5C,KAAK,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;IACvC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC;CAC5C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS;IACT,SAAS;IACT,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,aAAa;IACb,MAAM;CACE,CAAC;AAIX,wEAAwE;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AACjG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE/F,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
@@ -28,4 +28,12 @@ export declare function parseTaskCheckboxReconciled(s: string | undefined): Map<
28
28
  * Apply new done states to matching `N.M` task lines; preserves non-matching lines and all other text.
29
29
  */
30
30
  export declare function applyTaskCheckboxStateMap(content: string, idToDone: ReadonlyMap<string, boolean>): string;
31
+ /**
32
+ * Flip every `N.M` task checkbox in `content` to a single state. Preserves
33
+ * line structure, indentation, ids, titles, and every non-checkbox line.
34
+ *
35
+ * Used by `--all-done` / `--all-pending` flags on artifact updates so users
36
+ * can ship an artifact without hand-flipping each subtask.
37
+ */
38
+ export declare function applyAllCheckboxes(content: string, done: boolean): string;
31
39
  //# sourceMappingURL=markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWzD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG5F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAgC1E;AAID,8FAA8F;AAC9F,wBAAgB,+BAA+B,CAC7C,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAClE,MAAM,CAOR;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAUvF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,MAAM,CAaR"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWzD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG5F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAgC1E;AAID,8FAA8F;AAC9F,wBAAgB,+BAA+B,CAC7C,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAClE,MAAM,CAOR;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAUvF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,MAAM,CAaR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAazE"}