steerdev 0.5.4__tar.gz → 0.5.6__tar.gz

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.
Files changed (66) hide show
  1. {steerdev-0.5.4 → steerdev-0.5.6}/PKG-INFO +1 -1
  2. {steerdev-0.5.4 → steerdev-0.5.6}/pyproject.toml +1 -1
  3. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/claude_md_section.md +79 -10
  4. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/skills/git-workflow/SKILL.md +120 -12
  5. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/skills/task-management/SKILL.md +117 -10
  6. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/version.py +23 -11
  7. {steerdev-0.5.4 → steerdev-0.5.6}/.github/workflows/pre-commit.yml +0 -0
  8. {steerdev-0.5.4 → steerdev-0.5.6}/.github/workflows/publish.yml +0 -0
  9. {steerdev-0.5.4 → steerdev-0.5.6}/.gitignore +0 -0
  10. {steerdev-0.5.4 → steerdev-0.5.6}/.pre-commit-config.yaml +0 -0
  11. {steerdev-0.5.4 → steerdev-0.5.6}/AGENTS.md +0 -0
  12. {steerdev-0.5.4 → steerdev-0.5.6}/CLAUDE.md +0 -0
  13. {steerdev-0.5.4 → steerdev-0.5.6}/README.md +0 -0
  14. {steerdev-0.5.4 → steerdev-0.5.6}/scripts/pre-commit-version-bump.sh +0 -0
  15. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/__init__.py +0 -0
  16. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/__init__.py +0 -0
  17. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/activity.py +0 -0
  18. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/agents.py +0 -0
  19. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/client.py +0 -0
  20. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/commands.py +0 -0
  21. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/configs.py +0 -0
  22. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/context.py +0 -0
  23. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/events.py +0 -0
  24. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/hooks.py +0 -0
  25. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/implementation_plan.py +0 -0
  26. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/messages.py +0 -0
  27. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/prd.py +0 -0
  28. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/runs.py +0 -0
  29. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/sessions.py +0 -0
  30. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/specs.py +0 -0
  31. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/tasks.py +0 -0
  32. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/workflow_runs.py +0 -0
  33. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/api/workflows.py +0 -0
  34. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/cli.py +0 -0
  35. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/config/__init__.py +0 -0
  36. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/config/models.py +0 -0
  37. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/config/platform.py +0 -0
  38. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/config/settings.py +0 -0
  39. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/daemon.py +0 -0
  40. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/executor/__init__.py +0 -0
  41. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/executor/base.py +0 -0
  42. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/executor/claude.py +0 -0
  43. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/executor/stream.py +0 -0
  44. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/handlers/__init__.py +0 -0
  45. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/handlers/prd.py +0 -0
  46. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/integration.py +0 -0
  47. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/prompt/__init__.py +0 -0
  48. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/prompt/builder.py +0 -0
  49. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/prompt/templates.py +0 -0
  50. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/py.typed +0 -0
  51. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/runner.py +0 -0
  52. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/__init__.py +0 -0
  53. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/claude_setup.py +0 -0
  54. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/settings.json +0 -0
  55. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/skills/activity/SKILL.md +0 -0
  56. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/skills/context/SKILL.md +0 -0
  57. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/skills/progress-logging/SKILL.md +0 -0
  58. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/skills/specs-management/SKILL.md +0 -0
  59. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/setup/templates/steerdev.yaml +0 -0
  60. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/workflow/__init__.py +0 -0
  61. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/workflow/executor.py +0 -0
  62. {steerdev-0.5.4 → steerdev-0.5.6}/src/steerdev_agent/workflow/memory.py +0 -0
  63. {steerdev-0.5.4 → steerdev-0.5.6}/tests/__init__.py +0 -0
  64. {steerdev-0.5.4 → steerdev-0.5.6}/tests/test_config.py +0 -0
  65. {steerdev-0.5.4 → steerdev-0.5.6}/tests/test_executor.py +0 -0
  66. {steerdev-0.5.4 → steerdev-0.5.6}/tests/test_prompt.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerdev
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: Backend task runner for steerdev.com - orchestrates CLI coding agents with activity reporting
5
5
  Project-URL: Homepage, https://github.com/pentoai/steerdev-agent
