project-iris 0.3.0 → 0.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/flows/aidlc/context-config.yaml +4 -1
- package/flows/aidlc/skills/construction/bolt-start.md +214 -24
- package/flows/aidlc/templates/construction/bolt-types/ddd-construction-bolt/ddd-04-implementation-walkthrough-template.md +58 -0
- package/flows/aidlc/templates/construction/bolt-types/ddd-construction-bolt.md +21 -5
- package/flows/aidlc/templates/construction/bolt-types/simple-construction-bolt.md +3 -0
- package/flows/aidlc/templates/construction/ui-patterns.md +352 -0
- package/package.json +1 -1
- package/scripts/bolt-complete.js +80 -12
|
@@ -22,7 +22,10 @@ agents:
|
|
|
22
22
|
purpose: "API design conventions"
|
|
23
23
|
|
|
24
24
|
- path: standards/ux-guide.md
|
|
25
|
-
purpose: "UI/UX
|
|
25
|
+
purpose: "Project's UI/UX decisions and design tokens"
|
|
26
|
+
|
|
27
|
+
- path: .iris/aidlc/templates/construction/ui-patterns.md
|
|
28
|
+
purpose: "Design guide for building professional UI (load for any frontend work)"
|
|
26
29
|
|
|
27
30
|
on_missing_critical:
|
|
28
31
|
action: warn
|
|
@@ -143,12 +143,43 @@ agents:
|
|
|
143
143
|
optional_context:
|
|
144
144
|
- path: standards/system-architecture.md
|
|
145
145
|
- path: standards/api-conventions.md
|
|
146
|
+
- path: standards/ux-guide.md
|
|
147
|
+
- path: .iris/aidlc/templates/construction/ui-patterns.md
|
|
146
148
|
```
|
|
147
149
|
|
|
148
150
|
1. Load all `required_context` files (warn if missing with `critical: true`)
|
|
149
151
|
2. Load `optional_context` files if they exist
|
|
150
152
|
|
|
151
|
-
|
|
153
|
+
### 4b. UI Design Context (Conditional Load)
|
|
154
|
+
|
|
155
|
+
**Check if UI design guidance may be relevant:**
|
|
156
|
+
|
|
157
|
+
Scan the bolt's unit name, story titles, and story descriptions for these signals:
|
|
158
|
+
- `screen`, `page`, `view`, `layout`
|
|
159
|
+
- `component`, `widget`, `button`, `form`, `modal`, `dialog`
|
|
160
|
+
- `ui`, `ux`, `frontend`, `presentation`
|
|
161
|
+
- `navigation`, `menu`, `sidebar`, `header`, `footer`
|
|
162
|
+
- `list`, `card`, `table`, `grid` (in UI context)
|
|
163
|
+
|
|
164
|
+
**If ANY signal is found:**
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
168
|
+
│ UI DESIGN CONTEXT DETECTED │
|
|
169
|
+
│ │
|
|
170
|
+
│ Signal found: {signal} in {unit/story} │
|
|
171
|
+
│ │
|
|
172
|
+
│ Action: Read ui-patterns.md for design guidance │
|
|
173
|
+
│ Path: .iris/aidlc/templates/construction/ui-patterns.md │
|
|
174
|
+
│ │
|
|
175
|
+
│ Apply these principles where relevant during │
|
|
176
|
+
│ implementation. Not all principles apply to all tasks. │
|
|
177
|
+
└─────────────────────────────────────────────────────────────┘
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Then read the file and keep its principles in mind during code generation.**
|
|
181
|
+
|
|
182
|
+
This is not a hard requirement - use judgment on which principles apply to the current task.
|
|
152
183
|
|
|
153
184
|
### 5. Determine Current Stage
|
|
154
185
|
|
|
@@ -159,9 +190,22 @@ Based on bolt state:
|
|
|
159
190
|
- **completed** → Inform user bolt is done
|
|
160
191
|
- **blocked** → Show blocker, ask how to resolve
|
|
161
192
|
|
|
162
|
-
### 6. Update Bolt File on Start (CRITICAL -
|
|
193
|
+
### 6. Update Bolt File on Start (CRITICAL - HARD GATE)
|
|
194
|
+
|
|
195
|
+
**⛔ HARD GATE - MUST EXECUTE BEFORE ANY STAGE WORK**
|
|
163
196
|
|
|
164
|
-
|
|
197
|
+
```text
|
|
198
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
199
|
+
│ BOLT FILE UPDATE - NON-NEGOTIABLE │
|
|
200
|
+
│ │
|
|
201
|
+
│ You CANNOT proceed to stage work until you have: │
|
|
202
|
+
│ 1. Used the Edit tool to update bolt.md │
|
|
203
|
+
│ 2. Verified the edit was applied │
|
|
204
|
+
│ 3. Shown the user confirmation of the update │
|
|
205
|
+
│ │
|
|
206
|
+
│ This is a BLOCKING GATE - no exceptions. │
|
|
207
|
+
└─────────────────────────────────────────────────────────────┘
|
|
208
|
+
```
|
|
165
209
|
|
|
166
210
|
When transitioning from `planned` to `in-progress`:
|
|
167
211
|
|
|
@@ -173,11 +217,23 @@ current_stage: {first-stage} # was: null (e.g., "domain-design")
|
|
|
173
217
|
---
|
|
174
218
|
```
|
|
175
219
|
|
|
176
|
-
**
|
|
220
|
+
**Verification Output (REQUIRED):**
|
|
221
|
+
|
|
222
|
+
After editing, output this confirmation to the user:
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
✅ Bolt file updated: {bolt-id}/bolt.md
|
|
226
|
+
- status: planned → in-progress
|
|
227
|
+
- started: {timestamp}
|
|
228
|
+
- current_stage: {stage-name}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Why This Gate Exists:**
|
|
177
232
|
|
|
178
233
|
1. Progress is tracked even if execution is interrupted
|
|
179
234
|
2. Other tools/agents see accurate status
|
|
180
235
|
3. Resumption works correctly
|
|
236
|
+
4. **Prevents "Lost in the Middle" bug where updates are skipped**
|
|
181
237
|
|
|
182
238
|
**Also update construction log** (see "Update Construction Log" section below).
|
|
183
239
|
|
|
@@ -216,26 +272,95 @@ For the current stage, follow the bolt type definition:
|
|
|
216
272
|
- Use templates if specified by bolt type
|
|
217
273
|
- Place in correct paths per schema
|
|
218
274
|
|
|
219
|
-
###
|
|
275
|
+
### 7a. Stage Artifact Creation (HARD GATE)
|
|
276
|
+
|
|
277
|
+
**⛔ HARD GATE - STAGE ARTIFACTS ARE MANDATORY**
|
|
278
|
+
|
|
279
|
+
```text
|
|
280
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
281
|
+
│ ARTIFACT CREATION - NON-NEGOTIABLE │
|
|
282
|
+
│ │
|
|
283
|
+
│ Each stage in the bolt type specifies an artifact. │
|
|
284
|
+
│ You MUST create it before presenting the checkpoint. │
|
|
285
|
+
│ │
|
|
286
|
+
│ ⛔ FORBIDDEN: Completing a stage without its artifact │
|
|
287
|
+
│ ⛔ FORBIDDEN: Skipping artifact because "it's optional" │
|
|
288
|
+
│ ⛔ FORBIDDEN: Only creating source code without docs │
|
|
289
|
+
│ │
|
|
290
|
+
│ The artifact documents what was done. No artifact = stage │
|
|
291
|
+
│ not complete. │
|
|
292
|
+
└─────────────────────────────────────────────────────────────┘
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Artifact Verification (before checkpoint):**
|
|
296
|
+
|
|
297
|
+
```text
|
|
298
|
+
✅ Stage artifact created: {artifact-path}
|
|
299
|
+
- Location: memory-bank/bolts/{bolt-id}/{artifact-name}
|
|
300
|
+
- Template used: {yes/no}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Common artifacts by bolt type:**
|
|
304
|
+
|
|
305
|
+
| Bolt Type | Stage | Required Artifact |
|
|
306
|
+
|-----------|-------|-------------------|
|
|
307
|
+
| simple-construction | Plan | `implementation-plan.md` |
|
|
308
|
+
| simple-construction | Code Generation | `implementation-walkthrough.md` |
|
|
309
|
+
| simple-construction | Testing | `test-walkthrough.md` |
|
|
310
|
+
| ddd-construction | Domain Design | `ddd-01-domain-design.md` |
|
|
311
|
+
| ddd-construction | Logical Design | `ddd-02-logical-design.md` |
|
|
312
|
+
| ddd-construction | Code Generation | `ddd-04-implementation-walkthrough.md` |
|
|
313
|
+
| ddd-construction | Testing | `ddd-03-test-report.md` |
|
|
314
|
+
|
|
315
|
+
**If bolt type specifies an artifact, you MUST create it.**
|
|
316
|
+
|
|
317
|
+
### 7b. Story-by-Story Execution (Code Generation Stages) - HARD GATE
|
|
220
318
|
|
|
221
|
-
**⛔
|
|
319
|
+
**⛔ HARD GATE - SEQUENTIAL STORY EXECUTION REQUIRED**
|
|
222
320
|
|
|
223
321
|
```text
|
|
224
322
|
┌─────────────────────────────────────────────────────────────┐
|
|
225
|
-
│ STORY-BY-STORY EXECUTION
|
|
323
|
+
│ STORY-BY-STORY EXECUTION - NON-NEGOTIABLE │
|
|
226
324
|
│ │
|
|
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" │
|
|
325
|
+
│ ⛔ FORBIDDEN: Implementing multiple stories at once │
|
|
326
|
+
│ ⛔ FORBIDDEN: Skipping story file reads │
|
|
327
|
+
│ ⛔ FORBIDDEN: Not updating stories_progress in bolt file │
|
|
233
328
|
│ │
|
|
234
|
-
│
|
|
329
|
+
│ You MUST process stories ONE AT A TIME in sequence. │
|
|
330
|
+
│ Each story requires its own announce → read → implement → │
|
|
331
|
+
│ update cycle. Batch implementation = broken traceability. │
|
|
235
332
|
└─────────────────────────────────────────────────────────────┘
|
|
236
333
|
```
|
|
237
334
|
|
|
238
|
-
**
|
|
335
|
+
**For EACH story in bolt's stories array, execute this exact sequence:**
|
|
336
|
+
|
|
337
|
+
```text
|
|
338
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
339
|
+
│ STORY EXECUTION LOOP (repeat for each story) │
|
|
340
|
+
│ │
|
|
341
|
+
│ STEP A: Announce start │
|
|
342
|
+
│ Output: "⏳ Story {n}/{total}: {story-id} - {title}" │
|
|
343
|
+
│ │
|
|
344
|
+
│ STEP B: Read story file (MANDATORY) │
|
|
345
|
+
│ Action: Read {intent}/units/{unit}/stories/{story-id}.md │
|
|
346
|
+
│ Purpose: Extract acceptance criteria for implementation │
|
|
347
|
+
│ │
|
|
348
|
+
│ STEP C: Implement code for THIS story only │
|
|
349
|
+
│ Action: Create/modify code to satisfy acceptance criteria │
|
|
350
|
+
│ Add traceability: // Story: {story-id} │
|
|
351
|
+
│ │
|
|
352
|
+
│ STEP D: Update bolt file stories_progress (MANDATORY) │
|
|
353
|
+
│ Action: Edit bolt.md to mark story as completed │
|
|
354
|
+
│ │
|
|
355
|
+
│ STEP E: Announce completion │
|
|
356
|
+
│ Output: "✅ Story {story-id}: Implemented → `{files}`" │
|
|
357
|
+
│ │
|
|
358
|
+
│ STEP F: Show updated progress list │
|
|
359
|
+
│ Then proceed to next story (back to STEP A) │
|
|
360
|
+
└─────────────────────────────────────────────────────────────┘
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**Story Progress Display (show after EACH story completion):**
|
|
239
364
|
|
|
240
365
|
```markdown
|
|
241
366
|
### Story Progress ({completed}/{total})
|
|
@@ -248,7 +373,7 @@ For the current stage, follow the bolt type definition:
|
|
|
248
373
|
6. [ ] **{SSS}-{story-slug}**: Pending
|
|
249
374
|
```
|
|
250
375
|
|
|
251
|
-
**Update bolt file after
|
|
376
|
+
**Update bolt file after EACH story (not at the end):**
|
|
252
377
|
|
|
253
378
|
```yaml
|
|
254
379
|
stories_progress:
|
|
@@ -264,10 +389,51 @@ stories_progress:
|
|
|
264
389
|
status: pending
|
|
265
390
|
```
|
|
266
391
|
|
|
267
|
-
This
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
392
|
+
**Why This Pattern Exists:**
|
|
393
|
+
|
|
394
|
+
1. **Traceability**: Each piece of code maps to a specific story
|
|
395
|
+
2. **Resumability**: If interrupted, we know exactly where to continue
|
|
396
|
+
3. **Verification**: We can validate that ALL stories were addressed
|
|
397
|
+
4. **Visibility**: User sees clear progress through the work
|
|
398
|
+
5. **Quality**: Reading acceptance criteria prevents missed requirements
|
|
399
|
+
|
|
400
|
+
### 7c. Final Regression Check (After All Stories Implemented)
|
|
401
|
+
|
|
402
|
+
**⛔ REQUIRED: After implementing all stories, verify no regressions**
|
|
403
|
+
|
|
404
|
+
```text
|
|
405
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
406
|
+
│ REGRESSION CHECK - BEFORE STAGE CHECKPOINT │
|
|
407
|
+
│ │
|
|
408
|
+
│ After ALL stories are implemented, you MUST verify: │
|
|
409
|
+
│ 1. Re-read acceptance criteria from FIRST story │
|
|
410
|
+
│ 2. Verify the implementation still satisfies those ACs │
|
|
411
|
+
│ 3. Repeat for each story in order │
|
|
412
|
+
│ 4. Report any regressions found │
|
|
413
|
+
│ │
|
|
414
|
+
│ Later stories may have broken earlier implementations. │
|
|
415
|
+
│ Catch this BEFORE moving to Testing stage. │
|
|
416
|
+
└─────────────────────────────────────────────────────────────┘
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Regression Check Output:**
|
|
420
|
+
|
|
421
|
+
```text
|
|
422
|
+
### Regression Check ({stories_count} stories)
|
|
423
|
+
|
|
424
|
+
1. ✅ **{story-1}**: All ACs still valid
|
|
425
|
+
2. ✅ **{story-2}**: All ACs still valid
|
|
426
|
+
3. ⚠️ **{story-3}**: AC2 regression - {description} → FIX REQUIRED
|
|
427
|
+
4. ✅ **{story-4}**: All ACs still valid
|
|
428
|
+
|
|
429
|
+
{If regressions found: Fix before proceeding to checkpoint}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
**Why This Check Exists:**
|
|
433
|
+
|
|
434
|
+
- Story N implementation may modify shared code
|
|
435
|
+
- Changes could invalidate Story 1-N-1 acceptance criteria
|
|
436
|
+
- Catching regressions early prevents cascade failures in Testing stage
|
|
271
437
|
|
|
272
438
|
### 8. Handle Checkpoints (As Defined by Bolt Type)
|
|
273
439
|
|
|
@@ -310,14 +476,29 @@ If the bolt type specifies automatic validation criteria, follow those rules.
|
|
|
310
476
|
└─────────────────────────────────────────────────────────────┘
|
|
311
477
|
```
|
|
312
478
|
|
|
313
|
-
### 9. Update Bolt File on Stage Completion
|
|
479
|
+
### 9. Update Bolt File on Stage Completion (HARD GATE)
|
|
480
|
+
|
|
481
|
+
**⛔ HARD GATE - MUST EXECUTE AFTER EACH STAGE**
|
|
314
482
|
|
|
315
483
|
**Trigger**: After EACH stage completion (not just final stage).
|
|
316
484
|
|
|
317
|
-
|
|
485
|
+
```text
|
|
486
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
487
|
+
│ STAGE COMPLETION UPDATE - NON-NEGOTIABLE │
|
|
488
|
+
│ │
|
|
489
|
+
│ Before presenting checkpoint to user, you MUST: │
|
|
490
|
+
│ 1. Use Edit tool to update bolt.md with stage completion │
|
|
491
|
+
│ 2. Show verification output to user │
|
|
492
|
+
│ 3. Only THEN present the checkpoint prompt │
|
|
493
|
+
│ │
|
|
494
|
+
│ Stages not recorded in bolt.md = stages not done. │
|
|
495
|
+
└─────────────────────────────────────────────────────────────┘
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
**Required Updates:**
|
|
318
499
|
|
|
319
500
|
- Add stage to `stages_completed` with timestamp
|
|
320
|
-
- Update `current_stage` to next stage
|
|
501
|
+
- Update `current_stage` to next stage (or null if final)
|
|
321
502
|
|
|
322
503
|
**⚠️ TIMESTAMP FORMAT**: See `memory-bank.yaml` → `conventions.timestamps`
|
|
323
504
|
|
|
@@ -332,9 +513,18 @@ stages_completed:
|
|
|
332
513
|
---
|
|
333
514
|
```
|
|
334
515
|
|
|
516
|
+
**Verification Output (REQUIRED):**
|
|
517
|
+
|
|
518
|
+
```text
|
|
519
|
+
✅ Stage recorded: {stage-name}
|
|
520
|
+
- stages_completed: [{list of completed stages}]
|
|
521
|
+
- current_stage: {next-stage-name}
|
|
522
|
+
- artifact: {artifact-filename}
|
|
523
|
+
```
|
|
524
|
+
|
|
335
525
|
**If this is the FINAL stage**, proceed to **Step 10** (bolt completion).
|
|
336
526
|
|
|
337
|
-
**If this is NOT the final stage**, update bolt file
|
|
527
|
+
**If this is NOT the final stage**, update bolt file, show verification, then present checkpoint.
|
|
338
528
|
|
|
339
529
|
---
|
|
340
530
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
stage: code-generation
|
|
3
|
+
bolt: {bolt-id}
|
|
4
|
+
created: {YYYY-MM-DDTHH:MM:SSZ}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Implementation Walkthrough: {unit-name}
|
|
8
|
+
|
|
9
|
+
### Summary
|
|
10
|
+
|
|
11
|
+
{2-3 sentence overview of what was built - NO CODE}
|
|
12
|
+
|
|
13
|
+
### Design Alignment
|
|
14
|
+
|
|
15
|
+
How the implementation aligns with design documents:
|
|
16
|
+
|
|
17
|
+
- **Domain Design**: {alignment notes or deviations}
|
|
18
|
+
- **Logical Design**: {alignment notes or deviations}
|
|
19
|
+
|
|
20
|
+
### Structure Overview
|
|
21
|
+
|
|
22
|
+
{High-level description of the DDD layers implemented - NO CODE}
|
|
23
|
+
|
|
24
|
+
### Completed Work
|
|
25
|
+
|
|
26
|
+
#### Domain Layer
|
|
27
|
+
- [x] `{path/to/file}` - {what this file does}
|
|
28
|
+
|
|
29
|
+
#### Application Layer
|
|
30
|
+
- [x] `{path/to/file}` - {what this file does}
|
|
31
|
+
|
|
32
|
+
#### Infrastructure Layer
|
|
33
|
+
- [x] `{path/to/file}` - {what this file does}
|
|
34
|
+
|
|
35
|
+
#### Presentation Layer
|
|
36
|
+
- [x] `{path/to/file}` - {what this file does}
|
|
37
|
+
|
|
38
|
+
### Story Traceability
|
|
39
|
+
|
|
40
|
+
| Story | Files |
|
|
41
|
+
|-------|-------|
|
|
42
|
+
| {story-id} | `{files}` |
|
|
43
|
+
|
|
44
|
+
### Key Decisions
|
|
45
|
+
|
|
46
|
+
- **{Decision}**: {Why this approach was chosen}
|
|
47
|
+
|
|
48
|
+
### Deviations from Design
|
|
49
|
+
|
|
50
|
+
{Any changes from domain-design or logical-design and why, or "None"}
|
|
51
|
+
|
|
52
|
+
### Dependencies Added
|
|
53
|
+
|
|
54
|
+
- [x] `{package}` - {why needed}
|
|
55
|
+
|
|
56
|
+
### Developer Notes
|
|
57
|
+
|
|
58
|
+
{Gotchas, tips, or context for future work - keep brief}
|
|
@@ -33,7 +33,7 @@ Stage 1: Domain Design → Stage 2: Logical Design → Stage 3: ADR Analysis (op
|
|
|
33
33
|
- ✅/[ ] **1. Domain Design** (Required) → `ddd-01-domain-design.md`
|
|
34
34
|
- ✅/[ ] **2. Logical Design** (Required) → `ddd-02-logical-design.md`
|
|
35
35
|
- ✅/[ ] **3. ADR Analysis** (Optional) → `adr-{n}-{slug}.md` (zero or more)
|
|
36
|
-
- ✅/[ ] **4. Code Generation** (Required) → Source code
|
|
36
|
+
- ✅/[ ] **4. Code Generation** (Required) → Source code + `ddd-04-implementation-walkthrough.md`
|
|
37
37
|
- ✅/[ ] **5. Testing** (Required) → Tests + `ddd-03-test-report.md`
|
|
38
38
|
|
|
39
39
|
**Rules**:
|
|
@@ -386,11 +386,18 @@ 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
|
-
|
|
393
|
+
**Artifacts**:
|
|
394
|
+
|
|
395
|
+
- Source code in unit directory: `src/{unit}/` or as defined in project structure
|
|
396
|
+
- `ddd-04-implementation-walkthrough.md`: `memory-bank/bolts/{bolt-id}/ddd-04-implementation-walkthrough.md`
|
|
397
|
+
|
|
398
|
+
**Template**: `.iris/aidlc/templates/construction/bolt-types/ddd-construction-bolt/ddd-04-implementation-walkthrough-template.md`
|
|
399
|
+
|
|
400
|
+
**Implementation Walkthrough** documents what was built, any deviations from design, and key decisions made during coding. This is required - do not skip it.
|
|
394
401
|
|
|
395
402
|
**Project Structure**:
|
|
396
403
|
|
|
@@ -433,6 +440,7 @@ src/{unit}/
|
|
|
433
440
|
**Completion Criteria**:
|
|
434
441
|
|
|
435
442
|
- [ ] **All stories implemented in order** (see Story Progress below)
|
|
443
|
+
- [ ] **Regression check passed** - all previous story ACs still valid
|
|
436
444
|
- [ ] All domain models implemented
|
|
437
445
|
- [ ] All use cases implemented
|
|
438
446
|
- [ ] All API endpoints implemented
|
|
@@ -459,6 +467,13 @@ src/{unit}/
|
|
|
459
467
|
5. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
|
|
460
468
|
6. ✅ **{SSS}-{story-slug}**: Implemented → `{files}`
|
|
461
469
|
|
|
470
|
+
### Regression Check ({n}/{n} stories verified)
|
|
471
|
+
|
|
472
|
+
1. ✅ **{SSS}-{story-slug}**: All ACs still valid
|
|
473
|
+
2. ✅ **{SSS}-{story-slug}**: All ACs still valid
|
|
474
|
+
3. ✅ **{SSS}-{story-slug}**: All ACs still valid
|
|
475
|
+
...
|
|
476
|
+
|
|
462
477
|
### Code Generated
|
|
463
478
|
- {n} domain entities
|
|
464
479
|
- {n} use cases
|
|
@@ -469,6 +484,7 @@ src/{unit}/
|
|
|
469
484
|
- ✅ Types: Passed
|
|
470
485
|
- ✅ Build: Passed
|
|
471
486
|
- ✅ Traceability: All files linked to stories
|
|
487
|
+
- ✅ Regression: No story ACs broken
|
|
472
488
|
|
|
473
489
|
### Acceptance Criteria Preview
|
|
474
490
|
Each story's ACs will be validated in Stage 5 (Testing).
|
|
@@ -147,6 +147,9 @@ created: {YYYY-MM-DDTHH:MM:SSZ}
|
|
|
147
147
|
|
|
148
148
|
**Duration**: Hours (varies by complexity)
|
|
149
149
|
|
|
150
|
+
**For UI Work** (screens, components, layouts):
|
|
151
|
+
Load `.iris/aidlc/templates/construction/ui-patterns.md` before implementing. This guide helps you build professional UI without a designer.
|
|
152
|
+
|
|
150
153
|
**Activities**:
|
|
151
154
|
|
|
152
155
|
1 - **Setup structure**: Create files and folders
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
# UI Design Guide
|
|
2
|
+
|
|
3
|
+
You are building UI for a project without a designer. Your goal is to create polished, professional interfaces that users love. Think like a designer, not a developer.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Design Mindset
|
|
8
|
+
|
|
9
|
+
**Before writing any UI code, ask yourself:**
|
|
10
|
+
|
|
11
|
+
1. What is the user trying to accomplish here?
|
|
12
|
+
2. What's the most important thing on this screen?
|
|
13
|
+
3. What can I remove to make it simpler?
|
|
14
|
+
4. Would a non-technical person understand this instantly?
|
|
15
|
+
|
|
16
|
+
**Your north star**: If it looks like a template, you've failed. If it feels intentional and crafted, you've succeeded.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Design Tokens (Non-Negotiable)
|
|
21
|
+
|
|
22
|
+
**Before building screens, define and lock these values:**
|
|
23
|
+
|
|
24
|
+
- Font family
|
|
25
|
+
- Type scale (use the one in this guide)
|
|
26
|
+
- Primary color
|
|
27
|
+
- Neutral gray scale
|
|
28
|
+
- Border radius
|
|
29
|
+
- Shadow levels
|
|
30
|
+
- Spacing scale
|
|
31
|
+
|
|
32
|
+
**Once defined:**
|
|
33
|
+
|
|
34
|
+
- Do not invent new sizes
|
|
35
|
+
- Do not invent new colors
|
|
36
|
+
- Do not invent new radiuses
|
|
37
|
+
- Do not invent new spacing values
|
|
38
|
+
|
|
39
|
+
**Consistency feels like quality. Inconsistency feels like bugs.**
|
|
40
|
+
|
|
41
|
+
This prevents "just one more size/color" syndrome. Every deviation from your tokens is a crack in the system.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## One Primary Action Rule
|
|
46
|
+
|
|
47
|
+
**Every screen should answer: "What is the ONE thing the user should do next?"**
|
|
48
|
+
|
|
49
|
+
- One primary button per screen (ideally)
|
|
50
|
+
- Everything else is secondary, tertiary, or hidden
|
|
51
|
+
- If you need two primary actions, the screen is doing too much
|
|
52
|
+
|
|
53
|
+
This is product thinking, not just UI. A confused user does nothing.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Decision Hierarchy
|
|
58
|
+
|
|
59
|
+
**When making UI decisions, prioritize in this order:**
|
|
60
|
+
|
|
61
|
+
1. **Clarity** - Is it instantly understandable?
|
|
62
|
+
2. **Hierarchy** - Is the important thing obvious?
|
|
63
|
+
3. **Consistency** - Does it match the system?
|
|
64
|
+
4. **Speed** - Is it fast to scan and act on?
|
|
65
|
+
5. **Aesthetics** - Does it look good?
|
|
66
|
+
|
|
67
|
+
Pretty but confusing is failure. Clear and boring beats clever and unclear.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Visual Hierarchy
|
|
72
|
+
|
|
73
|
+
**The most important design skill.** Guide the user's eye to what matters.
|
|
74
|
+
|
|
75
|
+
### Size Creates Importance
|
|
76
|
+
The bigger something is, the more important it appears. Your page title should be the largest text. Secondary info should be smaller and lighter.
|
|
77
|
+
|
|
78
|
+
### Contrast Draws Attention
|
|
79
|
+
High contrast = look here. Low contrast = secondary. Use bold weight, darker colors, or accent colors for emphasis.
|
|
80
|
+
|
|
81
|
+
### Whitespace Is Not Empty
|
|
82
|
+
Space around elements gives them importance and breathing room. Cramped UIs feel cheap. Generous spacing feels premium.
|
|
83
|
+
|
|
84
|
+
**When building a screen:**
|
|
85
|
+
1. Identify the ONE most important element
|
|
86
|
+
2. Make it visually dominant (size, position, contrast)
|
|
87
|
+
3. De-emphasize everything else
|
|
88
|
+
4. Add generous whitespace around important elements
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Typography
|
|
93
|
+
|
|
94
|
+
**Typography alone can make or break your UI.**
|
|
95
|
+
|
|
96
|
+
### Headlines
|
|
97
|
+
- Bold, confident, short
|
|
98
|
+
- Use sentence case (not ALL CAPS unless it's a label)
|
|
99
|
+
- Leave room to breathe
|
|
100
|
+
|
|
101
|
+
### Body Text
|
|
102
|
+
- 16px minimum for readability
|
|
103
|
+
- Line height of 1.5-1.7 for paragraphs
|
|
104
|
+
- Keep line length under 70 characters
|
|
105
|
+
|
|
106
|
+
### The Type Scale
|
|
107
|
+
Don't use random sizes. Pick a scale and stick to it:
|
|
108
|
+
```
|
|
109
|
+
12px - Labels, captions, metadata
|
|
110
|
+
14px - Secondary text, table content
|
|
111
|
+
16px - Body text, form inputs
|
|
112
|
+
18px - Emphasized body, subheadings
|
|
113
|
+
20px - Section headers
|
|
114
|
+
24px - Page titles on mobile
|
|
115
|
+
30px - Page titles on desktop
|
|
116
|
+
36px+ - Hero headlines only
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Font Weight
|
|
120
|
+
- Regular (400) - Body text
|
|
121
|
+
- Medium (500) - Subtle emphasis, navigation
|
|
122
|
+
- Semibold (600) - Headings, buttons
|
|
123
|
+
- Bold (700) - Strong emphasis, hero text
|
|
124
|
+
|
|
125
|
+
**Never use light (300) weights for UI text.** It's hard to read.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Color
|
|
130
|
+
|
|
131
|
+
### Less Is More
|
|
132
|
+
Use 2-3 colors maximum:
|
|
133
|
+
- **Primary**: Your brand color. Use sparingly for CTAs and key actions.
|
|
134
|
+
- **Neutral**: Grays for text, borders, backgrounds. This is 80% of your UI.
|
|
135
|
+
- **Semantic**: Red for errors, green for success, yellow for warnings.
|
|
136
|
+
|
|
137
|
+
### The Gray Trick
|
|
138
|
+
Most "white" backgrounds shouldn't be pure white (#FFFFFF). Use a very light gray (#FAFAFA or #F9FAFB) for large areas. It's easier on the eyes and makes white cards pop.
|
|
139
|
+
|
|
140
|
+
### Text Colors
|
|
141
|
+
- Primary text: Not pure black. Use #111827 or #1F2937
|
|
142
|
+
- Secondary text: #6B7280 (gray-500)
|
|
143
|
+
- Muted/disabled: #9CA3AF (gray-400)
|
|
144
|
+
|
|
145
|
+
### Don't Over-Color
|
|
146
|
+
If everything is colorful, nothing stands out. Keep most of your UI neutral and use color only for:
|
|
147
|
+
- Primary actions (buttons, links)
|
|
148
|
+
- Status indicators
|
|
149
|
+
- Errors and alerts
|
|
150
|
+
- Brand moments
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Spacing
|
|
155
|
+
|
|
156
|
+
### The 4px/8px System
|
|
157
|
+
All spacing should be multiples of 4px or 8px:
|
|
158
|
+
- 4px - Minimum gap (icon to label)
|
|
159
|
+
- 8px - Tight spacing (within a component)
|
|
160
|
+
- 16px - Standard spacing (between elements)
|
|
161
|
+
- 24px - Section spacing
|
|
162
|
+
- 32px - Large section gaps
|
|
163
|
+
- 48px+ - Major divisions
|
|
164
|
+
|
|
165
|
+
### Padding Consistency
|
|
166
|
+
- Buttons: 12px vertical, 16-24px horizontal
|
|
167
|
+
- Cards: 16-24px padding
|
|
168
|
+
- Page content: 24px on mobile, 32-48px on desktop
|
|
169
|
+
- Modals: 24px padding
|
|
170
|
+
|
|
171
|
+
### Group Related Items
|
|
172
|
+
Elements that belong together should be closer to each other than elements that don't. This creates visual groupings without needing borders.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Layout Principles
|
|
177
|
+
|
|
178
|
+
### Alignment Creates Order
|
|
179
|
+
Pick an alignment and stick to it. Left-aligned is almost always correct for Western UIs. Don't center long text.
|
|
180
|
+
|
|
181
|
+
### Limit Line Length
|
|
182
|
+
Long lines of text are hard to read. Keep content areas between 600-800px max width.
|
|
183
|
+
|
|
184
|
+
### Use a Grid
|
|
185
|
+
12-column grids work for most layouts. On mobile, use full width or simple 2-column splits.
|
|
186
|
+
|
|
187
|
+
### Z-Pattern for Landing Pages
|
|
188
|
+
Users scan in a Z pattern: top-left → top-right → bottom-left → bottom-right. Place key elements along this path.
|
|
189
|
+
|
|
190
|
+
### F-Pattern for Content Pages
|
|
191
|
+
Users scan in an F pattern for text-heavy pages. Put important info on the left and in headings.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Components That Feel Right
|
|
196
|
+
|
|
197
|
+
### Buttons
|
|
198
|
+
- Primary button: Solid background, used for main action (one per screen ideally)
|
|
199
|
+
- Secondary button: Outline or ghost, for secondary actions
|
|
200
|
+
- Destructive button: Red, used only for irreversible actions
|
|
201
|
+
- Make buttons look clickable: slight shadow, hover state, cursor pointer
|
|
202
|
+
|
|
203
|
+
### Forms
|
|
204
|
+
- One column is usually better than two
|
|
205
|
+
- Label above the input, not beside it
|
|
206
|
+
- Group related fields with a section heading
|
|
207
|
+
- Show validation errors below the field in red
|
|
208
|
+
- Use placeholder text for examples, not labels
|
|
209
|
+
|
|
210
|
+
### Cards
|
|
211
|
+
- Use subtle shadow, not heavy borders
|
|
212
|
+
- Keep padding consistent
|
|
213
|
+
- Don't put too much in one card
|
|
214
|
+
- Cards should be scannable - bold title, muted description
|
|
215
|
+
|
|
216
|
+
### Tables
|
|
217
|
+
- Align text left, numbers right
|
|
218
|
+
- Use subtle row borders or alternating backgrounds, not both
|
|
219
|
+
- Make rows hoverable
|
|
220
|
+
- Put actions at the end of the row
|
|
221
|
+
|
|
222
|
+
### Empty States
|
|
223
|
+
- Never show a blank screen
|
|
224
|
+
- Explain what will be here
|
|
225
|
+
- Provide a clear action to fix the emptiness
|
|
226
|
+
- Add an illustration if appropriate
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Mobile First
|
|
231
|
+
|
|
232
|
+
### Design for the smallest screen first
|
|
233
|
+
If it works on mobile, it will work everywhere. The reverse is not true.
|
|
234
|
+
|
|
235
|
+
### Touch Targets
|
|
236
|
+
Minimum 44x44px for anything tappable. Fingers are imprecise.
|
|
237
|
+
|
|
238
|
+
### Thumb Zone
|
|
239
|
+
On mobile, important actions should be reachable by thumb (bottom half of screen).
|
|
240
|
+
|
|
241
|
+
### Simplify, Don't Shrink
|
|
242
|
+
Don't just make the desktop version smaller. Remove and reorganize for mobile.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## The Details That Matter
|
|
247
|
+
|
|
248
|
+
### Micro-interactions
|
|
249
|
+
- Buttons should have hover and active states
|
|
250
|
+
- Loading states should be smooth, not jarring
|
|
251
|
+
- Transitions should be 150-200ms (fast but noticeable)
|
|
252
|
+
|
|
253
|
+
### Border Radius
|
|
254
|
+
- Pick one and be consistent: 4px (sharp), 8px (friendly), 12px+ (playful)
|
|
255
|
+
- Don't mix different radiuses randomly
|
|
256
|
+
|
|
257
|
+
### Shadows
|
|
258
|
+
- Use subtle shadows (shadow-sm) for cards and dropdowns
|
|
259
|
+
- Shadows should be soft and diffused, not harsh
|
|
260
|
+
- Don't put shadows on everything
|
|
261
|
+
|
|
262
|
+
### Icons
|
|
263
|
+
- Use a consistent icon set (Lucide, Heroicons)
|
|
264
|
+
- Icons should be the same visual weight as text
|
|
265
|
+
- Don't use icons without meaning
|
|
266
|
+
- Always pair icon-only buttons with tooltips
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Accessibility (Baseline Rules)
|
|
271
|
+
|
|
272
|
+
**These are not optional. They are usability under stress.**
|
|
273
|
+
|
|
274
|
+
- Text contrast must be readable in sunlight
|
|
275
|
+
- Color is never the only indicator (errors, success, status need icons or text too)
|
|
276
|
+
- All interactive elements must be keyboard-focusable
|
|
277
|
+
- Focus states are required (visible ring on focus)
|
|
278
|
+
- Minimum text size: 16px
|
|
279
|
+
- Tap targets: 44x44px minimum
|
|
280
|
+
|
|
281
|
+
Accessibility is not decoration. It's your product working for everyone.
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Common UI Mistakes to Avoid
|
|
286
|
+
|
|
287
|
+
**Anti-patterns that make UIs feel amateurish:**
|
|
288
|
+
|
|
289
|
+
- Centered paragraphs of text (hard to read)
|
|
290
|
+
- Too many button styles on one screen
|
|
291
|
+
- Equal visual weight for all elements (nothing stands out)
|
|
292
|
+
- Icons without labels for critical actions
|
|
293
|
+
- Forms split into unnecessary columns
|
|
294
|
+
- Using placeholders instead of labels
|
|
295
|
+
- Overusing borders instead of spacing
|
|
296
|
+
- Multiple font families without reason
|
|
297
|
+
- Inconsistent spacing (16px here, 18px there)
|
|
298
|
+
- Pure black text on pure white backgrounds
|
|
299
|
+
- Tiny click targets on desktop (mobile isn't the only concern)
|
|
300
|
+
- Loading spinners without context ("Loading..." what?)
|
|
301
|
+
|
|
302
|
+
**If you catch yourself doing any of these, stop and reconsider.**
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Before You Ship
|
|
307
|
+
|
|
308
|
+
### The Squint Test
|
|
309
|
+
Squint at your screen. Can you still tell what's most important? If everything blurs into sameness, your hierarchy is weak.
|
|
310
|
+
|
|
311
|
+
### The Screenshot Test
|
|
312
|
+
Take a screenshot and look at it on your phone. Does it look like a real product or a developer's side project?
|
|
313
|
+
|
|
314
|
+
### The Mom Test
|
|
315
|
+
Would your non-technical mom understand what to do on this screen without help?
|
|
316
|
+
|
|
317
|
+
### Checklist
|
|
318
|
+
- [ ] One clear focal point per screen
|
|
319
|
+
- [ ] Consistent spacing throughout
|
|
320
|
+
- [ ] Type hierarchy is clear (3 sizes max per screen)
|
|
321
|
+
- [ ] Color is used intentionally, not decoratively
|
|
322
|
+
- [ ] Empty states are designed
|
|
323
|
+
- [ ] Loading states are smooth
|
|
324
|
+
- [ ] Works on mobile without horizontal scrolling
|
|
325
|
+
- [ ] All interactive elements have hover/focus states
|
|
326
|
+
- [ ] Adequate color contrast for accessibility
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Quick Reference
|
|
331
|
+
|
|
332
|
+
**When something feels off:**
|
|
333
|
+
- Add more whitespace
|
|
334
|
+
- Reduce the number of font sizes
|
|
335
|
+
- Increase contrast between heading and body
|
|
336
|
+
- Remove a color
|
|
337
|
+
- Align things properly
|
|
338
|
+
|
|
339
|
+
**When it looks boring:**
|
|
340
|
+
- Don't add more color - add more contrast
|
|
341
|
+
- Don't add decoration - add better typography
|
|
342
|
+
- Don't add borders - use whitespace and shadows
|
|
343
|
+
|
|
344
|
+
**When it's overwhelming:**
|
|
345
|
+
- Remove elements until it hurts, then add one back
|
|
346
|
+
- Break into smaller screens/steps
|
|
347
|
+
- Hide secondary actions in menus
|
|
348
|
+
- Use progressive disclosure
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
*Great UI is invisible. The user should focus on their task, not your interface. When in doubt, simplify.*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "project-iris",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
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)
|
|
@@ -342,28 +388,50 @@ async function updateStories(bolt) {
|
|
|
342
388
|
continue;
|
|
343
389
|
}
|
|
344
390
|
|
|
345
|
-
|
|
346
|
-
|
|
391
|
+
const alreadyComplete = frontmatter.status === 'complete' && frontmatter.implemented === true;
|
|
392
|
+
|
|
393
|
+
// Always check acceptance criteria, even if story is already complete
|
|
394
|
+
const acResult = checkAcceptanceCriteria(content);
|
|
395
|
+
const acNeedsUpdate = acResult.modified;
|
|
396
|
+
|
|
397
|
+
// Skip only if fully complete AND no AC updates needed
|
|
398
|
+
if (alreadyComplete && !acNeedsUpdate) {
|
|
347
399
|
console.log(` ${colors.dim}−${colors.reset} ${storyId} - ${colors.dim}Already complete${colors.reset}`);
|
|
348
400
|
results.skipped++;
|
|
349
401
|
results.details.push({ storyId, status: 'skipped', reason: 'Already complete' });
|
|
350
402
|
continue;
|
|
351
403
|
}
|
|
352
404
|
|
|
353
|
-
// Update frontmatter
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
}
|
|
405
|
+
// Update frontmatter (if not already complete)
|
|
406
|
+
let newContent;
|
|
407
|
+
if (alreadyComplete) {
|
|
408
|
+
// Only update ACs, keep existing frontmatter
|
|
409
|
+
newContent = acResult.content;
|
|
410
|
+
} else {
|
|
411
|
+
// Update both frontmatter and ACs
|
|
412
|
+
const newFrontmatter = {
|
|
413
|
+
...frontmatter,
|
|
414
|
+
status: 'complete',
|
|
415
|
+
implemented: true
|
|
416
|
+
};
|
|
417
|
+
newContent = updateFrontmatter(content, newFrontmatter);
|
|
418
|
+
if (newContent) {
|
|
419
|
+
const acResultUpdated = checkAcceptanceCriteria(newContent);
|
|
420
|
+
newContent = acResultUpdated.content;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
359
423
|
|
|
360
|
-
const newContent = updateFrontmatter(content, newFrontmatter);
|
|
361
424
|
if (newContent) {
|
|
362
425
|
await fs.writeFile(storyPath, newContent, 'utf8');
|
|
363
426
|
const oldStatus = frontmatter.status || 'draft';
|
|
364
|
-
|
|
427
|
+
const acNote = acNeedsUpdate ? ` ${colors.dim}(ACs checked)${colors.reset}` : '';
|
|
428
|
+
if (alreadyComplete) {
|
|
429
|
+
console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}ACs checked${colors.reset}`);
|
|
430
|
+
} else {
|
|
431
|
+
console.log(` ${colors.green}✓${colors.reset} ${storyId} - ${colors.dim}${oldStatus} → complete${colors.reset}${acNote}`);
|
|
432
|
+
}
|
|
365
433
|
results.updated++;
|
|
366
|
-
results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete' });
|
|
434
|
+
results.details.push({ storyId, status: 'updated', from: oldStatus, to: 'complete', acChecked: acNeedsUpdate });
|
|
367
435
|
} else {
|
|
368
436
|
console.log(` ${colors.red}✗${colors.reset} ${storyId} - ${colors.dim}Failed to update${colors.reset}`);
|
|
369
437
|
results.errors++;
|