project-iris 0.3.0 → 0.3.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.
|
@@ -159,9 +159,22 @@ Based on bolt state:
|
|
|
159
159
|
- **completed** → Inform user bolt is done
|
|
160
160
|
- **blocked** → Show blocker, ask how to resolve
|
|
161
161
|
|
|
162
|
-
### 6. Update Bolt File on Start (CRITICAL -
|
|
162
|
+
### 6. Update Bolt File on Start (CRITICAL - HARD GATE)
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
**⛔ HARD GATE - MUST EXECUTE BEFORE ANY STAGE WORK**
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
168
|
+
│ BOLT FILE UPDATE - NON-NEGOTIABLE │
|
|
169
|
+
│ │
|
|
170
|
+
│ You CANNOT proceed to stage work until you have: │
|
|
171
|
+
│ 1. Used the Edit tool to update bolt.md │
|
|
172
|
+
│ 2. Verified the edit was applied │
|
|
173
|
+
│ 3. Shown the user confirmation of the update │
|
|
174
|
+
│ │
|
|
175
|
+
│ This is a BLOCKING GATE - no exceptions. │
|
|
176
|
+
└─────────────────────────────────────────────────────────────┘
|
|
177
|
+
```
|
|
165
178
|
|
|
166
179
|
When transitioning from `planned` to `in-progress`:
|
|
167
180
|
|
|
@@ -173,11 +186,23 @@ current_stage: {first-stage} # was: null (e.g., "domain-design")
|
|
|
173
186
|
---
|
|
174
187
|
```
|
|
175
188
|
|
|
176
|
-
**
|
|
189
|
+
**Verification Output (REQUIRED):**
|
|
190
|
+
|
|
191
|
+
After editing, output this confirmation to the user:
|
|
192
|
+
|
|
193
|
+
```text
|
|
194
|
+
✅ Bolt file updated: {bolt-id}/bolt.md
|
|
195
|
+
- status: planned → in-progress
|
|
196
|
+
- started: {timestamp}
|
|
197
|
+
- current_stage: {stage-name}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Why This Gate Exists:**
|
|
177
201
|
|
|
178
202
|
1. Progress is tracked even if execution is interrupted
|
|
179
203
|
2. Other tools/agents see accurate status
|
|
180
204
|
3. Resumption works correctly
|
|
205
|
+
4. **Prevents "Lost in the Middle" bug where updates are skipped**
|
|
181
206
|
|
|
182
207
|
**Also update construction log** (see "Update Construction Log" section below).
|
|
183
208
|
|
|
@@ -216,26 +241,53 @@ For the current stage, follow the bolt type definition:
|
|
|
216
241
|
- Use templates if specified by bolt type
|
|
217
242
|
- Place in correct paths per schema
|
|
218
243
|
|
|
219
|
-
### 7b. Story-by-Story Execution (Code Generation Stages)
|
|
244
|
+
### 7b. Story-by-Story Execution (Code Generation Stages) - HARD GATE
|
|
220
245
|
|
|
221
|
-
**⛔
|
|
246
|
+
**⛔ HARD GATE - SEQUENTIAL STORY EXECUTION REQUIRED**
|
|
222
247
|
|
|
223
248
|
```text
|
|
224
249
|
┌─────────────────────────────────────────────────────────────┐
|
|
225
|
-
│ STORY-BY-STORY EXECUTION
|
|
250
|
+
│ STORY-BY-STORY EXECUTION - NON-NEGOTIABLE │
|
|
226
251
|
│ │
|
|
227
|
-
│
|
|
228
|
-
│
|
|
229
|
-
│
|
|
230
|
-
│ 3. Implement code for that story │
|
|
231
|
-
│ 4. Update stories_progress in bolt file │
|
|
232
|
-
│ 5. Announce: "✅ Story {story-id}: Implemented" │
|
|
252
|
+
│ ⛔ FORBIDDEN: Implementing multiple stories at once │
|
|
253
|
+
│ ⛔ FORBIDDEN: Skipping story file reads │
|
|
254
|
+
│ ⛔ FORBIDDEN: Not updating stories_progress in bolt file │
|
|
233
255
|
│ │
|
|
234
|
-
│
|
|
256
|
+
│ You MUST process stories ONE AT A TIME in sequence. │
|
|
257
|
+
│ Each story requires its own announce → read → implement → │
|
|
258
|
+
│ update cycle. Batch implementation = broken traceability. │
|
|
235
259
|
└─────────────────────────────────────────────────────────────┘
|
|
236
260
|
```
|
|
237
261
|
|
|
238
|
-
**
|
|
262
|
+
**For EACH story in bolt's stories array, execute this exact sequence:**
|
|
263
|
+
|
|
264
|
+
```text
|
|
265
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
266
|
+
│ STORY EXECUTION LOOP (repeat for each story) │
|
|
267
|
+
│ │
|
|
268
|
+
│ STEP A: Announce start │
|
|
269
|
+
│ Output: "⏳ Story {n}/{total}: {story-id} - {title}" │
|
|
270
|
+
│ │
|
|
271
|
+
│ STEP B: Read story file (MANDATORY) │
|
|
272
|
+
│ Action: Read {intent}/units/{unit}/stories/{story-id}.md │
|
|
273
|
+
│ Purpose: Extract acceptance criteria for implementation │
|
|
274
|
+
│ │
|
|
275
|
+
│ STEP C: Implement code for THIS story only │
|
|
276
|
+
│ Action: Create/modify code to satisfy acceptance criteria │
|
|
277
|
+
│ Add traceability: // Story: {story-id} │
|
|
278
|
+
│ │
|
|
279
|
+
│ STEP D: Update bolt file stories_progress (MANDATORY) │
|
|
280
|
+
│ Action: Edit bolt.md to mark story as completed │
|
|
281
|
+
│ │
|
|
282
|
+
│ STEP E: Announce completion │
|
|
283
|
+
│ Output: "✅ Story {story-id}: Implemented → `{files}`" │
|
|
284
|
+
│ │
|
|
285
|
+
│ STEP F: Show updated progress list │
|
|
286
|
+
│ Then proceed to next story (back to STEP A) │
|
|
287
|
+
└─────────────────────────────────────────────────────────────┘
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Story Progress Display (show after EACH story completion):**
|
|
239
291
|
|
|
240
292
|
```markdown
|
|
241
293
|
### Story Progress ({completed}/{total})
|
|
@@ -248,7 +300,7 @@ For the current stage, follow the bolt type definition:
|
|
|
248
300
|
6. [ ] **{SSS}-{story-slug}**: Pending
|
|
249
301
|
```
|
|
250
302
|
|
|
251
|
-
**Update bolt file after
|
|
303
|
+
**Update bolt file after EACH story (not at the end):**
|
|
252
304
|
|
|
253
305
|
```yaml
|
|
254
306
|
stories_progress:
|
|
@@ -264,10 +316,51 @@ stories_progress:
|
|
|
264
316
|
status: pending
|
|
265
317
|
```
|
|
266
318
|
|
|
267
|
-
This
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
319
|
+
**Why This Pattern Exists:**
|
|
320
|
+
|
|
321
|
+
1. **Traceability**: Each piece of code maps to a specific story
|
|
322
|
+
2. **Resumability**: If interrupted, we know exactly where to continue
|
|
323
|
+
3. **Verification**: We can validate that ALL stories were addressed
|
|
324
|
+
4. **Visibility**: User sees clear progress through the work
|
|
325
|
+
5. **Quality**: Reading acceptance criteria prevents missed requirements
|
|
326
|
+
|
|
327
|
+
### 7c. Final Regression Check (After All Stories Implemented)
|
|
328
|
+
|
|
329
|
+
**⛔ REQUIRED: After implementing all stories, verify no regressions**
|
|
330
|
+
|
|
331
|
+
```text
|
|
332
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
333
|
+
│ REGRESSION CHECK - BEFORE STAGE CHECKPOINT │
|
|
334
|
+
│ │
|
|
335
|
+
│ After ALL stories are implemented, you MUST verify: │
|
|
336
|
+
│ 1. Re-read acceptance criteria from FIRST story │
|
|
337
|
+
│ 2. Verify the implementation still satisfies those ACs │
|
|
338
|
+
│ 3. Repeat for each story in order │
|
|
339
|
+
│ 4. Report any regressions found │
|
|
340
|
+
│ │
|
|
341
|
+
│ Later stories may have broken earlier implementations. │
|
|
342
|
+
│ Catch this BEFORE moving to Testing stage. │
|
|
343
|
+
└─────────────────────────────────────────────────────────────┘
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Regression Check Output:**
|
|
347
|
+
|
|
348
|
+
```text
|
|
349
|
+
### Regression Check ({stories_count} stories)
|
|
350
|
+
|
|
351
|
+
1. ✅ **{story-1}**: All ACs still valid
|
|
352
|
+
2. ✅ **{story-2}**: All ACs still valid
|
|
353
|
+
3. ⚠️ **{story-3}**: AC2 regression - {description} → FIX REQUIRED
|
|
354
|
+
4. ✅ **{story-4}**: All ACs still valid
|
|
355
|
+
|
|
356
|
+
{If regressions found: Fix before proceeding to checkpoint}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**Why This Check Exists:**
|
|
360
|
+
|
|
361
|
+
- Story N implementation may modify shared code
|
|
362
|
+
- Changes could invalidate Story 1-N-1 acceptance criteria
|
|
363
|
+
- Catching regressions early prevents cascade failures in Testing stage
|
|
271
364
|
|
|
272
365
|
### 8. Handle Checkpoints (As Defined by Bolt Type)
|
|
273
366
|
|
|
@@ -310,14 +403,29 @@ If the bolt type specifies automatic validation criteria, follow those rules.
|
|
|
310
403
|
└─────────────────────────────────────────────────────────────┘
|
|
311
404
|
```
|
|
312
405
|
|
|
313
|
-
### 9. Update Bolt File on Stage Completion
|
|
406
|
+
### 9. Update Bolt File on Stage Completion (HARD GATE)
|
|
407
|
+
|
|
408
|
+
**⛔ HARD GATE - MUST EXECUTE AFTER EACH STAGE**
|
|
314
409
|
|
|
315
410
|
**Trigger**: After EACH stage completion (not just final stage).
|
|
316
411
|
|
|
317
|
-
|
|
412
|
+
```text
|
|
413
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
414
|
+
│ STAGE COMPLETION UPDATE - NON-NEGOTIABLE │
|
|
415
|
+
│ │
|
|
416
|
+
│ Before presenting checkpoint to user, you MUST: │
|
|
417
|
+
│ 1. Use Edit tool to update bolt.md with stage completion │
|
|
418
|
+
│ 2. Show verification output to user │
|
|
419
|
+
│ 3. Only THEN present the checkpoint prompt │
|
|
420
|
+
│ │
|
|
421
|
+
│ Stages not recorded in bolt.md = stages not done. │
|
|
422
|
+
└─────────────────────────────────────────────────────────────┘
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Required Updates:**
|
|
318
426
|
|
|
319
427
|
- Add stage to `stages_completed` with timestamp
|
|
320
|
-
- Update `current_stage` to next stage
|
|
428
|
+
- Update `current_stage` to next stage (or null if final)
|
|
321
429
|
|
|
322
430
|
**⚠️ TIMESTAMP FORMAT**: See `memory-bank.yaml` → `conventions.timestamps`
|
|
323
431
|
|
|
@@ -332,9 +440,18 @@ stages_completed:
|
|
|
332
440
|
---
|
|
333
441
|
```
|
|
334
442
|
|
|
443
|
+
**Verification Output (REQUIRED):**
|
|
444
|
+
|
|
445
|
+
```text
|
|
446
|
+
✅ Stage recorded: {stage-name}
|
|
447
|
+
- stages_completed: [{list of completed stages}]
|
|
448
|
+
- current_stage: {next-stage-name}
|
|
449
|
+
- artifact: {artifact-filename}
|
|
450
|
+
```
|
|
451
|
+
|
|
335
452
|
**If this is the FINAL stage**, proceed to **Step 10** (bolt completion).
|
|
336
453
|
|
|
337
|
-
**If this is NOT the final stage**, update bolt file
|
|
454
|
+
**If this is NOT the final stage**, update bolt file, show verification, then present checkpoint.
|
|
338
455
|
|
|
339
456
|
---
|
|
340
457
|
|
|
@@ -386,8 +386,9 @@ Implement CQRS pattern with separate read models for task queries.
|
|
|
386
386
|
|
|
387
387
|
**After ALL stories are implemented:**
|
|
388
388
|
|
|
389
|
-
6 - **
|
|
390
|
-
7 - **
|
|
389
|
+
6 - **Run regression check**: Re-verify ALL story acceptance criteria still valid
|
|
390
|
+
7 - **Setup project structure**: Verify scaffolding exists
|
|
391
|
+
8 - **Run code quality validation**: Execute linting, type checking, build
|
|
391
392
|
|
|
392
393
|
**Artifact**: Source code in unit directory
|
|
393
394
|
**Location**: `src/{unit}/` or as defined in project structure
|
|
@@ -433,6 +434,7 @@ src/{unit}/
|
|
|
433
434
|
**Completion Criteria**:
|
|
434
435
|
|
|
435
436
|
- [ ] **All stories implemented in order** (see Story Progress below)
|
|
437
|
+
- [ ] **Regression check passed** - all previous story ACs still valid
|
|
436
438
|
- [ ] All domain models implemented
|
|
437
439
|
- [ ] All use cases implemented
|
|
438
440
|
- [ ] All API endpoints implemented
|
|
@@ -459,6 +461,13 @@ src/{unit}/
|
|
|
459
461
|
5. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
|
|
460
462
|
6. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
|
|
461
463
|
|
|
464
|
+
### Regression Check ({n}/{n} stories verified)
|
|
465
|
+
|
|
466
|
+
1. ✅ **{SSS}-{story-slug}**: All ACs still valid
|
|
467
|
+
2. ✅ **{SSS}-{story-slug}**: All ACs still valid
|
|
468
|
+
3. ✅ **{SSS}-{story-slug}**: All ACs still valid
|
|
469
|
+
...
|
|
470
|
+
|
|
462
471
|
### Code Generated
|
|
463
472
|
- {n} domain entities
|
|
464
473
|
- {n} use cases
|
|
@@ -469,6 +478,7 @@ src/{unit}/
|
|
|
469
478
|
- ✅ Types: Passed
|
|
470
479
|
- ✅ Build: Passed
|
|
471
480
|
- ✅ Traceability: All files linked to stories
|
|
481
|
+
- ✅ Regression: No story ACs broken
|
|
472
482
|
|
|
473
483
|
### Acceptance Criteria Preview
|
|
474
484
|
Each story's ACs will be validated in Stage 5 (Testing).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "project-iris",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Multi-agent orchestration system for AI-native software development. Delivers AI-DLC, Agile, and custom SDLC flows as markdown-based agent systems.",
|
|
5
5
|
"main": "lib/installer.js",
|
|
6
6
|
"bin": {
|
package/scripts/bolt-complete.js
CHANGED
|
@@ -58,6 +58,8 @@
|
|
|
58
58
|
* │ 3. If not complete: │
|
|
59
59
|
* │ status: {current} → complete │
|
|
60
60
|
* │ implemented: false → true │
|
|
61
|
+
* │ 4. Check off acceptance criteria checkboxes: │
|
|
62
|
+
* │ - [ ] → - [x] (within ## Acceptance Criteria section) │
|
|
61
63
|
* │ │
|
|
62
64
|
* │ Story search strategy: │
|
|
63
65
|
* │ - Direct path: {intent}/units/{unit}/stories/{story}.md │
|
|
@@ -106,7 +108,7 @@
|
|
|
106
108
|
* │ └── {unit}/
|
|
107
109
|
* │ ├── unit-brief.md ← Updated: status (if all bolts complete)
|
|
108
110
|
* │ └── stories/
|
|
109
|
-
* │ ├── 001-{story}.md ← Updated: status, implemented
|
|
111
|
+
* │ ├── 001-{story}.md ← Updated: status, implemented, ACs checked
|
|
110
112
|
* │ └── ...
|
|
111
113
|
*
|
|
112
114
|
* ┌──────────────────────────────────────────────────────────────────────────┐
|
|
@@ -177,6 +179,50 @@ function updateFrontmatter(content, newFrontmatter) {
|
|
|
177
179
|
return `---\n${newYaml}\n---${content.slice(match[0].length)}`;
|
|
178
180
|
}
|
|
179
181
|
|
|
182
|
+
/**
|
|
183
|
+
* Check off all acceptance criteria checkboxes in markdown content
|
|
184
|
+
* Converts "- [ ]" to "- [x]" in the Acceptance Criteria section
|
|
185
|
+
*/
|
|
186
|
+
function checkAcceptanceCriteria(content) {
|
|
187
|
+
// Find the Acceptance Criteria section and check all boxes
|
|
188
|
+
// Pattern matches: - [ ] at start of line (with optional leading whitespace)
|
|
189
|
+
// Only within Acceptance Criteria section
|
|
190
|
+
|
|
191
|
+
const lines = content.split('\n');
|
|
192
|
+
let inAcceptanceCriteria = false;
|
|
193
|
+
let modified = false;
|
|
194
|
+
|
|
195
|
+
const updatedLines = lines.map(line => {
|
|
196
|
+
// Check if we're entering Acceptance Criteria section
|
|
197
|
+
if (line.match(/^##\s*Acceptance Criteria/i)) {
|
|
198
|
+
inAcceptanceCriteria = true;
|
|
199
|
+
return line;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Check if we're leaving (another h2 section)
|
|
203
|
+
if (inAcceptanceCriteria && line.match(/^##\s+[^#]/)) {
|
|
204
|
+
inAcceptanceCriteria = false;
|
|
205
|
+
return line;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// If in Acceptance Criteria section, check off unchecked boxes
|
|
209
|
+
if (inAcceptanceCriteria) {
|
|
210
|
+
const checkedLine = line.replace(/^(\s*-\s*)\[ \]/, '$1[x]');
|
|
211
|
+
if (checkedLine !== line) {
|
|
212
|
+
modified = true;
|
|
213
|
+
}
|
|
214
|
+
return checkedLine;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return line;
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
content: updatedLines.join('\n'),
|
|
222
|
+
modified
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
180
226
|
/**
|
|
181
227
|
* Format timestamp as ISO 8601
|
|
182
228
|
* Format: YYYY-MM-DDTHH:MM:SSZ (no milliseconds, per memory-bank.yaml convention)
|
|
@@ -357,13 +403,19 @@ async function updateStories(bolt) {
|
|
|
357
403
|
implemented: true
|
|
358
404
|
};
|
|
359
405
|
|
|
360
|
-
|
|
406
|
+
let newContent = updateFrontmatter(content, newFrontmatter);
|
|
361
407
|
if (newContent) {
|
|
408
|
+
// Also check off acceptance criteria checkboxes
|
|
409
|
+
const acResult = checkAcceptanceCriteria(newContent);
|
|
410
|
+
newContent = acResult.content;
|
|
411
|
+
const acChecked = acResult.modified;
|
|
412
|
+
|
|
362
413
|
await fs.writeFile(storyPath, newContent, 'utf8');
|
|
363
414
|
const oldStatus = frontmatter.status || 'draft';
|
|
364
|
-
|
|
415
|
+
const acNote = acChecked ? ` ${colors.dim}(ACs checked)${colors.reset}` : '';
|
|
416
|
+
console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}${oldStatus} → complete${colors.reset}${acNote}`);
|
|
365
417
|
results.updated++;
|
|
366
|
-
results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete' });
|
|
418
|
+
results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete', acChecked });
|
|
367
419
|
} else {
|
|
368
420
|
console.log(` ${colors.red}✗${colors.reset} ${storyId} - ${colors.dim}Failed to update${colors.reset}`);
|
|
369
421
|
results.errors++;
|