brain-dev 2.3.0 → 2.4.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.
- package/README.md +7 -5
- package/bin/lib/commands/execute.cjs +8 -9
- package/bin/lib/commands/new-task.cjs +6 -2
- package/bin/lib/commands/quick.cjs +15 -3
- package/bin/lib/commands/verify.cjs +12 -1
- package/bin/templates/executor.md +7 -0
- package/commands/brain/review.md +8 -1
- package/hooks/bootstrap.sh +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ Brain adds structure without adding friction:
|
|
|
30
30
|
/brain:discuss → Captures architectural decisions before coding
|
|
31
31
|
/brain:plan → Creates verified execution plans with TDD
|
|
32
32
|
/brain:execute → Builds with per-task commits and deviation handling
|
|
33
|
+
/brain:review → Mandatory code review before verification
|
|
33
34
|
/brain:verify → 3-level verification against must-haves
|
|
34
35
|
/brain:complete → Advances to next phase with audit trail
|
|
35
36
|
```
|
|
@@ -56,7 +57,7 @@ Brain provides four levels of work, from lightweight to comprehensive:
|
|
|
56
57
|
|
|
57
58
|
```
|
|
58
59
|
quick → plan → execute → commit (minutes)
|
|
59
|
-
new-task → discuss → plan → execute → verify
|
|
60
|
+
new-task → discuss → plan → execute → review → verify (hours)
|
|
60
61
|
story → research → requirements → roadmap → phases (days/weeks)
|
|
61
62
|
new-project → detect → map → suggest next step (one-time setup)
|
|
62
63
|
```
|
|
@@ -94,7 +95,7 @@ For features that need more than a quick fix but less than a full story:
|
|
|
94
95
|
/brain:new-task "add payment integration with Stripe"
|
|
95
96
|
```
|
|
96
97
|
|
|
97
|
-
Brain runs the full pipeline: discuss → plan → execute → verify → complete.
|
|
98
|
+
Brain runs the full pipeline: discuss → plan → execute → review → verify → complete.
|
|
98
99
|
|
|
99
100
|
```bash
|
|
100
101
|
/brain:new-task --research "add rate limiting" # With light research
|
|
@@ -150,7 +151,7 @@ No configuration needed — Brain detects your stack and injects expertise into
|
|
|
150
151
|
## Lifecycle
|
|
151
152
|
|
|
152
153
|
```
|
|
153
|
-
init → new-project → story → discuss → plan → execute → verify → complete
|
|
154
|
+
init → new-project → story → discuss → plan → execute → review → verify → complete
|
|
154
155
|
↑ │
|
|
155
156
|
└──────────── next story/phase ───────────────┘
|
|
156
157
|
```
|
|
@@ -173,14 +174,14 @@ Run phases autonomously without human intervention:
|
|
|
173
174
|
/brain:execute --auto --stop # Stop running auto session
|
|
174
175
|
```
|
|
175
176
|
|
|
176
|
-
Auto mode chains: discuss → plan → execute → verify → complete → next phase, with budget limits, stuck detection, and crash recovery built in.
|
|
177
|
+
Auto mode chains: discuss → plan → execute → review → verify → complete → next phase, with budget limits, stuck detection, and crash recovery built in.
|
|
177
178
|
|
|
178
179
|
## State Machine
|
|
179
180
|
|
|
180
181
|
Brain tracks progress through a deterministic state machine:
|
|
181
182
|
|
|
182
183
|
```
|
|
183
|
-
pending → discussing → discussed → planning → executing → executed → verifying → verified → complete
|
|
184
|
+
pending → discussing → discussed → planning → executing → executed → reviewing → reviewed → verifying → verified → complete
|
|
184
185
|
```
|
|
185
186
|
|
|
186
187
|
Every command knows what comes next. `brain-dev progress` always tells you the right next step.
|
|
@@ -223,6 +224,7 @@ No supply chain risk. No transitive vulnerabilities. No `node_modules` bloat.
|
|
|
223
224
|
| `/brain:discuss` | Capture architectural decisions |
|
|
224
225
|
| `/brain:plan` | Create verified execution plans |
|
|
225
226
|
| `/brain:execute` | Build according to plans with TDD |
|
|
227
|
+
| `/brain:review` | Mandatory code review before verification |
|
|
226
228
|
| `/brain:verify` | 3-level verification against must-haves |
|
|
227
229
|
| `/brain:complete` | Mark phase done, advance to next |
|
|
228
230
|
| `/brain:quick` | Quick task — skip the ceremony |
|
|
@@ -6,7 +6,7 @@ const { readState, writeState } = require('../state.cjs');
|
|
|
6
6
|
const { loadTemplate, interpolate, loadTemplateWithOverlay } = require('../templates.cjs');
|
|
7
7
|
const { getAgent, resolveModel } = require('../agents.cjs');
|
|
8
8
|
const { logEvent } = require('../logger.cjs');
|
|
9
|
-
const { output, error } = require('../core.cjs');
|
|
9
|
+
const { output, error, pipelineGate } = require('../core.cjs');
|
|
10
10
|
const { recordInvocation, estimateTokens } = require('../cost.cjs');
|
|
11
11
|
const { acquireLock, releaseLock } = require('../lock.cjs');
|
|
12
12
|
const { generateExpertise, getDetectedFramework } = require('../stack-expert.cjs');
|
|
@@ -306,9 +306,9 @@ async function run(args = [], opts = {}) {
|
|
|
306
306
|
if (!targetPlan) {
|
|
307
307
|
state.phase.status = 'executed';
|
|
308
308
|
writeState(brainDir, state);
|
|
309
|
-
const msg = "All plans executed. Run /brain:
|
|
310
|
-
output({ action: 'all-executed', message: msg, nextAction: '/brain:
|
|
311
|
-
return { action: 'all-executed', message: msg, nextAction: '/brain:
|
|
309
|
+
const msg = "All plans executed. Run /brain:review before verify.";
|
|
310
|
+
output({ action: 'all-executed', message: msg, nextAction: '/brain:review' }, `[brain] ${msg}\n${pipelineGate('npx brain-dev review --phase ' + phaseNumber)}`);
|
|
311
|
+
return { action: 'all-executed', message: msg, nextAction: '/brain:review' };
|
|
312
312
|
}
|
|
313
313
|
|
|
314
314
|
// Read plan content
|
|
@@ -409,10 +409,8 @@ async function run(args = [], opts = {}) {
|
|
|
409
409
|
buildDebuggerSpawnInstructions(taskSlug, errorCtx, taskCtx, attemptedFixes, state)
|
|
410
410
|
};
|
|
411
411
|
|
|
412
|
-
// Build
|
|
413
|
-
const
|
|
414
|
-
? `brain-dev verify --phase ${phaseNumber} --auto-recover`
|
|
415
|
-
: `brain-dev verify --phase ${phaseNumber}`;
|
|
412
|
+
// Build review command (review is mandatory before verify)
|
|
413
|
+
const reviewCmd = `brain-dev review --phase ${phaseNumber}`;
|
|
416
414
|
|
|
417
415
|
const humanLines = [
|
|
418
416
|
`[brain] Executor instructions generated for Plan ${padded} in Phase ${phaseNumber}`,
|
|
@@ -425,7 +423,8 @@ async function run(args = [], opts = {}) {
|
|
|
425
423
|
if (autoRecover) {
|
|
426
424
|
humanLines.push('[brain] Auto-recovery: enabled (verify will auto-diagnose failures)');
|
|
427
425
|
}
|
|
428
|
-
humanLines.push(`[brain]
|
|
426
|
+
humanLines.push(`[brain] After execution, review with: ${reviewCmd}`);
|
|
427
|
+
humanLines.push(pipelineGate(`npx brain-dev review --phase ${phaseNumber}`));
|
|
429
428
|
humanLines.push('');
|
|
430
429
|
humanLines.push(fullPrompt);
|
|
431
430
|
output(result, humanLines.join('\n'));
|
|
@@ -5,7 +5,7 @@ const path = require('node:path');
|
|
|
5
5
|
const { parseArgs } = require('node:util');
|
|
6
6
|
const { readState, writeState } = require('../state.cjs');
|
|
7
7
|
const { logEvent } = require('../logger.cjs');
|
|
8
|
-
const { output, error, prefix } = require('../core.cjs');
|
|
8
|
+
const { output, error, prefix, pipelineGate } = require('../core.cjs');
|
|
9
9
|
const { recordInvocation, estimateTokens } = require('../cost.cjs');
|
|
10
10
|
|
|
11
11
|
async function run(args = [], opts = {}) {
|
|
@@ -237,6 +237,9 @@ function buildStepInstructions(taskNum, slug, taskDir, brainDir, mode, research,
|
|
|
237
237
|
'- Project code style consistency',
|
|
238
238
|
'- Confidence-based filtering (only real issues, ≥80%)',
|
|
239
239
|
'',
|
|
240
|
+
'MANDATORY: Do NOT skip review because changes seem "small" or "trivial".',
|
|
241
|
+
'There are ZERO valid reasons to skip this step.',
|
|
242
|
+
'',
|
|
240
243
|
'Then run: `npx brain-dev new-task --continue`'
|
|
241
244
|
].join('\n');
|
|
242
245
|
}
|
|
@@ -361,7 +364,8 @@ function handleContinue(brainDir, state) {
|
|
|
361
364
|
prefix(`Status: ${newStatus}`),
|
|
362
365
|
prefix(`Next step: ${nextStep}`),
|
|
363
366
|
'',
|
|
364
|
-
steps[nextStep]
|
|
367
|
+
steps[nextStep],
|
|
368
|
+
nextStep === 'review' ? pipelineGate('npx brain-dev review') : ''
|
|
365
369
|
].join('\n');
|
|
366
370
|
|
|
367
371
|
output({
|
|
@@ -6,7 +6,7 @@ const { readState, writeState } = require('../state.cjs');
|
|
|
6
6
|
const { loadTemplate, interpolate } = require('../templates.cjs');
|
|
7
7
|
const { resolveModel } = require('../agents.cjs');
|
|
8
8
|
const { logEvent } = require('../logger.cjs');
|
|
9
|
-
const { output, error, success } = require('../core.cjs');
|
|
9
|
+
const { output, error, success, pipelineGate } = require('../core.cjs');
|
|
10
10
|
const { generateExpertise } = require('../stack-expert.cjs');
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -265,7 +265,7 @@ function handleExecute(args, brainDir, state) {
|
|
|
265
265
|
} catch { /* ignore */ }
|
|
266
266
|
|
|
267
267
|
const nextCmd = isFull
|
|
268
|
-
? `npx brain-dev
|
|
268
|
+
? `npx brain-dev review`
|
|
269
269
|
: `npx brain-dev quick --complete --task ${taskNum}`;
|
|
270
270
|
|
|
271
271
|
logEvent(brainDir, 0, { type: 'quick-execute', task: taskNum });
|
|
@@ -279,9 +279,10 @@ function handleExecute(args, brainDir, state) {
|
|
|
279
279
|
'Do NOT execute the tasks yourself.',
|
|
280
280
|
'',
|
|
281
281
|
`After executor completes, run: ${nextCmd}`,
|
|
282
|
+
isFull ? pipelineGate('npx brain-dev review') : '',
|
|
282
283
|
'',
|
|
283
284
|
prompt
|
|
284
|
-
].join('\n');
|
|
285
|
+
].filter(Boolean).join('\n');
|
|
285
286
|
|
|
286
287
|
const result = {
|
|
287
288
|
action: 'spawn-quick-executor',
|
|
@@ -313,6 +314,17 @@ function handleVerify(args, brainDir, state) {
|
|
|
313
314
|
return { error: 'task-not-found' };
|
|
314
315
|
}
|
|
315
316
|
|
|
317
|
+
// Hard gate: review must be completed before verify
|
|
318
|
+
const reviewPath = path.join(taskDir, 'REVIEW.md');
|
|
319
|
+
if (!fs.existsSync(reviewPath)) {
|
|
320
|
+
error('Review is mandatory before verify. Run: /brain:review first.');
|
|
321
|
+
output(
|
|
322
|
+
{ error: 'review-required', nextAction: '/brain:review' },
|
|
323
|
+
`[brain] BLOCKED: Run /brain:review before quick --verify\n${pipelineGate('npx brain-dev review')}`
|
|
324
|
+
);
|
|
325
|
+
return { error: 'review-required' };
|
|
326
|
+
}
|
|
327
|
+
|
|
316
328
|
const planPath = path.join(taskDir, 'PLAN-1.md');
|
|
317
329
|
const verificationPath = path.join(taskDir, 'VERIFICATION-1.md');
|
|
318
330
|
|
|
@@ -6,7 +6,7 @@ const { readState, writeState, atomicWriteSync } = require('../state.cjs');
|
|
|
6
6
|
const { loadTemplate, interpolate, loadTemplateWithOverlay } = require('../templates.cjs');
|
|
7
7
|
const { getAgent, resolveModel } = require('../agents.cjs');
|
|
8
8
|
const { logEvent } = require('../logger.cjs');
|
|
9
|
-
const { output, error, success } = require('../core.cjs');
|
|
9
|
+
const { output, error, success, pipelineGate } = require('../core.cjs');
|
|
10
10
|
const antiPatterns = require('../anti-patterns.cjs');
|
|
11
11
|
const { buildDebuggerSpawnInstructions } = require('./execute.cjs');
|
|
12
12
|
const { isPathWithinRoot } = require('../security.cjs');
|
|
@@ -203,6 +203,17 @@ async function run(args = [], opts = {}) {
|
|
|
203
203
|
return { error: 'phase-not-found' };
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
// Hard gate: review must be completed before verify
|
|
207
|
+
const reviewPath = path.join(phaseDir, 'REVIEW.md');
|
|
208
|
+
if (!fs.existsSync(reviewPath)) {
|
|
209
|
+
error('Review is mandatory before verify. Run: /brain:review first.');
|
|
210
|
+
output(
|
|
211
|
+
{ error: 'review-required', nextAction: '/brain:review' },
|
|
212
|
+
`[brain] BLOCKED: Run /brain:review before /brain:verify\n${pipelineGate('npx brain-dev review --phase ' + phaseNumber)}`
|
|
213
|
+
);
|
|
214
|
+
return { error: 'review-required' };
|
|
215
|
+
}
|
|
216
|
+
|
|
206
217
|
// Scan for PLAN-*.md files and extract must_haves from each
|
|
207
218
|
const files = fs.readdirSync(phaseDir);
|
|
208
219
|
const planFiles = files.filter(f => /^PLAN-\d+\.md$/.test(f)).sort();
|
|
@@ -243,6 +243,13 @@ Include sections:
|
|
|
243
243
|
- On failure after retry: `## EXECUTION FAILED`
|
|
244
244
|
- On checkpoint (user input needed): `## CHECKPOINT REACHED`
|
|
245
245
|
|
|
246
|
+
## After Execution Completes
|
|
247
|
+
|
|
248
|
+
When you output EXECUTION COMPLETE:
|
|
249
|
+
- The orchestrator will run /brain:review BEFORE /brain:verify
|
|
250
|
+
- Review is MANDATORY — it cannot be skipped for any reason
|
|
251
|
+
- Do NOT suggest running verify directly after execution
|
|
252
|
+
|
|
246
253
|
## Pipeline Enforcement Reminders
|
|
247
254
|
|
|
248
255
|
**EXECUTION FAILED:** When you output this marker:
|
package/commands/brain/review.md
CHANGED
|
@@ -16,11 +16,18 @@ framework best practices, and project code style consistency using confidence-ba
|
|
|
16
16
|
<critical-rules>
|
|
17
17
|
PIPELINE ENFORCEMENT (NON-NEGOTIABLE):
|
|
18
18
|
1. Run `npx brain-dev review` FIRST — before reading code, before analyzing, before suggesting fixes
|
|
19
|
-
2. READ the full output — it
|
|
19
|
+
2. READ the full output — it spawns brain-reviewer agent with framework-specific expertise
|
|
20
20
|
3. FOLLOW the nextAction field — copy the exact command, do not modify it
|
|
21
21
|
4. If output shows an ERROR: follow the recovery path in the output, do NOT debug manually
|
|
22
22
|
5. If output shows a CHECKPOINT: use AskUserQuestion, do NOT pick options yourself
|
|
23
23
|
|
|
24
|
+
ZERO EXCEPTIONS — REVIEW IS ALWAYS MANDATORY:
|
|
25
|
+
- "Changes are minimal" → STILL review. Small changes cause big bugs.
|
|
26
|
+
- "Only 2 files changed" → STILL review. Every file matters.
|
|
27
|
+
- "This is trivial" → STILL review. You don't decide what's trivial, the reviewer agent does.
|
|
28
|
+
- "I can see the code is fine" → STILL review. You are not the reviewer. The pipeline is.
|
|
29
|
+
- NEVER say "skipping review" for any reason. There is no valid reason to skip.
|
|
30
|
+
|
|
24
31
|
CONSEQUENCE OF SKIPPING: Pipeline tracks state, creates audit trails, spawns specialized agents,
|
|
25
32
|
and injects framework-specific expertise. Skipping it means: no state tracking, no audit trail,
|
|
26
33
|
no specialized agents, no framework guidance, potential data loss in .brain/ state.
|
package/hooks/bootstrap.sh
CHANGED
|
@@ -89,6 +89,11 @@ try {
|
|
|
89
89
|
'6. STATE: Run /brain:progress before suggesting next steps.',
|
|
90
90
|
' For /brain:update, always use: npx brain-dev@latest update',
|
|
91
91
|
' NEVER run brain-dev init after an update.',
|
|
92
|
+
'',
|
|
93
|
+
'7. REVIEW IS MANDATORY: After execute, ALWAYS run /brain:review before /brain:verify.',
|
|
94
|
+
' NEVER skip review because changes seem "small", "trivial", or "minimal".',
|
|
95
|
+
' You do NOT decide what needs review. The reviewer agent decides.',
|
|
96
|
+
' There are ZERO valid reasons to skip the review step.',
|
|
92
97
|
'--- End Brain Context ---'
|
|
93
98
|
];
|
|
94
99
|
console.log(lines.join('\n'));
|