specweave 0.22.11 → 0.22.12
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/CLAUDE.md +77 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +42 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/init/initial-increment-generator.d.ts +26 -0
- package/dist/src/cli/helpers/init/initial-increment-generator.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/initial-increment-generator.js +240 -0
- package/dist/src/cli/helpers/init/initial-increment-generator.js.map +1 -0
- package/dist/src/generators/spec/spec-parser.d.ts +79 -0
- package/dist/src/generators/spec/spec-parser.d.ts.map +1 -0
- package/dist/src/generators/spec/spec-parser.js +185 -0
- package/dist/src/generators/spec/spec-parser.js.map +1 -0
- package/dist/src/generators/spec/task-parser.d.ts +95 -0
- package/dist/src/generators/spec/task-parser.d.ts.map +1 -0
- package/dist/src/generators/spec/task-parser.js +301 -0
- package/dist/src/generators/spec/task-parser.js.map +1 -0
- package/dist/src/validators/ac-coverage-validator.d.ts +106 -0
- package/dist/src/validators/ac-coverage-validator.d.ts.map +1 -0
- package/dist/src/validators/ac-coverage-validator.js +250 -0
- package/dist/src/validators/ac-coverage-validator.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-done.md +58 -0
- package/plugins/specweave/commands/specweave-validate.md +36 -6
- package/plugins/specweave/lib/hooks/sync-living-docs.js +21 -0
- package/plugins/specweave/lib/hooks/sync-us-tasks.js +290 -0
- package/src/templates/AGENTS.md.template +16 -0
- package/src/templates/CLAUDE.md.template +18 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ac-coverage-validator.js","sourceRoot":"","sources":["../../../src/validators/ac-coverage-validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.12",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -80,6 +80,8 @@ if (!validation.isValid) {
|
|
|
80
80
|
|
|
81
81
|
• 17 acceptance criteria still open
|
|
82
82
|
• 13 tasks still pending
|
|
83
|
+
• 4 ACs uncovered by tasks (NEW - v0.23.0)
|
|
84
|
+
• 2 orphan tasks detected (NEW - v0.23.0)
|
|
83
85
|
|
|
84
86
|
Fix these issues before running /specweave:done again
|
|
85
87
|
```
|
|
@@ -89,6 +91,8 @@ Fix these issues before running /specweave:done again
|
|
|
89
91
|
✅ Automated validation passed
|
|
90
92
|
• All acceptance criteria completed
|
|
91
93
|
• All tasks completed
|
|
94
|
+
• 100% AC coverage (29/29 ACs) (NEW - v0.23.0)
|
|
95
|
+
• 0 orphan tasks (NEW - v0.23.0)
|
|
92
96
|
|
|
93
97
|
Proceeding to PM validation...
|
|
94
98
|
```
|
|
@@ -98,6 +102,10 @@ Proceeding to PM validation...
|
|
|
98
102
|
- [ ] All tasks are completed in **tasks.md** (`**Status**: [x] completed`)
|
|
99
103
|
- [ ] Required files exist (`spec.md`, `tasks.md`)
|
|
100
104
|
- [ ] **NEW**: Tasks count in frontmatter matches checked tasks (source of truth validation)
|
|
105
|
+
- [ ] **NEW (v0.23.0)**: AC coverage validation (US-Task Linkage Architecture)
|
|
106
|
+
- [ ] All ACs covered by at least one task (0% uncovered)
|
|
107
|
+
- [ ] No orphan tasks (all tasks have **Satisfies ACs** field)
|
|
108
|
+
- [ ] All US linkage valid (**User Story** field references exist in spec.md)
|
|
101
109
|
|
|
102
110
|
**⚠️ SOURCE OF TRUTH ENFORCEMENT (CRITICAL)**:
|
|
103
111
|
|
|
@@ -128,6 +136,56 @@ if (tasksInFile < total_tasks) {
|
|
|
128
136
|
- ❌ Marking work "done" without updating acceptance criteria
|
|
129
137
|
- ❌ The critical violation from increment 0044 (2025-11-19)
|
|
130
138
|
|
|
139
|
+
**⚠️ AC COVERAGE VALIDATION (NEW - v0.23.0)**:
|
|
140
|
+
|
|
141
|
+
Gate 0 now validates AC coverage to ensure all Acceptance Criteria have implementing tasks:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
import { validateACCoverage } from '../../../src/validators/ac-coverage-validator.js';
|
|
145
|
+
|
|
146
|
+
// Validate AC coverage
|
|
147
|
+
const coverageReport = validateACCoverage(incrementPath, {
|
|
148
|
+
minCoveragePercentage: 100, // Require 100% coverage
|
|
149
|
+
allowOrphans: false, // Block if orphan tasks exist
|
|
150
|
+
logger: consoleLogger
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// BLOCK if coverage fails
|
|
154
|
+
if (coverageReport.uncoveredACs.length > 0) {
|
|
155
|
+
throw new ValidationError(
|
|
156
|
+
`CRITICAL: AC Coverage validation failed!\n` +
|
|
157
|
+
`\n` +
|
|
158
|
+
`Uncovered Acceptance Criteria (${coverageReport.uncoveredACs.length}):\n` +
|
|
159
|
+
coverageReport.uncoveredACs.map(acId => ` • ${acId}`).join('\n') +
|
|
160
|
+
`\n\n` +
|
|
161
|
+
`All ACs MUST have at least one implementing task.\n` +
|
|
162
|
+
`Create tasks with **Satisfies ACs** field linking to these ACs.\n` +
|
|
163
|
+
`\n` +
|
|
164
|
+
`Run: /specweave:validate ${incrementId} to see detailed coverage report.`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (coverageReport.orphanTasks.length > 0) {
|
|
169
|
+
throw new ValidationError(
|
|
170
|
+
`CRITICAL: Orphan tasks detected!\n` +
|
|
171
|
+
`\n` +
|
|
172
|
+
`Tasks without AC linkage (${coverageReport.orphanTasks.length}):\n` +
|
|
173
|
+
coverageReport.orphanTasks.map(taskId => ` • ${taskId}`).join('\n') +
|
|
174
|
+
`\n\n` +
|
|
175
|
+
`All tasks MUST have **Satisfies ACs** field linking to acceptance criteria.\n` +
|
|
176
|
+
`Add AC references to these tasks.\n` +
|
|
177
|
+
`\n` +
|
|
178
|
+
`Run: /specweave:validate ${incrementId} to see detailed validation report.`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**This ensures**:
|
|
184
|
+
- ✅ All ACs covered by at least one task (100% coverage required)
|
|
185
|
+
- ✅ No orphan tasks (all tasks link to valid ACs)
|
|
186
|
+
- ✅ Traceability maintained (AC → Task mapping complete)
|
|
187
|
+
- ✅ Living docs accuracy (sync depends on task-AC linkage)
|
|
188
|
+
|
|
131
189
|
**Why Gate 0 matters**:
|
|
132
190
|
- **Prevents false completion**: Can't mark increment "completed" with open work
|
|
133
191
|
- **Fast feedback**: Fails immediately (< 1s) vs waiting for PM agent (30s+)
|
|
@@ -57,7 +57,7 @@ Usage: /specweave:validate-increment <id> [--quality] [--export] [--fix] [--alwa
|
|
|
57
57
|
|
|
58
58
|
### Step 2: Run Rule-Based Validation (Always)
|
|
59
59
|
|
|
60
|
-
Run 130+ validation rules across
|
|
60
|
+
Run 130+ validation rules across 7 categories:
|
|
61
61
|
|
|
62
62
|
**CRITICAL: Always run structure validation FIRST to prevent duplicate task files**
|
|
63
63
|
|
|
@@ -104,19 +104,31 @@ Run 130+ validation rules across 6 categories:
|
|
|
104
104
|
- ADR references exist
|
|
105
105
|
- Diagram references valid
|
|
106
106
|
|
|
107
|
+
7. **AC Coverage & Traceability (NEW - v0.23.0)**:
|
|
108
|
+
- All Acceptance Criteria have implementing tasks (0% uncovered)
|
|
109
|
+
- All tasks link to valid User Stories (**User Story**: US-XXX)
|
|
110
|
+
- All tasks link to valid Acceptance Criteria (**Satisfies ACs**: AC-USXX-YY)
|
|
111
|
+
- No orphan tasks (tasks without AC linkage)
|
|
112
|
+
- AC-Task traceability matrix builds successfully
|
|
113
|
+
- Per-User Story coverage calculated
|
|
114
|
+
|
|
107
115
|
**Display results**:
|
|
108
116
|
```
|
|
109
117
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
110
118
|
VALIDATION RESULTS: Increment 0001-authentication
|
|
111
119
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
112
120
|
|
|
113
|
-
✅ Rule-Based Validation: PASSED (
|
|
121
|
+
✅ Rule-Based Validation: PASSED (141/141 checks)
|
|
114
122
|
✓ Structure (5/5)
|
|
115
123
|
✓ Three-File Canonical (10/10) [ADR-0047]
|
|
116
124
|
✓ Consistency (47/47)
|
|
117
125
|
✓ Completeness (23/23)
|
|
118
126
|
✓ Quality (31/31)
|
|
119
127
|
✓ Traceability (19/19)
|
|
128
|
+
✓ AC Coverage & Traceability (6/6) [NEW - v0.23.0]
|
|
129
|
+
• 100% AC coverage (15/15 ACs covered)
|
|
130
|
+
• 0 orphan tasks
|
|
131
|
+
• All tasks linked to valid User Stories
|
|
120
132
|
|
|
121
133
|
Files validated:
|
|
122
134
|
• spec.md (250 lines, 6 user stories)
|
|
@@ -129,13 +141,17 @@ Files validated:
|
|
|
129
141
|
|
|
130
142
|
**If errors found**:
|
|
131
143
|
```
|
|
132
|
-
❌ Rule-Based Validation: FAILED (
|
|
144
|
+
❌ Rule-Based Validation: FAILED (128/141 checks)
|
|
133
145
|
❌ Structure (3/5) - 2 CRITICAL ERRORS
|
|
134
146
|
❌ Three-File Canonical (7/10) - 3 CRITICAL ERRORS [ADR-0047]
|
|
135
147
|
✓ Consistency (45/47) - 2 errors
|
|
136
148
|
✓ Completeness (23/23)
|
|
137
149
|
⚠️ Quality (28/31) - 3 warnings
|
|
138
150
|
✓ Traceability (19/19)
|
|
151
|
+
❌ AC Coverage & Traceability (3/6) - 3 ERRORS [NEW - v0.23.0]
|
|
152
|
+
• 73% AC coverage (11/15 ACs covered) - 4 uncovered
|
|
153
|
+
• 2 orphan tasks detected
|
|
154
|
+
• All US linkage valid
|
|
139
155
|
|
|
140
156
|
CRITICAL STRUCTURE ERRORS (MUST FIX FIRST):
|
|
141
157
|
❌ Duplicate task files detected: tasks.md, tasks-detailed.md
|
|
@@ -153,6 +169,16 @@ CRITICAL THREE-FILE VIOLATIONS (ADR-0047):
|
|
|
153
169
|
🚨 spec.md:102 - Contains task ID reference "T-001"
|
|
154
170
|
→ Tasks belong in tasks.md, use AC-IDs to link instead
|
|
155
171
|
|
|
172
|
+
AC COVERAGE ERRORS (3) [NEW - v0.23.0]:
|
|
173
|
+
🔴 4 Acceptance Criteria uncovered by tasks:
|
|
174
|
+
→ AC-US2-03: Real-time notification delivery (no implementing tasks)
|
|
175
|
+
→ AC-US3-01: API rate limiting (no implementing tasks)
|
|
176
|
+
→ AC-US3-05: Error handling for network failures (no implementing tasks)
|
|
177
|
+
→ AC-US4-02: Audit logging for security events (no implementing tasks)
|
|
178
|
+
🔴 2 Orphan tasks (no AC linkage):
|
|
179
|
+
→ T-008: Refactor authentication module (no **Satisfies ACs** field)
|
|
180
|
+
→ T-015: Update documentation (no **Satisfies ACs** field)
|
|
181
|
+
|
|
156
182
|
ERRORS (2):
|
|
157
183
|
🔴 spec.md:45 - Missing acceptance criteria for US-003
|
|
158
184
|
🔴 Inconsistency: spec.md mentions "real-time updates" but plan.md doesn't address it
|
|
@@ -168,9 +194,13 @@ Action required:
|
|
|
168
194
|
- Run refactoring script: .specweave/increments/XXXX/scripts/refactor-tasks-ac-to-implementation.sh
|
|
169
195
|
- Or manually replace "**Acceptance Criteria**:" with "**Implementation**:"
|
|
170
196
|
- Add "**AC-IDs**: AC-US-XX-YY" references to link tasks to spec.md
|
|
171
|
-
3.
|
|
172
|
-
|
|
173
|
-
|
|
197
|
+
3. 🔴 FIX AC COVERAGE ERRORS (v0.23.0 - US-Task Linkage):
|
|
198
|
+
- Create tasks for 4 uncovered ACs (AC-US2-03, AC-US3-01, AC-US3-05, AC-US4-02)
|
|
199
|
+
- Add **Satisfies ACs** field to 2 orphan tasks (T-008, T-015)
|
|
200
|
+
- Run: /specweave:validate 0001 to verify 100% coverage
|
|
201
|
+
4. Fix missing acceptance criteria for US-003
|
|
202
|
+
5. Address "real-time updates" in plan.md or remove from spec.md
|
|
203
|
+
6. Consider breaking down T012 into smaller tasks
|
|
174
204
|
|
|
175
205
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
176
206
|
```
|
|
@@ -103,6 +103,27 @@ async function hierarchicalDistribution(incrementId) {
|
|
|
103
103
|
console.log(` Files created/updated: ${result.filesCreated.length + result.filesUpdated.length}`);
|
|
104
104
|
|
|
105
105
|
const changedFiles = [...result.filesCreated, ...result.filesUpdated];
|
|
106
|
+
|
|
107
|
+
// NEW (v0.23.0): Sync tasks from tasks.md to living docs US files
|
|
108
|
+
// Part of increment 0047-us-task-linkage implementation
|
|
109
|
+
try {
|
|
110
|
+
const { syncUSTasksToLivingDocs } = await import("./sync-us-tasks.js");
|
|
111
|
+
const taskSyncResult = await syncUSTasksToLivingDocs(
|
|
112
|
+
incrementId,
|
|
113
|
+
projectRoot,
|
|
114
|
+
result.featureId,
|
|
115
|
+
{}
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
if (taskSyncResult.success && taskSyncResult.updatedFiles.length > 0) {
|
|
119
|
+
changedFiles.push(...taskSyncResult.updatedFiles);
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
// Don't fail entire sync if US-Task sync fails (graceful degradation)
|
|
123
|
+
console.log(` \u26A0\uFE0F US-Task sync failed (non-fatal):`, error.message);
|
|
124
|
+
console.log(` \u{1F4A1} Tip: This is a new feature (v0.23.0) - may need task parser build`);
|
|
125
|
+
}
|
|
126
|
+
|
|
106
127
|
return {
|
|
107
128
|
success: true,
|
|
108
129
|
changedFiles
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* US-Task Synchronization Module
|
|
4
|
+
*
|
|
5
|
+
* Syncs task completion status from tasks.md to living docs User Story files.
|
|
6
|
+
* Updates:
|
|
7
|
+
* - Task lists in US files (replaces "No tasks defined")
|
|
8
|
+
* - AC checkboxes based on task completion
|
|
9
|
+
*
|
|
10
|
+
* Part of increment 0047-us-task-linkage implementation.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import fs from 'fs-extra';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { parseTasksWithUSLinks, getAllTasks } from '../../../../dist/src/generators/spec/task-parser.js';
|
|
16
|
+
import { glob } from 'glob';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Sync tasks from tasks.md to living docs User Story files
|
|
20
|
+
*
|
|
21
|
+
* @param {string} incrementId - Increment ID (e.g., "0047-us-task-linkage")
|
|
22
|
+
* @param {string} projectRoot - Project root directory
|
|
23
|
+
* @param {string} featureId - Feature ID (e.g., "FS-047")
|
|
24
|
+
* @param {object} options - Sync options
|
|
25
|
+
* @returns {Promise<SyncResult>} Sync result
|
|
26
|
+
*/
|
|
27
|
+
export async function syncUSTasksToLivingDocs(incrementId, projectRoot, featureId, options = {}) {
|
|
28
|
+
try {
|
|
29
|
+
console.log(` 📋 Syncing tasks to living docs User Stories...`);
|
|
30
|
+
|
|
31
|
+
const tasksPath = path.join(projectRoot, '.specweave', 'increments', incrementId, 'tasks.md');
|
|
32
|
+
|
|
33
|
+
// Check if tasks.md exists
|
|
34
|
+
if (!fs.existsSync(tasksPath)) {
|
|
35
|
+
console.log(` ⚠️ tasks.md not found, skipping task sync`);
|
|
36
|
+
return { success: true, updatedFiles: [], errors: [] };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Parse tasks with US linkage
|
|
40
|
+
let tasksByUS;
|
|
41
|
+
try {
|
|
42
|
+
tasksByUS = parseTasksWithUSLinks(tasksPath);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error(` ❌ Failed to parse tasks.md:`, error.message);
|
|
45
|
+
return { success: false, updatedFiles: [], errors: [error.message] };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const allTasks = getAllTasks(tasksByUS);
|
|
49
|
+
console.log(` ✓ Parsed ${allTasks.length} tasks from tasks.md`);
|
|
50
|
+
|
|
51
|
+
// Check for tasks without US linkage (backward compatibility)
|
|
52
|
+
const unassignedTasks = tasksByUS['unassigned'] || [];
|
|
53
|
+
if (unassignedTasks.length > 0) {
|
|
54
|
+
console.log(` ⚠️ ${unassignedTasks.length} tasks without User Story linkage (old format)`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Get project ID (default to "specweave" for now, can be enhanced later)
|
|
58
|
+
const projectId = getProjectId(projectRoot, incrementId) || 'specweave';
|
|
59
|
+
|
|
60
|
+
const updatedFiles = [];
|
|
61
|
+
const errors = [];
|
|
62
|
+
|
|
63
|
+
// For each User Story with tasks, update its living docs file
|
|
64
|
+
for (const [usId, tasks] of Object.entries(tasksByUS)) {
|
|
65
|
+
if (usId === 'unassigned') continue; // Skip unassigned tasks
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
// Find US file in living docs
|
|
69
|
+
const usFilePath = await findUSFile(projectRoot, projectId, featureId, usId);
|
|
70
|
+
|
|
71
|
+
if (!usFilePath) {
|
|
72
|
+
console.log(` ⚠️ Living docs file not found for ${usId}, skipping`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Update US file with task list
|
|
77
|
+
const updated = await updateUSFile(usFilePath, tasks, incrementId);
|
|
78
|
+
|
|
79
|
+
if (updated) {
|
|
80
|
+
updatedFiles.push(usFilePath);
|
|
81
|
+
console.log(` ✓ Updated ${usId} with ${tasks.length} tasks`);
|
|
82
|
+
}
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.error(` ❌ Error updating ${usId}:`, error.message);
|
|
85
|
+
errors.push(`${usId}: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (updatedFiles.length > 0) {
|
|
90
|
+
console.log(` ✅ Updated ${updatedFiles.length} User Story file(s)`);
|
|
91
|
+
} else {
|
|
92
|
+
console.log(` ℹ️ No User Story files updated`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
success: errors.length === 0,
|
|
97
|
+
updatedFiles,
|
|
98
|
+
errors
|
|
99
|
+
};
|
|
100
|
+
} catch (error) {
|
|
101
|
+
console.error(` ❌ US-Task sync failed:`, error);
|
|
102
|
+
return { success: false, updatedFiles: [], errors: [error.message] };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Find User Story file in living docs
|
|
108
|
+
*
|
|
109
|
+
* @param {string} projectRoot - Project root
|
|
110
|
+
* @param {string} projectId - Project ID (e.g., "specweave")
|
|
111
|
+
* @param {string} featureId - Feature ID (e.g., "FS-047")
|
|
112
|
+
* @param {string} usId - User Story ID (e.g., "US-001")
|
|
113
|
+
* @returns {Promise<string|null>} Path to US file or null if not found
|
|
114
|
+
*/
|
|
115
|
+
async function findUSFile(projectRoot, projectId, featureId, usId) {
|
|
116
|
+
// Pattern: .specweave/docs/internal/specs/{project}/{feature}/us-{id}-*.md
|
|
117
|
+
const pattern = path.join(
|
|
118
|
+
projectRoot,
|
|
119
|
+
'.specweave',
|
|
120
|
+
'docs',
|
|
121
|
+
'internal',
|
|
122
|
+
'specs',
|
|
123
|
+
projectId,
|
|
124
|
+
featureId,
|
|
125
|
+
`${usId.toLowerCase()}-*.md`
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const files = await glob(pattern);
|
|
129
|
+
|
|
130
|
+
if (files.length === 0) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (files.length > 1) {
|
|
135
|
+
console.log(` ⚠️ Multiple files found for ${usId}, using first: ${path.basename(files[0])}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return files[0];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Update User Story file with task list and AC checkboxes
|
|
143
|
+
*
|
|
144
|
+
* @param {string} usFilePath - Path to US markdown file
|
|
145
|
+
* @param {Array} tasks - Tasks linked to this US
|
|
146
|
+
* @param {string} incrementId - Increment ID
|
|
147
|
+
* @returns {Promise<boolean>} True if file was updated
|
|
148
|
+
*/
|
|
149
|
+
async function updateUSFile(usFilePath, tasks, incrementId) {
|
|
150
|
+
let content = await fs.readFile(usFilePath, 'utf-8');
|
|
151
|
+
let updated = false;
|
|
152
|
+
|
|
153
|
+
// 1. Update task list section
|
|
154
|
+
const taskList = generateTaskList(tasks, incrementId);
|
|
155
|
+
const newTasksSection = `## Tasks\n\n${taskList}`;
|
|
156
|
+
|
|
157
|
+
// Replace existing tasks section
|
|
158
|
+
if (content.includes('## Tasks')) {
|
|
159
|
+
// Replace everything from "## Tasks" to next "##" or end of file
|
|
160
|
+
const tasksRegex = /(## Tasks\n\n)(?:.*?)(?=\n## |\n---\n|$)/s;
|
|
161
|
+
const newContent = content.replace(tasksRegex, newTasksSection);
|
|
162
|
+
|
|
163
|
+
if (newContent !== content) {
|
|
164
|
+
content = newContent;
|
|
165
|
+
updated = true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// 2. Update AC checkboxes based on task completion
|
|
170
|
+
const updatedACs = updateACCheckboxes(content, tasks);
|
|
171
|
+
if (updatedACs !== content) {
|
|
172
|
+
content = updatedACs;
|
|
173
|
+
updated = true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Write updated content
|
|
177
|
+
if (updated) {
|
|
178
|
+
await fs.writeFile(usFilePath, content, 'utf-8');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return updated;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Generate task list markdown
|
|
186
|
+
*
|
|
187
|
+
* @param {Array} tasks - Tasks to list
|
|
188
|
+
* @param {string} incrementId - Increment ID
|
|
189
|
+
* @returns {string} Markdown task list
|
|
190
|
+
*/
|
|
191
|
+
function generateTaskList(tasks, incrementId) {
|
|
192
|
+
if (tasks.length === 0) {
|
|
193
|
+
return '_No tasks defined for this user story_';
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return tasks.map(task => {
|
|
197
|
+
const checkbox = task.status === 'completed' ? 'x' : ' ';
|
|
198
|
+
const link = `../../../../increments/${incrementId}/tasks.md#${task.id}`;
|
|
199
|
+
return `- [${checkbox}] [${task.id}](${link}): ${task.title}`;
|
|
200
|
+
}).join('\n');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Update AC checkboxes based on task completion
|
|
205
|
+
*
|
|
206
|
+
* @param {string} content - US file content
|
|
207
|
+
* @param {Array} tasks - Tasks linked to this US
|
|
208
|
+
* @returns {string} Updated content
|
|
209
|
+
*/
|
|
210
|
+
function updateACCheckboxes(content, tasks) {
|
|
211
|
+
// Collect all AC-IDs satisfied by completed tasks
|
|
212
|
+
const satisfiedACs = new Set();
|
|
213
|
+
|
|
214
|
+
tasks.forEach(task => {
|
|
215
|
+
if (task.status === 'completed' && task.satisfiesACs) {
|
|
216
|
+
task.satisfiesACs.forEach(acId => satisfiedACs.add(acId));
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
// Update AC checkboxes
|
|
221
|
+
let updatedContent = content;
|
|
222
|
+
|
|
223
|
+
satisfiedACs.forEach(acId => {
|
|
224
|
+
// Replace: - [ ] **AC-US1-01** with - [x] **AC-US1-01**
|
|
225
|
+
const uncheckedRegex = new RegExp(`- \\[ \\] \\*\\*${escapeRegex(acId)}\\*\\*`, 'g');
|
|
226
|
+
updatedContent = updatedContent.replace(uncheckedRegex, `- [x] **${acId}**`);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Also uncheck ACs that are no longer satisfied (tasks incomplete/pending)
|
|
230
|
+
// Extract all AC-IDs from content
|
|
231
|
+
const acPattern = /- \[[x ]\] \*\*(AC-US\d+-\d{2})\*\*/g;
|
|
232
|
+
let match;
|
|
233
|
+
const allACs = [];
|
|
234
|
+
|
|
235
|
+
while ((match = acPattern.exec(content)) !== null) {
|
|
236
|
+
allACs.push(match[1]);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Uncheck ACs not in satisfiedACs set
|
|
240
|
+
allACs.forEach(acId => {
|
|
241
|
+
if (!satisfiedACs.has(acId)) {
|
|
242
|
+
const checkedRegex = new RegExp(`- \\[x\\] \\*\\*${escapeRegex(acId)}\\*\\*`, 'g');
|
|
243
|
+
updatedContent = updatedContent.replace(checkedRegex, `- [ ] **${acId}**`);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
return updatedContent;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Escape special regex characters
|
|
252
|
+
*/
|
|
253
|
+
function escapeRegex(str) {
|
|
254
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Get project ID from metadata or config
|
|
259
|
+
*
|
|
260
|
+
* @param {string} projectRoot - Project root
|
|
261
|
+
* @param {string} incrementId - Increment ID
|
|
262
|
+
* @returns {string|null} Project ID or null
|
|
263
|
+
*/
|
|
264
|
+
function getProjectId(projectRoot, incrementId) {
|
|
265
|
+
try {
|
|
266
|
+
// Try to get from metadata.json
|
|
267
|
+
const metadataPath = path.join(projectRoot, '.specweave', 'increments', incrementId, 'metadata.json');
|
|
268
|
+
if (fs.existsSync(metadataPath)) {
|
|
269
|
+
const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
|
|
270
|
+
if (metadata.project) {
|
|
271
|
+
return metadata.project;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Try to get from config.json
|
|
276
|
+
const configPath = path.join(projectRoot, '.specweave', 'config.json');
|
|
277
|
+
if (fs.existsSync(configPath)) {
|
|
278
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
279
|
+
if (config.defaultProject) {
|
|
280
|
+
return config.defaultProject;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Default to "specweave" (single-project mode)
|
|
285
|
+
return 'specweave';
|
|
286
|
+
} catch (error) {
|
|
287
|
+
console.log(` ⚠️ Could not determine project ID, using default: "specweave"`);
|
|
288
|
+
return 'specweave';
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -5,6 +5,22 @@
|
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## 🎯 Getting Started
|
|
9
|
+
|
|
10
|
+
**Initial Increment Created**: `0001-project-setup` (`.specweave/increments/0001-project-setup/`)
|
|
11
|
+
|
|
12
|
+
This increment was auto-generated by `specweave init` to give you a starting point.
|
|
13
|
+
|
|
14
|
+
**Your Options**:
|
|
15
|
+
1. **Start Fresh** (Recommended): Delete it and create your first real feature
|
|
16
|
+
- Delete the increment folder manually
|
|
17
|
+
- Ask user to run `/specweave:increment "your-feature-name"` (if in Claude Code) or create new increment via this file's commands
|
|
18
|
+
2. **Customize It**: Edit the spec.md in the increment folder and use it for initial setup tasks
|
|
19
|
+
|
|
20
|
+
**Note**: SpecWeave works best when each increment represents a single, focused feature or bugfix.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
8
24
|
## 🚨 CRITICAL: How to Use This File (Non-Claude Code Tools)
|
|
9
25
|
|
|
10
26
|
**You're using Cursor, GitHub Copilot, or another AI tool - NOT Claude Code.**
|
|
@@ -4,6 +4,24 @@ This project uses **SpecWeave** - a specification-first AI development framework
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## 🎯 Getting Started
|
|
8
|
+
|
|
9
|
+
**Initial Increment Created**: `0001-project-setup` (`.specweave/increments/0001-project-setup/`)
|
|
10
|
+
|
|
11
|
+
This increment was auto-generated by `specweave init` to give you a starting point.
|
|
12
|
+
|
|
13
|
+
**Your Options**:
|
|
14
|
+
1. **Start Fresh** (Recommended): Delete it and create your first real feature
|
|
15
|
+
```bash
|
|
16
|
+
rm -rf .specweave/increments/0001-project-setup
|
|
17
|
+
/specweave:increment "your-feature-name"
|
|
18
|
+
```
|
|
19
|
+
2. **Customize It**: Edit the spec.md and use this increment for initial setup tasks
|
|
20
|
+
|
|
21
|
+
**Note**: SpecWeave works best when each increment represents a single, focused feature or bugfix.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
7
25
|
## 🚨 CRITICAL: NEVER POLLUTE PROJECT ROOT!
|
|
8
26
|
|
|
9
27
|
**⛔ THIS IS THE #1 RULE - ALL AI-GENERATED FILES GO IN INCREMENT FOLDERS ⛔**
|