6
6
  Project-URL: Repository, https://github.com/pentoai/steerdev-agent
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "steerdev"
3
- version = "0.5.4"
3
+ version = "0.5.6"
4
4
  description = "Backend task runner for steerdev.com - orchestrates CLI coding agents with activity reporting"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -30,14 +30,31 @@ BACKLOG → TODO → IN-PROGRESS → DONE
30
30
 
31
31
  ### Workflow
32
32
 
33
+ #### Standard Mode (one task at a time)
34
+
33
35
  1. Run `steerdev tasks next` to get the next task
34
36
  2. Update task to `in-progress` before starting work
35
- 3. **Create a feature branch** using the task ID: `git checkout -b task/<task-id-short>`
37
+ 3. **Create a feature branch**: `git checkout -b task/<task-id-short>`
36
38
  4. Implement the task
37
39
  5. **Commit your changes** with clear, descriptive commit messages
38
- 6. **Create a pull request** using GitHub CLI: `gh pr create`
40
+ 6. **Push and create a pull request**: `git push -u origin HEAD && gh pr create`
39
41
  7. Update task to `done` with a result summary and PR URL: `--result "Summary of work done. PR: <url>"`
40
42
 
43
+ #### Wave Mode (multiple tasks in one session)
44
+
45
+ When your prompt includes a **"Wave Context"** section, you are in wave mode. One branch and one PR cover the entire wave.
46
+
47
+ 1. **Create a wave branch once**: `git checkout -b wave/<wave-number>` (e.g. `wave/1`)
48
+ 2. For **each task** in the wave:
49
+ a. Update task to `in-progress`
50
+ b. Implement the task
51
+ c. **Commit** with a message that references the task: `[task:<id>] feat: ...`
52
+ d. Update task to `done` with a result summary (no PR yet)
53
+ 3. After **all tasks** are complete:
54
+ a. `git push -u origin HEAD`
55
+ b. Create a **single PR** for the wave (title: `Wave <N>: <description>`, body lists all completed tasks)
56
+ c. Update all tasks with the PR URL
57
+
41
58
  ### Git Workflow (Required)
42
59
 
43
60
  **You MUST use Git and GitHub CLI to manage your work.** Every task implementation must result in a pull request.
@@ -47,11 +64,13 @@ BACKLOG → TODO → IN-PROGRESS → DONE
47
64
  Create a branch before starting any implementation work:
48
65
 
49
66
  ```bash
50
- # Use task ID for branch name (use first 8 chars of UUID)
67
+ # Standard mode: use task ID (first 8 chars of UUID)
51
68
  git checkout -b task/<short-task-id>
69
+ # Example: git checkout -b task/abc12345
52
70
 
53
- # Example
54
- git checkout -b task/abc12345
71
+ # Wave mode: use wave number
72
+ git checkout -b wave/<wave-number>
73
+ # Example: git checkout -b wave/1
55
74
  ```
56
75
 
57
76
  #### Committing Changes
@@ -78,10 +97,9 @@ Follow conventional commit format:
78
97
 
79
98
  #### Creating Pull Requests
80
99
 
81
- **Always create a PR when completing a task:**
100
+ ##### Standard Mode PR (per task)
82
101
 
83
102
  ```bash
84
- # Push branch and create PR
85
103
  git push -u origin HEAD
86
104
  gh pr create --title "Task: <title>" --body "## Summary
87
105
 
@@ -98,7 +116,29 @@ Task ID: <task-id>
98
116
  - How to test the changes"
99
117
  ```
100
118
 
101
- #### Complete Workflow Example
119
+ ##### Wave Mode PR (per wave)
120
+
121
+ After all wave tasks are complete, create a single PR:
122
+
123
+ ```bash
124
+ git push -u origin HEAD
125
+ gh pr create --title "Wave <N>: <brief description>" --body "## Summary
126
+
127
+ Wave <N> implementation covering <number> tasks.
128
+
129
+ ## Tasks Completed
130
+ - [task:<id1>] <title1>
131
+ - [task:<id2>] <title2>
132
+
133
+ ## Changes Made
134
+ - Change 1
135
+ - Change 2
136
+
137
+ ## Testing
138
+ - How to test the changes"
139
+ ```
140
+
141
+ #### Standard Workflow Example
102
142
 
