steerdev 1.1.48__tar.gz → 1.1.62__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 (158) hide show
  1. steerdev-1.1.62/AGENTS.md +122 -0
  2. {steerdev-1.1.48 → steerdev-1.1.62}/PKG-INFO +27 -4
  3. {steerdev-1.1.48 → steerdev-1.1.62}/README.md +25 -3
  4. steerdev-1.1.62/docs/superpowers/plans/2026-07-15-unified-merge-flow-agent.md +918 -0
  5. {steerdev-1.1.48 → steerdev-1.1.62}/pyproject.toml +2 -1
  6. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/agent_loop.py +40 -4
  7. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/canals.py +19 -22
  8. steerdev-1.1.62/src/steerdev_agent/api/projects.py +58 -0
  9. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/tasks.py +2 -1
  10. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/cli.py +376 -203
  11. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/config/models.py +98 -2
  12. steerdev-1.1.62/src/steerdev_agent/executor/__init__.py +139 -0
  13. steerdev-1.1.62/src/steerdev_agent/executor/acp.py +400 -0
  14. steerdev-1.1.62/src/steerdev_agent/executor/acp_client.py +442 -0
  15. steerdev-1.1.62/src/steerdev_agent/executor/acp_registry.py +154 -0
  16. steerdev-1.1.62/src/steerdev_agent/executor/acp_spec.py +128 -0
  17. steerdev-1.1.62/src/steerdev_agent/executor/acp_stream.py +228 -0
  18. steerdev-1.1.62/src/steerdev_agent/executor/codex.py +137 -0
  19. steerdev-1.1.62/src/steerdev_agent/executor/pi.py +356 -0
  20. steerdev-1.1.62/src/steerdev_agent/executor/pi_stream.py +280 -0
  21. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/git/pr.py +122 -0
  22. steerdev-1.1.62/src/steerdev_agent/merge_settings.py +47 -0
  23. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/runner.py +40 -11
  24. steerdev-1.1.62/src/steerdev_agent/setup/templates/skills/steerdev-merge-into-canal-skill/SKILL.md +13 -0
  25. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/steerdev.yaml +1 -1
  26. steerdev-1.1.62/src/steerdev_agent/workspace/tool_detection.py +90 -0
  27. steerdev-1.1.62/tests/fixtures/fake_acp_echo.py +123 -0
  28. steerdev-1.1.62/tests/test_acp_executor.py +293 -0
  29. steerdev-1.1.62/tests/test_acp_registry.py +104 -0
  30. steerdev-1.1.62/tests/test_acp_stream.py +259 -0
  31. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_agent_loop_extended.py +45 -4
  32. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_agent_loop_wave_pr.py +30 -1
  33. steerdev-1.1.62/tests/test_canal_enroll.py +186 -0
  34. steerdev-1.1.62/tests/test_cli_provider.py +209 -0
  35. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_config.py +13 -2
  36. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_config_extended.py +2 -2
  37. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_conflict_mitigation.py +14 -3
  38. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_executor.py +35 -0
  39. steerdev-1.1.62/tests/test_merge_settings.py +41 -0
  40. steerdev-1.1.62/tests/test_pi_executor.py +332 -0
  41. steerdev-1.1.62/tests/test_projects_api.py +60 -0
  42. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_runner_merge_modes.py +19 -10
  43. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_runner_wave_pr.py +3 -0
  44. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_workspace.py +31 -1
  45. steerdev-1.1.48/AGENTS.md +0 -57
  46. steerdev-1.1.48/src/steerdev_agent/executor/__init__.py +0 -73
  47. steerdev-1.1.48/src/steerdev_agent/setup/templates/skills/steerdev-merge-into-canal-skill/SKILL.md +0 -88
  48. steerdev-1.1.48/src/steerdev_agent/workspace/tool_detection.py +0 -20
  49. {steerdev-1.1.48 → steerdev-1.1.62}/.github/workflows/pre-commit.yml +0 -0
  50. {steerdev-1.1.48 → steerdev-1.1.62}/.github/workflows/publish.yml +0 -0
  51. {steerdev-1.1.48 → steerdev-1.1.62}/.gitignore +0 -0
  52. {steerdev-1.1.48 → steerdev-1.1.62}/.pre-commit-config.yaml +0 -0
  53. {steerdev-1.1.48 → steerdev-1.1.62}/CLAUDE.md +0 -0
  54. {steerdev-1.1.48 → steerdev-1.1.62}/docs/superpowers/plans/2026-06-05-wave-id-implies-unlimited-max-tasks.md +0 -0
  55. {steerdev-1.1.48 → steerdev-1.1.62}/docs/superpowers/specs/2026-06-05-wave-id-implies-unlimited-max-tasks-design.md +0 -0
  56. {steerdev-1.1.48 → steerdev-1.1.62}/scripts/pre-commit-version-bump.sh +0 -0
  57. {steerdev-1.1.48 → steerdev-1.1.62}/snapshots/steerdev-agent-v1/Dockerfile +0 -0
  58. {steerdev-1.1.48 → steerdev-1.1.62}/snapshots/steerdev-agent-v1/start-agent.sh +0 -0
  59. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/__init__.py +0 -0
  60. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/__init__.py +0 -0
  61. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/activity.py +0 -0
  62. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/agents.py +0 -0
  63. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/client.py +0 -0
  64. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/commands.py +0 -0
  65. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/configs.py +0 -0
  66. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/context.py +0 -0
  67. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/events.py +0 -0
  68. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/hooks.py +0 -0
  69. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/implementation_plan.py +0 -0
  70. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/merger.py +0 -0
  71. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/messages.py +0 -0
  72. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/prd.py +0 -0
  73. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/reports.py +0 -0
  74. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/runs.py +0 -0
  75. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/sessions.py +0 -0
  76. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/specs.py +0 -0
  77. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/workflow_runs.py +0 -0
  78. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/api/workflows.py +0 -0
  79. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/config/__init__.py +0 -0
  80. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/config/platform.py +0 -0
  81. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/config/settings.py +0 -0
  82. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/evidence.py +0 -0
  83. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/evidence_assets.py +0 -0
  84. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/executor/base.py +0 -0
  85. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/executor/claude.py +0 -0
  86. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/executor/stream.py +0 -0
  87. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/git/__init__.py +0 -0
  88. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/git/commit.py +0 -0
  89. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/git_ops.py +0 -0
  90. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/handlers/__init__.py +0 -0
  91. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/handlers/prd.py +0 -0
  92. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/integration.py +0 -0
  93. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/prompt/__init__.py +0 -0
  94. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/prompt/builder.py +0 -0
  95. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/prompt/templates.py +0 -0
  96. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/prompt/workflow_template.py +0 -0
  97. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/py.typed +0 -0
  98. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/retry.py +0 -0
  99. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/__init__.py +0 -0
  100. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/claude_setup.py +0 -0
  101. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/repo_setup.py +0 -0
  102. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/ci/canal-integration.yml +0 -0
  103. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/claude_md_section.md +0 -0
  104. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/settings.json +0 -0
  105. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-activity-skill/SKILL.md +0 -0
  106. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-canal-workflow-skill/SKILL.md +0 -0
  107. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-context-skill/SKILL.md +0 -0
  108. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-git-workflow-skill/SKILL.md +0 -0
  109. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-progress-logging-skill/SKILL.md +0 -0
  110. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-single-task-merge-skill/SKILL.md +0 -0
  111. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-specs-management-skill/SKILL.md +0 -0
  112. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-task-management-skill/SKILL.md +0 -0
  113. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/skills/steerdev-wave-tasks-merge-skill/SKILL.md +0 -0
  114. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/setup/templates/worktrunk.config.toml +0 -0
  115. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/update_check.py +0 -0
  116. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/version.py +0 -0
  117. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workflow/__init__.py +0 -0
  118. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workflow/context.py +0 -0
  119. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workflow/executor.py +0 -0
  120. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workflow/memory.py +0 -0
  121. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workspace/__init__.py +0 -0
  122. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workspace/preparation.py +0 -0
  123. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/workspace/project_manager.py +0 -0
  124. {steerdev-1.1.48 → steerdev-1.1.62}/src/steerdev_agent/worktree.py +0 -0
  125. {steerdev-1.1.48 → steerdev-1.1.62}/tests/__init__.py +0 -0
  126. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_agent_loop.py +0 -0
  127. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_agents_api.py +0 -0
  128. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_api_client.py +0 -0
  129. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_claude_executor.py +0 -0
  130. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_claude_setup.py +0 -0
  131. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_client_methods.py +0 -0
  132. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_commands_api.py +0 -0
  133. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_context_search.py +0 -0
  134. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_git_commit.py +0 -0
  135. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_git_ops.py +0 -0
  136. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_git_pr.py +0 -0
  137. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_hooks_post_tool_use.py +0 -0
  138. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_platform_config.py +0 -0
  139. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_preparation.py +0 -0
  140. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_preparation_provenance.py +0 -0
  141. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_prompt.py +0 -0
  142. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_reports_client.py +0 -0
  143. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_resolve_executor_config.py +0 -0
  144. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_resolve_max_tasks.py +0 -0
  145. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_retry.py +0 -0
  146. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_runner_boundary_commit.py +0 -0
  147. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_runner_worktrees.py +0 -0
  148. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_stream_parser.py +0 -0
  149. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_tasks.py +0 -0
  150. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_tasks_update_branch.py +0 -0
  151. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_version.py +0 -0
  152. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_wave_scoped_fetch.py +0 -0
  153. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_workflow_context.py +0 -0
  154. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_workflow_memory.py +0 -0
  155. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_workflow_prompt_template.py +0 -0
  156. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_workflow_runs_api.py +0 -0
  157. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_workspace_extended.py +0 -0
  158. {steerdev-1.1.48 → steerdev-1.1.62}/tests/test_worktree.py +0 -0
