sdd-pipeline 1.2.4 → 1.2.7
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/bin/sdd.cjs +201 -0
- package/lib/bmad/index.js +20 -3
- package/lib/bundle/.claude/commands/sdd-check.md +153 -0
- package/lib/bundle/.claude/commands/sdd-cook.md +149 -167
- package/lib/bundle/.claude/commands/sdd-task-status.md +97 -27
- package/lib/bundle/bin/sdd.cjs +201 -0
- package/lib/bundle/bin/sdd.js +159 -0
- package/lib/bundle/commands/sdd-task-status.ps1 +82 -22
- package/lib/bundle/lib/bmad/confidence.js +129 -0
- package/lib/bundle/lib/bmad/index.js +157 -0
- package/lib/bundle/lib/bmad/problem-first.js +91 -0
- package/lib/bundle/lib/bmad/questions.js +110 -0
- package/lib/bundle/lib/bmad/synthesis.js +109 -0
- package/lib/bundle/lib/config.js +35 -0
- package/lib/bundle/lib/init.js +204 -0
- package/lib/bundle/lib/sanitize.js +10 -0
- package/lib/bundle/run-converge.ps1 +288 -42
- package/lib/bundle/skills/sdd-tasks/SKILL.md +259 -0
- package/lib/init.js +108 -32
- package/package.json +8 -8
- package/bin/sdd.js +0 -70
- package/lib/bmad.js +0 -54
|
@@ -1,183 +1,205 @@
|
|
|
1
1
|
---
|
|
2
2
|
# SDD Cook — Phase 4 Implementation
|
|
3
|
-
#
|
|
4
|
-
# Validates with subagents, updates task status
|
|
3
|
+
# Single command for task execution
|
|
5
4
|
---
|
|
6
5
|
tool: Bash
|
|
7
6
|
when: always
|
|
8
7
|
args: optional
|
|
9
|
-
description: Phase 4 —
|
|
8
|
+
description: Phase 4 — Implement tasks from MASTER-TASKS.md. Args: [--all | --task T-XXX] [--dry-run]. Reads task file, shows requirements, guides implementation, marks complete.
|
|
10
9
|
---
|
|
11
|
-
$ErrorActionPreference = '
|
|
10
|
+
$ErrorActionPreference = 'Continue'
|
|
12
11
|
|
|
13
12
|
# ============================================================
|
|
14
|
-
# SDD Cook — Phase 4
|
|
13
|
+
# SDD Cook — Unified Phase 4 Command
|
|
15
14
|
# ============================================================
|
|
16
|
-
#
|
|
17
|
-
#
|
|
15
|
+
# Usage:
|
|
16
|
+
# claude "/sdd-cook" # Show plan, guide next task
|
|
17
|
+
# claude "/sdd-cook --all" # Implement all pending tasks
|
|
18
|
+
# claude "/sdd-cook --task T-001" # Implement specific task
|
|
18
19
|
# ============================================================
|
|
19
20
|
|
|
20
21
|
# --- Parse arguments ---
|
|
21
22
|
$rawArgs = $args -join ' '
|
|
22
23
|
$targetTask = ""
|
|
23
|
-
$skipTest = $false
|
|
24
|
-
$skipReview = $false
|
|
25
24
|
$executeAll = $false
|
|
25
|
+
$dryRun = $false
|
|
26
26
|
|
|
27
|
+
# Parse flags
|
|
27
28
|
if ($rawArgs -match "--task\s+(\S+)") {
|
|
28
29
|
$targetTask = $matches[1]
|
|
29
30
|
}
|
|
30
31
|
if ($rawArgs -match "--all") {
|
|
31
32
|
$executeAll = $true
|
|
32
33
|
}
|
|
33
|
-
if ($rawArgs -match "--
|
|
34
|
-
$
|
|
35
|
-
}
|
|
36
|
-
if ($rawArgs -match "--no-review") {
|
|
37
|
-
$skipReview = $true
|
|
34
|
+
if ($rawArgs -match "--dry-run") {
|
|
35
|
+
$dryRun = $true
|
|
38
36
|
}
|
|
39
37
|
|
|
40
38
|
# ============================================================
|
|
41
|
-
#
|
|
39
|
+
# Prerequisites Check
|
|
42
40
|
# ============================================================
|
|
43
41
|
Write-Host ""
|
|
44
|
-
Write-Host "
|
|
42
|
+
Write-Host "========================================" -ForegroundColor Cyan
|
|
43
|
+
Write-Host " SDD Cook — Phase 4 Implementation" -ForegroundColor Cyan
|
|
44
|
+
Write-Host "========================================" -ForegroundColor Cyan
|
|
45
45
|
Write-Host ""
|
|
46
46
|
|
|
47
|
-
#
|
|
48
|
-
$
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
# Find task directory
|
|
48
|
+
$SDD_TASKS_DIR = "sdd/tasks"
|
|
49
|
+
$taskDir = $null
|
|
50
|
+
|
|
51
|
+
if (Test-Path $SDD_TASKS_DIR) {
|
|
52
|
+
$taskDirs = Get-ChildItem -Path $SDD_TASKS_DIR -Filter "task-*-*" -Directory -ErrorAction SilentlyContinue
|
|
53
|
+
if ($taskDirs) {
|
|
54
|
+
$taskDir = Join-Path $SDD_TASKS_DIR ($taskDirs[0].Name)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (-not $taskDir) {
|
|
59
|
+
$legacyTaskDirs = Get-ChildItem -Filter "task-*-*" -Directory -ErrorAction SilentlyContinue
|
|
60
|
+
if ($legacyTaskDirs) {
|
|
61
|
+
$taskDir = $legacyTaskDirs[0].FullName
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (-not $taskDir) {
|
|
66
|
+
Write-Host "[ERROR] No task directory found." -ForegroundColor Red
|
|
67
|
+
Write-Host "Run: claude `"/sdd-tasks`" first." -ForegroundColor Yellow
|
|
52
68
|
exit 1
|
|
53
69
|
}
|
|
54
70
|
|
|
55
|
-
$
|
|
56
|
-
$taskDirName = $taskDirs[0].Name
|
|
71
|
+
$taskDirName = Split-Path $taskDir -Leaf
|
|
57
72
|
|
|
58
|
-
# Check
|
|
73
|
+
# Check files
|
|
59
74
|
$masterTasksPath = Join-Path $taskDir "MASTER-TASKS.md"
|
|
60
75
|
if (-not (Test-Path $masterTasksPath)) {
|
|
61
|
-
Write-Host "[ERROR] MASTER-TASKS.md not found
|
|
62
|
-
Write-Host "Run: /sdd-tasks to generate tasks." -ForegroundColor Yellow
|
|
76
|
+
Write-Host "[ERROR] MASTER-TASKS.md not found." -ForegroundColor Red
|
|
63
77
|
exit 1
|
|
64
78
|
}
|
|
65
79
|
|
|
66
|
-
|
|
67
|
-
if (-not (Test-Path
|
|
80
|
+
$specFile = "sdd/SPEC.md"
|
|
81
|
+
if (-not (Test-Path $specFile)) {
|
|
68
82
|
Write-Host "[ERROR] SPEC.md not found." -ForegroundColor Red
|
|
69
|
-
Write-Host "Run: /sdd-spec
|
|
83
|
+
Write-Host "Run: claude `"/sdd-spec`" first." -ForegroundColor Yellow
|
|
70
84
|
exit 1
|
|
71
85
|
}
|
|
72
86
|
|
|
73
|
-
Write-Host "[OK] Prerequisites verified
|
|
74
|
-
Write-Host "
|
|
75
|
-
Write-Host " - MASTER-TASKS.md: Found" -ForegroundColor Gray
|
|
76
|
-
Write-Host " - SPEC.md: Found" -ForegroundColor Gray
|
|
87
|
+
Write-Host "[OK] Prerequisites verified" -ForegroundColor Green
|
|
88
|
+
Write-Host " Task dir: $taskDirName" -ForegroundColor Gray
|
|
77
89
|
Write-Host ""
|
|
78
90
|
|
|
79
91
|
# ============================================================
|
|
80
|
-
#
|
|
92
|
+
# Load Tasks
|
|
81
93
|
# ============================================================
|
|
82
94
|
Write-Host "--- Loading Tasks ---" -ForegroundColor Yellow
|
|
83
95
|
|
|
84
96
|
$masterContent = Get-Content $masterTasksPath -Raw
|
|
85
97
|
|
|
86
|
-
# Parse tasks from table
|
|
87
98
|
$taskPattern = '\|\s*(T-\d+)\s*\|\s*([^\|]+)\s*\|\s*([^\|]+)\s*\|\s*\[([^\]]+)\]\s*\|'
|
|
88
99
|
$tasks = @()
|
|
89
100
|
if ($masterContent -match $taskPattern) {
|
|
90
101
|
$matches = [regex]::Matches($masterContent, $taskPattern)
|
|
91
102
|
foreach ($m in $matches) {
|
|
92
|
-
$
|
|
103
|
+
$tasks += @{
|
|
93
104
|
Id = $m.Groups[1].Value
|
|
94
105
|
Name = $m.Groups[2].Value.Trim()
|
|
95
106
|
Estimate = $m.Groups[3].Value.Trim()
|
|
96
107
|
Status = $m.Groups[4].Value.Trim()
|
|
97
108
|
}
|
|
98
|
-
$tasks += $task
|
|
99
109
|
}
|
|
100
110
|
}
|
|
101
111
|
|
|
102
112
|
if ($tasks.Count -eq 0) {
|
|
103
|
-
Write-Host "[ERROR] No tasks found
|
|
113
|
+
Write-Host "[ERROR] No tasks found." -ForegroundColor Red
|
|
104
114
|
exit 1
|
|
105
115
|
}
|
|
106
116
|
|
|
117
|
+
# Helper function
|
|
118
|
+
function Test-TaskComplete($status) {
|
|
119
|
+
return $status -in @("x", "X", "v", "V", "done", "completed")
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
Write-Host ""
|
|
107
123
|
Write-Host "Found $($tasks.Count) tasks:" -ForegroundColor Green
|
|
124
|
+
$completedCount = 0
|
|
125
|
+
$pendingTasks = @()
|
|
108
126
|
foreach ($t in $tasks) {
|
|
109
|
-
$
|
|
110
|
-
|
|
111
|
-
|
|
127
|
+
$isComplete = Test-TaskComplete $t.Status
|
|
128
|
+
if ($isComplete) { $completedCount++ } else { $pendingTasks += $t }
|
|
129
|
+
$statusIcon = if ($isComplete) { "[V]" } else { "[ ]" }
|
|
130
|
+
$color = if ($isComplete) { "Green" } else { "Gray" }
|
|
131
|
+
Write-Host " $statusIcon $($t.Id): $($t.Name)" -ForegroundColor $color
|
|
112
132
|
}
|
|
113
133
|
Write-Host ""
|
|
134
|
+
Write-Host "Progress: $completedCount/$($tasks.Count) complete" -ForegroundColor Cyan
|
|
135
|
+
Write-Host ""
|
|
114
136
|
|
|
115
137
|
# ============================================================
|
|
116
|
-
#
|
|
138
|
+
# Select Tasks to Execute
|
|
117
139
|
# ============================================================
|
|
118
|
-
$pendingTasks = $tasks | Where-Object { $_.Status -ne "x" }
|
|
119
140
|
$tasksToExecute = @()
|
|
120
141
|
|
|
121
142
|
if ($targetTask) {
|
|
122
|
-
#
|
|
123
|
-
$
|
|
124
|
-
if ($
|
|
125
|
-
$tasksToExecute += $
|
|
126
|
-
Write-Host "
|
|
143
|
+
# Specific task
|
|
144
|
+
$task = $pendingTasks | Where-Object { $_.Id -eq $targetTask }
|
|
145
|
+
if ($task) {
|
|
146
|
+
$tasksToExecute += $task
|
|
147
|
+
Write-Host "Mode: specific - Task $targetTask" -ForegroundColor Cyan
|
|
127
148
|
} else {
|
|
128
|
-
$
|
|
129
|
-
if ($
|
|
130
|
-
Write-Host "[
|
|
149
|
+
$existing = $tasks | Where-Object { $_.Id -eq $targetTask }
|
|
150
|
+
if ($existing) {
|
|
151
|
+
Write-Host "[INFO] Task $targetTask already complete." -ForegroundColor Green
|
|
131
152
|
} else {
|
|
132
153
|
Write-Host "[ERROR] Task $targetTask not found." -ForegroundColor Red
|
|
133
154
|
}
|
|
134
155
|
exit 0
|
|
135
156
|
}
|
|
136
157
|
} elseif ($executeAll) {
|
|
137
|
-
#
|
|
158
|
+
# All pending
|
|
138
159
|
$tasksToExecute = $pendingTasks
|
|
139
|
-
Write-Host "
|
|
160
|
+
Write-Host "Mode: all - $($tasksToExecute.Count) tasks" -ForegroundColor Cyan
|
|
140
161
|
} else {
|
|
141
|
-
#
|
|
162
|
+
# Interactive - next pending task
|
|
142
163
|
if ($pendingTasks.Count -gt 0) {
|
|
143
164
|
$tasksToExecute += $pendingTasks[0]
|
|
144
|
-
Write-Host "
|
|
165
|
+
Write-Host "Mode: next pending task" -ForegroundColor Cyan
|
|
145
166
|
} else {
|
|
146
|
-
Write-Host "[INFO] All tasks
|
|
167
|
+
Write-Host "[INFO] All tasks complete!" -ForegroundColor Green
|
|
147
168
|
Write-Host ""
|
|
148
|
-
Write-Host "Next: /sdd-converge
|
|
169
|
+
Write-Host "Next: claude `"/sdd-converge`"" -ForegroundColor Cyan
|
|
149
170
|
exit 0
|
|
150
171
|
}
|
|
151
172
|
}
|
|
152
173
|
|
|
153
|
-
# ============================================================
|
|
154
|
-
# STEP 4: Read task files and execute
|
|
155
|
-
# ============================================================
|
|
156
|
-
Write-Host ""
|
|
157
|
-
Write-Host "--- Task Execution ---" -ForegroundColor Yellow
|
|
158
174
|
Write-Host ""
|
|
175
|
+
Write-Host "Tasks to execute: $($tasksToExecute.Count)" -ForegroundColor Green
|
|
159
176
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
177
|
+
# ============================================================
|
|
178
|
+
# Implement Each Task
|
|
179
|
+
# ============================================================
|
|
164
180
|
foreach ($task in $tasksToExecute) {
|
|
165
181
|
Write-Host ""
|
|
166
182
|
Write-Host "========================================" -ForegroundColor Magenta
|
|
167
|
-
Write-Host "
|
|
183
|
+
Write-Host " Implementing: $($task.Id) - $($task.Name)" -ForegroundColor Magenta
|
|
168
184
|
Write-Host "========================================" -ForegroundColor Magenta
|
|
169
185
|
|
|
170
186
|
# Find task file
|
|
171
|
-
$taskFiles = Get-ChildItem -Path $taskDir -Filter "$($task.Id)-*.md" -File
|
|
187
|
+
$taskFiles = Get-ChildItem -Path $taskDir -Filter "$($task.Id)-*.md" -File -ErrorAction SilentlyContinue
|
|
188
|
+
$taskFiles = $taskFiles | Where-Object { $_.Name -ne "MASTER-TASKS.md" }
|
|
189
|
+
|
|
172
190
|
if (-not $taskFiles) {
|
|
173
191
|
Write-Host "[WARN] Task file not found: $($task.Id)-*.md" -ForegroundColor Yellow
|
|
174
|
-
Write-Host "Skipping $($task.Id)..." -ForegroundColor Yellow
|
|
175
192
|
continue
|
|
176
193
|
}
|
|
177
194
|
|
|
178
195
|
$taskFile = $taskFiles[0].FullName
|
|
179
196
|
$taskContent = Get-Content $taskFile -Raw
|
|
180
197
|
|
|
198
|
+
# Extract task name override
|
|
199
|
+
if ($taskContent -match '(?m)^#\s+\S+:\s*(.+)') {
|
|
200
|
+
$task.Name = $matches[1].Trim()
|
|
201
|
+
}
|
|
202
|
+
|
|
181
203
|
# Parse frontmatter
|
|
182
204
|
$dependsOn = @()
|
|
183
205
|
if ($taskContent -match 'depends_on:\s*\[([^\]]*)\]') {
|
|
@@ -187,27 +209,9 @@ foreach ($task in $tasksToExecute) {
|
|
|
187
209
|
}
|
|
188
210
|
}
|
|
189
211
|
|
|
190
|
-
#
|
|
191
|
-
if ($dependsOn.Count -gt 0) {
|
|
192
|
-
Write-Host "Dependencies: $($dependsOn -join ', ')" -ForegroundColor Gray
|
|
193
|
-
$depsMet = $true
|
|
194
|
-
foreach ($dep in $dependsOn) {
|
|
195
|
-
$depTask = $tasks | Where-Object { $_.Id -eq $dep }
|
|
196
|
-
if ($depTask -and $depTask.Status -ne "x") {
|
|
197
|
-
Write-Host "[BLOCKED] $($task.Id) depends on $dep which is not complete." -ForegroundColor Red
|
|
198
|
-
$depsMet = $false
|
|
199
|
-
break
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
if (-not $depsMet) {
|
|
203
|
-
Write-Host "Skipping $($task.Id) - dependency not met." -ForegroundColor Yellow
|
|
204
|
-
continue
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
# Extract files to modify
|
|
212
|
+
# Extract files
|
|
209
213
|
$filesToModify = @()
|
|
210
|
-
if ($taskContent -match '## Files to Modify
|
|
214
|
+
if ($taskContent -match '(?s)## Files to (?:Modify|Create)\s*\n((?:- .+\n)+)') {
|
|
211
215
|
$filesBlock = $matches[1]
|
|
212
216
|
$files = $filesBlock -split '\n' | Where-Object { $_ -match '^\s*-\s+' }
|
|
213
217
|
foreach ($f in $files) {
|
|
@@ -216,120 +220,98 @@ foreach ($task in $tasksToExecute) {
|
|
|
216
220
|
}
|
|
217
221
|
}
|
|
218
222
|
|
|
219
|
-
# Extract
|
|
223
|
+
# Extract steps
|
|
220
224
|
$implSteps = @()
|
|
221
|
-
if ($taskContent -match '## Implementation Steps\s*\n((?:\d+\. .+\n)+)') {
|
|
225
|
+
if ($taskContent -match '(?s)## Implementation Steps\s*\n((?:\d+\. .+\n?)+)') {
|
|
222
226
|
$stepsBlock = $matches[1]
|
|
223
227
|
$implSteps = $stepsBlock -split '\n' | Where-Object { $_ -match '^\d+\.' }
|
|
224
228
|
}
|
|
225
229
|
|
|
226
|
-
# Extract verification
|
|
230
|
+
# Extract verification
|
|
227
231
|
$verificationChecks = @()
|
|
228
|
-
if ($taskContent -match '## Verification\s*\n((?:- \[ \] .+\n)+)') {
|
|
232
|
+
if ($taskContent -match '(?s)## Verification\s*\n((?:- \[ \] .+\n?)+)') {
|
|
229
233
|
$checksBlock = $matches[1]
|
|
230
234
|
$verificationChecks = $checksBlock -split '\n' | Where-Object { $_ -match '- \[ \]' }
|
|
231
235
|
}
|
|
232
236
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
+
# Extract SPEC sections
|
|
238
|
+
$specSections = @()
|
|
239
|
+
if ($taskContent -match 'spec_sections:\s*\[([^\]]+)\]') {
|
|
240
|
+
$sections = $matches[1] -split ',' | ForEach-Object { $_.Trim() -replace '"', '' }
|
|
241
|
+
$specSections += $sections
|
|
242
|
+
}
|
|
237
243
|
|
|
238
|
-
#
|
|
239
|
-
# IMPLEMENTATION
|
|
240
|
-
# ============================================================
|
|
241
|
-
Write-Host ""
|
|
242
|
-
Write-Host "--- Implementation ---" -ForegroundColor Yellow
|
|
243
|
-
Write-Host "Executing implementation for $($task.Id)..." -ForegroundColor Green
|
|
244
|
-
Write-Host ""
|
|
245
|
-
Write-Host "[HINT] To implement this task:" -ForegroundColor Cyan
|
|
246
|
-
Write-Host " 1. Read SPEC.md for requirements" -ForegroundColor Gray
|
|
247
|
-
Write-Host " 2. Read $taskFile" -ForegroundColor Gray
|
|
248
|
-
Write-Host " 3. Implement changes per steps" -ForegroundColor Gray
|
|
244
|
+
# Display requirements
|
|
249
245
|
Write-Host ""
|
|
250
|
-
Write-Host "
|
|
251
|
-
|
|
252
|
-
|
|
246
|
+
Write-Host "--- Requirements ---" -ForegroundColor Yellow
|
|
247
|
+
|
|
248
|
+
if ($taskContent -match '(?m)^description:\s*"([^"]+)"') {
|
|
249
|
+
Write-Host "Description: $($matches[1])" -ForegroundColor White
|
|
253
250
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
Write-Host " $step" -ForegroundColor Gray
|
|
251
|
+
|
|
252
|
+
if ($dependsOn.Count -gt 0) {
|
|
253
|
+
Write-Host "Dependencies: $($dependsOn -join ', ')" -ForegroundColor Yellow
|
|
258
254
|
}
|
|
259
255
|
|
|
260
|
-
|
|
261
|
-
# TESTING (if not skipped)
|
|
262
|
-
# ============================================================
|
|
263
|
-
if (-not $skipTest) {
|
|
256
|
+
if ($filesToModify.Count -gt 0) {
|
|
264
257
|
Write-Host ""
|
|
265
|
-
Write-Host "
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
Write-Host " [ ] $checkText" -ForegroundColor Gray
|
|
258
|
+
Write-Host "Files to create/modify:" -ForegroundColor Cyan
|
|
259
|
+
foreach ($f in $filesToModify) {
|
|
260
|
+
$exists = if (Test-Path $f) { "(exists)" } else { "(new)" }
|
|
261
|
+
Write-Host " - $f $exists" -ForegroundColor Gray
|
|
270
262
|
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if ($implSteps.Count -gt 0) {
|
|
271
266
|
Write-Host ""
|
|
272
|
-
Write-Host "
|
|
273
|
-
|
|
267
|
+
Write-Host "Implementation Steps:" -ForegroundColor Cyan
|
|
268
|
+
foreach ($step in $implSteps) {
|
|
269
|
+
Write-Host " $step" -ForegroundColor Gray
|
|
270
|
+
}
|
|
274
271
|
}
|
|
275
272
|
|
|
276
|
-
|
|
277
|
-
# CODE REVIEW (if not skipped)
|
|
278
|
-
# ============================================================
|
|
279
|
-
if (-not $skipReview) {
|
|
273
|
+
if ($verificationChecks.Count -gt 0) {
|
|
280
274
|
Write-Host ""
|
|
281
|
-
Write-Host "
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
Write-Host " - Code quality and patterns" -ForegroundColor Gray
|
|
275
|
+
Write-Host "Verification Checks:" -ForegroundColor Cyan
|
|
276
|
+
foreach ($check in $verificationChecks) {
|
|
277
|
+
$checkText = $check -replace '^\s*-\s+\[ \]\s*', ''
|
|
278
|
+
Write-Host " - [ ] $checkText" -ForegroundColor Gray
|
|
279
|
+
}
|
|
287
280
|
}
|
|
288
281
|
|
|
289
|
-
#
|
|
290
|
-
# MANUAL CONFIRMATION
|
|
291
|
-
# ============================================================
|
|
282
|
+
# Implementation guidance
|
|
292
283
|
Write-Host ""
|
|
293
|
-
Write-Host "
|
|
294
|
-
Write-Host "After completing $($task.Id), update status?" -ForegroundColor Yellow
|
|
295
|
-
Write-Host "========================================" -ForegroundColor Magenta
|
|
296
|
-
Write-Host ""
|
|
297
|
-
Write-Host "To mark complete, run:" -ForegroundColor Cyan
|
|
298
|
-
Write-Host ' /sdd-task-status ' + $task.Id + ' done' -ForegroundColor Gray
|
|
284
|
+
Write-Host "--- Implementation ---" -ForegroundColor Yellow
|
|
299
285
|
Write-Host ""
|
|
286
|
+
Write-Host "1. Read sdd/SPEC.md (sections: $($specSections -join ', '))" -ForegroundColor White
|
|
287
|
+
Write-Host "2. Implement $($task.Name)" -ForegroundColor White
|
|
288
|
+
Write-Host "3. Verify against checks above" -ForegroundColor White
|
|
300
289
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
290
|
+
if (-not $dryRun) {
|
|
291
|
+
Write-Host ""
|
|
292
|
+
Write-Host "4. Mark task complete:" -ForegroundColor White
|
|
293
|
+
Write-Host " pwsh commands/sdd-task-status.ps1 -TaskId '$($task.Id)' -Status completed" -ForegroundColor Gray
|
|
294
|
+
}
|
|
306
295
|
|
|
307
|
-
Write-Host "
|
|
308
|
-
$completedCount++
|
|
296
|
+
Write-Host ""
|
|
309
297
|
}
|
|
310
298
|
|
|
311
299
|
# ============================================================
|
|
312
|
-
#
|
|
300
|
+
# Summary
|
|
313
301
|
# ============================================================
|
|
314
302
|
Write-Host ""
|
|
315
303
|
Write-Host "========================================" -ForegroundColor Cyan
|
|
316
|
-
Write-Host "
|
|
304
|
+
Write-Host " Ready to implement $($tasksToExecute.Count) task(s)" -ForegroundColor Green
|
|
317
305
|
Write-Host "========================================" -ForegroundColor Cyan
|
|
318
306
|
Write-Host ""
|
|
319
|
-
Write-Host "Tasks completed this session: $completedCount" -ForegroundColor Green
|
|
320
|
-
$completedAfter = $completedBefore + $completedCount
|
|
321
|
-
Write-Host "Total progress: $completedAfter / $totalTasks" -ForegroundColor Gray
|
|
322
307
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
Write-Host "
|
|
308
|
+
if ($executeAll) {
|
|
309
|
+
Write-Host "To execute all:" -ForegroundColor White
|
|
310
|
+
Write-Host " Run this command for each task in order" -ForegroundColor Gray
|
|
326
311
|
Write-Host ""
|
|
327
|
-
|
|
312
|
+
$cmdList = $tasksToExecute | ForEach-Object { "claude `"/sdd-cook --task $($_.Id)`"" }
|
|
313
|
+
Write-Host ($cmdList -join "`n") -ForegroundColor Gray
|
|
328
314
|
} else {
|
|
329
|
-
Write-Host ""
|
|
330
|
-
Write-Host "
|
|
331
|
-
Write-Host ""
|
|
332
|
-
Write-Host "Next: /sdd-converge to validate implementation" -ForegroundColor Cyan
|
|
315
|
+
Write-Host "Next: Implement task, then mark complete" -ForegroundColor White
|
|
316
|
+
Write-Host "After: claude `"/sdd-cook --all`" for remaining tasks" -ForegroundColor Gray
|
|
333
317
|
}
|
|
334
|
-
|
|
335
|
-
Write-Host ""
|