103
143
  ```bash
104
144
  # 1. Get next task
@@ -122,9 +162,38 @@ gh pr create --title "Add user data endpoint" --body "Implementation for task ab
122
162
  steerdev tasks update abc123-... --status done --result "Implemented user data endpoint. PR: https://github.com/org/repo/pull/42"
123
163
  ```
124
164
 
125
- **IMPORTANT:** Never leave work uncommitted. Always create a PR before marking a task as `done`.
165
+ #### Wave Workflow Example
166
+
167
+ ```bash
168
+ # 1. Create wave branch (once for the entire wave)
169
+ git checkout -b wave/1
170
+
171
+ # 2. First task
172
+ steerdev tasks update task-aaa... --status in-progress
173
+ # ... implement ...
174
+ git add . && git commit -m "[task:task-aaa] feat: add user endpoint"
175
+ steerdev tasks update task-aaa... --status done --result "Added user endpoint"
176
+
177
+ # 3. Second task (same branch)
178
+ steerdev tasks update task-bbb... --status in-progress
179
+ # ... implement ...
180
+ git add . && git commit -m "[task:task-bbb] fix: validate email format"
181
+ steerdev tasks update task-bbb... --status done --result "Fixed email validation"
182
+
183
+ # 4. All tasks done — push and create single PR
184
+ git push -u origin HEAD
185
+ gh pr create --title "Wave 1: User management improvements" \
186
+ --body "## Tasks Completed
187
+ - [task:task-aaa] Add user endpoint
188
+ - [task:task-bbb] Fix email validation"
189
+ # Returns: https://github.com/org/repo/pull/42
190
+
191
+ # 5. Update all tasks with PR URL
192
+ steerdev tasks update task-aaa... --result "PR: https://github.com/org/repo/pull/42"
193
+ steerdev tasks update task-bbb... --result "PR: https://github.com/org/repo/pull/42"
194
+ ```
126
195
 
127
- **Wave Mode:** If you are running in **wave mode** (processing multiple tasks in a single session), **only create the PR at the end of the wave**, not after each individual task. Commit your changes after each task, but defer the `git push` and PR creation until all tasks in the wave are completed.
196
+ **IMPORTANT:** Never leave work uncommitted. Always create a PR before marking a task as `done`.
128
197
 
129
198
  ### Status Values
130
199
 
@@ -10,7 +10,7 @@ This skill provides Git workflow commands with steerdev conventions for branch m
10
10
 
11
11
  ## Available Commands
12
12
 
13
- ### Create Task Branch
13
+ ### Create Task Branch (Standard Mode)
14
14
 
15
15
  ```bash
16
16
  steerdev git branch TASK_ID [--name NAME]
@@ -39,6 +39,22 @@ steerdev git branch abc12345-def6-7890-... --name auth-flow
39
39
  - If branch already exists, switches to it
40
40
  - If branch doesn't exist, creates and switches to it
41
41
 
42
+ ### Create Wave Branch (Wave Mode)
43
+
44
+ In wave mode, create a single branch for the entire wave instead of per-task branches:
45
+
46
+ ```bash
47
+ git checkout -b wave/<wave-number>
48
+
49
+ # Example
50
+ git checkout -b wave/1
51
+ ```
52
+
53
+ **Behavior:**
54
+ - Create the wave branch **once** at the start of the wave
55
+ - All tasks in the wave are committed to this branch
56
+ - Do not create per-task branches in wave mode
57
+
42
58
  ### Create Pull Request
43
59
 
44
60
  ```bash
@@ -53,7 +69,8 @@ Create a pull request using GitHub CLI with steerdev conventions.
53
69
  - `--task-id`: Task ID to reference in PR
54
70
  - `--draft`, `-d`: Create as draft PR
55
71
 
56
- **Examples:**
72
+ #### Standard Mode PR (per task)
73
+
57
74
  ```bash
58
75
  # Simple PR
59
76
  steerdev git pr --title "Add user authentication"
@@ -80,6 +97,29 @@ steerdev git pr \
80
97
  --draft
81
98
  ```
82
99
 