@@ -0,0 +1,122 @@
1
+ # AGENTS.md
2
+
3
+ Guidance for AI coding agents working in this repository.
4
+
5
+ ## Overview
6
+
7
+ **steerdev-agent** is a Python CLI that orchestrates AI coding agents via subprocess execution, streaming events to the steerdev.com API. It fetches tasks, builds prompts, launches agents (Claude Code and pi are wired; `openai-codex` is a stub), and reports activity.
8
+
9
+ ## Project Structure
10
+
11
+ ```
12
+ src/steerdev_agent/
13
+ ├── cli.py # Typer CLI commands
14
+ ├── runner.py # Main orchestrator
15
+ ├── agent_loop.py # Persistent agent mode
16
+ ├── version.py # Version management
17
+ ├── integration.py # Integration utilities
18
+ ├── api/ # API clients (tasks, sessions, events, workflows, etc.)
19
+ ├── config/ # Pydantic config models and settings
20
+ ├── executor/ # Agent subprocess execution (base, claude, stream)
21
+ ├── workflow/ # Multi-phase workflow execution and memory
22
+ ├── prompt/ # Prompt building and templates
23
+ ├── setup/ # Project setup and templates
24
+ ├── handlers/ # Task/PRD handlers
25
+ └── git/ # Git utilities
26
+ ```
27
+
28
+ ## Development
29
+
30
+ - **Python 3.12+** with **uv** package manager
31
+ - `uv sync` — install deps
32
+ - `uv run pytest` — run tests
33
+ - `uv run ruff check . && uv run ruff format .` — lint and format
34
+ - `uv run basedpyright` — type check
35
+
36
+ ## Conventions
37
+
38
+ - Type hints on all function signatures
39
+ - Pydantic v2 for data models and config
40
+ - Async/await for I/O (HTTP, subprocess)
41
+ - `loguru` for logging
42
+ - Specific exception classes (no bare `except`)
43
+ - Absolute imports (`from steerdev_agent.config.models import ...`)
44
+ - Import order: stdlib, third-party, local
45
+
46
+ ## Key Integration Points
47
+
48
+ - **steerdev.com API**: Bearer auth via `STEERDEV_API_KEY`. Events POSTed to `/api/v1/sessions/{id}/events`.
49
+ - **Executor**: Launches agents as subprocesses with `--output-format stream-json`. Parses newline-delimited JSON events.
50
+ - **Config**: YAML config file + environment variable overrides.
51
+
52
+ ## Environment Variables
53
+
54
+ | Variable | Purpose |
55
+ | --- | --- |
56
+ | `STEERDEV_API_KEY` | API authentication |
57
+ | `STEERDEV_PROJECT_ID` | Default project |
58
+ | `STEERDEV_PROVIDER` | Harness provider: `claude` (default), `pi`, `openai-codex`, `acp:<agent>` |
59
+ | `STEERDEV_ACP_HARNESS` | ACP agent name when the provider is bare `acp` (equivalent to `--acp-agent`) |
60
+ | `CLAUDE_CODE_OAUTH_TOKEN` / `ANTHROPIC_API_KEY` | Claude credentials (sandbox-injected; locally use `claude login` instead) |
61
+ | `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `OPENROUTER_API_KEY` / `GEMINI_API_KEY` | pi credentials — whichever matches the selected model's provider (sandbox-injected; locally use `pi` + `/login`) |
62
+ | `OPENAI_API_KEY` | Codex credentials for `openai-codex` (sandbox-injected) |
63
+ | Per-harness (e.g. `GEMINI_API_KEY` for `acp:gemini`) | ACP credentials — declared per agent in the registry (`credential_env`) |
64
+
65
+ ## Providers
66
+
67
+ The agent supports multiple harness providers via `--provider` (or `STEERDEV_PROVIDER`):
68
+
69
+ ```bash
70
+ steerdev run --provider claude --project-id abc123 # default (Claude Code)
71
+ steerdev run --provider pi --project-id abc123 # pi.dev coding agent
72
+ steerdev run --provider acp:gemini --project-id abc123 # any ACP harness (Gemini CLI here)
73
+ steerdev run --provider openai-codex --project-id abc123 # stub (not yet wired)
74
+ ```
75
+
76
+ `claude` (Claude Code) and `pi` (the [pi.dev](https://pi.dev) coding agent) are
77
+ wired end-to-end. `pi` is launched headless as `pi --mode json "<prompt>"`, with
78
+ resume via `--session`, model via `--model`, and tool allow/deny lists via
79
+ `--tools`/`--exclude-tools`; see `executor/pi.py` and `executor/pi_stream.py`.
80
+ `openai-codex` is a clearly-stubbed seam (`executor/codex.py`) that fails fast
81
+ with a "not yet supported" message.
82
+
83
+ ### ACP harnesses (`acp:<agent>`)
84
+
85
+ `acp:<agent>` drives **any** harness speaking the
86
+ [Agent Client Protocol](https://agentclientprotocol.com) (JSON-RPC 2.0 over
87
+ stdio) through a single executor — steerdev acts as the ACP *Client*
88
+ (filesystem, terminals, permissions) and the harness is the ACP *Agent*.
89
+ Built-in registry entries (`executor/acp_registry.py`): `acp:gemini`
90
+ (Gemini CLI via `gemini --experimental-acp`), `acp:claude-code` (via
91
+ `npx @zed-industries/claude-code-acp`), `acp:goose` (`goose acp`).
92
+
93
+ Adding a new harness requires **no code** — declare it under `acp.agents` in
94
+ `steerdev.yaml`:
95
+
96
+ ```yaml
97
+ acp:
98
+ # default agent for `--provider acp`
99
+ agent: gemini
100
+ # auto_approve_all (default) | auto_approve_workdir | read_only | escalate
101
+ permission_policy: auto_approve_all
102
+ agents:
103
+ myagent:
104
+ name: myagent
105
+ command: my-acp-agent
106
+ args: ["--serve"]
107
+ credential_env: ["MY_AGENT_API_KEY"]
108
+ ```
109
+
110
+ Key modules: `executor/acp.py` (`ACPExecutor` — spawn, initialize,
111
+ session/new|load, prompt), `executor/acp_client.py` (`SteerdevAcpClient` +
112
+ `AcpPermissionPolicy` — fs/terminal/permission callbacks), `executor/acp_stream.py`
113
+ (ACP `session/update` → canonical `EventType` translation), `executor/acp_spec.py`
114
+ + `executor/acp_registry.py` (declarative launch specs). ACP turns end with a
115
+ `stopReason`, not an exit code — `wait()` synthesizes one (nonzero only on
116
+ refusal/error).
117
+
118
+ Credentials arrive via ENV (the sandbox bootstrap injects them); the agent never
119
+ fetches credentials itself. For providers with a persisted local login (`claude`,
120
+ `pi`, and ACP agents with `requires_local_login`) a missing credential env var
121
+ only warns; for the rest the matching env var must be present or the command
122
+ hard-fails.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerdev
3
- Version: 1.1.48
3
+ Version: 1.1.62
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
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
17
  Classifier: Topic :: Terminals
18
18
  Requires-Python: >=3.12
19
+ Requires-Dist: agent-client-protocol<0.11,>=0.10
19
20
  Requires-Dist: httpx>=0.27.0
20
21
  Requires-Dist: loguru>=0.7.3
21
22
  Requires-Dist: pydantic-settings>=2.0.0
@@ -43,7 +44,7 @@ Task runner for [steerdev.com](https://steerdev.com) — orchestrates AI coding
43
44
 
44
45
  ## What It Does
45
46
 
46
- SteerDev Agent connects your AI coding agent (Claude Code, Codex, Aider) to the steerdev.com platform:
47
+ SteerDev Agent connects your AI coding agent (Claude Code or pi; `openai-codex` is a stub) to the steerdev.com platform:
47
48
 
48
49
  1. **Fetches tasks** from your SteerDev project
49
50
  2. **Builds prompts** with project context, task details, and workflow instructions
@@ -299,7 +300,7 @@ api:
299
300
  project_id_env: STEERDEV_PROJECT_ID
300
301
 
301
302
  executor:
302
- type: claude # claude, codex, aider
303
+ type: claude # claude (wired), pi (wired), openai-codex (stub)
303
304
  permission_mode: default
304
305
  allowed_tools: []
305
306
  disallowed_tools: []
@@ -316,8 +317,30 @@ worktrees:
316
317
  | `STEERDEV_API_KEY` | API key for steerdev.com |
317
318
  | `STEERDEV_PROJECT_ID` | Default project ID |
318
319
  | `STEERDEV_AGENT_NAME` | Agent name for session tracking |
320
+ | `STEERDEV_PROVIDER` | Harness provider: `claude` (default), `pi`, `openai-codex` |
321
+ | `CLAUDE_CODE_OAUTH_TOKEN` / `ANTHROPIC_API_KEY` | Claude credentials (sandbox-injected; locally use `claude login`) |
322
+ | `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `OPENROUTER_API_KEY` / `GEMINI_API_KEY` | pi credentials — whichever matches the selected model's provider (sandbox-injected; locally use `pi` + `/login`) |
323
+ | `OPENAI_API_KEY` | Codex credentials for `openai-codex` (sandbox-injected) |
319
324
 
