@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.
@@ -53,9 +53,9 @@ Compare the `format:` field across all discovered plans.
53
53
  ```
54
54
  Mixed output formats detected:
55
55
 
56
- - authentication: beads
57
- - billing-system: linear
58
- - notifications: beads
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: beads)
81
+ Plan: authentication (format: {format})
82
82
  - billing-system: Invoice generation (unresolved)
83
- - user-management: User profiles → beads-7x2k (resolved)
83
+ - user-management: User profiles → {task-id} (resolved)
84
84
 
85
- Plan: billing-system (format: beads)
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: beads)
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: beads-b7c2.1.1 (Invoice generation)
137
- - notifications → authentication: beads-a3f8.1.2 (Session management)
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: beads-9m3p
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: local-markdown
109
- 2. {topic-2} (concluded) - format: local-markdown
110
- 3. {topic-3} (in-progress) - format: beads
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 status
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, local-markdown)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leeovery/claude-technical-workflows",
3
- "version": "2.0.43",
3
+ "version": "2.0.44",
4
4
  "description": "Technical workflow skills & commands for Claude Code",
5
5
  "license": "MIT",
6
6
  "author": "Lee Overy <me@leeovery.com>",
@@ -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:-"local-markdown"}
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:-"local-markdown"}
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
- frontmatter="---
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: local-markdown
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: local-markdown
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="local-markdown" # Default format
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
- frontmatter="---
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")
@@ -53,7 +53,7 @@ The plan file in `docs/workflow/planning/{topic}.md` serves as the reference poi
53
53
  ```markdown
54
54
  ---
55
55
  format: backlog-md
56
- project: {TOPIC_NAME}
56
+ plan_id: {TOPIC_NAME}
57
57
  ---
58
58
 
59
59
  # Plan Reference: {Topic Name}
@@ -240,7 +240,7 @@ Create `docs/workflow/planning/{topic}.md`:
240
240
  ```markdown
241
241
  ---
242
242
  format: beads
243
- epic: bd-{EPIC_ID}
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
- epic: bd-a3f8
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 `epic` ID from frontmatter
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
- project: {PROJECT_NAME}
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
- project: USER-AUTH-FEATURE
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 `project_id` from frontmatter
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