100
+ #### Wave Mode PR (per wave)
101
+
102
+ After all wave tasks are complete, create a single PR:
103
+
104
+ ```bash
105
+ steerdev git pr \
106
+ --title "Wave <N>: <brief description>" \
107
+ --body "## Summary
108
+
109
+ Wave <N> implementation covering <number> tasks.
110
+
111
+ ## Tasks Completed
112
+ - [task:<id1>] <title1>
113
+ - [task:<id2>] <title2>
114
+
115
+ ## Changes Made
116
+ - Change 1
117
+ - Change 2
118
+
119
+ ## Testing
120
+ - How to test the changes"
121
+ ```
122
+
83
123
  **Note:** Requires GitHub CLI (`gh`) to be installed and authenticated.
84
124
 
85
125
  ### Check Git Status
@@ -109,6 +149,8 @@ Status: 2 ahead, 0 behind
109
149
 
110
150
  ## Complete Workflow Example
111
151
 
152
+ ### Standard Workflow Example
153
+
112
154
  ```bash
113
155
  # 1. Get next task
114
156
  steerdev tasks next
@@ -175,9 +217,65 @@ steerdev tasks update abc12345... \
175
217
  --result "Implemented auth. PR: https://github.com/org/repo/pull/42"
176
218
  ```
177
219
 
220
+ ### Wave Workflow Example
221
+
222
+ ```bash
223
+ # 1. Create wave branch (once for the entire wave)
224
+ git checkout -b wave/1
225
+
226
+ # --- Task 1 ---
227
+ steerdev tasks update task-aaa... --status started
228
+
229
+ # Create progress log
230
+ TIMESTAMP=$(date -u +%Y%m%d_%H%M%S)
231
+ DOC_FILE="docs/${TIMESTAMP}_wave_1.md"
232
+ echo '{"timestamp":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","task_id":"task-aaa","event":"started","message":"Wave 1: starting task 1"}' >> docs/progress.jsonl
233
+
234
+ # ... implement task 1 ...
235
+ git add .
236
+ git commit -m "[task:task-aaa] feat: add user endpoint"
237
+ steerdev tasks update task-aaa... --status completed \
238
+ --result "Added user endpoint"
239
+
240
+ # --- Task 2 ---
241
+ steerdev tasks update task-bbb... --status started
242
+ echo '{"timestamp":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","task_id":"task-bbb","event":"started","message":"Wave 1: starting task 2"}' >> docs/progress.jsonl
243
+
244
+ # ... implement task 2 ...
245
+ git add .
246
+ git commit -m "[task:task-bbb] fix: validate email format"
247
+ steerdev tasks update task-bbb... --status completed \
248
+ --result "Fixed email validation"
249
+
250
+ # --- All tasks done — push and create single PR ---
251
+ git push -u origin HEAD
252
+ steerdev git pr \
253
+ --title "Wave 1: User management improvements" \
254
+ --body "## Summary
255
+
256
+ Wave 1 implementation covering 2 tasks.
257
+
258
+ ## Tasks Completed
259
+ - [task:task-aaa] Add user endpoint
260
+ - [task:task-bbb] Fix email validation
261
+
262
+ ## Changes Made
263
+ - New user CRUD endpoint
264
+ - Email format validation on signup
265
+
266
+ ## Testing
267
+ - Run \`npm test\` to verify"
268
+ # Returns: https://github.com/org/repo/pull/42
269
+
270
+ # Log completion and update all tasks with PR URL
271
+ echo '{"timestamp":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","task_id":"wave-1","event":"completed","message":"Wave 1 complete","pr_url":"https://github.com/org/repo/pull/42"}' >> docs/progress.jsonl
272
+ steerdev tasks update task-aaa... --result "PR: https://github.com/org/repo/pull/42"
273
+ steerdev tasks update task-bbb... --result "PR: https://github.com/org/repo/pull/42"
274
+ ```
275
+
178
276
  ## Branch Naming Convention
179
277
 
180
- Branches follow the pattern: `task/<short-task-id>[-optional-suffix]`
278
+ **Standard mode** — branches follow the pattern: `task/<short-task-id>[-optional-suffix]`
181
279
 
182
280
  - `task/abc12345` - Basic task branch
183
281
  - `task/abc12345-auth` - With descriptive suffix
