@leeovery/claude-technical-workflows 2.0.43 → 2.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/link-dependencies.md +10 -10
- package/commands/workflow/start-implementation.md +5 -4
- package/commands/workflow/start-planning.md +2 -2
- package/commands/workflow/start-review.md +2 -1
- package/package.json +1 -1
- package/scripts/discovery-for-implementation-and-review.sh +5 -1
- package/scripts/discovery-for-planning.sh +5 -1
- package/scripts/migrations/002-specification-frontmatter.sh +39 -2
- package/scripts/migrations/003-planning-frontmatter.sh +26 -7
- package/skills/technical-planning/references/output-backlog-md.md +1 -1
- package/skills/technical-planning/references/output-beads.md +3 -3
- package/skills/technical-planning/references/output-linear.md +3 -3
|
@@ -53,9 +53,9 @@ Compare the `format:` field across all discovered plans.
|
|
|
53
53
|
```
|
|
54
54
|
Mixed output formats detected:
|
|
55
55
|
|
|
56
|
-
- authentication:
|
|
57
|
-
- billing-system:
|
|
58
|
-
- notifications:
|
|
56
|
+
- authentication: {format-a}
|
|
57
|
+
- billing-system: {format-b}
|
|
58
|
+
- notifications: {format-a}
|
|
59
59
|
|
|
60
60
|
Cross-topic dependencies can only be wired within the same output format.
|
|
61
61
|
Please consolidate your plans to use a single output format before linking dependencies.
|
|
@@ -78,15 +78,15 @@ For each plan, find the External Dependencies section:
|
|
|
78
78
|
```
|
|
79
79
|
Dependency Summary
|
|
80
80
|
|
|
81
|
-
Plan: authentication (format:
|
|
81
|
+
Plan: authentication (format: {format})
|
|
82
82
|
- billing-system: Invoice generation (unresolved)
|
|
83
|
-
- user-management: User profiles →
|
|
83
|
+
- user-management: User profiles → {task-id} (resolved)
|
|
84
84
|
|
|
85
|
-
Plan: billing-system (format:
|
|
85
|
+
Plan: billing-system (format: {format})
|
|
86
86
|
- authentication: User context (unresolved)
|
|
87
87
|
- ~~payment-gateway: Payment processing~~ → satisfied externally
|
|
88
88
|
|
|
89
|
-
Plan: notifications (format:
|
|
89
|
+
Plan: notifications (format: {format})
|
|
90
90
|
- authentication: User lookup (unresolved)
|
|
91
91
|
- billing-system: Invoice events (unresolved)
|
|
92
92
|
```
|
|
@@ -133,11 +133,11 @@ Present a summary:
|
|
|
133
133
|
Dependency Linking Complete
|
|
134
134
|
|
|
135
135
|
RESOLVED (newly linked):
|
|
136
|
-
- authentication → billing-system:
|
|
137
|
-
- notifications → authentication:
|
|
136
|
+
- authentication → billing-system: {task-id} (Invoice generation)
|
|
137
|
+
- notifications → authentication: {task-id} (Session management)
|
|
138
138
|
|
|
139
139
|
ALREADY RESOLVED (no action needed):
|
|
140
|
-
- authentication → user-management:
|
|
140
|
+
- authentication → user-management: {task-id}
|
|
141
141
|
|
|
142
142
|
SATISFIED EXTERNALLY (no action needed):
|
|
143
143
|
- billing-system → payment-gateway
|
|
@@ -56,7 +56,7 @@ This outputs structured YAML. Parse it to understand:
|
|
|
56
56
|
|
|
57
57
|
**From `plans` section:**
|
|
58
58
|
- `exists` - whether any plans exist
|
|
59
|
-
- `files` - list of plans with: name, topic, status, date, format, specification, specification_exists
|
|
59
|
+
- `files` - list of plans with: name, topic, status, date, format, specification, specification_exists, plan_id (if present)
|
|
60
60
|
- `count` - total number of plans
|
|
61
61
|
|
|
62
62
|
**From `environment` section:**
|
|
@@ -105,9 +105,9 @@ Present all discovered plans to help the user make an informed choice.
|
|
|
105
105
|
```
|
|
106
106
|
Available Plans:
|
|
107
107
|
|
|
108
|
-
1. {topic-1} (in-progress) - format:
|
|
109
|
-
2. {topic-2} (concluded) - format:
|
|
110
|
-
3. {topic-3} (in-progress) - format:
|
|
108
|
+
1. {topic-1} (in-progress) - format: {format}
|
|
109
|
+
2. {topic-2} (concluded) - format: {format}
|
|
110
|
+
3. {topic-3} (in-progress) - format: {format}
|
|
111
111
|
|
|
112
112
|
Which plan would you like to implement? (Enter a number or name)
|
|
113
113
|
```
|
|
@@ -259,6 +259,7 @@ Invoke the [technical-implementation](../../skills/technical-implementation/SKIL
|
|
|
259
259
|
Implementation session for: {topic}
|
|
260
260
|
Plan: docs/workflow/planning/{topic}.md
|
|
261
261
|
Format: {format}
|
|
262
|
+
Plan ID: {plan_id} (if applicable)
|
|
262
263
|
Specification: {specification} (exists: {true|false})
|
|
263
264
|
Scope: {all phases | Phase N | Task N.M | next-available}
|
|
264
265
|
|
|
@@ -64,7 +64,7 @@ This outputs structured YAML. Parse it to understand:
|
|
|
64
64
|
|
|
65
65
|
**From `plans` section:**
|
|
66
66
|
- `exists` - whether any plans exist
|
|
67
|
-
- `files` - each plan's name, format, and
|
|
67
|
+
- `files` - each plan's name, format, status, and plan_id (if present)
|
|
68
68
|
|
|
69
69
|
**From `state` section:**
|
|
70
70
|
- `scenario` - one of: `"no_specs"`, `"no_ready_specs"`, `"single_ready_spec"`, `"multiple_ready_specs"`
|
|
@@ -122,7 +122,7 @@ Cross-cutting specifications (reference context):
|
|
|
122
122
|
- {rate-limiting} (concluded)
|
|
123
123
|
|
|
124
124
|
Existing plans:
|
|
125
|
-
- {topic-3}.md (in-progress,
|
|
125
|
+
- {topic-3}.md (in-progress, {format})
|
|
126
126
|
```
|
|
127
127
|
|
|
128
128
|
**Legend:**
|
|
@@ -56,7 +56,7 @@ This outputs structured YAML. Parse it to understand:
|
|
|
56
56
|
|
|
57
57
|
**From `plans` section:**
|
|
58
58
|
- `exists` - whether any plans exist
|
|
59
|
-
- `files` - list of plans with: name, topic, status, date, format, specification, specification_exists
|
|
59
|
+
- `files` - list of plans with: name, topic, status, date, format, specification, specification_exists, plan_id (if present)
|
|
60
60
|
- `count` - total number of plans
|
|
61
61
|
|
|
62
62
|
**From `state` section:**
|
|
@@ -154,6 +154,7 @@ Invoke the [technical-review](../../skills/technical-review/SKILL.md) skill for
|
|
|
154
154
|
Review session for: {topic}
|
|
155
155
|
Plan: docs/workflow/planning/{topic}.md
|
|
156
156
|
Format: {format}
|
|
157
|
+
Plan ID: {plan_id} (if applicable)
|
|
157
158
|
Specification: {specification} (exists: {true|false})
|
|
158
159
|
Scope: {all changes | specific paths | from git status}
|
|
159
160
|
|
package/package.json
CHANGED
|
@@ -55,9 +55,10 @@ if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
|
55
55
|
date=$(extract_field "$file" "date")
|
|
56
56
|
date=${date:-"unknown"}
|
|
57
57
|
format=$(extract_field "$file" "format")
|
|
58
|
-
format=${format:-"
|
|
58
|
+
format=${format:-"MISSING"}
|
|
59
59
|
specification=$(extract_field "$file" "specification")
|
|
60
60
|
specification=${specification:-"${name}.md"}
|
|
61
|
+
plan_id=$(extract_field "$file" "plan_id")
|
|
61
62
|
|
|
62
63
|
# Check if linked specification exists
|
|
63
64
|
spec_exists="false"
|
|
@@ -73,6 +74,9 @@ if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
|
73
74
|
echo " format: \"$format\""
|
|
74
75
|
echo " specification: \"$specification\""
|
|
75
76
|
echo " specification_exists: $spec_exists"
|
|
77
|
+
if [ -n "$plan_id" ]; then
|
|
78
|
+
echo " plan_id: \"$plan_id\""
|
|
79
|
+
fi
|
|
76
80
|
|
|
77
81
|
plan_count=$((plan_count + 1))
|
|
78
82
|
done
|
|
@@ -136,13 +136,17 @@ if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
|
136
136
|
|
|
137
137
|
name=$(basename "$file" .md)
|
|
138
138
|
format=$(extract_field "$file" "format")
|
|
139
|
-
format=${format:-"
|
|
139
|
+
format=${format:-"MISSING"}
|
|
140
140
|
status=$(extract_field "$file" "status")
|
|
141
141
|
status=${status:-"unknown"}
|
|
142
|
+
plan_id=$(extract_field "$file" "plan_id")
|
|
142
143
|
|
|
143
144
|
echo " - name: \"$name\""
|
|
144
145
|
echo " format: \"$format\""
|
|
145
146
|
echo " status: \"$status\""
|
|
147
|
+
if [ -n "$plan_id" ]; then
|
|
148
|
+
echo " plan_id: \"$plan_id\""
|
|
149
|
+
fi
|
|
146
150
|
done
|
|
147
151
|
else
|
|
148
152
|
echo " exists: false"
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
# status: in-progress | concluded
|
|
18
18
|
# type: feature | cross-cutting | (empty if unknown)
|
|
19
19
|
# date: YYYY-MM-DD
|
|
20
|
+
# sources: # Optional - only if Sources field exists
|
|
21
|
+
# - discussion-one
|
|
22
|
+
# - discussion-two
|
|
20
23
|
# ---
|
|
21
24
|
#
|
|
22
25
|
# # Specification: {Topic}
|
|
@@ -128,17 +131,51 @@ for file in "$SPEC_DIR"/*.md; do
|
|
|
128
131
|
date_value=$(date +%Y-%m-%d)
|
|
129
132
|
fi
|
|
130
133
|
|
|
134
|
+
# Extract sources from **Sources**: source1, source2, ... (comma-separated list of discussion names)
|
|
135
|
+
# These link the specification back to the discussions that informed it
|
|
136
|
+
sources_raw=$(grep -m1 '^\*\*Sources\*\*:' "$file" 2>/dev/null | \
|
|
137
|
+
sed 's/^\*\*Sources\*\*:[[:space:]]*//' | \
|
|
138
|
+
xargs || echo "")
|
|
139
|
+
|
|
140
|
+
# Convert comma-separated list to array
|
|
141
|
+
sources_array=()
|
|
142
|
+
if [ -n "$sources_raw" ]; then
|
|
143
|
+
IFS=',' read -ra sources_parts <<< "$sources_raw"
|
|
144
|
+
for src in "${sources_parts[@]}"; do
|
|
145
|
+
# Trim whitespace
|
|
146
|
+
src=$(echo "$src" | xargs)
|
|
147
|
+
if [ -n "$src" ]; then
|
|
148
|
+
sources_array+=("$src")
|
|
149
|
+
fi
|
|
150
|
+
done
|
|
151
|
+
fi
|
|
152
|
+
|
|
131
153
|
#
|
|
132
154
|
# Build new file content
|
|
133
155
|
#
|
|
134
156
|
|
|
135
|
-
# Create frontmatter
|
|
136
|
-
|
|
157
|
+
# Create frontmatter (conditionally include sources if present)
|
|
158
|
+
if [ ${#sources_array[@]} -gt 0 ]; then
|
|
159
|
+
sources_yaml=""
|
|
160
|
+
for src in "${sources_array[@]}"; do
|
|
161
|
+
sources_yaml="${sources_yaml}
|
|
162
|
+
- $src"
|
|
163
|
+
done
|
|
164
|
+
frontmatter="---
|
|
137
165
|
topic: $topic_kebab
|
|
138
166
|
status: $status_new
|
|
139
167
|
type: $type_new
|
|
140
168
|
date: $date_value
|
|
169
|
+
sources:$sources_yaml
|
|
141
170
|
---"
|
|
171
|
+
else
|
|
172
|
+
frontmatter="---
|
|
173
|
+
topic: $topic_kebab
|
|
174
|
+
status: $status_new
|
|
175
|
+
type: $type_new
|
|
176
|
+
date: $date_value
|
|
177
|
+
---"
|
|
178
|
+
fi
|
|
142
179
|
|
|
143
180
|
# Extract H1 heading (preserve original)
|
|
144
181
|
h1_heading=$(grep -m1 "^# " "$file")
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
#
|
|
7
7
|
# Legacy format (partial frontmatter + inline metadata):
|
|
8
8
|
# ---
|
|
9
|
-
# format:
|
|
9
|
+
# format: {format}
|
|
10
10
|
# ---
|
|
11
11
|
#
|
|
12
12
|
# # Implementation Plan: {Feature/Project Name}
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
# topic: {topic-name}
|
|
21
21
|
# status: in-progress | concluded
|
|
22
22
|
# date: YYYY-MM-DD
|
|
23
|
-
# format:
|
|
23
|
+
# format: {format} # Required - no default, MISSING if not present
|
|
24
24
|
# specification: {topic}.md
|
|
25
|
+
# plan_id: {id} # Optional - migrated from 'epic' or 'project' fields
|
|
25
26
|
# ---
|
|
26
27
|
#
|
|
27
28
|
# # Implementation Plan: {Feature/Project Name}
|
|
@@ -85,7 +86,14 @@ for file in "$PLAN_DIR"/*.md; do
|
|
|
85
86
|
# Extract format from existing frontmatter (if present)
|
|
86
87
|
format_value=$(sed -n '/^---$/,/^---$/p' "$file" 2>/dev/null | grep "^format:" | sed 's/^format:[[:space:]]*//' | xargs || echo "")
|
|
87
88
|
if [ -z "$format_value" ]; then
|
|
88
|
-
format_value="
|
|
89
|
+
format_value="MISSING" # No default - missing format is an error
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Extract plan_id from existing frontmatter - could be 'epic' (beads) or 'project' (linear/backlog)
|
|
93
|
+
# These are migrated to a unified 'plan_id' field
|
|
94
|
+
plan_id_value=$(sed -n '/^---$/,/^---$/p' "$file" 2>/dev/null | grep "^epic:" | sed 's/^epic:[[:space:]]*//' | xargs || echo "")
|
|
95
|
+
if [ -z "$plan_id_value" ]; then
|
|
96
|
+
plan_id_value=$(sed -n '/^---$/,/^---$/p' "$file" 2>/dev/null | grep "^project:" | sed 's/^project:[[:space:]]*//' | xargs || echo "")
|
|
89
97
|
fi
|
|
90
98
|
|
|
91
99
|
# Extract status from **Status**: Value
|
|
@@ -107,8 +115,8 @@ for file in "$PLAN_DIR"/*.md; do
|
|
|
107
115
|
;;
|
|
108
116
|
esac
|
|
109
117
|
|
|
110
|
-
# Extract date from **Date**: YYYY-MM-DD
|
|
111
|
-
date_value=$(grep -m1 '^\*\*Date\*\*:' "$file" 2>/dev/null | \
|
|
118
|
+
# Extract date from **Date**: YYYY-MM-DD or **Created**: YYYY-MM-DD
|
|
119
|
+
date_value=$(grep -m1 '^\*\*Date\*\*:\|^\*\*Created\*\*:' "$file" 2>/dev/null | \
|
|
112
120
|
grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}' || echo "")
|
|
113
121
|
|
|
114
122
|
# Use today's date if none found
|
|
@@ -134,14 +142,25 @@ for file in "$PLAN_DIR"/*.md; do
|
|
|
134
142
|
# Build new file content
|
|
135
143
|
#
|
|
136
144
|
|
|
137
|
-
# Create frontmatter
|
|
138
|
-
|
|
145
|
+
# Create frontmatter (conditionally include plan_id if present)
|
|
146
|
+
if [ -n "$plan_id_value" ]; then
|
|
147
|
+
frontmatter="---
|
|
148
|
+
topic: $topic_kebab
|
|
149
|
+
status: $status_new
|
|
150
|
+
date: $date_value
|
|
151
|
+
format: $format_value
|
|
152
|
+
specification: $spec_value
|
|
153
|
+
plan_id: $plan_id_value
|
|
154
|
+
---"
|
|
155
|
+
else
|
|
156
|
+
frontmatter="---
|
|
139
157
|
topic: $topic_kebab
|
|
140
158
|
status: $status_new
|
|
141
159
|
date: $date_value
|
|
142
160
|
format: $format_value
|
|
143
161
|
specification: $spec_value
|
|
144
162
|
---"
|
|
163
|
+
fi
|
|
145
164
|
|
|
146
165
|
# Extract H1 heading (preserve original)
|
|
147
166
|
h1_heading=$(grep -m1 "^# " "$file")
|
|
@@ -240,7 +240,7 @@ Create `docs/workflow/planning/{topic}.md`:
|
|
|
240
240
|
```markdown
|
|
241
241
|
---
|
|
242
242
|
format: beads
|
|
243
|
-
|
|
243
|
+
plan_id: bd-{EPIC_ID}
|
|
244
244
|
---
|
|
245
245
|
|
|
246
246
|
# Plan Reference: {Topic Name}
|
|
@@ -304,7 +304,7 @@ The `format: beads` frontmatter tells implementation to use beads CLI:
|
|
|
304
304
|
```yaml
|
|
305
305
|
---
|
|
306
306
|
format: beads
|
|
307
|
-
|
|
307
|
+
plan_id: bd-a3f8
|
|
308
308
|
---
|
|
309
309
|
```
|
|
310
310
|
|
|
@@ -327,7 +327,7 @@ In the task body:
|
|
|
327
327
|
|
|
328
328
|
### Reading Plans
|
|
329
329
|
|
|
330
|
-
1. Extract `
|
|
330
|
+
1. Extract `plan_id` (beads epic ID) from frontmatter
|
|
331
331
|
2. Check `.beads/config.yaml` for `no-db` setting
|
|
332
332
|
3. Run `bd ready` to get unblocked tasks
|
|
333
333
|
4. View task details with `bd show bd-{id}`
|
|
@@ -148,7 +148,7 @@ Create `docs/workflow/planning/{topic}.md`:
|
|
|
148
148
|
```markdown
|
|
149
149
|
---
|
|
150
150
|
format: linear
|
|
151
|
-
|
|
151
|
+
plan_id: {PROJECT_NAME}
|
|
152
152
|
project_id: {ID from MCP response}
|
|
153
153
|
team: {TEAM_NAME}
|
|
154
154
|
---
|
|
@@ -207,7 +207,7 @@ The frontmatter contains all information needed to query Linear:
|
|
|
207
207
|
```yaml
|
|
208
208
|
---
|
|
209
209
|
format: linear
|
|
210
|
-
|
|
210
|
+
plan_id: USER-AUTH-FEATURE
|
|
211
211
|
project_id: abc123-def456
|
|
212
212
|
team: Engineering
|
|
213
213
|
---
|
|
@@ -257,7 +257,7 @@ Linear:
|
|
|
257
257
|
|
|
258
258
|
### Reading Plans
|
|
259
259
|
|
|
260
|
-
1. Extract `
|
|
260
|
+
1. Extract `plan_id` (Linear project name) from frontmatter
|
|
261
261
|
2. Query Linear MCP for project issues
|
|
262
262
|
3. Filter issues by phase label (e.g., `phase-1`, `phase-2`)
|
|
263
263
|
4. Process in phase order
|