@anhth2/spec-driven-dev-plugin 0.9.0 → 0.9.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.
- package/commands/generate-prd.md +39 -20
- package/commands/generate-prd.tmpl +39 -20
- package/commands/refine-prd.md +9 -1
- package/commands/refine-prd.tmpl +9 -1
- package/commands/review-context.md +8 -0
- package/commands/review-context.tmpl +8 -0
- package/commands/review-tech-docs.md +7 -0
- package/commands/review-tech-docs.tmpl +7 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/generate-prd.md +39 -20
- package/core/commands/refine-prd.md +9 -1
- package/core/commands/review-context.md +8 -0
- package/core/commands/review-tech-docs.md +7 -0
- package/core/templates/prd.template.md +35 -20
- package/package.json +9 -2
- package/templates/prd.template.md +35 -20
package/commands/generate-prd.md
CHANGED
|
@@ -450,13 +450,14 @@ Write `{paths.prd_dir}/{domain}/{TICKET-ID}-{slug}.md` using the structure below
|
|
|
450
450
|
|
|
451
451
|
## a. User Story
|
|
452
452
|
|
|
453
|
-
As a {User role}
|
|
454
|
-
I want to {User goal}
|
|
455
|
-
So that {Business value}
|
|
453
|
+
- **As a** {User role}
|
|
454
|
+
- **I want to** {User goal}
|
|
455
|
+
- **So that** {Business value}
|
|
456
456
|
|
|
457
457
|
## b. Scope
|
|
458
458
|
|
|
459
|
-
In Scope
|
|
459
|
+
**In Scope**
|
|
460
|
+
|
|
460
461
|
- {Function 1}
|
|
461
462
|
- {Function 2}
|
|
462
463
|
|
|
@@ -464,24 +465,36 @@ In Scope
|
|
|
464
465
|
|
|
465
466
|
# 2. Acceptance Criteria
|
|
466
467
|
|
|
467
|
-
AC1
|
|
468
|
-
AC2
|
|
468
|
+
- **AC1:** {Acceptance criterion — testable, observable, no UI details}
|
|
469
|
+
- **AC2:** {Acceptance criterion}
|
|
469
470
|
|
|
470
471
|
---
|
|
471
472
|
|
|
472
473
|
# 3. Use Case
|
|
473
474
|
|
|
474
475
|
#### {TICKET-ID}-UC1: {Use Case Name}
|
|
475
|
-
Actor: {User performing the action}
|
|
476
|
-
Description: {Business scenario description — 1 sentence}
|
|
477
|
-
Pre-condition: {Condition that must be true BEFORE use case begins}
|
|
478
|
-
Post-condition: {State / result AFTER use case completes}
|
|
479
476
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
477
|
+
- **Actor:** {User performing the action}
|
|
478
|
+
- **Description:** {Business scenario description — 1 sentence}
|
|
479
|
+
- **Pre-condition:** {Condition that must be true BEFORE use case begins}
|
|
480
|
+
- **Post-condition:** {State / result AFTER use case completes}
|
|
481
|
+
|
|
482
|
+
**Business Rule**
|
|
483
|
+
|
|
484
|
+
| ID | Business Rule |
|
|
485
|
+
|----|---------------|
|
|
486
|
+
| {TICKET-ID}-UC1-BR1 | {Rule — WHAT the system must do} |
|
|
487
|
+
| {TICKET-ID}-UC1-BR2 | {Rule} |
|
|
488
|
+
|
|
489
|
+
**Business Logic**
|
|
490
|
+
|
|
491
|
+
**{TICKET-ID}-UC1-BR1:**
|
|
492
|
+
- Logic 1
|
|
493
|
+
- Logic 2
|
|
494
|
+
- Logic 3
|
|
495
|
+
|
|
496
|
+
**{TICKET-ID}-UC1-BR2:**
|
|
497
|
+
- Logic
|
|
485
498
|
|
|
486
499
|
---
|
|
487
500
|
|
|
@@ -503,11 +516,16 @@ flowchart TD
|
|
|
503
516
|
|
|
504
517
|
**Screen 1: {Screen Name}**
|
|
505
518
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
519
|
+
**Screen:** {Screen name}
|
|
520
|
+
|
|
521
|
+
**Components:**
|
|
522
|
+
- {Component 1}
|
|
523
|
+
- {Component 2}
|
|
524
|
+
- {Component 3}
|
|
525
|
+
|
|
526
|
+
**Actions:**
|
|
527
|
+
- {Action 1} → {Result}
|
|
528
|
+
- {Action 2} → {Result}
|
|
511
529
|
|
|
512
530
|
---
|
|
513
531
|
|
|
@@ -557,6 +575,7 @@ flowchart TD
|
|
|
557
575
|
- [ ] No banned terms (if dictionary exists)
|
|
558
576
|
- [ ] User Flow includes error path / exception path
|
|
559
577
|
- [ ] Wireframe covers all screens related to Use Cases
|
|
578
|
+
- [ ] **Định dạng (readability)**: User Story / AC / các field của UC (Actor, Description, Pre/Post-condition) viết dạng bullet `- **Label:** …` — mỗi ý MỘT dòng, KHÔNG viết các dòng liền nhau (sẽ bị dồn thành 1 đoạn khi render); có một dòng trống trước và sau mỗi bảng
|
|
560
579
|
|
|
561
580
|
## Changelog Section (append at end of PRD)
|
|
562
581
|
|
|
@@ -98,13 +98,14 @@ Write `{paths.prd_dir}/{domain}/{TICKET-ID}-{slug}.md` using the structure below
|
|
|
98
98
|
|
|
99
99
|
## a. User Story
|
|
100
100
|
|
|
101
|
-
As a {User role}
|
|
102
|
-
I want to {User goal}
|
|
103
|
-
So that {Business value}
|
|
101
|
+
- **As a** {User role}
|
|
102
|
+
- **I want to** {User goal}
|
|
103
|
+
- **So that** {Business value}
|
|
104
104
|
|
|
105
105
|
## b. Scope
|
|
106
106
|
|
|
107
|
-
In Scope
|
|
107
|
+
**In Scope**
|
|
108
|
+
|
|
108
109
|
- {Function 1}
|
|
109
110
|
- {Function 2}
|
|
110
111
|
|
|
@@ -112,24 +113,36 @@ In Scope
|
|
|
112
113
|
|
|
113
114
|
# 2. Acceptance Criteria
|
|
114
115
|
|
|
115
|
-
AC1
|
|
116
|
-
AC2
|
|
116
|
+
- **AC1:** {Acceptance criterion — testable, observable, no UI details}
|
|
117
|
+
- **AC2:** {Acceptance criterion}
|
|
117
118
|
|
|
118
119
|
---
|
|
119
120
|
|
|
120
121
|
# 3. Use Case
|
|
121
122
|
|
|
122
123
|
#### {TICKET-ID}-UC1: {Use Case Name}
|
|
123
|
-
Actor: {User performing the action}
|
|
124
|
-
Description: {Business scenario description — 1 sentence}
|
|
125
|
-
Pre-condition: {Condition that must be true BEFORE use case begins}
|
|
126
|
-
Post-condition: {State / result AFTER use case completes}
|
|
127
124
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
125
|
+
- **Actor:** {User performing the action}
|
|
126
|
+
- **Description:** {Business scenario description — 1 sentence}
|
|
127
|
+
- **Pre-condition:** {Condition that must be true BEFORE use case begins}
|
|
128
|
+
- **Post-condition:** {State / result AFTER use case completes}
|
|
129
|
+
|
|
130
|
+
**Business Rule**
|
|
131
|
+
|
|
132
|
+
| ID | Business Rule |
|
|
133
|
+
|----|---------------|
|
|
134
|
+
| {TICKET-ID}-UC1-BR1 | {Rule — WHAT the system must do} |
|
|
135
|
+
| {TICKET-ID}-UC1-BR2 | {Rule} |
|
|
136
|
+
|
|
137
|
+
**Business Logic**
|
|
138
|
+
|
|
139
|
+
**{TICKET-ID}-UC1-BR1:**
|
|
140
|
+
- Logic 1
|
|
141
|
+
- Logic 2
|
|
142
|
+
- Logic 3
|
|
143
|
+
|
|
144
|
+
**{TICKET-ID}-UC1-BR2:**
|
|
145
|
+
- Logic
|
|
133
146
|
|
|
134
147
|
---
|
|
135
148
|
|
|
@@ -151,11 +164,16 @@ flowchart TD
|
|
|
151
164
|
|
|
152
165
|
**Screen 1: {Screen Name}**
|
|
153
166
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
167
|
+
**Screen:** {Screen name}
|
|
168
|
+
|
|
169
|
+
**Components:**
|
|
170
|
+
- {Component 1}
|
|
171
|
+
- {Component 2}
|
|
172
|
+
- {Component 3}
|
|
173
|
+
|
|
174
|
+
**Actions:**
|
|
175
|
+
- {Action 1} → {Result}
|
|
176
|
+
- {Action 2} → {Result}
|
|
159
177
|
|
|
160
178
|
---
|
|
161
179
|
|
|
@@ -205,6 +223,7 @@ flowchart TD
|
|
|
205
223
|
- [ ] No banned terms (if dictionary exists)
|
|
206
224
|
- [ ] User Flow includes error path / exception path
|
|
207
225
|
- [ ] Wireframe covers all screens related to Use Cases
|
|
226
|
+
- [ ] **Định dạng (readability)**: User Story / AC / các field của UC (Actor, Description, Pre/Post-condition) viết dạng bullet `- **Label:** …` — mỗi ý MỘT dòng, KHÔNG viết các dòng liền nhau (sẽ bị dồn thành 1 đoạn khi render); có một dòng trống trước và sau mỗi bảng
|
|
208
227
|
|
|
209
228
|
## Changelog Section (append at end of PRD)
|
|
210
229
|
|
package/commands/refine-prd.md
CHANGED
|
@@ -389,7 +389,9 @@ findings:
|
|
|
389
389
|
- id: "F001"
|
|
390
390
|
lens: "QA" # QA | DEV | SA | PO
|
|
391
391
|
severity: "major" # critical | major | minor
|
|
392
|
-
section: "§6. Acceptance Criteria"
|
|
392
|
+
section: "§6. Acceptance Criteria" # human-readable heading/section label
|
|
393
|
+
uc_id: "{TICKET-ID}-UC{N}" # UC this finding belongs to; "" if PRD-global (scope, metrics, problem statement)
|
|
394
|
+
quote: "{verbatim snippet copied EXACTLY from the PRD at the issue location, ≤120 chars}"
|
|
393
395
|
finding: "{description of gap or issue}"
|
|
394
396
|
suggestion: "{specific actionable improvement}"
|
|
395
397
|
auto_fixable: false # true = AI applies in --resume; false = human must write decision in note
|
|
@@ -402,6 +404,12 @@ summary:
|
|
|
402
404
|
recommendation: "APPROVED_WITH_MINOR_CHANGES | NEEDS_REVISION | BLOCKED"
|
|
403
405
|
```
|
|
404
406
|
|
|
407
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
408
|
+
> For every finding, copy a short **verbatim** `quote` straight from the PRD at the exact spot the
|
|
409
|
+
> issue occurs — do NOT paraphrase; it is matched against the document to locate the line. Set
|
|
410
|
+
> `uc_id` to the owning Use Case (or `""` for PRD-global findings). These let a reviewer click a
|
|
411
|
+
> finding in the Review Board and jump straight to the precise location in the source PRD.
|
|
412
|
+
|
|
405
413
|
## Report
|
|
406
414
|
|
|
407
415
|
# Report Footer — Standard Command Output Format
|
package/commands/refine-prd.tmpl
CHANGED
|
@@ -37,7 +37,9 @@ findings:
|
|
|
37
37
|
- id: "F001"
|
|
38
38
|
lens: "QA" # QA | DEV | SA | PO
|
|
39
39
|
severity: "major" # critical | major | minor
|
|
40
|
-
section: "§6. Acceptance Criteria"
|
|
40
|
+
section: "§6. Acceptance Criteria" # human-readable heading/section label
|
|
41
|
+
uc_id: "{TICKET-ID}-UC{N}" # UC this finding belongs to; "" if PRD-global (scope, metrics, problem statement)
|
|
42
|
+
quote: "{verbatim snippet copied EXACTLY from the PRD at the issue location, ≤120 chars}"
|
|
41
43
|
finding: "{description of gap or issue}"
|
|
42
44
|
suggestion: "{specific actionable improvement}"
|
|
43
45
|
auto_fixable: false # true = AI applies in --resume; false = human must write decision in note
|
|
@@ -50,6 +52,12 @@ summary:
|
|
|
50
52
|
recommendation: "APPROVED_WITH_MINOR_CHANGES | NEEDS_REVISION | BLOCKED"
|
|
51
53
|
```
|
|
52
54
|
|
|
55
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
56
|
+
> For every finding, copy a short **verbatim** `quote` straight from the PRD at the exact spot the
|
|
57
|
+
> issue occurs — do NOT paraphrase; it is matched against the document to locate the line. Set
|
|
58
|
+
> `uc_id` to the owning Use Case (or `""` for PRD-global findings). These let a reviewer click a
|
|
59
|
+
> finding in the Review Board and jump straight to the precise location in the source PRD.
|
|
60
|
+
|
|
53
61
|
## Report
|
|
54
62
|
|
|
55
63
|
{{include:steps/report-footer.md}}
|
|
@@ -563,6 +563,8 @@ findings:
|
|
|
563
563
|
check_id: "P1" # P1-P5 for PRD; B1-B6 for BDD
|
|
564
564
|
severity: "critical" # critical | major | minor
|
|
565
565
|
section: "{section or scenario ID where issue was found}"
|
|
566
|
+
uc_id: "{UC-ID this finding belongs to — PRD: the UC heading; BDD: @trace.id; \"\" if global}"
|
|
567
|
+
quote: "{verbatim snippet copied EXACTLY from the reviewed file at the issue location, ≤120 chars}"
|
|
566
568
|
finding: "{clear description of the issue}"
|
|
567
569
|
suggestion: "{specific actionable fix — AI will apply this in --resume if accepted}"
|
|
568
570
|
auto_fixable: true # true = AI can apply; false = human must write note in Review Board
|
|
@@ -576,6 +578,12 @@ summary:
|
|
|
576
578
|
recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
|
|
577
579
|
```
|
|
578
580
|
|
|
581
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
582
|
+
> For every finding, copy a short **verbatim** `quote` straight from the reviewed file at the exact
|
|
583
|
+
> spot the issue occurs — do NOT paraphrase; it is matched against the document to locate the line.
|
|
584
|
+
> Set `uc_id` to the owning Use Case (`@trace.id` for BDD, the UC heading for PRD; `""` if global).
|
|
585
|
+
> These let a reviewer click a finding in the Review Board and jump to the precise source location.
|
|
586
|
+
|
|
579
587
|
## Post-Analysis Routing
|
|
580
588
|
|
|
581
589
|
After running all checks and writing the findings file:
|
|
@@ -211,6 +211,8 @@ findings:
|
|
|
211
211
|
check_id: "P1" # P1-P5 for PRD; B1-B6 for BDD
|
|
212
212
|
severity: "critical" # critical | major | minor
|
|
213
213
|
section: "{section or scenario ID where issue was found}"
|
|
214
|
+
uc_id: "{UC-ID this finding belongs to — PRD: the UC heading; BDD: @trace.id; \"\" if global}"
|
|
215
|
+
quote: "{verbatim snippet copied EXACTLY from the reviewed file at the issue location, ≤120 chars}"
|
|
214
216
|
finding: "{clear description of the issue}"
|
|
215
217
|
suggestion: "{specific actionable fix — AI will apply this in --resume if accepted}"
|
|
216
218
|
auto_fixable: true # true = AI can apply; false = human must write note in Review Board
|
|
@@ -224,6 +226,12 @@ summary:
|
|
|
224
226
|
recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
|
|
225
227
|
```
|
|
226
228
|
|
|
229
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
230
|
+
> For every finding, copy a short **verbatim** `quote` straight from the reviewed file at the exact
|
|
231
|
+
> spot the issue occurs — do NOT paraphrase; it is matched against the document to locate the line.
|
|
232
|
+
> Set `uc_id` to the owning Use Case (`@trace.id` for BDD, the UC heading for PRD; `""` if global).
|
|
233
|
+
> These let a reviewer click a finding in the Review Board and jump to the precise source location.
|
|
234
|
+
|
|
227
235
|
## Post-Analysis Routing
|
|
228
236
|
|
|
229
237
|
After running all checks and writing the findings file:
|
|
@@ -554,6 +554,8 @@ findings:
|
|
|
554
554
|
check_id: "T1" # T1–T7
|
|
555
555
|
severity: "critical" # critical | major | minor
|
|
556
556
|
section: "{section heading or component name where issue was found}"
|
|
557
|
+
uc_id: "{UC-ID}" # same as top-level uc_id (the UC this tech-doc designs)
|
|
558
|
+
quote: "{verbatim snippet copied EXACTLY from the tech-doc at the issue location, ≤120 chars}"
|
|
557
559
|
finding: "{clear description of the violation or gap}"
|
|
558
560
|
suggestion: "{specific fix — AI applies this in --resume if accepted}"
|
|
559
561
|
auto_fixable: false # true = AI can apply; false = human must write decision in note
|
|
@@ -568,6 +570,11 @@ summary:
|
|
|
568
570
|
sign_off_gate: "{blocked — pending: fe_team, app_team, sa | ready}"
|
|
569
571
|
```
|
|
570
572
|
|
|
573
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
574
|
+
> For every finding, copy a short **verbatim** `quote` straight from the tech-doc at the exact spot
|
|
575
|
+
> the issue occurs — do NOT paraphrase; it is matched against the document to locate the line.
|
|
576
|
+
> These let a reviewer click a finding in the Review Board and jump to the precise source location.
|
|
577
|
+
|
|
571
578
|
## Report
|
|
572
579
|
|
|
573
580
|
# Report Footer — Standard Command Output Format
|
|
@@ -202,6 +202,8 @@ findings:
|
|
|
202
202
|
check_id: "T1" # T1–T7
|
|
203
203
|
severity: "critical" # critical | major | minor
|
|
204
204
|
section: "{section heading or component name where issue was found}"
|
|
205
|
+
uc_id: "{UC-ID}" # same as top-level uc_id (the UC this tech-doc designs)
|
|
206
|
+
quote: "{verbatim snippet copied EXACTLY from the tech-doc at the issue location, ≤120 chars}"
|
|
205
207
|
finding: "{clear description of the violation or gap}"
|
|
206
208
|
suggestion: "{specific fix — AI applies this in --resume if accepted}"
|
|
207
209
|
auto_fixable: false # true = AI can apply; false = human must write decision in note
|
|
@@ -216,6 +218,11 @@ summary:
|
|
|
216
218
|
sign_off_gate: "{blocked — pending: fe_team, app_team, sa | ready}"
|
|
217
219
|
```
|
|
218
220
|
|
|
221
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
222
|
+
> For every finding, copy a short **verbatim** `quote` straight from the tech-doc at the exact spot
|
|
223
|
+
> the issue occurs — do NOT paraphrase; it is matched against the document to locate the line.
|
|
224
|
+
> These let a reviewer click a finding in the Review Board and jump to the precise source location.
|
|
225
|
+
|
|
219
226
|
## Report
|
|
220
227
|
|
|
221
228
|
{{include:steps/report-footer.md}}
|
package/core/FRAMEWORK_VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.1
|
|
@@ -450,13 +450,14 @@ Write `{paths.prd_dir}/{domain}/{TICKET-ID}-{slug}.md` using the structure below
|
|
|
450
450
|
|
|
451
451
|
## a. User Story
|
|
452
452
|
|
|
453
|
-
As a {User role}
|
|
454
|
-
I want to {User goal}
|
|
455
|
-
So that {Business value}
|
|
453
|
+
- **As a** {User role}
|
|
454
|
+
- **I want to** {User goal}
|
|
455
|
+
- **So that** {Business value}
|
|
456
456
|
|
|
457
457
|
## b. Scope
|
|
458
458
|
|
|
459
|
-
In Scope
|
|
459
|
+
**In Scope**
|
|
460
|
+
|
|
460
461
|
- {Function 1}
|
|
461
462
|
- {Function 2}
|
|
462
463
|
|
|
@@ -464,24 +465,36 @@ In Scope
|
|
|
464
465
|
|
|
465
466
|
# 2. Acceptance Criteria
|
|
466
467
|
|
|
467
|
-
AC1
|
|
468
|
-
AC2
|
|
468
|
+
- **AC1:** {Acceptance criterion — testable, observable, no UI details}
|
|
469
|
+
- **AC2:** {Acceptance criterion}
|
|
469
470
|
|
|
470
471
|
---
|
|
471
472
|
|
|
472
473
|
# 3. Use Case
|
|
473
474
|
|
|
474
475
|
#### {TICKET-ID}-UC1: {Use Case Name}
|
|
475
|
-
Actor: {User performing the action}
|
|
476
|
-
Description: {Business scenario description — 1 sentence}
|
|
477
|
-
Pre-condition: {Condition that must be true BEFORE use case begins}
|
|
478
|
-
Post-condition: {State / result AFTER use case completes}
|
|
479
476
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
477
|
+
- **Actor:** {User performing the action}
|
|
478
|
+
- **Description:** {Business scenario description — 1 sentence}
|
|
479
|
+
- **Pre-condition:** {Condition that must be true BEFORE use case begins}
|
|
480
|
+
- **Post-condition:** {State / result AFTER use case completes}
|
|
481
|
+
|
|
482
|
+
**Business Rule**
|
|
483
|
+
|
|
484
|
+
| ID | Business Rule |
|
|
485
|
+
|----|---------------|
|
|
486
|
+
| {TICKET-ID}-UC1-BR1 | {Rule — WHAT the system must do} |
|
|
487
|
+
| {TICKET-ID}-UC1-BR2 | {Rule} |
|
|
488
|
+
|
|
489
|
+
**Business Logic**
|
|
490
|
+
|
|
491
|
+
**{TICKET-ID}-UC1-BR1:**
|
|
492
|
+
- Logic 1
|
|
493
|
+
- Logic 2
|
|
494
|
+
- Logic 3
|
|
495
|
+
|
|
496
|
+
**{TICKET-ID}-UC1-BR2:**
|
|
497
|
+
- Logic
|
|
485
498
|
|
|
486
499
|
---
|
|
487
500
|
|
|
@@ -503,11 +516,16 @@ flowchart TD
|
|
|
503
516
|
|
|
504
517
|
**Screen 1: {Screen Name}**
|
|
505
518
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
519
|
+
**Screen:** {Screen name}
|
|
520
|
+
|
|
521
|
+
**Components:**
|
|
522
|
+
- {Component 1}
|
|
523
|
+
- {Component 2}
|
|
524
|
+
- {Component 3}
|
|
525
|
+
|
|
526
|
+
**Actions:**
|
|
527
|
+
- {Action 1} → {Result}
|
|
528
|
+
- {Action 2} → {Result}
|
|
511
529
|
|
|
512
530
|
---
|
|
513
531
|
|
|
@@ -557,6 +575,7 @@ flowchart TD
|
|
|
557
575
|
- [ ] No banned terms (if dictionary exists)
|
|
558
576
|
- [ ] User Flow includes error path / exception path
|
|
559
577
|
- [ ] Wireframe covers all screens related to Use Cases
|
|
578
|
+
- [ ] **Định dạng (readability)**: User Story / AC / các field của UC (Actor, Description, Pre/Post-condition) viết dạng bullet `- **Label:** …` — mỗi ý MỘT dòng, KHÔNG viết các dòng liền nhau (sẽ bị dồn thành 1 đoạn khi render); có một dòng trống trước và sau mỗi bảng
|
|
560
579
|
|
|
561
580
|
## Changelog Section (append at end of PRD)
|
|
562
581
|
|
|
@@ -389,7 +389,9 @@ findings:
|
|
|
389
389
|
- id: "F001"
|
|
390
390
|
lens: "QA" # QA | DEV | SA | PO
|
|
391
391
|
severity: "major" # critical | major | minor
|
|
392
|
-
section: "§6. Acceptance Criteria"
|
|
392
|
+
section: "§6. Acceptance Criteria" # human-readable heading/section label
|
|
393
|
+
uc_id: "{TICKET-ID}-UC{N}" # UC this finding belongs to; "" if PRD-global (scope, metrics, problem statement)
|
|
394
|
+
quote: "{verbatim snippet copied EXACTLY from the PRD at the issue location, ≤120 chars}"
|
|
393
395
|
finding: "{description of gap or issue}"
|
|
394
396
|
suggestion: "{specific actionable improvement}"
|
|
395
397
|
auto_fixable: false # true = AI applies in --resume; false = human must write decision in note
|
|
@@ -402,6 +404,12 @@ summary:
|
|
|
402
404
|
recommendation: "APPROVED_WITH_MINOR_CHANGES | NEEDS_REVISION | BLOCKED"
|
|
403
405
|
```
|
|
404
406
|
|
|
407
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
408
|
+
> For every finding, copy a short **verbatim** `quote` straight from the PRD at the exact spot the
|
|
409
|
+
> issue occurs — do NOT paraphrase; it is matched against the document to locate the line. Set
|
|
410
|
+
> `uc_id` to the owning Use Case (or `""` for PRD-global findings). These let a reviewer click a
|
|
411
|
+
> finding in the Review Board and jump straight to the precise location in the source PRD.
|
|
412
|
+
|
|
405
413
|
## Report
|
|
406
414
|
|
|
407
415
|
# Report Footer — Standard Command Output Format
|
|
@@ -563,6 +563,8 @@ findings:
|
|
|
563
563
|
check_id: "P1" # P1-P5 for PRD; B1-B6 for BDD
|
|
564
564
|
severity: "critical" # critical | major | minor
|
|
565
565
|
section: "{section or scenario ID where issue was found}"
|
|
566
|
+
uc_id: "{UC-ID this finding belongs to — PRD: the UC heading; BDD: @trace.id; \"\" if global}"
|
|
567
|
+
quote: "{verbatim snippet copied EXACTLY from the reviewed file at the issue location, ≤120 chars}"
|
|
566
568
|
finding: "{clear description of the issue}"
|
|
567
569
|
suggestion: "{specific actionable fix — AI will apply this in --resume if accepted}"
|
|
568
570
|
auto_fixable: true # true = AI can apply; false = human must write note in Review Board
|
|
@@ -576,6 +578,12 @@ summary:
|
|
|
576
578
|
recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
|
|
577
579
|
```
|
|
578
580
|
|
|
581
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
582
|
+
> For every finding, copy a short **verbatim** `quote` straight from the reviewed file at the exact
|
|
583
|
+
> spot the issue occurs — do NOT paraphrase; it is matched against the document to locate the line.
|
|
584
|
+
> Set `uc_id` to the owning Use Case (`@trace.id` for BDD, the UC heading for PRD; `""` if global).
|
|
585
|
+
> These let a reviewer click a finding in the Review Board and jump to the precise source location.
|
|
586
|
+
|
|
579
587
|
## Post-Analysis Routing
|
|
580
588
|
|
|
581
589
|
After running all checks and writing the findings file:
|
|
@@ -554,6 +554,8 @@ findings:
|
|
|
554
554
|
check_id: "T1" # T1–T7
|
|
555
555
|
severity: "critical" # critical | major | minor
|
|
556
556
|
section: "{section heading or component name where issue was found}"
|
|
557
|
+
uc_id: "{UC-ID}" # same as top-level uc_id (the UC this tech-doc designs)
|
|
558
|
+
quote: "{verbatim snippet copied EXACTLY from the tech-doc at the issue location, ≤120 chars}"
|
|
557
559
|
finding: "{clear description of the violation or gap}"
|
|
558
560
|
suggestion: "{specific fix — AI applies this in --resume if accepted}"
|
|
559
561
|
auto_fixable: false # true = AI can apply; false = human must write decision in note
|
|
@@ -568,6 +570,11 @@ summary:
|
|
|
568
570
|
sign_off_gate: "{blocked — pending: fe_team, app_team, sa | ready}"
|
|
569
571
|
```
|
|
570
572
|
|
|
573
|
+
> **Locator fields (`quote` + `uc_id`) — required for Review Board source-jump.**
|
|
574
|
+
> For every finding, copy a short **verbatim** `quote` straight from the tech-doc at the exact spot
|
|
575
|
+
> the issue occurs — do NOT paraphrase; it is matched against the document to locate the line.
|
|
576
|
+
> These let a reviewer click a finding in the Review Board and jump to the precise source location.
|
|
577
|
+
|
|
571
578
|
## Report
|
|
572
579
|
|
|
573
580
|
# Report Footer — Standard Command Output Format
|
|
@@ -102,9 +102,9 @@
|
|
|
102
102
|
- {Business value}→ Giá trị nghiệp vụ mang lại (lý do tại sao người dùng cần điều này)
|
|
103
103
|
-->
|
|
104
104
|
|
|
105
|
-
As a {User role}
|
|
106
|
-
I want to {User goal}
|
|
107
|
-
So that {Business value}
|
|
105
|
+
- **As a** {User role}
|
|
106
|
+
- **I want to** {User goal}
|
|
107
|
+
- **So that** {Business value}
|
|
108
108
|
|
|
109
109
|
## b. Phạm vi
|
|
110
110
|
|
|
@@ -119,7 +119,8 @@ So that {Business value}
|
|
|
119
119
|
- Viết ngắn gọn, súc tích, đủ để người đọc hiểu mà không cần giải thích thêm.
|
|
120
120
|
-->
|
|
121
121
|
|
|
122
|
-
In Scope
|
|
122
|
+
**In Scope**
|
|
123
|
+
|
|
123
124
|
- {Chức năng thuộc feature}
|
|
124
125
|
|
|
125
126
|
---
|
|
@@ -141,9 +142,9 @@ In Scope
|
|
|
141
142
|
- Chi tiết kỹ thuật hoặc logic xử lý nội bộ → thuộc Business Rule / Business Logic.
|
|
142
143
|
-->
|
|
143
144
|
|
|
144
|
-
AC1
|
|
145
|
-
AC2
|
|
146
|
-
AC3
|
|
145
|
+
- **AC1:** {Điều kiện chấp nhận}
|
|
146
|
+
- **AC2:** {Điều kiện chấp nhận}
|
|
147
|
+
- **AC3:** {Điều kiện chấp nhận}
|
|
147
148
|
|
|
148
149
|
---
|
|
149
150
|
|
|
@@ -183,15 +184,24 @@ AC3: {Điều kiện chấp nhận}
|
|
|
183
184
|
-->
|
|
184
185
|
|
|
185
186
|
#### {TICKET_ID}-UC1: {Tên Use Case}
|
|
186
|
-
Actor: {Người dùng thực hiện}
|
|
187
|
-
Description: {Mô tả ngắn gọn kịch bản nghiệp vụ}
|
|
188
|
-
Pre-condition: {Điều kiện cần trước khi Use Case bắt đầu}
|
|
189
|
-
Post-condition: {Kết quả sau khi Use Case hoàn thành}
|
|
190
187
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
188
|
+
- **Actor:** {Người dùng thực hiện}
|
|
189
|
+
- **Description:** {Mô tả ngắn gọn kịch bản nghiệp vụ}
|
|
190
|
+
- **Pre-condition:** {Điều kiện cần trước khi Use Case bắt đầu}
|
|
191
|
+
- **Post-condition:** {Kết quả sau khi Use Case hoàn thành}
|
|
192
|
+
|
|
193
|
+
**Business Rule**
|
|
194
|
+
|
|
195
|
+
| ID | Business Rule |
|
|
196
|
+
|----|---------------|
|
|
197
|
+
| {TICKET_ID}-UC1-BR1 | |
|
|
198
|
+
|
|
199
|
+
**Business Logic**
|
|
200
|
+
|
|
201
|
+
**{TICKET_ID}-UC1-BR1:**
|
|
202
|
+
- Logic 1
|
|
203
|
+
- Logic 2
|
|
204
|
+
- Logic 3
|
|
195
205
|
|
|
196
206
|
---
|
|
197
207
|
|
|
@@ -246,11 +256,16 @@ flowchart TD
|
|
|
246
256
|
|
|
247
257
|
**Screen N: {Tên màn hình}**
|
|
248
258
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
259
|
+
**Screen:** {Tên màn hình}
|
|
260
|
+
|
|
261
|
+
**Components:**
|
|
262
|
+
- {Component 1}
|
|
263
|
+
- {Component 2}
|
|
264
|
+
- {Component 3}
|
|
265
|
+
|
|
266
|
+
**Actions:**
|
|
267
|
+
- {Hành động 1} → {Kết quả}
|
|
268
|
+
- {Hành động 2} → {Kết quả}
|
|
254
269
|
|
|
255
270
|
<!-- Figma Design: {Link Figma — xóa dòng này nếu không có URL} -->
|
|
256
271
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anhth2/spec-driven-dev-plugin",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "AI-First Spec-Driven Development workflow plugin for Claude Code",
|
|
5
5
|
"bin": {
|
|
6
6
|
"spec-driven-dev": "./bin/index.js"
|
|
@@ -26,7 +26,14 @@
|
|
|
26
26
|
"templates/",
|
|
27
27
|
"ARCHITECTURE.md"
|
|
28
28
|
],
|
|
29
|
-
"keywords": [
|
|
29
|
+
"keywords": [
|
|
30
|
+
"claude-code",
|
|
31
|
+
"spec-driven",
|
|
32
|
+
"ai-first",
|
|
33
|
+
"bdd",
|
|
34
|
+
"traceability",
|
|
35
|
+
"workflow"
|
|
36
|
+
],
|
|
30
37
|
"author": "Edupia Team",
|
|
31
38
|
"license": "MIT",
|
|
32
39
|
"repository": {
|
|
@@ -102,9 +102,9 @@
|
|
|
102
102
|
- {Business value}→ Giá trị nghiệp vụ mang lại (lý do tại sao người dùng cần điều này)
|
|
103
103
|
-->
|
|
104
104
|
|
|
105
|
-
As a {User role}
|
|
106
|
-
I want to {User goal}
|
|
107
|
-
So that {Business value}
|
|
105
|
+
- **As a** {User role}
|
|
106
|
+
- **I want to** {User goal}
|
|
107
|
+
- **So that** {Business value}
|
|
108
108
|
|
|
109
109
|
## b. Phạm vi
|
|
110
110
|
|
|
@@ -119,7 +119,8 @@ So that {Business value}
|
|
|
119
119
|
- Viết ngắn gọn, súc tích, đủ để người đọc hiểu mà không cần giải thích thêm.
|
|
120
120
|
-->
|
|
121
121
|
|
|
122
|
-
In Scope
|
|
122
|
+
**In Scope**
|
|
123
|
+
|
|
123
124
|
- {Chức năng thuộc feature}
|
|
124
125
|
|
|
125
126
|
---
|
|
@@ -141,9 +142,9 @@ In Scope
|
|
|
141
142
|
- Chi tiết kỹ thuật hoặc logic xử lý nội bộ → thuộc Business Rule / Business Logic.
|
|
142
143
|
-->
|
|
143
144
|
|
|
144
|
-
AC1
|
|
145
|
-
AC2
|
|
146
|
-
AC3
|
|
145
|
+
- **AC1:** {Điều kiện chấp nhận}
|
|
146
|
+
- **AC2:** {Điều kiện chấp nhận}
|
|
147
|
+
- **AC3:** {Điều kiện chấp nhận}
|
|
147
148
|
|
|
148
149
|
---
|
|
149
150
|
|
|
@@ -183,15 +184,24 @@ AC3: {Điều kiện chấp nhận}
|
|
|
183
184
|
-->
|
|
184
185
|
|
|
185
186
|
#### {TICKET_ID}-UC1: {Tên Use Case}
|
|
186
|
-
Actor: {Người dùng thực hiện}
|
|
187
|
-
Description: {Mô tả ngắn gọn kịch bản nghiệp vụ}
|
|
188
|
-
Pre-condition: {Điều kiện cần trước khi Use Case bắt đầu}
|
|
189
|
-
Post-condition: {Kết quả sau khi Use Case hoàn thành}
|
|
190
187
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
188
|
+
- **Actor:** {Người dùng thực hiện}
|
|
189
|
+
- **Description:** {Mô tả ngắn gọn kịch bản nghiệp vụ}
|
|
190
|
+
- **Pre-condition:** {Điều kiện cần trước khi Use Case bắt đầu}
|
|
191
|
+
- **Post-condition:** {Kết quả sau khi Use Case hoàn thành}
|
|
192
|
+
|
|
193
|
+
**Business Rule**
|
|
194
|
+
|
|
195
|
+
| ID | Business Rule |
|
|
196
|
+
|----|---------------|
|
|
197
|
+
| {TICKET_ID}-UC1-BR1 | |
|
|
198
|
+
|
|
199
|
+
**Business Logic**
|
|
200
|
+
|
|
201
|
+
**{TICKET_ID}-UC1-BR1:**
|
|
202
|
+
- Logic 1
|
|
203
|
+
- Logic 2
|
|
204
|
+
- Logic 3
|
|
195
205
|
|
|
196
206
|
---
|
|
197
207
|
|
|
@@ -246,11 +256,16 @@ flowchart TD
|
|
|
246
256
|
|
|
247
257
|
**Screen N: {Tên màn hình}**
|
|
248
258
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
259
|
+
**Screen:** {Tên màn hình}
|
|
260
|
+
|
|
261
|
+
**Components:**
|
|
262
|
+
- {Component 1}
|
|
263
|
+
- {Component 2}
|
|
264
|
+
- {Component 3}
|
|
265
|
+
|
|
266
|
+
**Actions:**
|
|
267
|
+
- {Hành động 1} → {Kết quả}
|
|
268
|
+
- {Hành động 2} → {Kết quả}
|
|
254
269
|
|
|
255
270
|
<!-- Figma Design: {Link Figma — xóa dòng này nếu không có URL} -->
|
|
256
271
|
|