@@ -185,6 +283,11 @@ Branches follow the pattern: `task/<short-task-id>[-optional-suffix]`
185
283
 
186
284
  The short task ID is the first 8 characters of the full UUID.
187
285
 
286
+ **Wave mode** — branches follow the pattern: `wave/<wave-number>`
287
+
288
+ - `wave/1` - First wave
289
+ - `wave/2` - Second wave
290
+
188
291
  ## PR Conventions
189
292
 
190
293
  Pull requests created via this skill include:
@@ -197,16 +300,21 @@ Pull requests created via this skill include:
197
300
 
198
301
  ## Important Rules
199
302
 
200
- 1. **Always create a branch** before starting work
303
+ **Always:**
304
+ 1. **Create a branch** before starting work
201
305
  2. **Commit frequently** with descriptive messages
202
- 3. **Create PR before marking task complete**
203
- 4. **Include PR URL** in task completion result
204
- 5. **Log progress** to `docs/progress.jsonl` (see Progress Logging skill)
205
- 6. **Log completion** with PR URL before marking task done
206
-
207
- ## Wave Mode
208
-
209
- If you are running in **wave mode** (processing multiple tasks in a single session), **only create the PR at the end of the wave**, not after each individual task. Commit your changes after each task, but defer the `git push` and `gh pr create` until all tasks in the wave are completed. The PR should then reference all tasks completed in the wave.
306
+ 3. **Log progress** to `docs/progress.jsonl` (see Progress Logging skill)
307
+ 4. **Log completion** with PR URL before marking task done
308
+
309
+ **Standard mode:**
310
+ 5. **Create a PR per task** before marking it as `completed`
311
+ 6. **Include PR URL** in the task result summary
312
+
313
+ **Wave mode:**
314
+ 5. **One branch per wave** (`wave/<N>`) — do not create per-task branches
315
+ 6. **Commit per task** with `[task:<id>]` prefix for traceability
316
+ 7. **One PR per wave** — defer `git push` and `gh pr create` until all wave tasks are done
317
+ 8. **Update all tasks** with the wave PR URL after creating the PR
210
318
 
211
319
  ## Prerequisites
212
320
 
@@ -110,6 +110,8 @@ Create a new task for discovered work items.
110
110
 
111
111
  ## Workflow
112
112
 
113
+ ### Standard Mode (one task at a time)
114
+
113
115
  1. **On start**: Run `steerdev tasks next` to get the next task
114
116
  2. **Update task** to `started` before starting work
115
117
  3. **Create progress log**: Create `docs/{timestamp}_{task_slug}.md` and log `started` event to `docs/progress.jsonl`
@@ -122,6 +124,25 @@ Create a new task for discovered work items.
122
124
  10. **Update task** to `completed` with a result summary and PR URL
123
125
  11. **Fetch next task** and repeat
124
126
 
127
+ ### Wave Mode (multiple tasks in one session)
128
+
129
+ When your prompt includes a **"Wave Context"** section, you are in wave mode. One branch and one PR cover the entire wave.
130
+
131
+ 1. **Create a wave branch once**: `git checkout -b wave/<wave-number>` (e.g. `wave/1`)
132
+ 2. For **each task** in the wave:
133
+ a. Run `steerdev tasks next` (or pick the next task from the wave context)
134
+ b. **Update task** to `started`
135
+ c. **Create progress log** and log `started` event
136
+ d. **Implement** the task
137
+ e. **Verify visually** if applicable
138
+ f. **Commit** with a message referencing the task: `[task:<id>] feat: ...`
139
+ g. **Update task** to `completed` with a result summary (no PR yet)
140
+ 3. After **all wave tasks** are complete:
141
+ a. `git push -u origin HEAD`
142
+ b. Create a **single PR** for the wave (title: `Wave <N>: <description>`, body lists all completed tasks)
143
+ c. **Log completion** with PR URL
144
+ d. **Update all tasks** with the PR URL
145
+
125
146
  **IMPORTANT**: Always write progress logs. See the Progress Logging skill for details.
126
147
 
127
148
  ## Visual Verification for Web Changes (Required)
@@ -216,11 +237,13 @@ When creating pull requests for visual changes, mention that screenshots were ta
216
237
  Create a branch before starting any implementation work:
217
238
 
218
239
  ```bash
219
- # Use task ID for branch name (use first 8 chars of UUID)
240
+ # Standard mode: use task ID (first 8 chars of UUID)
220
241
  git checkout -b task/<short-task-id>
242
+ # Example: git checkout -b task/abc12345
221
243
 
222
- # Example
223
- git checkout -b task/abc12345
244
+ # Wave mode: use wave number
245
+ git checkout -b wave/<wave-number>
246
+ # Example: git checkout -b wave/1
224
247
  ```
225
248
 
226
249
  ### Committing Changes
@@ -228,9 +251,18 @@ git checkout -b task/abc12345
228
251
  Make atomic commits with clear, descriptive messages:
229
252
 
230
253
  ```bash
254
+ # Standard mode
231
255
  git add .
232
256
  git commit -m "feat: implement user authentication
233
257
 
258
+ - Add JWT token generation
259
+ - Create login/logout endpoints
260
+ - Add auth middleware"
261
+
262
+ # Wave mode — prefix with [task:<id>] for traceability
263
+ git add .
264
+ git commit -m "[task:abc12345] feat: implement user authentication
265
+
234
266
  - Add JWT token generation
235
267
  - Create login/logout endpoints
236
268
  - Add auth middleware"
@@ -246,10 +278,9 @@ Follow conventional commit format:
246
278
 
247
279
  ### Creating Pull Requests
248
280
 
249
- **Always create a PR when completing a task:**
281
+ #### Standard Mode PR (per task)
250
282
 
251
283
  ```bash
252
- # Push branch and create PR
253
284
  git push -u origin HEAD
254
285
  gh pr create --title "Task: <title>" --body "## Summary
255
286
 
@@ -266,19 +297,49 @@ Task ID: <task-id>
266
297
  - How to test the changes"
267
298
  ```
268
299
 
300
+ #### Wave Mode PR (per wave)
301
+
302
+ After all wave tasks are complete, create a single PR:
303
+
304
+ ```bash
305
+ git push -u origin HEAD
306
+ gh pr create --title "Wave <N>: <brief description>" --body "## Summary
307
+
308
+ Wave <N> implementation covering <number> tasks.
309
+
310
+ ## Tasks Completed
311
+ - [task:<id1>] <title1>
312
+ - [task:<id2>] <title2>
313
+
314
+ ## Changes Made
315
+ - Change 1
316
+ - Change 2
317
+
318
+ ## Testing
319
+ - How to test the changes"
320
+ ```
321
+
269
322
  ### Important Rules
270
323
 
271
- - **Never leave work uncommitted** - Always commit before stopping work
272
- - **Always create a PR** before marking a task as `completed`
273
- - **Include PR URL** in the task result summary
324
+ **Always:**
325
+ - **Never leave work uncommitted** always commit before stopping work
274
326
  - **Use descriptive commit messages** that explain the "why" not just the "what"
327
+ - **Log progress** to `docs/progress.jsonl`
275
328
 
276
- ### Wave Mode
329
+ **Standard mode:**
330
+ - **Create a PR per task** before marking it as `completed`
331
+ - **Include PR URL** in the task result summary
277
332
 
278
- If you are running in **wave mode** (processing multiple tasks in a single session), **only create the PR at the end of the wave**, not after each individual task. Commit your changes after each task, but defer the `git push` and `gh pr create` until all tasks in the wave are completed. The PR should then reference all tasks completed in the wave.
333
+ **Wave mode:**
334
+ - **One branch per wave** (`wave/<N>`) — do not create per-task branches
335
+ - **Commit per task** with `[task:<id>]` prefix for traceability
336
+ - **One PR per wave** — defer `git push` and `gh pr create` until all wave tasks are done
337
+ - **Update all tasks** with the wave PR URL after creating the PR
279
338
 
280
339
  ## Example Session
281
340
 
341
+ ### Standard Mode Example
342
+
282
343
  ```bash
283
344
  # Get next task
284
345
  steerdev tasks next
@@ -325,6 +386,52 @@ steerdev tasks update abc123-... --status completed \
325
386
  steerdev tasks next
