@sienklogic/plan-build-run 2.0.0 → 2.0.1

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 (225) hide show
  1. package/CHANGELOG.md +56 -56
  2. package/CLAUDE.md +149 -149
  3. package/LICENSE +21 -21
  4. package/README.md +247 -247
  5. package/dashboard/bin/cli.js +25 -25
  6. package/dashboard/package.json +34 -34
  7. package/dashboard/public/css/layout.css +406 -406
  8. package/dashboard/public/css/status-colors.css +98 -98
  9. package/dashboard/public/js/htmx-title.js +5 -5
  10. package/dashboard/public/js/sidebar-toggle.js +20 -20
  11. package/dashboard/src/app.js +78 -78
  12. package/dashboard/src/middleware/errorHandler.js +52 -52
  13. package/dashboard/src/middleware/notFoundHandler.js +9 -9
  14. package/dashboard/src/repositories/planning.repository.js +128 -128
  15. package/dashboard/src/routes/events.routes.js +40 -40
  16. package/dashboard/src/routes/index.routes.js +31 -31
  17. package/dashboard/src/routes/pages.routes.js +245 -195
  18. package/dashboard/src/server.js +42 -42
  19. package/dashboard/src/services/dashboard.service.js +222 -222
  20. package/dashboard/src/services/phase.service.js +220 -167
  21. package/dashboard/src/services/project.service.js +57 -57
  22. package/dashboard/src/services/roadmap.service.js +171 -171
  23. package/dashboard/src/services/sse.service.js +58 -58
  24. package/dashboard/src/services/todo.service.js +254 -254
  25. package/dashboard/src/services/watcher.service.js +48 -48
  26. package/dashboard/src/views/coming-soon.ejs +11 -11
  27. package/dashboard/src/views/error.ejs +13 -13
  28. package/dashboard/src/views/index.ejs +5 -5
  29. package/dashboard/src/views/layout.ejs +1 -1
  30. package/dashboard/src/views/partials/dashboard-content.ejs +77 -77
  31. package/dashboard/src/views/partials/footer.ejs +3 -3
  32. package/dashboard/src/views/partials/head.ejs +21 -21
  33. package/dashboard/src/views/partials/header.ejs +12 -12
  34. package/dashboard/src/views/partials/layout-bottom.ejs +15 -15
  35. package/dashboard/src/views/partials/layout-top.ejs +8 -8
  36. package/dashboard/src/views/partials/phase-content.ejs +188 -181
  37. package/dashboard/src/views/partials/phase-doc-content.ejs +38 -0
  38. package/dashboard/src/views/partials/phases-content.ejs +117 -117
  39. package/dashboard/src/views/partials/roadmap-content.ejs +142 -142
  40. package/dashboard/src/views/partials/sidebar.ejs +38 -38
  41. package/dashboard/src/views/partials/todo-create-content.ejs +53 -53
  42. package/dashboard/src/views/partials/todo-detail-content.ejs +38 -38
  43. package/dashboard/src/views/partials/todos-content.ejs +53 -53
  44. package/dashboard/src/views/phase-detail.ejs +5 -5
  45. package/dashboard/src/views/phase-doc.ejs +5 -0
  46. package/dashboard/src/views/phases.ejs +5 -5
  47. package/dashboard/src/views/roadmap.ejs +5 -5
  48. package/dashboard/src/views/todo-create.ejs +5 -5
  49. package/dashboard/src/views/todo-detail.ejs +5 -5
  50. package/dashboard/src/views/todos.ejs +5 -5
  51. package/package.json +57 -57
  52. package/plugins/pbr/.claude-plugin/plugin.json +13 -13
  53. package/plugins/pbr/UI-CONSISTENCY-GAPS.md +61 -61
  54. package/plugins/pbr/agents/codebase-mapper.md +279 -271
  55. package/plugins/pbr/agents/debugger.md +281 -281
  56. package/plugins/pbr/agents/executor.md +428 -407
  57. package/plugins/pbr/agents/general.md +164 -164
  58. package/plugins/pbr/agents/integration-checker.md +169 -141
  59. package/plugins/pbr/agents/plan-checker.md +296 -280
  60. package/plugins/pbr/agents/planner.md +358 -358
  61. package/plugins/pbr/agents/researcher.md +363 -363
  62. package/plugins/pbr/agents/synthesizer.md +230 -230
  63. package/plugins/pbr/agents/verifier.md +489 -454
  64. package/plugins/pbr/commands/begin.md +5 -5
  65. package/plugins/pbr/commands/build.md +5 -5
  66. package/plugins/pbr/commands/config.md +5 -5
  67. package/plugins/pbr/commands/continue.md +5 -5
  68. package/plugins/pbr/commands/debug.md +5 -5
  69. package/plugins/pbr/commands/discuss.md +5 -5
  70. package/plugins/pbr/commands/explore.md +5 -5
  71. package/plugins/pbr/commands/health.md +5 -5
  72. package/plugins/pbr/commands/help.md +5 -5
  73. package/plugins/pbr/commands/import.md +5 -5
  74. package/plugins/pbr/commands/milestone.md +5 -5
  75. package/plugins/pbr/commands/note.md +5 -5
  76. package/plugins/pbr/commands/pause.md +5 -5
  77. package/plugins/pbr/commands/plan.md +5 -5
  78. package/plugins/pbr/commands/quick.md +5 -5
  79. package/plugins/pbr/commands/resume.md +5 -5
  80. package/plugins/pbr/commands/review.md +5 -5
  81. package/plugins/pbr/commands/scan.md +5 -5
  82. package/plugins/pbr/commands/setup.md +5 -5
  83. package/plugins/pbr/commands/status.md +5 -5
  84. package/plugins/pbr/commands/todo.md +5 -5
  85. package/plugins/pbr/contexts/dev.md +27 -27
  86. package/plugins/pbr/contexts/research.md +28 -28
  87. package/plugins/pbr/contexts/review.md +36 -36
  88. package/plugins/pbr/hooks/hooks.json +183 -183
  89. package/plugins/pbr/references/agent-anti-patterns.md +24 -24
  90. package/plugins/pbr/references/agent-interactions.md +134 -134
  91. package/plugins/pbr/references/agent-teams.md +54 -54
  92. package/plugins/pbr/references/checkpoints.md +157 -157
  93. package/plugins/pbr/references/common-bug-patterns.md +13 -13
  94. package/plugins/pbr/references/config-reference.md +441 -0
  95. package/plugins/pbr/references/continuation-format.md +212 -212
  96. package/plugins/pbr/references/deviation-rules.md +112 -112
  97. package/plugins/pbr/references/git-integration.md +226 -226
  98. package/plugins/pbr/references/integration-patterns.md +117 -117
  99. package/plugins/pbr/references/model-profiles.md +99 -99
  100. package/plugins/pbr/references/model-selection.md +31 -31
  101. package/plugins/pbr/references/pbr-rules.md +193 -193
  102. package/plugins/pbr/references/plan-authoring.md +181 -181
  103. package/plugins/pbr/references/plan-format.md +287 -283
  104. package/plugins/pbr/references/planning-config.md +213 -213
  105. package/plugins/pbr/references/questioning.md +214 -214
  106. package/plugins/pbr/references/reading-verification.md +127 -127
  107. package/plugins/pbr/references/stub-patterns.md +160 -160
  108. package/plugins/pbr/references/subagent-coordination.md +119 -119
  109. package/plugins/pbr/references/ui-formatting.md +461 -399
  110. package/plugins/pbr/references/verification-patterns.md +198 -198
  111. package/plugins/pbr/references/wave-execution.md +95 -95
  112. package/plugins/pbr/scripts/auto-continue.js +80 -80
  113. package/plugins/pbr/scripts/check-dangerous-commands.js +136 -136
  114. package/plugins/pbr/scripts/check-doc-sprawl.js +102 -102
  115. package/plugins/pbr/scripts/check-phase-boundary.js +196 -196
  116. package/plugins/pbr/scripts/check-plan-format.js +270 -270
  117. package/plugins/pbr/scripts/check-roadmap-sync.js +322 -252
  118. package/plugins/pbr/scripts/check-skill-workflow.js +262 -262
  119. package/plugins/pbr/scripts/check-state-sync.js +476 -476
  120. package/plugins/pbr/scripts/check-subagent-output.js +144 -144
  121. package/plugins/pbr/scripts/config-schema.json +251 -251
  122. package/plugins/pbr/scripts/context-budget-check.js +287 -287
  123. package/plugins/pbr/scripts/event-handler.js +151 -151
  124. package/plugins/pbr/scripts/event-logger.js +92 -92
  125. package/plugins/pbr/scripts/hook-logger.js +80 -76
  126. package/plugins/pbr/scripts/hooks-schema.json +79 -79
  127. package/plugins/pbr/scripts/log-subagent.js +164 -152
  128. package/plugins/pbr/scripts/log-tool-failure.js +88 -88
  129. package/plugins/pbr/scripts/pbr-tools.js +1378 -1301
  130. package/plugins/pbr/scripts/post-write-dispatch.js +66 -66
  131. package/plugins/pbr/scripts/post-write-quality.js +207 -207
  132. package/plugins/pbr/scripts/pre-bash-dispatch.js +86 -56
  133. package/plugins/pbr/scripts/pre-write-dispatch.js +97 -62
  134. package/plugins/pbr/scripts/progress-tracker.js +281 -228
  135. package/plugins/pbr/scripts/run-hook.js +92 -0
  136. package/plugins/pbr/scripts/session-cleanup.js +254 -254
  137. package/plugins/pbr/scripts/status-line.js +288 -285
  138. package/plugins/pbr/scripts/suggest-compact.js +119 -119
  139. package/plugins/pbr/scripts/task-completed.js +45 -45
  140. package/plugins/pbr/scripts/track-context-budget.js +149 -119
  141. package/plugins/pbr/scripts/validate-commit.js +200 -200
  142. package/plugins/pbr/scripts/validate-plugin-structure.js +183 -172
  143. package/plugins/pbr/scripts/validate-task.js +106 -0
  144. package/plugins/pbr/skills/begin/SKILL.md +594 -545
  145. package/plugins/pbr/skills/begin/templates/PROJECT.md.tmpl +33 -33
  146. package/plugins/pbr/skills/begin/templates/REQUIREMENTS.md.tmpl +18 -18
  147. package/plugins/pbr/skills/begin/templates/STATE.md.tmpl +49 -49
  148. package/plugins/pbr/skills/begin/templates/config.json.tmpl +64 -63
  149. package/plugins/pbr/skills/begin/templates/researcher-prompt.md.tmpl +19 -19
  150. package/plugins/pbr/skills/begin/templates/roadmap-prompt.md.tmpl +30 -30
  151. package/plugins/pbr/skills/begin/templates/synthesis-prompt.md.tmpl +16 -16
  152. package/plugins/pbr/skills/build/SKILL.md +943 -962
  153. package/plugins/pbr/skills/config/SKILL.md +256 -241
  154. package/plugins/pbr/skills/continue/SKILL.md +164 -127
  155. package/plugins/pbr/skills/debug/SKILL.md +515 -489
  156. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +16 -16
  157. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +27 -27
  158. package/plugins/pbr/skills/discuss/SKILL.md +347 -338
  159. package/plugins/pbr/skills/discuss/templates/CONTEXT.md.tmpl +61 -61
  160. package/plugins/pbr/skills/discuss/templates/decision-categories.md +9 -9
  161. package/plugins/pbr/skills/explore/SKILL.md +378 -362
  162. package/plugins/pbr/skills/health/SKILL.md +221 -186
  163. package/plugins/pbr/skills/health/templates/check-pattern.md.tmpl +30 -30
  164. package/plugins/pbr/skills/health/templates/output-format.md.tmpl +63 -63
  165. package/plugins/pbr/skills/help/SKILL.md +155 -140
  166. package/plugins/pbr/skills/import/SKILL.md +504 -490
  167. package/plugins/pbr/skills/milestone/SKILL.md +704 -673
  168. package/plugins/pbr/skills/milestone/templates/audit-report.md.tmpl +48 -48
  169. package/plugins/pbr/skills/milestone/templates/stats-file.md.tmpl +30 -30
  170. package/plugins/pbr/skills/note/SKILL.md +231 -212
  171. package/plugins/pbr/skills/pause/SKILL.md +249 -235
  172. package/plugins/pbr/skills/pause/templates/continue-here.md.tmpl +71 -71
  173. package/plugins/pbr/skills/plan/SKILL.md +685 -628
  174. package/plugins/pbr/skills/plan/decimal-phase-calc.md +98 -98
  175. package/plugins/pbr/skills/plan/templates/checker-prompt.md.tmpl +21 -21
  176. package/plugins/pbr/skills/plan/templates/gap-closure-prompt.md.tmpl +32 -32
  177. package/plugins/pbr/skills/plan/templates/planner-prompt.md.tmpl +38 -38
  178. package/plugins/pbr/skills/plan/templates/researcher-prompt.md.tmpl +19 -19
  179. package/plugins/pbr/skills/plan/templates/revision-prompt.md.tmpl +23 -23
  180. package/plugins/pbr/skills/quick/SKILL.md +354 -335
  181. package/plugins/pbr/skills/resume/SKILL.md +402 -388
  182. package/plugins/pbr/skills/review/SKILL.md +686 -652
  183. package/plugins/pbr/skills/review/templates/debugger-prompt.md.tmpl +60 -60
  184. package/plugins/pbr/skills/review/templates/gap-planner-prompt.md.tmpl +40 -40
  185. package/plugins/pbr/skills/review/templates/verifier-prompt.md.tmpl +115 -115
  186. package/plugins/pbr/skills/scan/SKILL.md +304 -269
  187. package/plugins/pbr/skills/scan/templates/mapper-prompt.md.tmpl +201 -201
  188. package/plugins/pbr/skills/setup/SKILL.md +253 -227
  189. package/plugins/pbr/skills/shared/commit-planning-docs.md +35 -35
  190. package/plugins/pbr/skills/shared/config-loading.md +102 -102
  191. package/plugins/pbr/skills/shared/context-budget.md +40 -40
  192. package/plugins/pbr/skills/shared/context-loader-task.md +86 -86
  193. package/plugins/pbr/skills/shared/digest-select.md +79 -79
  194. package/plugins/pbr/skills/shared/domain-probes.md +125 -125
  195. package/plugins/pbr/skills/shared/error-reporting.md +79 -79
  196. package/plugins/pbr/skills/shared/gate-prompts.md +388 -388
  197. package/plugins/pbr/skills/shared/phase-argument-parsing.md +45 -45
  198. package/plugins/pbr/skills/shared/progress-display.md +53 -53
  199. package/plugins/pbr/skills/shared/revision-loop.md +81 -81
  200. package/plugins/pbr/skills/shared/state-loading.md +62 -62
  201. package/plugins/pbr/skills/shared/state-update.md +161 -161
  202. package/plugins/pbr/skills/shared/universal-anti-patterns.md +33 -33
  203. package/plugins/pbr/skills/status/SKILL.md +367 -353
  204. package/plugins/pbr/skills/todo/SKILL.md +198 -181
  205. package/plugins/pbr/templates/CONTEXT.md.tmpl +52 -52
  206. package/plugins/pbr/templates/INTEGRATION-REPORT.md.tmpl +151 -151
  207. package/plugins/pbr/templates/RESEARCH-SUMMARY.md.tmpl +97 -97
  208. package/plugins/pbr/templates/ROADMAP.md.tmpl +40 -40
  209. package/plugins/pbr/templates/SUMMARY.md.tmpl +81 -81
  210. package/plugins/pbr/templates/VERIFICATION-DETAIL.md.tmpl +116 -116
  211. package/plugins/pbr/templates/codebase/ARCHITECTURE.md.tmpl +98 -98
  212. package/plugins/pbr/templates/codebase/CONCERNS.md.tmpl +93 -93
  213. package/plugins/pbr/templates/codebase/CONVENTIONS.md.tmpl +104 -104
  214. package/plugins/pbr/templates/codebase/INTEGRATIONS.md.tmpl +78 -78
  215. package/plugins/pbr/templates/codebase/STACK.md.tmpl +78 -78
  216. package/plugins/pbr/templates/codebase/STRUCTURE.md.tmpl +80 -80
  217. package/plugins/pbr/templates/codebase/TESTING.md.tmpl +107 -107
  218. package/plugins/pbr/templates/continue-here.md.tmpl +73 -73
  219. package/plugins/pbr/templates/prompt-partials/phase-project-context.md.tmpl +37 -37
  220. package/plugins/pbr/templates/research/ARCHITECTURE.md.tmpl +124 -124
  221. package/plugins/pbr/templates/research/STACK.md.tmpl +71 -71
  222. package/plugins/pbr/templates/research/SUMMARY.md.tmpl +112 -112
  223. package/plugins/pbr/templates/research-outputs/phase-research.md.tmpl +81 -81
  224. package/plugins/pbr/templates/research-outputs/project-research.md.tmpl +99 -99
  225. package/plugins/pbr/templates/research-outputs/synthesis.md.tmpl +36 -36