320
- > **Note:** CLI agents (Claude Code, Codex, etc.) must be logged in independently before running steerdev. No LLM API keys are needed here.
325
+ > **Note:** Locally, CLI agents like Claude Code and pi can be logged in
326
+ > independently (`claude login`, or `pi` + `/login`) before running steerdev — no
327
+ > LLM API keys are strictly needed. In a sandbox, the bootstrap injects the
328
+ > per-provider credentials above; steerdev never fetches credentials itself.
329
+
330
+ ### Providers
331
+
332
+ Select the harness with `--provider` (or `STEERDEV_PROVIDER`). Defaults to `claude`:
333
+
334
+ ```bash
335
+ steerdev run --provider claude --project-id YOUR_PROJECT_ID # Claude Code
336
+ steerdev run --provider pi --project-id YOUR_PROJECT_ID # pi.dev coding agent
337
+ ```
338
+
339
+ `claude` (Claude Code) and `pi` (the [pi.dev](https://pi.dev) coding agent) are
340
+ wired end-to-end. `pi` runs headless as `pi --mode json "<prompt>"` and streams
341
+ its JSON events back to steerdev. `openai-codex` is a clearly-stubbed seam that
342
+ fails fast with a "not yet supported" message, reserved for a future harness
343
+ protocol.
321
344
 
322
345
  ## Architecture
323
346
 
@@ -6,7 +6,7 @@ Task runner for [steerdev.com](https://steerdev.com) — orchestrates AI coding
6
6
 
7
7
  ## What It Does
8
8
 
9
- SteerDev Agent connects your AI coding agent (Claude Code, Codex, Aider) to the steerdev.com platform:
9
+ SteerDev Agent connects your AI coding agent (Claude Code or pi; `openai-codex` is a stub) to the steerdev.com platform:
10
10
 
11
11
  1. **Fetches tasks** from your SteerDev project
12
12
  2. **Builds prompts** with project context, task details, and workflow instructions
@@ -262,7 +262,7 @@ api:
262
262
  project_id_env: STEERDEV_PROJECT_ID
263
263
 
264
264
  executor:
265
- type: claude # claude, codex, aider
265
+ type: claude # claude (wired), pi (wired), openai-codex (stub)
266
266
  permission_mode: default
267
267
  allowed_tools: []
268
268
  disallowed_tools: []
@@ -279,8 +279,30 @@ worktrees:
279
279
  | `STEERDEV_API_KEY` | API key for steerdev.com |
280
280
  | `STEERDEV_PROJECT_ID` | Default project ID |
281
281
  | `STEERDEV_AGENT_NAME` | Agent name for session tracking |
282
+ | `STEERDEV_PROVIDER` | Harness provider: `claude` (default), `pi`, `openai-codex` |
283
+ | `CLAUDE_CODE_OAUTH_TOKEN` / `ANTHROPIC_API_KEY` | Claude credentials (sandbox-injected; locally use `claude login`) |
284
+ | `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `OPENROUTER_API_KEY` / `GEMINI_API_KEY` | pi credentials — whichever matches the selected model's provider (sandbox-injected; locally use `pi` + `/login`) |
285
+ | `OPENAI_API_KEY` | Codex credentials for `openai-codex` (sandbox-injected) |
282
286
 
283
- > **Note:** CLI agents (Claude Code, Codex, etc.) must be logged in independently before running steerdev. No LLM API keys are needed here.
287
+ > **Note:** Locally, CLI agents like Claude Code and pi can be logged in
288
+ > independently (`claude login`, or `pi` + `/login`) before running steerdev — no
289
+ > LLM API keys are strictly needed. In a sandbox, the bootstrap injects the
290
+ > per-provider credentials above; steerdev never fetches credentials itself.
291
+
292
+ ### Providers
293
+
294
+ Select the harness with `--provider` (or `STEERDEV_PROVIDER`). Defaults to `claude`:
295
+
296
+ ```bash
297
+ steerdev run --provider claude --project-id YOUR_PROJECT_ID # Claude Code
298
+ steerdev run --provider pi --project-id YOUR_PROJECT_ID # pi.dev coding agent
299
+ ```
300
+
301
+ `claude` (Claude Code) and `pi` (the [pi.dev](https://pi.dev) coding agent) are
302
+ wired end-to-end. `pi` runs headless as `pi --mode json "<prompt>"` and streams
303
+ its JSON events back to steerdev. `openai-codex` is a clearly-stubbed seam that
304
+ fails fast with a "not yet supported" message, reserved for a future harness
305
+ protocol.
284
306
 
285
307
  ## Architecture
286
308