326
387
  ```
327
388
 
389
+ ### Wave Mode Example
390
+
391
+ ```bash
392
+ # 1. Create wave branch (once for the entire wave)
393
+ git checkout -b wave/1
394
+
395
+ # --- Task 1 ---
396
+ steerdev tasks update task-aaa... --status started
397
+ # ... implement task 1 ...
398
+ git add .
399
+ git commit -m "[task:task-aaa] feat: add user endpoint"
400
+ steerdev tasks update task-aaa... --status completed \
401
+ --result "Added user endpoint"
402
+
403
+ # --- Task 2 ---
404
+ steerdev tasks update task-bbb... --status started
405
+ # ... implement task 2 ...
406
+ git add .
407
+ git commit -m "[task:task-bbb] fix: validate email format"
408
+ steerdev tasks update task-bbb... --status completed \
409
+ --result "Fixed email validation"
410
+
411
+ # --- All tasks done — create single PR ---
412
+ git push -u origin HEAD
413
+ gh pr create --title "Wave 1: User management improvements" \
414
+ --body "## Summary
415
+
416
+ Wave 1 implementation covering 2 tasks.
417
+
418
+ ## Tasks Completed
419
+ - [task:task-aaa] Add user endpoint
420
+ - [task:task-bbb] Fix email validation
421
+
422
+ ## Changes Made
423
+ - New user CRUD endpoint
424
+ - Email format validation on signup
425
+
426
+ ## Testing
427
+ - Run \`npm test\` to verify"
428
+ # Returns: https://github.com/org/repo/pull/42
429
+
430
+ # Update all tasks with PR URL
431
+ steerdev tasks update task-aaa... --result "PR: https://github.com/org/repo/pull/42"
432
+ steerdev tasks update task-bbb... --result "PR: https://github.com/org/repo/pull/42"
433
+ ```
434
+
328
435
  ## Adding Comments
329
436
 
330
437
  You can add markdown comments to tasks at any time:
@@ -5,6 +5,7 @@ Provides functions to get and manage the project version from pyproject.toml.
5
5
 
6
6
  import subprocess
7
7
  import tomllib
8
+ from importlib.metadata import PackageNotFoundError, version
8
9
  from pathlib import Path
9
10
 
10
11
 
@@ -14,14 +15,23 @@ def get_project_root() -> Path:
14
15
 
15
16
 
16
17
  def get_version() -> str:
17
- """Get the current project version from pyproject.toml.
18
+ """Get the current project version.
18
19
 
19
- First tries to use `uv version --short`, then falls back to reading
20
- pyproject.toml directly.
20
+ Resolution order:
21
+ 1. Installed package metadata (works when installed via pip/uv)
22
+ 2. `uv version --short` (works in dev with uv)
23
+ 3. Read pyproject.toml directly (works in dev without uv)
21
24
 
22
25
  Returns:
23
- The current version string (e.g., "0.1.0")
26
+ The current version string (e.g., "0.5.4")
24
27
  """
28
+ # 1. Try installed package metadata (always works for installed packages)
29
+ try:
30
+ return version("steerdev")
31
+ except PackageNotFoundError:
32
+ pass
33
+
34
+ # 2. Try uv (dev environment)
25
35
  try:
26
36
  result = subprocess.run(
27
37
  ["uv", "version", "--short"],
@@ -32,13 +42,15 @@ def get_version() -> str:
32
42
  )
33
43
  return result.stdout.strip()
34
44
  except (subprocess.CalledProcessError, FileNotFoundError):
35
- # Fallback: read directly from pyproject.toml
36
- pyproject_path = get_project_root() / "pyproject.toml"
37
- if pyproject_path.exists():
38
- with open(pyproject_path, "rb") as f:
39
- data = tomllib.load(f)
40
- return data.get("project", {}).get("version", "unknown")
41
- return "unknown"
45
+ pass
46
+
47
+ # 3. Fallback: read directly from pyproject.toml (dev environment)
48
+ pyproject_path = get_project_root() / "pyproject.toml"
49
+ if pyproject_path.exists():
50
+ with open(pyproject_path, "rb") as f:
51
+ data = tomllib.load(f)
52
+ return data.get("project", {}).get("version", "unknown")
53
+ return "unknown"
42
54
 
43
55
 
44
56
  def bump_version(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes