steerdev 1.1.2__tar.gz → 1.1.3__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 (116) hide show
  1. {steerdev-1.1.2 → steerdev-1.1.3}/PKG-INFO +1 -1
  2. {steerdev-1.1.2 → steerdev-1.1.3}/pyproject.toml +1 -1
  3. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/prompt/builder.py +1 -0
  4. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/runner.py +4 -3
  5. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/worktree.py +2 -2
  6. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_preparation.py +3 -3
  7. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_runner_merge_modes.py +2 -0
  8. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_runner_worktrees.py +4 -4
  9. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_worktree.py +2 -2
  10. {steerdev-1.1.2 → steerdev-1.1.3}/.github/workflows/pre-commit.yml +0 -0
  11. {steerdev-1.1.2 → steerdev-1.1.3}/.github/workflows/publish.yml +0 -0
  12. {steerdev-1.1.2 → steerdev-1.1.3}/.gitignore +0 -0
  13. {steerdev-1.1.2 → steerdev-1.1.3}/.pre-commit-config.yaml +0 -0
  14. {steerdev-1.1.2 → steerdev-1.1.3}/AGENTS.md +0 -0
  15. {steerdev-1.1.2 → steerdev-1.1.3}/CLAUDE.md +0 -0
  16. {steerdev-1.1.2 → steerdev-1.1.3}/README.md +0 -0
  17. {steerdev-1.1.2 → steerdev-1.1.3}/scripts/pre-commit-version-bump.sh +0 -0
  18. {steerdev-1.1.2 → steerdev-1.1.3}/snapshots/steerdev-agent-v1/Dockerfile +0 -0
  19. {steerdev-1.1.2 → steerdev-1.1.3}/snapshots/steerdev-agent-v1/start-agent.sh +0 -0
  20. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/__init__.py +0 -0
  21. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/agent_loop.py +0 -0
  22. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/__init__.py +0 -0
  23. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/activity.py +0 -0
  24. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/agents.py +0 -0
  25. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/canals.py +0 -0
  26. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/client.py +0 -0
  27. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/commands.py +0 -0
  28. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/configs.py +0 -0
  29. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/context.py +0 -0
  30. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/events.py +0 -0
  31. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/hooks.py +0 -0
  32. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/implementation_plan.py +0 -0
  33. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/merger.py +0 -0
  34. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/messages.py +0 -0
  35. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/prd.py +0 -0
  36. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/reports.py +0 -0
  37. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/runs.py +0 -0
  38. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/sessions.py +0 -0
  39. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/specs.py +0 -0
  40. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/tasks.py +0 -0
  41. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/workflow_runs.py +0 -0
  42. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/api/workflows.py +0 -0
  43. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/cli.py +0 -0
  44. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/config/__init__.py +0 -0
  45. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/config/models.py +0 -0
  46. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/config/platform.py +0 -0
  47. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/config/settings.py +0 -0
  48. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/evidence.py +0 -0
  49. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/evidence_assets.py +0 -0
  50. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/executor/__init__.py +0 -0
  51. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/executor/base.py +0 -0
  52. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/executor/claude.py +0 -0
  53. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/executor/stream.py +0 -0
  54. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/handlers/__init__.py +0 -0
  55. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/handlers/prd.py +0 -0
  56. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/integration.py +0 -0
  57. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/prompt/__init__.py +0 -0
  58. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/prompt/templates.py +0 -0
  59. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/prompt/workflow_template.py +0 -0
  60. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/py.typed +0 -0
  61. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/retry.py +0 -0
  62. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/__init__.py +0 -0
  63. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/claude_setup.py +0 -0
  64. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/repo_setup.py +0 -0
  65. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/ci/canal-integration.yml +0 -0
  66. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/claude_md_section.md +0 -0
  67. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/settings.json +0 -0
  68. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-activity-skill/SKILL.md +0 -0
  69. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-canal-workflow-skill/SKILL.md +0 -0
  70. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-context-skill/SKILL.md +0 -0
  71. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-git-workflow-skill/SKILL.md +0 -0
  72. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-merge-into-canal-skill/SKILL.md +0 -0
  73. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-progress-logging-skill/SKILL.md +0 -0
  74. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-single-task-merge-skill/SKILL.md +0 -0
  75. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-specs-management-skill/SKILL.md +0 -0
  76. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-task-management-skill/SKILL.md +0 -0
  77. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/skills/steerdev-wave-tasks-merge-skill/SKILL.md +0 -0
  78. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/steerdev.yaml +0 -0
  79. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/setup/templates/worktrunk.config.toml +0 -0
  80. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/update_check.py +0 -0
  81. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/version.py +0 -0
  82. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workflow/__init__.py +0 -0
  83. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workflow/context.py +0 -0
  84. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workflow/executor.py +0 -0
  85. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workflow/memory.py +0 -0
  86. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workspace/__init__.py +0 -0
  87. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workspace/preparation.py +0 -0
  88. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workspace/project_manager.py +0 -0
  89. {steerdev-1.1.2 → steerdev-1.1.3}/src/steerdev_agent/workspace/tool_detection.py +0 -0
  90. {steerdev-1.1.2 → steerdev-1.1.3}/tests/__init__.py +0 -0
  91. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_agent_loop.py +0 -0
  92. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_agent_loop_extended.py +0 -0
  93. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_agents_api.py +0 -0
  94. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_api_client.py +0 -0
  95. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_claude_executor.py +0 -0
  96. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_claude_setup.py +0 -0
  97. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_client_methods.py +0 -0
  98. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_commands_api.py +0 -0
  99. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_config.py +0 -0
  100. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_config_extended.py +0 -0
  101. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_conflict_mitigation.py +0 -0
  102. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_context_search.py +0 -0
  103. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_executor.py +0 -0
  104. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_platform_config.py +0 -0
  105. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_prompt.py +0 -0
  106. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_reports_client.py +0 -0
  107. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_retry.py +0 -0
  108. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_stream_parser.py +0 -0
  109. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_tasks.py +0 -0
  110. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_version.py +0 -0
  111. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_workflow_context.py +0 -0
  112. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_workflow_memory.py +0 -0
  113. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_workflow_prompt_template.py +0 -0
  114. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_workflow_runs_api.py +0 -0
  115. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_workspace.py +0 -0
  116. {steerdev-1.1.2 → steerdev-1.1.3}/tests/test_workspace_extended.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerdev
