@leeovery/claude-technical-workflows 2.0.49 → 2.0.51
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/workflow/start-planning.md +103 -49
- package/commands/workflow/start-specification.md +18 -12
- package/package.json +1 -1
- package/scripts/discovery-for-planning.sh +35 -6
- package/skills/technical-planning/SKILL.md +16 -1
- package/skills/technical-planning/references/steps/plan-construction.md +11 -0
|
@@ -60,18 +60,20 @@ This outputs structured YAML. Parse it to understand:
|
|
|
60
60
|
|
|
61
61
|
**From `specifications` section:**
|
|
62
62
|
- `exists` - whether any specifications exist
|
|
63
|
-
- `feature` - list of feature specs (name, status, has_plan)
|
|
63
|
+
- `feature` - list of feature specs (name, status, has_plan, plan_status)
|
|
64
64
|
- `crosscutting` - list of cross-cutting specs (name, status)
|
|
65
65
|
- `counts.feature` - total feature specifications
|
|
66
66
|
- `counts.feature_ready` - feature specs ready for planning (concluded + no plan)
|
|
67
|
+
- `counts.feature_with_plan` - feature specs that already have plans
|
|
67
68
|
- `counts.crosscutting` - total cross-cutting specifications
|
|
68
69
|
|
|
69
70
|
**From `plans` section:**
|
|
70
71
|
- `exists` - whether any plans exist
|
|
71
72
|
- `files` - each plan's name, format, status, and plan_id (if present)
|
|
73
|
+
- `common_format` - the output format if all existing plans share the same one; empty string otherwise
|
|
72
74
|
|
|
73
75
|
**From `state` section:**
|
|
74
|
-
- `scenario` - one of: `"no_specs"`, `"
|
|
76
|
+
- `scenario` - one of: `"no_specs"`, `"nothing_actionable"`, `"has_options"`
|
|
75
77
|
|
|
76
78
|
**IMPORTANT**: Use ONLY this script for discovery. Do NOT run additional bash commands (ls, head, cat, etc.) to gather state - the script provides everything needed.
|
|
77
79
|
|
|
@@ -95,18 +97,20 @@ The planning phase requires a concluded specification. Please run /start-specifi
|
|
|
95
97
|
|
|
96
98
|
**STOP.** Wait for user to acknowledge before ending.
|
|
97
99
|
|
|
98
|
-
#### If scenario is "
|
|
100
|
+
#### If scenario is "nothing_actionable"
|
|
99
101
|
|
|
100
|
-
Specifications exist but none are
|
|
102
|
+
Specifications exist but none are actionable — all are still in-progress and no plans exist to continue.
|
|
101
103
|
|
|
102
104
|
→ Proceed to **Step 3** to show the state.
|
|
103
105
|
|
|
104
|
-
#### If scenario is "
|
|
106
|
+
#### If scenario is "has_options"
|
|
105
107
|
|
|
106
|
-
|
|
108
|
+
At least one specification is ready for planning, or an existing plan can be continued or reviewed.
|
|
107
109
|
|
|
108
110
|
→ Proceed to **Step 3** to present options.
|
|
109
111
|
|
|
112
|
+
---
|
|
113
|
+
|
|
110
114
|
## Step 3: Present Workflow State and Options
|
|
111
115
|
|
|
112
116
|
Present everything discovered to help the user make an informed choice.
|
|
@@ -114,47 +118,55 @@ Present everything discovered to help the user make an informed choice.
|
|
|
114
118
|
**Present the full state:**
|
|
115
119
|
|
|
116
120
|
```
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
Feature specifications:
|
|
120
|
-
1. · {topic-1} (in-progress) - not ready
|
|
121
|
-
2. ✓ {topic-2} (concluded) - ready for planning
|
|
122
|
-
3. - {topic-3} (concluded) → plan exists
|
|
121
|
+
Planning Phase
|
|
123
122
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
Available:
|
|
124
|
+
1. + {topic-2} - create new plan
|
|
125
|
+
2. ▶ {topic-3} - continue in-progress plan
|
|
126
|
+
3. > {topic-4} - review concluded plan
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
Not plannable specifications:
|
|
129
|
+
· {topic-1} [feature, in-progress]
|
|
130
|
+
· {caching-strategy} [cross-cutting, concluded]
|
|
131
|
+
· {rate-limiting} [cross-cutting, in-progress]
|
|
130
132
|
```
|
|
131
133
|
|
|
132
|
-
**
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
-
|
|
134
|
+
**Formatting rules:**
|
|
135
|
+
|
|
136
|
+
Available (numbered, selectable):
|
|
137
|
+
- **`+`** — concluded spec with no plan yet
|
|
138
|
+
- **`▶`** — has a plan with `plan_status: planning`
|
|
139
|
+
- **`>`** — has a plan with `plan_status: concluded`
|
|
140
|
+
|
|
141
|
+
Not plannable specifications (no number, not selectable — `[type, status]` format):
|
|
142
|
+
- **`·`** — feature specs still in-progress, or cross-cutting specifications
|
|
143
|
+
- Feature specs: `[feature, in-progress]`
|
|
144
|
+
- Cross-cutting specs: `[cross-cutting, {status}]`
|
|
136
145
|
|
|
137
|
-
|
|
146
|
+
Omit either section entirely if it has no entries.
|
|
138
147
|
|
|
139
|
-
**
|
|
148
|
+
**Then prompt based on what's actionable:**
|
|
149
|
+
|
|
150
|
+
**If multiple actionable items:**
|
|
140
151
|
```
|
|
141
|
-
|
|
152
|
+
Select a specification (enter number):
|
|
142
153
|
```
|
|
143
154
|
|
|
144
155
|
**STOP.** Wait for user response.
|
|
145
156
|
|
|
146
|
-
**If single
|
|
157
|
+
**If single actionable item (auto-select):**
|
|
147
158
|
```
|
|
148
|
-
Auto-selecting: {topic} (only
|
|
159
|
+
Auto-selecting: {topic} (only actionable specification)
|
|
149
160
|
```
|
|
161
|
+
|
|
150
162
|
→ Proceed directly to **Step 4**.
|
|
151
163
|
|
|
152
|
-
**If
|
|
164
|
+
**If nothing actionable:**
|
|
153
165
|
```
|
|
154
|
-
No specifications
|
|
166
|
+
No plannable specifications.
|
|
155
167
|
|
|
156
168
|
To proceed:
|
|
157
|
-
- Complete any
|
|
169
|
+
- Complete any in-progress specifications with /start-specification
|
|
158
170
|
- Or create a new specification first
|
|
159
171
|
```
|
|
160
172
|
|
|
@@ -164,7 +176,23 @@ To proceed:
|
|
|
164
176
|
|
|
165
177
|
---
|
|
166
178
|
|
|
167
|
-
## Step 4:
|
|
179
|
+
## Step 4: Route by Plan State
|
|
180
|
+
|
|
181
|
+
Check whether the selected specification already has a plan (from `has_plan` in discovery output).
|
|
182
|
+
|
|
183
|
+
#### If no existing plan (fresh start)
|
|
184
|
+
|
|
185
|
+
→ Proceed to **Step 5** to gather context before invoking the skill.
|
|
186
|
+
|
|
187
|
+
#### If existing plan (continue or review)
|
|
188
|
+
|
|
189
|
+
The plan already has its context from when it was created. Skip context gathering.
|
|
190
|
+
|
|
191
|
+
→ Go directly to **Step 7** to invoke the skill.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Step 5: Gather Additional Context
|
|
168
196
|
|
|
169
197
|
Ask:
|
|
170
198
|
- Any additional context or priorities to consider?
|
|
@@ -172,46 +200,72 @@ Ask:
|
|
|
172
200
|
|
|
173
201
|
**STOP.** Wait for user response.
|
|
174
202
|
|
|
175
|
-
→ Proceed to **Step
|
|
203
|
+
→ Proceed to **Step 6**.
|
|
176
204
|
|
|
177
205
|
---
|
|
178
206
|
|
|
179
|
-
## Step
|
|
207
|
+
## Step 6: Surface Cross-Cutting Context
|
|
180
208
|
|
|
181
|
-
If
|
|
209
|
+
**If no cross-cutting specifications exist**: Skip this step. → Proceed to **Step 7**.
|
|
182
210
|
|
|
183
|
-
|
|
184
|
-
- Read each cross-cutting specification
|
|
185
|
-
- Identify which ones are relevant to the feature being planned
|
|
186
|
-
- Relevance is determined by topic overlap (e.g., caching strategy applies if the feature involves data retrieval or API calls)
|
|
211
|
+
Read each cross-cutting specification from `specifications.crosscutting` in the discovery output.
|
|
187
212
|
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
Cross-cutting specifications to reference:
|
|
191
|
-
- caching-strategy.md: [brief summary of key decisions]
|
|
192
|
-
- rate-limiting.md: [brief summary of key decisions]
|
|
193
|
-
```
|
|
213
|
+
### 6a: Warn about in-progress cross-cutting specs
|
|
194
214
|
|
|
195
|
-
|
|
215
|
+
If any **in-progress** cross-cutting specifications exist, check whether they could be relevant to the feature being planned (by topic overlap — e.g., a caching strategy is relevant if the feature involves data retrieval or API calls).
|
|
196
216
|
|
|
197
|
-
|
|
217
|
+
If any are relevant:
|
|
198
218
|
|
|
199
|
-
|
|
219
|
+
```
|
|
220
|
+
Note: The following cross-cutting specifications are still in-progress:
|
|
221
|
+
· {rate-limiting} - in-progress
|
|
222
|
+
|
|
223
|
+
These may contain architectural decisions relevant to this plan. You can:
|
|
224
|
+
- Continue planning without them
|
|
225
|
+
- Stop and complete them first (/start-specification)
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**STOP.** Wait for user response.
|
|
229
|
+
|
|
230
|
+
If the user chooses to stop, end here. If they choose to continue, proceed.
|
|
231
|
+
|
|
232
|
+
### 6b: Summarize concluded cross-cutting specs
|
|
233
|
+
|
|
234
|
+
If any **concluded** cross-cutting specifications exist, identify which are relevant to the feature being planned and summarize for handoff:
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
Cross-cutting specifications to reference:
|
|
238
|
+
- caching-strategy.md: [brief summary of key decisions]
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
These specifications contain validated architectural decisions that should inform the plan. The planning skill will incorporate these as a "Cross-Cutting References" section in the plan.
|
|
242
|
+
|
|
243
|
+
→ Proceed to **Step 7**.
|
|
200
244
|
|
|
201
245
|
---
|
|
202
246
|
|
|
203
|
-
## Step
|
|
247
|
+
## Step 7: Invoke the Skill
|
|
204
248
|
|
|
205
249
|
After completing the steps above, this command's purpose is fulfilled.
|
|
206
250
|
|
|
207
251
|
Invoke the [technical-planning](../../skills/technical-planning/SKILL.md) skill for your next instructions. Do not act on the gathered information until the skill is loaded - it contains the instructions for how to proceed.
|
|
208
252
|
|
|
209
|
-
**Example handoff:**
|
|
253
|
+
**Example handoff (fresh plan):**
|
|
210
254
|
```
|
|
211
255
|
Planning session for: {topic}
|
|
212
256
|
Specification: docs/workflow/specification/{topic}.md
|
|
213
|
-
Additional context: {summary of user's answers from Step
|
|
257
|
+
Additional context: {summary of user's answers from Step 5}
|
|
214
258
|
Cross-cutting references: {list of applicable cross-cutting specs with brief summaries, or "none"}
|
|
259
|
+
Recommended output format: {common_format from discovery if non-empty, otherwise "none"}
|
|
260
|
+
|
|
261
|
+
Invoke the technical-planning skill.
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Example handoff (continue/review existing plan):**
|
|
265
|
+
```
|
|
266
|
+
Planning session for: {topic}
|
|
267
|
+
Specification: docs/workflow/specification/{topic}.md
|
|
268
|
+
Existing plan: docs/workflow/planning/{topic}.md
|
|
215
269
|
|
|
216
270
|
Invoke the technical-planning skill.
|
|
217
271
|
```
|
|
@@ -120,25 +120,31 @@ At least one concluded discussion exists.
|
|
|
120
120
|
Show the current state clearly. Use this EXACT format:
|
|
121
121
|
|
|
122
122
|
```
|
|
123
|
-
|
|
123
|
+
Specification Phase
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
125
|
+
Available discussions:
|
|
126
|
+
+ {topic-1} - create new spec
|
|
127
|
+
+ {topic-2} - create new spec
|
|
128
|
+
▶ {topic-3} - continue in-progress spec
|
|
129
|
+
> {topic-4} - review concluded spec
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
Not specifiable discussions:
|
|
132
|
+
· {topic-5} [in-progress]
|
|
133
|
+
|
|
134
|
+
Existing specifications:
|
|
135
|
+
• {spec-1} [active] - sources: {topic-1}
|
|
136
|
+
• {spec-2} [superseded → {other-spec}] - sources: {topic-x}
|
|
134
137
|
|
|
135
138
|
{N} concluded discussions available.
|
|
136
139
|
```
|
|
137
140
|
|
|
138
141
|
**Legend:**
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
+
- `+` = concluded, no spec yet (create new)
|
|
143
|
+
- `▶` = concluded, has in-progress spec (continue)
|
|
144
|
+
- `>` = concluded, has concluded spec (review)
|
|
145
|
+
- `·` = in-progress (not specifiable)
|
|
146
|
+
|
|
147
|
+
Omit either discussions section if it has no entries.
|
|
142
148
|
|
|
143
149
|
#### Routing Based on State
|
|
144
150
|
|
package/package.json
CHANGED
|
@@ -40,6 +40,7 @@ echo "specifications:"
|
|
|
40
40
|
|
|
41
41
|
feature_count=0
|
|
42
42
|
feature_ready_count=0
|
|
43
|
+
feature_with_plan_count=0
|
|
43
44
|
crosscutting_count=0
|
|
44
45
|
|
|
45
46
|
if [ -d "$SPEC_DIR" ] && [ -n "$(ls -A "$SPEC_DIR" 2>/dev/null)" ]; then
|
|
@@ -59,21 +60,30 @@ if [ -d "$SPEC_DIR" ] && [ -n "$(ls -A "$SPEC_DIR" 2>/dev/null)" ]; then
|
|
|
59
60
|
# Skip cross-cutting specs in this pass
|
|
60
61
|
[ "$spec_type" = "cross-cutting" ] && continue
|
|
61
62
|
|
|
62
|
-
# Check if plan exists
|
|
63
|
+
# Check if plan exists and its status
|
|
63
64
|
has_plan="false"
|
|
65
|
+
plan_status=""
|
|
64
66
|
if [ -f "$PLAN_DIR/${name}.md" ]; then
|
|
65
67
|
has_plan="true"
|
|
68
|
+
plan_status=$(extract_field "$PLAN_DIR/${name}.md" "status")
|
|
69
|
+
plan_status=${plan_status:-"unknown"}
|
|
66
70
|
fi
|
|
67
71
|
|
|
68
72
|
echo " - name: \"$name\""
|
|
69
73
|
echo " status: \"$status\""
|
|
70
74
|
echo " has_plan: $has_plan"
|
|
75
|
+
if [ "$has_plan" = "true" ]; then
|
|
76
|
+
echo " plan_status: \"$plan_status\""
|
|
77
|
+
fi
|
|
71
78
|
|
|
72
79
|
feature_count=$((feature_count + 1))
|
|
73
80
|
# "concluded" specs without plans are ready for planning
|
|
74
81
|
if [ "$status" = "concluded" ] && [ "$has_plan" = "false" ]; then
|
|
75
82
|
feature_ready_count=$((feature_ready_count + 1))
|
|
76
83
|
fi
|
|
84
|
+
if [ "$has_plan" = "true" ]; then
|
|
85
|
+
feature_with_plan_count=$((feature_with_plan_count + 1))
|
|
86
|
+
fi
|
|
77
87
|
done
|
|
78
88
|
|
|
79
89
|
if [ "$feature_count" -eq 0 ]; then
|
|
@@ -109,6 +119,7 @@ if [ -d "$SPEC_DIR" ] && [ -n "$(ls -A "$SPEC_DIR" 2>/dev/null)" ]; then
|
|
|
109
119
|
echo " counts:"
|
|
110
120
|
echo " feature: $feature_count"
|
|
111
121
|
echo " feature_ready: $feature_ready_count"
|
|
122
|
+
echo " feature_with_plan: $feature_with_plan_count"
|
|
112
123
|
echo " crosscutting: $crosscutting_count"
|
|
113
124
|
else
|
|
114
125
|
echo " exists: false"
|
|
@@ -117,6 +128,7 @@ else
|
|
|
117
128
|
echo " counts:"
|
|
118
129
|
echo " feature: 0"
|
|
119
130
|
echo " feature_ready: 0"
|
|
131
|
+
echo " feature_with_plan: 0"
|
|
120
132
|
echo " crosscutting: 0"
|
|
121
133
|
fi
|
|
122
134
|
|
|
@@ -127,6 +139,9 @@ echo ""
|
|
|
127
139
|
#
|
|
128
140
|
echo "plans:"
|
|
129
141
|
|
|
142
|
+
plan_format_seen=""
|
|
143
|
+
plan_format_unanimous="true"
|
|
144
|
+
|
|
130
145
|
if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
131
146
|
echo " exists: true"
|
|
132
147
|
echo " files:"
|
|
@@ -137,6 +152,15 @@ if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
|
137
152
|
name=$(basename "$file" .md)
|
|
138
153
|
format=$(extract_field "$file" "format")
|
|
139
154
|
format=${format:-"MISSING"}
|
|
155
|
+
|
|
156
|
+
if [ "$format" != "MISSING" ]; then
|
|
157
|
+
if [ -z "$plan_format_seen" ]; then
|
|
158
|
+
plan_format_seen="$format"
|
|
159
|
+
elif [ "$plan_format_seen" != "$format" ]; then
|
|
160
|
+
plan_format_unanimous="false"
|
|
161
|
+
fi
|
|
162
|
+
fi
|
|
163
|
+
|
|
140
164
|
status=$(extract_field "$file" "status")
|
|
141
165
|
status=${status:-"unknown"}
|
|
142
166
|
plan_id=$(extract_field "$file" "plan_id")
|
|
@@ -148,9 +172,16 @@ if [ -d "$PLAN_DIR" ] && [ -n "$(ls -A "$PLAN_DIR" 2>/dev/null)" ]; then
|
|
|
148
172
|
echo " plan_id: \"$plan_id\""
|
|
149
173
|
fi
|
|
150
174
|
done
|
|
175
|
+
|
|
176
|
+
if [ "$plan_format_unanimous" = "true" ] && [ -n "$plan_format_seen" ]; then
|
|
177
|
+
echo " common_format: \"$plan_format_seen\""
|
|
178
|
+
else
|
|
179
|
+
echo " common_format: \"\""
|
|
180
|
+
fi
|
|
151
181
|
else
|
|
152
182
|
echo " exists: false"
|
|
153
183
|
echo " files: []"
|
|
184
|
+
echo " common_format: \"\""
|
|
154
185
|
fi
|
|
155
186
|
|
|
156
187
|
echo ""
|
|
@@ -177,10 +208,8 @@ echo " has_plans: $plans_exist"
|
|
|
177
208
|
# Determine workflow state for routing
|
|
178
209
|
if [ "$specs_exist" = "false" ]; then
|
|
179
210
|
echo " scenario: \"no_specs\""
|
|
180
|
-
elif [ "$feature_ready_count" -eq 0 ]; then
|
|
181
|
-
echo " scenario: \"
|
|
182
|
-
elif [ "$feature_ready_count" -eq 1 ]; then
|
|
183
|
-
echo " scenario: \"single_ready_spec\""
|
|
211
|
+
elif [ "$feature_ready_count" -eq 0 ] && [ "$feature_with_plan_count" -eq 0 ]; then
|
|
212
|
+
echo " scenario: \"nothing_actionable\""
|
|
184
213
|
else
|
|
185
|
-
echo " scenario: \"
|
|
214
|
+
echo " scenario: \"has_options\""
|
|
186
215
|
fi
|
|
@@ -22,6 +22,7 @@ Either way: Transform specifications into actionable phases, tasks, and acceptan
|
|
|
22
22
|
- **Specification content** (required) - The validated decisions and requirements to plan from
|
|
23
23
|
- **Topic name** (optional) - Will derive from specification if not provided
|
|
24
24
|
- **Output format preference** (optional) - Will ask if not specified
|
|
25
|
+
- **Recommended output format** (optional) - A format suggestion for consistency with existing plans
|
|
25
26
|
- **Cross-cutting references** (optional) - Cross-cutting specifications that inform technical decisions in this plan
|
|
26
27
|
|
|
27
28
|
**Before proceeding**, verify the required input is available and unambiguous. If anything is missing or unclear, **STOP** — do not proceed until resolved.
|
|
@@ -97,7 +98,21 @@ Read **[output-formats.md](references/output-formats.md)**, find the entry match
|
|
|
97
98
|
|
|
98
99
|
#### If no Plan Index File exists
|
|
99
100
|
|
|
100
|
-
First, choose the Output Format.
|
|
101
|
+
First, choose the Output Format.
|
|
102
|
+
|
|
103
|
+
**If a recommended output format was provided** (non-empty, not "none"):
|
|
104
|
+
|
|
105
|
+
Present the recommendation:
|
|
106
|
+
|
|
107
|
+
> "Existing plans use **{format}**. Use the same format for consistency?
|
|
108
|
+
> - **yes** — use {format}
|
|
109
|
+
> - **no** — see all available formats"
|
|
110
|
+
|
|
111
|
+
**STOP.** Wait for user choice. If declined, fall through to the full list below.
|
|
112
|
+
|
|
113
|
+
**If no recommendation, or user declined:**
|
|
114
|
+
|
|
115
|
+
Present the formats from **[output-formats.md](references/output-formats.md)** to the user — including description, pros, cons, and "best for". Number each format and ask the user to pick.
|
|
101
116
|
|
|
102
117
|
**STOP.** Wait for the user to choose.
|
|
103
118
|
|
|
@@ -88,6 +88,17 @@ Present the task list to the user for review.
|
|
|
88
88
|
|
|
89
89
|
Work through each task in the phase's task table, in order.
|
|
90
90
|
|
|
91
|
+
### Parallel authoring (optional optimization)
|
|
92
|
+
|
|
93
|
+
After the first `pending` task in a phase is approved, you may invoke multiple Step B agents concurrently for tasks you judge to be independent — where the authored detail of one would not inform the other. This is an invocation optimization only; the approval flow is unchanged:
|
|
94
|
+
|
|
95
|
+
- Present tasks one at a time, in order
|
|
96
|
+
- Each task still requires explicit user approval before logging
|
|
97
|
+
- If user feedback on a presented task changes context that could affect any already-authored task waiting to be presented, discard those results and re-invoke Step B
|
|
98
|
+
- When uncertain about independence, default to sequential — it is always safe
|
|
99
|
+
|
|
100
|
+
Never parallelize the first `pending` task in a phase. Never parallelize across phases.
|
|
101
|
+
|
|
91
102
|
#### If the task status is `authored`
|
|
92
103
|
|
|
93
104
|
Already written. Present a brief summary:
|