@@ -1,283 +1,287 @@
1
- # Plan Format Reference
2
-
3
- Complete reference for the XML task specification used in Plan-Build-Run plan files.
4
-
5
- ---
6
-
7
- ## Plan File Structure
8
-
9
- Every plan file has two sections:
10
- 1. **YAML Frontmatter** — metadata about the plan
11
- 2. **XML Tasks** — the executable task specifications
12
-
13
- ---
14
-
15
- ## YAML Frontmatter
16
-
17
- ```yaml
18
- ---
19
- phase: "02-authentication"
20
- plan: "02-01"
21
- type: "feature"
22
- wave: 1
23
- depends_on: []
24
- files_modified:
25
- - "src/auth/discord.ts"
26
- - "src/middleware/auth.ts"
27
- autonomous: true
28
- discovery: 1
29
- gap_closure: false
30
- must_haves:
31
- truths:
32
- - "User can authenticate via Discord OAuth"
33
- - "JWT token is set in httpOnly cookie"
34
- artifacts:
35
- - "src/auth/discord.ts: >50 lines"
36
- - "src/middleware/auth.ts: >30 lines"
37
- key_links:
38
- - "Auth middleware applied to protected routes"
39
- - "Login button calls authenticateWithDiscord()"
40
- provides:
41
- - "AuthService class"
42
- - "POST /api/auth/login endpoint"
43
- - "requireAuth() middleware"
44
- consumes:
45
- - "Database connection (from plan 01-01)"
46
- ---
47
- ```
48
-
49
- ### Frontmatter Fields
50
-
51
- | Field | Required | Type | Description |
52
- |-------|----------|------|-------------|
53
- | `phase` | YES | string | Phase directory name (e.g., "02-authentication") |
54
- | `plan` | YES | string | Plan ID: `{phase_num}-{plan_num}` (e.g., "02-01") |
55
- | `type` | YES | enum | `feature`, `bugfix`, `refactor`, `infrastructure`, `docs` |
56
- | `wave` | YES | int | Execution wave (1 = independent, 2+ = has deps) |
57
- | `depends_on` | YES | array | Plan IDs that must complete first. `[]` if Wave 1. |
58
- | `files_modified` | YES | array | All files this plan creates or modifies |
59
- | `autonomous` | YES | bool | `true` if no human checkpoints |
60
- | `discovery` | NO | int | Research level: 0=skip, 1=quick, 2=standard, 3=deep. Default: 1 |
61
- | `gap_closure` | NO | bool | `true` if this is a gap-closure plan. Default: false |
62
- | `must_haves` | YES | object | Goal-backward derivation |
63
- | `must_haves.truths` | YES | array | Observable truths that must be true when done |
64
- | `must_haves.artifacts` | YES | array | Files/modules that must exist. Append `: >N lines` for size hints. |
65
- | `must_haves.key_links` | YES | array | Connections between components. Append `: grep command` for verification. |
66
- | `provides` | NO | array | What this plan exports for other plans to consume (classes, endpoints, modules) |
67
- | `consumes` | NO | array | What this plan needs from prior plans. Format: `"Thing (from plan XX-YY)"` |
68
- | `dependency_fingerprints` | NO | object | Hashes of dependency phase SUMMARY.md files at plan-creation time. Used to detect stale plans. |
69
-
70
- ---
71
-
72
- ## Summary Section
73
-
74
- Every plan file MUST end with a `## Summary` section after all XML tasks. This section provides a compact overview (~500 tokens) for injection into executor prompts, avoiding the need to inline the full plan (~1,500 tokens).
75
-
76
- Format:
77
-
78
- ```
79
- ## Summary
80
-
81
- **Plan {plan_id}**: {1-sentence description of what this plan does}
82
-
83
- **Tasks:**
84
- 1. {task_id}: {task name} -- {files touched}
85
- 2. {task_id}: {task name} -- {files touched}
86
- 3. {task_id}: {task name} -- {files touched}
87
-
88
- **Key files:** {comma-separated list of all files_modified}
89
-
90
- **Must-haves:** {comma-separated list of truths from frontmatter}
91
-
92
- **Provides:** {comma-separated list from provides field}
93
-
94
- **Consumes:** {comma-separated list from consumes field, or "None"}
95
- ```
96
-
97
- The Summary section is generated by the planner agent at plan creation time. It is a denormalized view of plan metadata -- if the plan is revised, the Summary must also be updated.
98
-
99
- ---
100
-
101
- ## Task Types
102
-
103
- ### Standard Auto Task
104
-
105
- ```xml
106
- <task id="02-01-T1" type="auto" complexity="medium">
107
- <name>Create Discord OAuth client module</name>
108
- <files>
109
- src/auth/discord.ts
110
- src/auth/types.ts
111
- </files>
112
- <action>
113
- 1. Create file `src/auth/types.ts`
114
- - Export interface `DiscordUser` with fields: id, username, avatar, email
115
- - Export interface `AuthTokens` with fields: accessToken, refreshToken, expiresAt
116
-
117
- 2. Create file `src/auth/discord.ts`
118
- - Import `OAuth2Client` from `discord-oauth2`
119
- - Import `DiscordUser`, `AuthTokens` from `./types`
120
- - Export async function `authenticateWithDiscord(code: string): Promise<DiscordUser>`
121
- - Create OAuth2Client with DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET from env
122
- - Exchange authorization code for access token
123
- - Fetch user profile: GET /api/users/@me
124
- - Return DiscordUser object
125
- - Export function `getDiscordAuthUrl(): string`
126
- - Build OAuth2 URL with scopes: identify, email
127
- - Include DISCORD_REDIRECT_URI from env
128
-
129
- 3. Add to `.env.example`:
130
- DISCORD_CLIENT_ID=
131
- DISCORD_CLIENT_SECRET=
132
- DISCORD_REDIRECT_URI=http://localhost:3000/auth/callback
133
- </action>
134
- <verify>
135
- npx tsc --noEmit
136
- ls src/auth/discord.ts
137
- ls src/auth/types.ts
138
- </verify>
139
- <done>Discord OAuth client module exists and compiles without errors</done>
140
- </task>
141
- ```
142
-
143
- ### TDD Task
144
-
145
- ```xml
146
- <task id="02-01-T2" type="auto" tdd="true" complexity="medium">
147
- <name>Implement auth middleware with TDD</name>
148
- <files>
149
- src/middleware/auth.ts
150
- tests/middleware/auth.test.ts
151
- </files>
152
- <action>
153
- RED:
154
- 1. Create `tests/middleware/auth.test.ts`
155
- - Test: "rejects request without token" — expect 401
156
- - Test: "rejects request with invalid token" — expect 401
157
- - Test: "passes request with valid token" — expect next() called
158
-
159
- GREEN:
160
- 2. Create `src/middleware/auth.ts`
161
- - Export function `requireAuth(req, res, next)`
162
- - Extract JWT from httpOnly cookie
163
- - Verify token with jsonwebtoken
164
- - If valid: attach user to req, call next()
165
- - If invalid: respond 401
166
-
167
- REFACTOR:
168
- 3. Extract token verification into `verifyToken()` helper
169
- </action>
170
- <verify>
171
- npm test -- --grep "auth middleware"
172
- </verify>
173
- <done>Auth middleware rejects invalid tokens and passes valid tokens</done>
174
- </task>
175
- ```
176
-
177
- ### Checkpoint: Human Verify
178
-
179
- ```xml
180
- <task id="03-02-T3" type="checkpoint:human-verify">
181
- <name>Verify OAuth callback flow</name>
182
- <files>
183
- src/pages/auth/callback.ts
184
- </files>
185
- <action>
186
- 1. Create the OAuth callback page at `src/pages/auth/callback.ts`
187
- 2. Wire it to call `authenticateWithDiscord()` with the authorization code
188
- 3. On success: set JWT cookie and redirect to dashboard
189
- 4. On failure: redirect to login with error message
190
- </action>
191
- <verify>
192
- what-built: OAuth callback page that exchanges Discord auth code for JWT
193
- how-to-verify: |
194
- 1. Click "Login with Discord" button
195
- 2. Authorize the application in Discord
196
- 3. Verify you are redirected to the dashboard
197
- 4. Check browser cookies for JWT token
198
- resume-signal: "User confirms OAuth flow works end-to-end"
199
- </verify>
200
- <done>User can complete full Discord OAuth login flow</done>
201
- </task>
202
- ```
203
-
204
- ### Checkpoint: Decision
205
-
206
- ```xml
207
- <task id="04-01-T1" type="checkpoint:decision">
208
- <name>Choose database migration strategy</name>
209
- <files></files>
210
- <action>
211
- Present the user with the migration strategy options after research.
212
- </action>
213
- <verify>
214
- decision: "Which migration strategy to use for production database?"
215
- context: "We need to decide how to handle schema changes in production."
216
- options: |
217
- A) Prisma Migrate — automatic migrations, good for development, requires care in production
218
- B) Manual SQL full control, more work, explicit about what changes
219
- C) TypeORM migrations auto-generated from entities, reversible
220
- resume-signal: "User selects option A, B, or C"
221
- </verify>
222
- <done>Database migration strategy decided and documented in CONTEXT.md</done>
223
- </task>
224
- ```
225
-
226
- ### Checkpoint: Human Action
227
-
228
- ```xml
229
- <task id="05-03-T2" type="checkpoint:human-action">
230
- <name>Configure production environment</name>
231
- <files>
232
- .env.production
233
- </files>
234
- <action>
235
- 1. Create `.env.production.example` with all required variables listed
236
- 2. Document each variable's purpose in comments
237
- </action>
238
- <verify>
239
- what-needed: "Production environment variables must be set"
240
- how-to-do: |
241
- 1. Copy `.env.production.example` to `.env.production`
242
- 2. Fill in production values for:
243
- - DATABASE_URL (production database connection string)
244
- - DISCORD_CLIENT_ID (production Discord app)
245
- - DISCORD_CLIENT_SECRET (production Discord app)
246
- - JWT_SECRET (generate with: openssl rand -base64 32)
247
- resume-signal: "User confirms .env.production is configured"
248
- </verify>
249
- <done>Production environment is configured with real credentials</done>
250
- </task>
251
- ```
252
-
253
- ---
254
-
255
- ## The 5 Mandatory Elements
256
-
257
- Every task MUST have ALL 5. No exceptions.
258
-
259
- | Element | Purpose | Rules |
260
- |---------|---------|-------|
261
- | `<name>` | What the task does | Imperative verb phrase. Short. |
262
- | `<files>` | Files touched | One per line. Actual file paths. |
263
- | `<action>` | How to do it | Numbered steps. Specific. Code snippets for complex work. |
264
- | `<verify>` | How to check | Executable shell commands. Or checkpoint format. |
265
- | `<done>` | How to know it worked | Observable user/system behavior. Maps to a must-have. |
266
-
267
- ---
268
-
269
- ## Task ID Format
270
-
271
- ```
272
- {plan_id}-T{sequential_number}
273
-
274
- Examples:
275
- 02-01-T1 — Phase 02, Plan 01, Task 1
276
- 02-01-T2 — Phase 02, Plan 01, Task 2
277
- 03-02-T1 — Phase 03, Plan 02, Task 1
278
- ```
279
-
280
- Task IDs are unique within a phase. They are used for:
281
- - Commit message references
282
- - Checkpoint continuation references
283
- - SUMMARY.md task result tracking
1
+ # Plan Format Reference
2
+
3
+ Complete reference for the XML task specification used in Plan-Build-Run plan files.
4
+
5
+ ---
6
+
7
+ ## Plan File Structure
8
+
9
+ Every plan file has two sections:
10
+ 1. **YAML Frontmatter** — metadata about the plan
11
+ 2. **XML Tasks** — the executable task specifications
12
+
13
+ ---
14
+
15
+ ## YAML Frontmatter
16
+
17
+ ```yaml
18
+ ---
19
+ phase: "02-authentication"
20
+ plan: "02-01"
21
+ type: "feature"
22
+ wave: 1
23
+ depends_on: []
24
+ files_modified:
25
+ - "src/auth/discord.ts"
26
+ - "src/middleware/auth.ts"
27
+ autonomous: true
28
+ discovery: 1
29
+ gap_closure: false
30
+ must_haves:
31
+ truths:
32
+ - "User can authenticate via Discord OAuth"
33
+ - "JWT token is set in httpOnly cookie"
34
+ artifacts:
35
+ - "src/auth/discord.ts: >50 lines"
36
+ - "src/middleware/auth.ts: >30 lines"
37
+ key_links:
38
+ - "Auth middleware applied to protected routes"
39
+ - "Login button calls authenticateWithDiscord()"
40
+ provides:
41
+ - "AuthService class"
42
+ - "POST /api/auth/login endpoint"
43
+ - "requireAuth() middleware"
44
+ consumes:
45
+ - "Database connection (from plan 01-01)"
46
+ requirement_ids:
47
+ - "P02-G1"
48
+ - "P02-G2"
49
+ ---
50
+ ```
51
+
52
+ ### Frontmatter Fields
53
+
54
+ | Field | Required | Type | Description |
55
+ |-------|----------|------|-------------|
56
+ | `phase` | YES | string | Phase directory name (e.g., "02-authentication") |
57
+ | `plan` | YES | string | Plan ID: `{phase_num}-{plan_num}` (e.g., "02-01") |
58
+ | `type` | YES | enum | `feature`, `bugfix`, `refactor`, `infrastructure`, `docs` |
59
+ | `wave` | YES | int | Execution wave (1 = independent, 2+ = has deps) |
60
+ | `depends_on` | YES | array | Plan IDs that must complete first. `[]` if Wave 1. |
61
+ | `files_modified` | YES | array | All files this plan creates or modifies |
62
+ | `autonomous` | YES | bool | `true` if no human checkpoints |
63
+ | `discovery` | NO | int | Research level: 0=skip, 1=quick, 2=standard, 3=deep. Default: 1 |
64
+ | `gap_closure` | NO | bool | `true` if this is a gap-closure plan. Default: false |
65
+ | `must_haves` | YES | object | Goal-backward derivation |
66
+ | `must_haves.truths` | YES | array | Observable truths that must be true when done |
67
+ | `must_haves.artifacts` | YES | array | Files/modules that must exist. Append `: >N lines` for size hints. |
68
+ | `must_haves.key_links` | YES | array | Connections between components. Append `: grep command` for verification. |
69
+ | `provides` | NO | array | What this plan exports for other plans to consume (classes, endpoints, modules) |
70
+ | `consumes` | NO | array | What this plan needs from prior plans. Format: `"Thing (from plan XX-YY)"` |
71
+ | `requirement_ids` | NO | array | Requirement IDs from REQUIREMENTS.md or ROADMAP.md goal IDs that this plan addresses. Enables bidirectional traceability between plans and requirements/goals. |
72
+ | `dependency_fingerprints` | NO | object | Hashes of dependency phase SUMMARY.md files at plan-creation time. Used to detect stale plans. |
73
+
74
+ ---
75
+
76
+ ## Summary Section
77
+
78
+ Every plan file MUST end with a `## Summary` section after all XML tasks. This section provides a compact overview (~500 tokens) for injection into executor prompts, avoiding the need to inline the full plan (~1,500 tokens).
79
+
80
+ Format:
81
+
82
+ ```
83
+ ## Summary
84
+
85
+ **Plan {plan_id}**: {1-sentence description of what this plan does}
86
+
87
+ **Tasks:**
88
+ 1. {task_id}: {task name} -- {files touched}
89
+ 2. {task_id}: {task name} -- {files touched}
90
+ 3. {task_id}: {task name} -- {files touched}
91
+
92
+ **Key files:** {comma-separated list of all files_modified}
93
+
94
+ **Must-haves:** {comma-separated list of truths from frontmatter}
95
+
96
+ **Provides:** {comma-separated list from provides field}
97
+
98
+ **Consumes:** {comma-separated list from consumes field, or "None"}
99
+ ```
100
+
101
+ The Summary section is generated by the planner agent at plan creation time. It is a denormalized view of plan metadata -- if the plan is revised, the Summary must also be updated.
102
+
103
+ ---
104
+
105
+ ## Task Types
106
+
107
+ ### Standard Auto Task
108
+
109
+ ```xml
110
+ <task id="02-01-T1" type="auto" complexity="medium">
111
+ <name>Create Discord OAuth client module</name>
112
+ <files>
113
+ src/auth/discord.ts
114
+ src/auth/types.ts
115
+ </files>
116
+ <action>
117
+ 1. Create file `src/auth/types.ts`
118
+ - Export interface `DiscordUser` with fields: id, username, avatar, email
119
+ - Export interface `AuthTokens` with fields: accessToken, refreshToken, expiresAt
120
+
121
+ 2. Create file `src/auth/discord.ts`
122
+ - Import `OAuth2Client` from `discord-oauth2`
123
+ - Import `DiscordUser`, `AuthTokens` from `./types`
124
+ - Export async function `authenticateWithDiscord(code: string): Promise<DiscordUser>`
125
+ - Create OAuth2Client with DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET from env
126
+ - Exchange authorization code for access token
127
+ - Fetch user profile: GET /api/users/@me
128
+ - Return DiscordUser object
129
+ - Export function `getDiscordAuthUrl(): string`
130
+ - Build OAuth2 URL with scopes: identify, email
131
+ - Include DISCORD_REDIRECT_URI from env
132
+
133
+ 3. Add to `.env.example`:
134
+ DISCORD_CLIENT_ID=
135
+ DISCORD_CLIENT_SECRET=
136
+ DISCORD_REDIRECT_URI=http://localhost:3000/auth/callback
137
+ </action>
138
+ <verify>
139
+ npx tsc --noEmit
140
+ ls src/auth/discord.ts
141
+ ls src/auth/types.ts
142
+ </verify>
143
+ <done>Discord OAuth client module exists and compiles without errors</done>
144
+ </task>
145
+ ```
146
+
147
+ ### TDD Task
148
+
149
+ ```xml
150
+ <task id="02-01-T2" type="auto" tdd="true" complexity="medium">
151
+ <name>Implement auth middleware with TDD</name>
152
+ <files>
153
+ src/middleware/auth.ts
154
+ tests/middleware/auth.test.ts
155
+ </files>
156
+ <action>
157
+ RED:
158
+ 1. Create `tests/middleware/auth.test.ts`
159
+ - Test: "rejects request without token" — expect 401
160
+ - Test: "rejects request with invalid token" — expect 401
161
+ - Test: "passes request with valid token" — expect next() called
162
+
163
+ GREEN:
164
+ 2. Create `src/middleware/auth.ts`
165
+ - Export function `requireAuth(req, res, next)`
166
+ - Extract JWT from httpOnly cookie
167
+ - Verify token with jsonwebtoken
168
+ - If valid: attach user to req, call next()
169
+ - If invalid: respond 401
170
+
171
+ REFACTOR:
172
+ 3. Extract token verification into `verifyToken()` helper
173
+ </action>
174
+ <verify>
175
+ npm test -- --grep "auth middleware"
176
+ </verify>
177
+ <done>Auth middleware rejects invalid tokens and passes valid tokens</done>
178
+ </task>
179
+ ```
180
+
181
+ ### Checkpoint: Human Verify
182
+
183
+ ```xml
184
+ <task id="03-02-T3" type="checkpoint:human-verify">
185
+ <name>Verify OAuth callback flow</name>
186
+ <files>
187
+ src/pages/auth/callback.ts
188
+ </files>
189
+ <action>
190
+ 1. Create the OAuth callback page at `src/pages/auth/callback.ts`
191
+ 2. Wire it to call `authenticateWithDiscord()` with the authorization code
192
+ 3. On success: set JWT cookie and redirect to dashboard
193
+ 4. On failure: redirect to login with error message
194
+ </action>
195
+ <verify>
196
+ what-built: OAuth callback page that exchanges Discord auth code for JWT
197
+ how-to-verify: |
198
+ 1. Click "Login with Discord" button
199
+ 2. Authorize the application in Discord
200
+ 3. Verify you are redirected to the dashboard
201
+ 4. Check browser cookies for JWT token
202
+ resume-signal: "User confirms OAuth flow works end-to-end"
203
+ </verify>
204
+ <done>User can complete full Discord OAuth login flow</done>
205
+ </task>
206
+ ```
207
+
208
+ ### Checkpoint: Decision
209
+
210
+ ```xml
211
+ <task id="04-01-T1" type="checkpoint:decision">
212
+ <name>Choose database migration strategy</name>
213
+ <files></files>
214
+ <action>
215
+ Present the user with the migration strategy options after research.
216
+ </action>
217
+ <verify>
218
+ decision: "Which migration strategy to use for production database?"
219
+ context: "We need to decide how to handle schema changes in production."
220
+ options: |
221
+ A) Prisma Migrate — automatic migrations, good for development, requires care in production
222
+ B) Manual SQL full control, more work, explicit about what changes
223
+ C) TypeORM migrations — auto-generated from entities, reversible
224
+ resume-signal: "User selects option A, B, or C"
225
+ </verify>
226
+ <done>Database migration strategy decided and documented in CONTEXT.md</done>
227
+ </task>
228
+ ```
229
+
230
+ ### Checkpoint: Human Action
231
+
232
+ ```xml
233
+ <task id="05-03-T2" type="checkpoint:human-action">
234
+ <name>Configure production environment</name>
235
+ <files>
236
+ .env.production
237
+ </files>
238
+ <action>
239
+ 1. Create `.env.production.example` with all required variables listed
240
+ 2. Document each variable's purpose in comments
241
+ </action>
242
+ <verify>
243
+ what-needed: "Production environment variables must be set"
244
+ how-to-do: |
245
+ 1. Copy `.env.production.example` to `.env.production`
246
+ 2. Fill in production values for:
247
+ - DATABASE_URL (production database connection string)
248
+ - DISCORD_CLIENT_ID (production Discord app)
249
+ - DISCORD_CLIENT_SECRET (production Discord app)
250
+ - JWT_SECRET (generate with: openssl rand -base64 32)
251
+ resume-signal: "User confirms .env.production is configured"
252
+ </verify>
253
+ <done>Production environment is configured with real credentials</done>
254
+ </task>
255
+ ```
256
+
257
+ ---
258
+
259
+ ## The 5 Mandatory Elements
260
+
261
+ Every task MUST have ALL 5. No exceptions.
262
+
263
+ | Element | Purpose | Rules |
264
+ |---------|---------|-------|
265
+ | `<name>` | What the task does | Imperative verb phrase. Short. |
266
+ | `<files>` | Files touched | One per line. Actual file paths. |
267
+ | `<action>` | How to do it | Numbered steps. Specific. Code snippets for complex work. |
268
+ | `<verify>` | How to check | Executable shell commands. Or checkpoint format. |
269
+ | `<done>` | How to know it worked | Observable user/system behavior. Maps to a must-have. |
270
+
271
+ ---
272
+
273
+ ## Task ID Format
274
+
275
+ ```
276
+ {plan_id}-T{sequential_number}
277
+
278
+ Examples:
279
+ 02-01-T1 — Phase 02, Plan 01, Task 1
280
+ 02-01-T2 — Phase 02, Plan 01, Task 2
281
+ 03-02-T1 — Phase 03, Plan 02, Task 1
282
+ ```
283
+
284
+ Task IDs are unique within a phase. They are used for:
285
+ - Commit message references
286
+ - Checkpoint continuation references
287
+ - SUMMARY.md task result tracking