3
- Version: 1.1.2
3
+ Version: 1.1.3
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 = "1.1.2"
3
+ version = "1.1.3"
4
4
  description = "Backend task runner for steerdev.com - orchestrates CLI coding agents with activity reporting"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -24,6 +24,7 @@ class WaveContext(BaseModel):
24
24
 
25
25
  wave_number: int = Field(description="Current wave number")
26
26
  total_waves: int = Field(description="Total number of waves")
27
+ wave_name: str = Field(default="", description="Unique wave name (e.g., wave-532d5c)")
27
28
  wave_description: str = Field(default="", description="Description of this wave")
28
29
  wave_tasks_summary: str = Field(default="", description="Summary of tasks in this wave")
29
30
  completed_waves_summary: str = Field(default="", description="Summary of completed waves")
@@ -111,6 +111,7 @@ def build_wave_context(wave_response: dict[str, Any]) -> WaveContext | None:
111
111
  return WaveContext(
112
112
  wave_number=wave_info.get("wave_number", 1),
113
113
  total_waves=wave_info.get("total_waves", 1),
114
+ wave_name=wave_info.get("name", ""),
114
115
  wave_description=wave_info.get("description", ""),
115
116
  wave_tasks_summary=tasks_summary,
116
117
  completed_waves_summary=completed_summary,
@@ -187,13 +188,13 @@ def compute_worktree_name(task_id: str, wave_context: WaveContext | None = None)
187
188
  """Compute the git worktree name for a task execution.
188
189
 
189
190
  Naming conventions:
190
- - Wave-based: "wave-{wave_number}" (e.g., "wave-3")
191
+ - Wave-based: "{wave_name}" (e.g., "wave-532d5c")
191
192
  - Task-based: "task-{first_8_chars}" (e.g., "task-abc12345")
192
193
 
193
194
  The worktree lifecycle is managed by Claude CLI via the --worktree flag.
194
195
  """
195
196
  if wave_context:
196
- return f"wave-{wave_context.wave_number}"
197
+ return wave_context.wave_name or f"wave-{wave_context.wave_number}"
197
198
  task_short = task_id[:8] if len(task_id) > 8 else task_id
198
199
  return f"task-{task_short}"
199
200
 
@@ -643,7 +644,7 @@ class Runner:
643
644
 
644
645
  wave_id: str | None = None
645
646
  if wave_context:
646
- wave_id = f"wave-{wave_context.wave_number}"
647
+ wave_id = wave_context.wave_name or f"wave-{wave_context.wave_number}"
647
648
 
648
649
  try:
649
650
  with ReportsClient(api_key=self._api_key) as client:
@@ -213,7 +213,7 @@ def compute_branch_name(
213
213
  """Compute the branch name for a task or wave.
214
214
 
215
215
  Naming conventions aligned with merge skill branch patterns:
216
- - Wave: "wave/{wave_number}" (e.g., "wave/3")
216
+ - Wave: "{wave_name}" (e.g., "wave-532d5c")
217
217
  - Task with external ID: "task/{TICKET-ID}-{slug}" (e.g., "task/PROJ-123-add-auth")
218
218
  - Task without external ID: "task/{short-id}-{slug}" (e.g., "task/abc12345-add-auth")
219
219
 
@@ -225,7 +225,7 @@ def compute_branch_name(
225
225
  Branch name string.
226
226
  """
227
227
  if wave_context:
228
- return f"wave/{wave_context.wave_number}"
228
+ return wave_context.wave_name or f"wave-{wave_context.wave_number}"
229
229
 
230
230
  # Try external ticket ID first (e.g., Linear "PROJ-123")
231
231
  external_id = task.get("linear_identifier") or task.get("external_id")
@@ -211,7 +211,7 @@ class TestWorkspacePreparationInPlace:
211
211
  """Continuing a wave stays on the wave branch, only fetches."""
212
212
  from steerdev_agent.prompt.builder import WaveContext
213
213
 
214
- wave_ctx = WaveContext(wave_number=3, total_waves=5)
214
+ wave_ctx = WaveContext(wave_number=3, total_waves=5, wave_name="wave-a1b2c3")
215
215
 
216
216
  prep = WorkspacePreparation(
217
217
  working_directory=Path("/tmp/repo"),
@@ -227,7 +227,7 @@ class TestWorkspacePreparationInPlace:
227
227
  if "rev-parse --is-inside-work-tree" in cmd:
228
228
  return (0, "true", "")
229
229
  if "branch --show-current" in cmd:
230
- return (0, "wave/3", "") # Already on wave branch
230
+ return (0, "wave-a1b2c3", "") # Already on wave branch
231
231
  if "fetch origin" in cmd:
232
232
  return (0, "", "")
233
233
  return (0, "", "")
@@ -236,7 +236,7 @@ class TestWorkspacePreparationInPlace:
236
236
  result = await prep.prepare(sample_task, wave_ctx)
237
237
 
238
238
  assert result.success is True
239
- assert result.branch_name == "wave/3"
239
+ assert result.branch_name == "wave-a1b2c3"
240
240
  # Should NOT have checkout commands (stayed on branch)
241
241
  checkout_cmds = [c for c in calls if c[0] == "checkout"]
242
242
  assert len(checkout_cmds) == 0
@@ -12,6 +12,7 @@ def _make_wave_context() -> WaveContext:
12
12
  return WaveContext(
13
13
  wave_number=3,
14
14
  total_waves=5,
15
+ wave_name="wave-a1b2c3",
15
16
  wave_description="User management improvements",
16
17
  wave_tasks_summary=" [todo] Add user endpoint",
17
18
  completed_waves_summary=" - Wave 2: Auth cleanup",
@@ -23,6 +24,7 @@ def _make_wave_response(task_id: str = "task-123") -> dict:
23
24
  "wave": {
24
25
  "wave_number": 3,
25
26
  "total_waves": 5,
27
+ "name": "wave-a1b2c3",
26
28
  "description": "User management improvements",
27
29
  },
28
30
  "context": {
@@ -25,13 +25,13 @@ class TestComputeBranchName:
25
25
 
26
26
  def test_wave_based(self):
27
27
  task = {"id": "abc123", "title": "Something"}
28
- wave = WaveContext(wave_number=3, total_waves=5)
29
- assert compute_branch_name(task, wave) == "wave/3"
28
+ wave = WaveContext(wave_number=3, total_waves=5, wave_name="wave-a1b2c3")
29
+ assert compute_branch_name(task, wave) == "wave-a1b2c3"
30
30
 
31
31
  def test_wave_takes_precedence(self):
32
32
  task = {"id": "abc12345xyz", "title": "Add auth", "linear_identifier": "PROJ-123"}
33
- wave = WaveContext(wave_number=2, total_waves=4)
34
- assert compute_branch_name(task, wave) == "wave/2"
33
+ wave = WaveContext(wave_number=2, total_waves=4, wave_name="wave-f1e2d3")
34
+ assert compute_branch_name(task, wave) == "wave-f1e2d3"
35
35
 
36
36
  def test_title_slugified(self):
37
37
  task = {"id": "abc12345xyz", "title": "Add User Authentication & OAuth 2.0"}
@@ -37,8 +37,8 @@ class TestComputeBranchName:
37
37
  from steerdev_agent.prompt.builder import WaveContext
38
38
 
39
39
  task = {"id": "abc", "title": "test"}
40
- wave = WaveContext(wave_number=5, total_waves=10)
41
- assert compute_branch_name(task, wave) == "wave/5"
40
+ wave = WaveContext(wave_number=5, total_waves=10, wave_name="wave-d4e5f6")
41
+ assert compute_branch_name(task, wave) == "wave-d4e5f6"
42
42
 
43
43
  def test_task_with_linear_id(self):
44
44
  task = {"id": "abc12345xyz", "title": "Add auth", "linear_identifier": "PROJ-42"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes