@leeovery/claude-technical-workflows 2.1.24 → 2.1.26
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/agents/review-task-verifier.md +22 -10
- package/package.json +1 -1
- package/skills/link-dependencies/SKILL.md +60 -33
- package/skills/start-discussion/references/display-options.md +44 -15
- package/skills/start-discussion/references/gather-context-continue.md +2 -0
- package/skills/start-discussion/references/gather-context-fresh.md +6 -0
- package/skills/start-discussion/references/gather-context-research.md +2 -2
- package/skills/start-implementation/SKILL.md +114 -47
- package/skills/start-planning/SKILL.md +19 -133
- package/skills/start-planning/references/cross-cutting-context.md +50 -0
- package/skills/start-planning/references/display-state.md +109 -0
- package/skills/start-planning/references/invoke-skill.md +29 -0
- package/skills/start-research/references/gather-context.md +4 -4
- package/skills/start-review/SKILL.md +14 -123
- package/skills/start-review/references/display-plans.md +103 -0
- package/skills/start-review/references/invoke-skill.md +32 -0
- package/skills/start-review/references/select-plans.md +41 -0
- package/skills/start-specification/references/analysis-flow.md +2 -0
- package/skills/start-specification/references/confirm-continue.md +21 -1
- package/skills/start-specification/references/confirm-create.md +15 -1
- package/skills/start-specification/references/confirm-refine.md +9 -1
- package/skills/start-specification/references/confirm-unify.md +12 -0
- package/skills/start-specification/references/display-analyze.md +21 -2
- package/skills/start-specification/references/display-blocks.md +11 -6
- package/skills/start-specification/references/display-groupings.md +20 -13
- package/skills/start-specification/references/display-single-grouped.md +13 -6
- package/skills/start-specification/references/display-single-has-spec.md +15 -7
- package/skills/start-specification/references/display-single-no-spec.md +13 -9
- package/skills/start-specification/references/display-single.md +0 -2
- package/skills/start-specification/references/display-specs-menu.md +21 -6
- package/skills/status/SKILL.md +155 -38
- package/skills/status/scripts/discovery.sh +420 -0
- package/skills/technical-implementation/SKILL.md +14 -6
- package/skills/technical-implementation/references/steps/analysis-loop.md +12 -6
- package/skills/technical-implementation/references/steps/task-loop.md +12 -6
- package/skills/technical-planning/SKILL.md +8 -4
- package/skills/technical-planning/references/steps/analyze-task-graph.md +8 -4
- package/skills/technical-planning/references/steps/author-tasks.md +4 -2
- package/skills/technical-planning/references/steps/define-phases.md +4 -2
- package/skills/technical-planning/references/steps/define-tasks.md +4 -2
- package/skills/technical-planning/references/steps/plan-construction.md +4 -2
- package/skills/technical-planning/references/steps/resolve-dependencies.md +4 -2
- package/skills/technical-planning/references/steps/review-integrity.md +4 -2
- package/skills/technical-planning/references/steps/review-traceability.md +4 -2
- package/skills/technical-research/SKILL.md +4 -2
- package/skills/technical-review/references/invoke-task-verifiers.md +37 -47
- package/skills/technical-specification/references/specification-guide.md +11 -3
- package/skills/view-plan/SKILL.md +3 -1
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Discovers the full workflow state across all phases
|
|
4
|
+
# for the /status command.
|
|
5
|
+
#
|
|
6
|
+
# Outputs structured YAML that the command can consume directly.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
set -eo pipefail
|
|
10
|
+
|
|
11
|
+
RESEARCH_DIR="docs/workflow/research"
|
|
12
|
+
DISCUSSION_DIR="docs/workflow/discussion"
|
|
13
|
+
SPEC_DIR="docs/workflow/specification"
|
|
14
|
+
PLAN_DIR="docs/workflow/planning"
|
|
15
|
+
IMPL_DIR="docs/workflow/implementation"
|
|
16
|
+
|
|
17
|
+
# Helper: Extract a frontmatter field value from a file
|
|
18
|
+
# Usage: extract_field <file> <field_name>
|
|
19
|
+
extract_field() {
|
|
20
|
+
local file="$1"
|
|
21
|
+
local field="$2"
|
|
22
|
+
local value=""
|
|
23
|
+
|
|
24
|
+
if head -1 "$file" 2>/dev/null | grep -q "^---$"; then
|
|
25
|
+
value=$(sed -n '2,/^---$/p' "$file" 2>/dev/null | \
|
|
26
|
+
grep -i -m1 "^${field}:" | \
|
|
27
|
+
sed -E "s/^${field}:[[:space:]]*//i" || true)
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
echo "$value"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# Helper: Extract frontmatter content (between first pair of --- delimiters)
|
|
34
|
+
extract_frontmatter() {
|
|
35
|
+
local file="$1"
|
|
36
|
+
awk 'BEGIN{c=0} /^---$/{c++; if(c==2) exit; next} c==1{print}' "$file" 2>/dev/null
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Helper: Extract sources from specification frontmatter
|
|
40
|
+
# Outputs: name|status per line (object format only; legacy converted by migration 004)
|
|
41
|
+
extract_sources() {
|
|
42
|
+
local file="$1"
|
|
43
|
+
local in_sources=false
|
|
44
|
+
local current_name=""
|
|
45
|
+
local current_status=""
|
|
46
|
+
|
|
47
|
+
while IFS= read -r line; do
|
|
48
|
+
if [[ "$line" =~ ^sources: ]]; then
|
|
49
|
+
in_sources=true
|
|
50
|
+
continue
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
if $in_sources && [[ "$line" =~ ^[a-z_]+: ]] && [[ ! "$line" =~ ^[[:space:]] ]]; then
|
|
54
|
+
if [ -n "$current_name" ]; then
|
|
55
|
+
echo "${current_name}|${current_status:-incorporated}"
|
|
56
|
+
fi
|
|
57
|
+
break
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if $in_sources; then
|
|
61
|
+
if [[ "$line" =~ ^[[:space:]]*-[[:space:]]*name:[[:space:]]*(.+)$ ]]; then
|
|
62
|
+
if [ -n "$current_name" ]; then
|
|
63
|
+
echo "${current_name}|${current_status:-incorporated}"
|
|
64
|
+
fi
|
|
65
|
+
current_name="${BASH_REMATCH[1]}"
|
|
66
|
+
current_name=$(echo "$current_name" | sed 's/^"//' | sed 's/"$//' | xargs)
|
|
67
|
+
current_status=""
|
|
68
|
+
elif [[ "$line" =~ ^[[:space:]]*status:[[:space:]]*(.+)$ ]]; then
|
|
69
|
+
current_status="${BASH_REMATCH[1]}"
|
|
70
|
+
current_status=$(echo "$current_status" | sed 's/^"//' | sed 's/"$//' | xargs)
|
|
71
|
+
fi
|
|
72
|
+
fi
|
|
73
|
+
done < <(extract_frontmatter "$file")
|
|
74
|
+
|
|
75
|
+
if [ -n "$current_name" ]; then
|
|
76
|
+
echo "${current_name}|${current_status:-incorporated}"
|
|
77
|
+
fi
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# Helper: Extract external_dependencies from plan frontmatter
|
|
81
|
+
# Outputs: topic|state|task_id per line
|
|
82
|
+
extract_external_deps() {
|
|
83
|
+
local file="$1"
|
|
84
|
+
local frontmatter
|
|
85
|
+
frontmatter=$(extract_frontmatter "$file")
|
|
86
|
+
|
|
87
|
+
if ! echo "$frontmatter" | grep -q "^external_dependencies:" 2>/dev/null; then
|
|
88
|
+
return 0
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
if echo "$frontmatter" | grep -q "^external_dependencies:[[:space:]]*\[\]" 2>/dev/null; then
|
|
92
|
+
return 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
echo "$frontmatter" | awk '
|
|
96
|
+
/^external_dependencies:/ { in_block=1; next }
|
|
97
|
+
in_block && /^[a-z_]+:/ && !/^[[:space:]]/ { exit }
|
|
98
|
+
in_block && /^[[:space:]]*- topic:/ {
|
|
99
|
+
if (topic != "") print topic "|" state "|" task_id
|
|
100
|
+
line=$0; gsub(/^[[:space:]]*- topic:[[:space:]]*/, "", line)
|
|
101
|
+
topic=line; state=""; task_id=""
|
|
102
|
+
next
|
|
103
|
+
}
|
|
104
|
+
in_block && /^[[:space:]]*state:/ {
|
|
105
|
+
line=$0; gsub(/^[[:space:]]*state:[[:space:]]*/, "", line)
|
|
106
|
+
state=line; next
|
|
107
|
+
}
|
|
108
|
+
in_block && /^[[:space:]]*task_id:/ {
|
|
109
|
+
line=$0; gsub(/^[[:space:]]*task_id:[[:space:]]*/, "", line)
|
|
110
|
+
task_id=line; next
|
|
111
|
+
}
|
|
112
|
+
END { if (topic != "") print topic "|" state "|" task_id }
|
|
113
|
+
'
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# Helper: Count completed tasks from implementation tracking
|
|
117
|
+
count_completed_tasks() {
|
|
118
|
+
local file="$1"
|
|
119
|
+
local frontmatter
|
|
120
|
+
frontmatter=$(extract_frontmatter "$file")
|
|
121
|
+
|
|
122
|
+
if echo "$frontmatter" | grep -q "^completed_tasks:[[:space:]]*\[\]" 2>/dev/null; then
|
|
123
|
+
echo 0
|
|
124
|
+
return
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
local count
|
|
128
|
+
count=$(echo "$frontmatter" | awk '
|
|
129
|
+
/^completed_tasks:/ { in_block=1; next }
|
|
130
|
+
in_block && /^[a-z_]+:/ { exit }
|
|
131
|
+
in_block && /^[[:space:]]*-[[:space:]]/ { c++ }
|
|
132
|
+
END { print c+0 }
|
|
133
|
+
')
|
|
134
|
+
echo "$count"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# Helper: Count completed phases from implementation tracking
|
|
138
|
+
count_completed_phases() {
|
|
139
|
+
local file="$1"
|
|
140
|
+
local frontmatter
|
|
141
|
+
frontmatter=$(extract_frontmatter "$file")
|
|
142
|
+
|
|
143
|
+
# Handle inline array format: [1, 2, 3]
|
|
144
|
+
local inline
|
|
145
|
+
inline=$(echo "$frontmatter" | grep "^completed_phases:" | sed 's/^completed_phases:[[:space:]]*//' || true)
|
|
146
|
+
if echo "$inline" | grep -q '^\['; then
|
|
147
|
+
local items
|
|
148
|
+
items=$(echo "$inline" | tr -d '[]' | tr ',' '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$')
|
|
149
|
+
if [ -n "$items" ]; then
|
|
150
|
+
echo "$items" | wc -l | tr -d ' '
|
|
151
|
+
else
|
|
152
|
+
echo 0
|
|
153
|
+
fi
|
|
154
|
+
return
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
if echo "$frontmatter" | grep -q "^completed_phases:[[:space:]]*\[\]" 2>/dev/null; then
|
|
158
|
+
echo 0
|
|
159
|
+
return
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
local count
|
|
163
|
+
count=$(echo "$frontmatter" | awk '
|
|
164
|
+
/^completed_phases:/ { in_block=1; next }
|
|
165
|
+
in_block && /^[a-z_]+:/ { exit }
|
|
166
|
+
in_block && /^[[:space:]]*-[[:space:]]/ { c++ }
|
|
167
|
+
END { print c+0 }
|
|
168
|
+
')
|
|
169
|
+
echo "$count"
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# Start YAML output
|
|
174
|
+
echo "# Workflow Status Discovery"
|
|
175
|
+
echo "# Generated: $(date -Iseconds)"
|
|
176
|
+
echo ""
|
|
177
|
+
|
|
178
|
+
#
|
|
179
|
+
# RESEARCH
|
|
180
|
+
#
|
|
181
|
+
echo "research:"
|
|
182
|
+
|
|
183
|
+
research_count=0
|
|
184
|
+
if [ -d "$RESEARCH_DIR" ] && [ -n "$(ls -A "$RESEARCH_DIR" 2>/dev/null)" ]; then
|
|
185
|
+
echo " exists: true"
|
|
186
|
+
echo " files:"
|
|
187
|
+
for file in "$RESEARCH_DIR"/*; do
|
|
188
|
+
[ -f "$file" ] || continue
|
|
189
|
+
name=$(basename "$file" .md)
|
|
190
|
+
echo " - \"$name\""
|
|
191
|
+
research_count=$((research_count + 1))
|
|
192
|
+
done
|
|
193
|
+
echo " count: $research_count"
|
|
194
|
+
else
|
|
195
|
+
echo " exists: false"
|
|
196
|
+
echo " files: []"
|
|
197
|
+
echo " count: 0"
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
echo ""
|
|
201
|
+
|
|
202
|
+
#
|
|
203
|
+
# DISCUSSIONS
|
|
204
|
+
#
|
|
205
|
+
echo "discussions:"
|
|
206
|
+
|
|
207
|
+
disc_count=0
|
|
208
|
+
disc_concluded=0
|
|
209
|
+
disc_in_progress=0
|
|
210
|
+
|
|
211
|
+
if [ -d "$DISCUSSION_DIR" ] && [ -n "$(ls -A "$DISCUSSION_DIR" 2>/dev/null)" ]; then
|
|
212
|
+
echo " exists: true"
|
|
213
|
+
echo " files:"
|
|
214
|
+
for file in "$DISCUSSION_DIR"/*.md; do
|
|
215
|
+
[ -f "$file" ] || continue
|
|
216
|
+
name=$(basename "$file" .md)
|
|
217
|
+
status=$(extract_field "$file" "status")
|
|
218
|
+
status=${status:-"unknown"}
|
|
219
|
+
|
|
220
|
+
echo " - name: \"$name\""
|
|
221
|
+
echo " status: \"$status\""
|
|
222
|
+
|
|
223
|
+
disc_count=$((disc_count + 1))
|
|
224
|
+
[ "$status" = "concluded" ] && disc_concluded=$((disc_concluded + 1))
|
|
225
|
+
[ "$status" = "in-progress" ] && disc_in_progress=$((disc_in_progress + 1))
|
|
226
|
+
done
|
|
227
|
+
echo " count: $disc_count"
|
|
228
|
+
echo " concluded: $disc_concluded"
|
|
229
|
+
echo " in_progress: $disc_in_progress"
|
|
230
|
+
else
|
|
231
|
+
echo " exists: false"
|
|
232
|
+
echo " files: []"
|
|
233
|
+
echo " count: 0"
|
|
234
|
+
echo " concluded: 0"
|
|
235
|
+
echo " in_progress: 0"
|
|
236
|
+
fi
|
|
237
|
+
|
|
238
|
+
echo ""
|
|
239
|
+
|
|
240
|
+
#
|
|
241
|
+
# SPECIFICATIONS
|
|
242
|
+
#
|
|
243
|
+
echo "specifications:"
|
|
244
|
+
|
|
245
|
+
spec_count=0
|
|
246
|
+
spec_active=0
|
|
247
|
+
spec_superseded=0
|
|
248
|
+
spec_feature=0
|
|
249
|
+
spec_crosscutting=0
|
|
250
|
+
|
|
251
|
+
if [ -d "$SPEC_DIR" ] && [ -n "$(ls -A "$SPEC_DIR" 2>/dev/null)" ]; then
|
|
252
|
+
echo " exists: true"
|
|
253
|
+
echo " files:"
|
|
254
|
+
for file in "$SPEC_DIR"/*.md; do
|
|
255
|
+
[ -f "$file" ] || continue
|
|
256
|
+
name=$(basename "$file" .md)
|
|
257
|
+
status=$(extract_field "$file" "status")
|
|
258
|
+
status=${status:-"in-progress"}
|
|
259
|
+
spec_type=$(extract_field "$file" "type")
|
|
260
|
+
spec_type=${spec_type:-"feature"}
|
|
261
|
+
superseded_by=$(extract_field "$file" "superseded_by")
|
|
262
|
+
|
|
263
|
+
echo " - name: \"$name\""
|
|
264
|
+
echo " status: \"$status\""
|
|
265
|
+
echo " type: \"$spec_type\""
|
|
266
|
+
[ -n "$superseded_by" ] && echo " superseded_by: \"$superseded_by\""
|
|
267
|
+
|
|
268
|
+
# Sources
|
|
269
|
+
sources_output=$(extract_sources "$file")
|
|
270
|
+
if [ -n "$sources_output" ]; then
|
|
271
|
+
echo " sources:"
|
|
272
|
+
while IFS='|' read -r src_name src_status; do
|
|
273
|
+
[ -z "$src_name" ] && continue
|
|
274
|
+
echo " - name: \"$src_name\""
|
|
275
|
+
echo " status: \"$src_status\""
|
|
276
|
+
done <<< "$sources_output"
|
|
277
|
+
else
|
|
278
|
+
echo " sources: []"
|
|
279
|
+
fi
|
|
280
|
+
|
|
281
|
+
spec_count=$((spec_count + 1))
|
|
282
|
+
if [ "$status" = "superseded" ]; then
|
|
283
|
+
spec_superseded=$((spec_superseded + 1))
|
|
284
|
+
else
|
|
285
|
+
spec_active=$((spec_active + 1))
|
|
286
|
+
[ "$spec_type" = "cross-cutting" ] && spec_crosscutting=$((spec_crosscutting + 1))
|
|
287
|
+
[ "$spec_type" != "cross-cutting" ] && spec_feature=$((spec_feature + 1))
|
|
288
|
+
fi
|
|
289
|
+
done
|
|
290
|
+
echo " count: $spec_count"
|
|
291
|
+
echo " active: $spec_active"
|
|
292
|
+
echo " superseded: $spec_superseded"
|
|
293
|
+
echo " feature: $spec_feature"
|
|
294
|
+
echo " crosscutting: $spec_crosscutting"
|
|
295
|
+
else
|
|
296
|
+
echo " exists: false"
|
|
297
|
+
echo " files: []"
|
|
298
|
+
echo " count: 0"
|
|
299
|
+
echo " active: 0"
|
|
300
|
+
echo " superseded: 0"
|
|
301
|
+
echo " feature: 0"
|
|
302
|
+
echo " crosscutting: 0"
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
echo ""
|
|
306
|
+
|
|
307
|
+
#
|
|
308
|
+
# PLANS
|
|
309
|
+
#
|
|
310
|
+
echo "plans:"
|
|
311
|
+
|
|
312
|
+
plan_count=0
|
|
313
|
+
plan_concluded=0
|
|
314
|
+
plan_in_progress=0
|
|
315
|
+
|
|
316
|
+
if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
317
|
+
echo " exists: true"
|
|
318
|
+
echo " files:"
|
|
319
|
+
for file in "$PLAN_DIR"/*.md; do
|
|
320
|
+
[ -f "$file" ] || continue
|
|
321
|
+
name=$(basename "$file" .md)
|
|
322
|
+
status=$(extract_field "$file" "status")
|
|
323
|
+
status=${status:-"unknown"}
|
|
324
|
+
format=$(extract_field "$file" "format")
|
|
325
|
+
format=${format:-"unknown"}
|
|
326
|
+
specification=$(extract_field "$file" "specification")
|
|
327
|
+
specification=${specification:-"${name}.md"}
|
|
328
|
+
|
|
329
|
+
echo " - name: \"$name\""
|
|
330
|
+
echo " status: \"$status\""
|
|
331
|
+
echo " format: \"$format\""
|
|
332
|
+
echo " specification: \"$specification\""
|
|
333
|
+
|
|
334
|
+
# External dependencies
|
|
335
|
+
deps_output=$(extract_external_deps "$file")
|
|
336
|
+
has_unresolved="false"
|
|
337
|
+
if [ -n "$deps_output" ]; then
|
|
338
|
+
echo " external_deps:"
|
|
339
|
+
while IFS='|' read -r dep_topic dep_state dep_task_id; do
|
|
340
|
+
[ -z "$dep_topic" ] && continue
|
|
341
|
+
echo " - topic: \"$dep_topic\""
|
|
342
|
+
echo " state: \"$dep_state\""
|
|
343
|
+
[ -n "$dep_task_id" ] && echo " task_id: \"$dep_task_id\""
|
|
344
|
+
[ "$dep_state" = "unresolved" ] && has_unresolved="true"
|
|
345
|
+
done <<< "$deps_output"
|
|
346
|
+
else
|
|
347
|
+
echo " external_deps: []"
|
|
348
|
+
fi
|
|
349
|
+
echo " has_unresolved_deps: $has_unresolved"
|
|
350
|
+
|
|
351
|
+
plan_count=$((plan_count + 1))
|
|
352
|
+
[ "$status" = "concluded" ] && plan_concluded=$((plan_concluded + 1))
|
|
353
|
+
{ [ "$status" = "planning" ] || [ "$status" = "in-progress" ]; } && plan_in_progress=$((plan_in_progress + 1))
|
|
354
|
+
done
|
|
355
|
+
echo " count: $plan_count"
|
|
356
|
+
echo " concluded: $plan_concluded"
|
|
357
|
+
echo " in_progress: $plan_in_progress"
|
|
358
|
+
else
|
|
359
|
+
echo " exists: false"
|
|
360
|
+
echo " files: []"
|
|
361
|
+
echo " count: 0"
|
|
362
|
+
echo " concluded: 0"
|
|
363
|
+
echo " in_progress: 0"
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
echo ""
|
|
367
|
+
|
|
368
|
+
#
|
|
369
|
+
# IMPLEMENTATION
|
|
370
|
+
#
|
|
371
|
+
echo "implementation:"
|
|
372
|
+
|
|
373
|
+
impl_count=0
|
|
374
|
+
impl_completed=0
|
|
375
|
+
impl_in_progress=0
|
|
376
|
+
|
|
377
|
+
if [ -d "$IMPL_DIR" ] && [ -n "$(ls -A "$IMPL_DIR" 2>/dev/null)" ]; then
|
|
378
|
+
echo " exists: true"
|
|
379
|
+
echo " files:"
|
|
380
|
+
for file in "$IMPL_DIR"/*/tracking.md; do
|
|
381
|
+
[ -f "$file" ] || continue
|
|
382
|
+
topic=$(basename "$(dirname "$file")")
|
|
383
|
+
status=$(extract_field "$file" "status")
|
|
384
|
+
status=${status:-"unknown"}
|
|
385
|
+
current_phase=$(extract_field "$file" "current_phase")
|
|
386
|
+
|
|
387
|
+
completed_tasks=$(count_completed_tasks "$file")
|
|
388
|
+
completed_phases=$(count_completed_phases "$file")
|
|
389
|
+
|
|
390
|
+
# Count total tasks from plan directory (local-markdown format)
|
|
391
|
+
total_tasks=0
|
|
392
|
+
plan_file="$PLAN_DIR/${topic}.md"
|
|
393
|
+
if [ -f "$plan_file" ]; then
|
|
394
|
+
plan_format=$(extract_field "$plan_file" "format")
|
|
395
|
+
if [ "$plan_format" = "local-markdown" ] && [ -d "$PLAN_DIR/${topic}" ]; then
|
|
396
|
+
total_tasks=$(ls -1 "$PLAN_DIR/${topic}/"*.md 2>/dev/null | wc -l | tr -d ' ')
|
|
397
|
+
fi
|
|
398
|
+
fi
|
|
399
|
+
|
|
400
|
+
echo " - topic: \"$topic\""
|
|
401
|
+
echo " status: \"$status\""
|
|
402
|
+
[ -n "$current_phase" ] && [ "$current_phase" != "~" ] && echo " current_phase: $current_phase"
|
|
403
|
+
echo " completed_tasks: $completed_tasks"
|
|
404
|
+
echo " completed_phases: $completed_phases"
|
|
405
|
+
echo " total_tasks: $total_tasks"
|
|
406
|
+
|
|
407
|
+
impl_count=$((impl_count + 1))
|
|
408
|
+
[ "$status" = "completed" ] && impl_completed=$((impl_completed + 1))
|
|
409
|
+
[ "$status" = "in-progress" ] && impl_in_progress=$((impl_in_progress + 1))
|
|
410
|
+
done
|
|
411
|
+
echo " count: $impl_count"
|
|
412
|
+
echo " completed: $impl_completed"
|
|
413
|
+
echo " in_progress: $impl_in_progress"
|
|
414
|
+
else
|
|
415
|
+
echo " exists: false"
|
|
416
|
+
echo " files: []"
|
|
417
|
+
echo " count: 0"
|
|
418
|
+
echo " completed: 0"
|
|
419
|
+
echo " in_progress: 0"
|
|
420
|
+
fi
|
|
@@ -166,6 +166,9 @@ Commit: `impl({topic}): start implementation`
|
|
|
166
166
|
|
|
167
167
|
Present the existing configuration for confirmation:
|
|
168
168
|
|
|
169
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
170
|
+
|
|
171
|
+
```
|
|
169
172
|
Previous session used these project skills:
|
|
170
173
|
- `{skill-name}` — {path}
|
|
171
174
|
- ...
|
|
@@ -174,8 +177,7 @@ Previous session used these project skills:
|
|
|
174
177
|
- **`y`/`yes`** — Keep these, proceed
|
|
175
178
|
- **`c`/`change`** — Re-discover and choose skills
|
|
176
179
|
· · · · · · · · · · · ·
|
|
177
|
-
|
|
178
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
180
|
+
```
|
|
179
181
|
|
|
180
182
|
**STOP.** Wait for user choice.
|
|
181
183
|
|
|
@@ -184,6 +186,8 @@ Previous session used these project skills:
|
|
|
184
186
|
|
|
185
187
|
#### If `.claude/skills/` does not exist or is empty
|
|
186
188
|
|
|
189
|
+
> *Output the next fenced block as a code block:*
|
|
190
|
+
|
|
187
191
|
```
|
|
188
192
|
No project skills found. Proceeding without project-specific conventions.
|
|
189
193
|
```
|
|
@@ -194,6 +198,9 @@ No project skills found. Proceeding without project-specific conventions.
|
|
|
194
198
|
|
|
195
199
|
Scan `.claude/skills/` for project-specific skill directories. Present findings:
|
|
196
200
|
|
|
201
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
202
|
+
|
|
203
|
+
```
|
|
197
204
|
Found these project skills that may be relevant to implementation:
|
|
198
205
|
- `{skill-name}` — {brief description}
|
|
199
206
|
- `{skill-name}` — {brief description}
|
|
@@ -204,8 +211,7 @@ Found these project skills that may be relevant to implementation:
|
|
|
204
211
|
- **`n`/`none`** — Skip project skills
|
|
205
212
|
- **Or list the ones you want** — e.g. "golang-pro, react-patterns"
|
|
206
213
|
· · · · · · · · · · · ·
|
|
207
|
-
|
|
208
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
214
|
+
```
|
|
209
215
|
|
|
210
216
|
**STOP.** Wait for user to confirm which skills are relevant.
|
|
211
217
|
|
|
@@ -223,6 +229,9 @@ If `linters` is already populated in the tracking file, present the existing con
|
|
|
223
229
|
|
|
224
230
|
Otherwise, present discovery findings to the user:
|
|
225
231
|
|
|
232
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
233
|
+
|
|
234
|
+
```
|
|
226
235
|
**Linter discovery:**
|
|
227
236
|
- {tool} — `{command}` (installed / not installed)
|
|
228
237
|
- ...
|
|
@@ -234,8 +243,7 @@ Recommendations: {any suggested tools with install commands}
|
|
|
234
243
|
- **`c`/`change`** — Modify the linter list
|
|
235
244
|
- **`s`/`skip`** — Skip linter setup (no linting during TDD)
|
|
236
245
|
· · · · · · · · · · · ·
|
|
237
|
-
|
|
238
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
246
|
+
```
|
|
239
247
|
|
|
240
248
|
**STOP.** Wait for user choice.
|
|
241
249
|
|
|
@@ -32,12 +32,14 @@ If `analysis_cycle > 3`:
|
|
|
32
32
|
|
|
33
33
|
Analysis has run {N-1} times so far. You can continue (recommended if issues were still found last cycle) or skip to completion.
|
|
34
34
|
|
|
35
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
36
|
+
|
|
37
|
+
```
|
|
35
38
|
· · · · · · · · · · · ·
|
|
36
39
|
- **`p`/`proceed`** — Continue analysis *(default)*
|
|
37
40
|
- **`s`/`skip`** — Skip analysis, proceed to completion
|
|
38
41
|
· · · · · · · · · · · ·
|
|
39
|
-
|
|
40
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
42
|
+
```
|
|
41
43
|
|
|
42
44
|
**STOP.** Wait for user choice. You MUST NOT choose on the user's behalf.
|
|
43
45
|
|
|
@@ -61,13 +63,15 @@ If there are unstaged changes or untracked files, categorize them:
|
|
|
61
63
|
- `{file}` ({status: modified/untracked})
|
|
62
64
|
- ...
|
|
63
65
|
|
|
66
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
67
|
+
|
|
68
|
+
```
|
|
64
69
|
· · · · · · · · · · · ·
|
|
65
70
|
- **`y`/`yes`** — Include all in the checkpoint commit
|
|
66
71
|
- **`s`/`skip`** — Exclude unexpected files, commit only implementation files
|
|
67
72
|
- **Comment** — Specify which to include
|
|
68
73
|
· · · · · · · · · · · ·
|
|
69
|
-
|
|
70
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
74
|
+
```
|
|
71
75
|
|
|
72
76
|
**STOP.** Wait for user choice.
|
|
73
77
|
|
|
@@ -145,13 +149,15 @@ Sources: {sources}
|
|
|
145
149
|
**Tests**:
|
|
146
150
|
{tests}
|
|
147
151
|
|
|
152
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
153
|
+
|
|
154
|
+
```
|
|
148
155
|
· · · · · · · · · · · ·
|
|
149
156
|
- **`a`/`approve`** — Approve this task
|
|
150
157
|
- **`s`/`skip`** — Skip this task
|
|
151
158
|
- **Comment** — Revise based on feedback
|
|
152
159
|
· · · · · · · · · · · ·
|
|
153
|
-
|
|
154
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
160
|
+
```
|
|
155
161
|
|
|
156
162
|
**STOP.** Wait for user input.
|
|
157
163
|
|
|
@@ -44,13 +44,15 @@ Present the executor's ISSUES to the user:
|
|
|
44
44
|
|
|
45
45
|
{executor's ISSUES content}
|
|
46
46
|
|
|
47
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
48
|
+
|
|
49
|
+
```
|
|
47
50
|
· · · · · · · · · · · ·
|
|
48
51
|
- **`r`/`retry`** — Re-invoke the executor with your comments (provide below)
|
|
49
52
|
- **`s`/`skip`** — Skip this task and move to the next
|
|
50
53
|
- **`t`/`stop`** — Stop implementation entirely
|
|
51
54
|
· · · · · · · · · · · ·
|
|
52
|
-
|
|
53
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
55
|
+
```
|
|
54
56
|
|
|
55
57
|
**STOP.** Wait for user choice.
|
|
56
58
|
|
|
@@ -103,14 +105,16 @@ Present the reviewer's findings and fix analysis to the user:
|
|
|
103
105
|
Notes (non-blocking):
|
|
104
106
|
{NOTES from reviewer}
|
|
105
107
|
|
|
108
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
109
|
+
|
|
110
|
+
```
|
|
106
111
|
· · · · · · · · · · · ·
|
|
107
112
|
- **`y`/`yes`** — Accept the review and fix analysis, pass to executor
|
|
108
113
|
- **`a`/`auto`** — Accept and auto-approve future fix analyses
|
|
109
114
|
- **`s`/`skip`** — Override the reviewer and proceed as-is
|
|
110
115
|
- **Comment** — Any commentary, adjustments, alternative approaches, or questions before passing to executor
|
|
111
116
|
· · · · · · · · · · · ·
|
|
112
|
-
|
|
113
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
117
|
+
```
|
|
114
118
|
|
|
115
119
|
**STOP.** Wait for user choice.
|
|
116
120
|
|
|
@@ -134,14 +138,16 @@ Present a summary and wait for user input:
|
|
|
134
138
|
Phase: {phase number} — {phase name}
|
|
135
139
|
{executor's SUMMARY — brief commentary, decisions, implementation notes}
|
|
136
140
|
|
|
141
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
142
|
+
|
|
143
|
+
```
|
|
137
144
|
· · · · · · · · · · · ·
|
|
138
145
|
**Options:**
|
|
139
146
|
- **`y`/`yes`** — Approve, commit, continue to next task
|
|
140
147
|
- **`a`/`auto`** — Approve this and all future reviewer-approved tasks automatically
|
|
141
148
|
- **Comment** — Feedback the reviewer missed (triggers a fix round)
|
|
142
149
|
· · · · · · · · · · · ·
|
|
143
|
-
|
|
144
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
150
|
+
```
|
|
145
151
|
|
|
146
152
|
**STOP.** Wait for user input.
|
|
147
153
|
|
|
@@ -84,12 +84,14 @@ Found existing plan for **{topic}** (previously reached phase {N}, task {M}).
|
|
|
84
84
|
|
|
85
85
|
{spec change summary from spec-change-detection.md}
|
|
86
86
|
|
|
87
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
88
|
+
|
|
89
|
+
```
|
|
87
90
|
· · · · · · · · · · · ·
|
|
88
91
|
- **`c`/`continue`** — Walk through the plan from the start. You can review, amend, or navigate at any point — including straight to the leading edge.
|
|
89
92
|
- **`r`/`restart`** — Erase all planning work for this topic and start fresh. This deletes the Plan Index File and any Authored Tasks. Other topics are unaffected.
|
|
90
93
|
· · · · · · · · · · · ·
|
|
91
|
-
|
|
92
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
94
|
+
```
|
|
93
95
|
|
|
94
96
|
**STOP.** Wait for user response.
|
|
95
97
|
|
|
@@ -128,12 +130,14 @@ Present the recommendation:
|
|
|
128
130
|
|
|
129
131
|
Existing plans use **{format}**. Use the same format for consistency?
|
|
130
132
|
|
|
133
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
134
|
+
|
|
135
|
+
```
|
|
131
136
|
· · · · · · · · · · · ·
|
|
132
137
|
- **`y`/`yes`** — Use {format}
|
|
133
138
|
- **`n`/`no`** — See all available formats
|
|
134
139
|
· · · · · · · · · · · ·
|
|
135
|
-
|
|
136
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
140
|
+
```
|
|
137
141
|
|
|
138
142
|
**STOP.** Wait for user choice. If declined, fall through to the full list below.
|
|
139
143
|
|
|
@@ -38,13 +38,15 @@ The natural task order is already correct. Present as rendered markdown (not in
|
|
|
38
38
|
|
|
39
39
|
{notes from agent output}"
|
|
40
40
|
|
|
41
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
42
|
+
|
|
43
|
+
```
|
|
41
44
|
· · · · · · · · · · · ·
|
|
42
45
|
**To proceed:**
|
|
43
46
|
- **`y`/`yes`** — Confirmed.
|
|
44
47
|
- **Or tell me what to change.**
|
|
45
48
|
· · · · · · · · · · · ·
|
|
46
|
-
|
|
47
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
49
|
+
```
|
|
48
50
|
|
|
49
51
|
**STOP.** Wait for the user's response.
|
|
50
52
|
|
|
@@ -74,13 +76,15 @@ Dependencies and priorities have already been written to the task files. Present
|
|
|
74
76
|
|
|
75
77
|
{any notes from agent output}"
|
|
76
78
|
|
|
79
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
80
|
+
|
|
81
|
+
```
|
|
77
82
|
· · · · · · · · · · · ·
|
|
78
83
|
**To proceed:**
|
|
79
84
|
- **`y`/`yes`** — Approved.
|
|
80
85
|
- **Or tell me what to change.**
|
|
81
86
|
· · · · · · · · · · · ·
|
|
82
|
-
|
|
83
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
87
|
+
```
|
|
84
88
|
|
|
85
89
|
**STOP.** Wait for the user's response.
|
|
86
90
|
|
|
@@ -31,14 +31,16 @@ After presenting, ask:
|
|
|
31
31
|
|
|
32
32
|
**Task {M} of {total}: {Task Name}**
|
|
33
33
|
|
|
34
|
+
> *Output the next fenced block as markdown (not a code block):*
|
|
35
|
+
|
|
36
|
+
```
|
|
34
37
|
· · · · · · · · · · · ·
|
|
35
38
|
**To proceed:**
|
|
36
39
|
- **`y`/`yes`** — Approved. I'll log it to the plan.
|
|
37
40
|
- **Or tell me what to change.**
|
|
38
41
|
- **Or navigate** — a different phase or task, or the leading edge.
|
|
39
42
|
· · · · · · · · · · · ·
|
|
40
|
-
|
|
41
|
-
**Do not wrap the above in a code block** — output as raw markdown so bold styling renders.
|
|
43
|
+
```
|
|
42
44
|
|
|
43
45
|
**STOP.** Wait for the user's response.
|
|
44
46
|
|