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.
@@ -1,183 +1,205 @@
1
1
  ---
2
2
  # SDD Cook — Phase 4 Implementation
3
- # Executes tasks from MASTER-TASKS.md sequentially
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 — Execute tasks from MASTER-TASKS.md sequentially. Args: [--all | --task T-XXX | --no-test | --no-review]. Validates dependencies, runs testing + code-review, updates task status.
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 = 'Stop'
10
+ $ErrorActionPreference = 'Continue'
12
11
 
13
12
  # ============================================================
14
- # SDD Cook — Phase 4 Implementation
13
+ # SDD Cook — Unified Phase 4 Command
15
14
  # ============================================================
16
- # Reads MASTER-TASKS.md, executes tasks sequentially,
17
- # validates with subagents, updates task status
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 "--no-test") {
34
- $skipTest = $true
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
- # STEP 1: Prerequisites Check
39
+ # Prerequisites Check
42
40
  # ============================================================
43
41
  Write-Host ""
44
- Write-Host "=== SDD Cook — Phase 4 Implementation ===" -ForegroundColor Cyan
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
- # Check for task directory
48
- $taskDirs = Get-ChildItem -Filter "task-*-*" -Directory -ErrorAction SilentlyContinue
49
- if (-not $taskDirs) {
50
- Write-Host "[ERROR] No task directory found (task-*-*/)." -ForegroundColor Red
51
- Write-Host "Run: /sdd-tasks to generate tasks first." -ForegroundColor Yellow
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
- $taskDir = $taskDirs[0].FullName
56
- $taskDirName = $taskDirs[0].Name
71
+ $taskDirName = Split-Path $taskDir -Leaf
57
72
 
58
- # Check MASTER-TASKS.md exists
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: $masterTasksPath" -ForegroundColor Red
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
- # Check SPEC.md exists
67
- if (-not (Test-Path "SPEC.md")) {
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 to generate SPEC.md first." -ForegroundColor Yellow
83
+ Write-Host "Run: claude `"/sdd-spec`" first." -ForegroundColor Yellow
70
84
  exit 1
71
85
  }
72
86
 
73
- Write-Host "[OK] Prerequisites verified:" -ForegroundColor Green
74
- Write-Host " - Task directory: $taskDirName" -ForegroundColor Gray
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
- # STEP 2: Read MASTER-TASKS.md
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
- $task = @{
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 in MASTER-TASKS.md" -ForegroundColor Red
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
- $statusIcon = if ($t.Status -eq "x") { "[V]" } else { "[ ]" }
110
- $color = if ($t.Status -eq "x") { "Green" } else { "Gray" }
111
- Write-Host " $statusIcon $($t.Id): $($t.Name) ($($t.Estimate))" -ForegroundColor $color
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
- # STEP 3: Find tasks to execute
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
- # Execute specific task
123
- $specific = $pendingTasks | Where-Object { $_.Id -eq $targetTask }
124
- if ($specific) {
125
- $tasksToExecute += $specific
126
- Write-Host "Executing specific task: $targetTask" -ForegroundColor Cyan
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
- $found = $tasks | Where-Object { $_.Id -eq $targetTask }
129
- if ($found) {
130
- Write-Host "[WARN] Task $targetTask is already complete." -ForegroundColor Yellow
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
- # Execute all pending in order
158
+ # All pending
138
159
  $tasksToExecute = $pendingTasks
139
- Write-Host "Executing all pending tasks ($($tasksToExecute.Count) tasks)..." -ForegroundColor Cyan
160
+ Write-Host "Mode: all - $($tasksToExecute.Count) tasks" -ForegroundColor Cyan
140
161
  } else {
141
- # Default: execute first pending task
162
+ # Interactive - next pending task
142
163
  if ($pendingTasks.Count -gt 0) {
143
164
  $tasksToExecute += $pendingTasks[0]
144
- Write-Host "Executing next pending task: $($pendingTasks[0].Id)" -ForegroundColor Cyan
165
+ Write-Host "Mode: next pending task" -ForegroundColor Cyan
145
166
  } else {
146
- Write-Host "[INFO] All tasks are complete!" -ForegroundColor Green
167
+ Write-Host "[INFO] All tasks complete!" -ForegroundColor Green
147
168
  Write-Host ""
148
- Write-Host "Next: /sdd-converge to validate implementation" -ForegroundColor Cyan
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
- $completedCount = 0
161
- $totalTasks = $tasks.Count
162
- $completedBefore = ($tasks | Where-Object { $_.Status -eq "x" }).Count
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 "Executing: $($task.Id) - $($task.Name)" -ForegroundColor Magenta
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
- # Check dependencies
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/Create\s*\n((?:- .+\n)+)') {
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 implementation steps
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 checks
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
- Write-Host ""
234
- Write-Host "Task Details:" -ForegroundColor Cyan
235
- Write-Host " Files: $($filesToModify -join ', ')" -ForegroundColor Gray
236
- Write-Host " Verification checks: $($verificationChecks.Count)" -ForegroundColor Gray
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 "[HINT] Files to modify:" -ForegroundColor Cyan
251
- foreach ($f in $filesToModify) {
252
- Write-Host " - $f" -ForegroundColor Gray
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
- Write-Host ""
255
- Write-Host "[HINT] Implementation steps:" -ForegroundColor Cyan
256
- foreach ($step in $implSteps) {
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 "--- Testing ---" -ForegroundColor Yellow
266
- Write-Host "Verification checks:" -ForegroundColor Cyan
267
- foreach ($check in $verificationChecks) {
268
- $checkText = $check -replace '^\s*-\s+\[ \]\s*', ''
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 "[HINT] Run tests and verify each check." -ForegroundColor Cyan
273
- Write-Host "Mark checks complete after verification." -ForegroundColor Gray
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 "--- Code Review ---" -ForegroundColor Yellow
282
- Write-Host "[HINT] After implementation, run: /ck:code-review" -ForegroundColor Cyan
283
- Write-Host "[HINT] Verify:" -ForegroundColor Cyan
284
- Write-Host " - Spec compliance (SPEC.md requirements met)" -ForegroundColor Gray
285
- Write-Host " - No regression in touched files" -ForegroundColor Gray
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 "========================================" -ForegroundColor Magenta
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
- # Update MASTER-TASKS.md
302
- $masterContent = Get-Content $masterTasksPath -Raw
303
- $newStatus = "[x]"
304
- $updatedContent = $masterContent -replace "(`|$([regex]::Escape($task.Id))`|\s)\[([ `])\](?=\s*\|)", "`$1[x]"
305
- Set-Content $masterTasksPath $updatedContent -Encoding UTF8
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 "[OK] Status updated in MASTER-TASKS.md" -ForegroundColor Green
308
- $completedCount++
296
+ Write-Host ""
309
297
  }
310
298
 
311
299
  # ============================================================
312
- # STEP 5: Summary
300
+ # Summary
313
301
  # ============================================================
314
302
  Write-Host ""
315
303
  Write-Host "========================================" -ForegroundColor Cyan
316
- Write-Host "SDD Cook Execution Complete" -ForegroundColor Cyan
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
- $remaining = $totalTasks - $completedAfter
324
- if ($remaining -gt 0) {
325
- Write-Host "Remaining: $remaining tasks" -ForegroundColor Yellow
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
- Write-Host "Next: /sdd-cook --all to continue" -ForegroundColor Cyan
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 "[V] All tasks complete!" -ForegroundColor Green
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 ""