feat(workflows): add per-step integration configuration - #4425
Conversation
Assisted-by: OpenAI Codex (model: GPT-5, autonomous)
There was a problem hiding this comment.
🟡 Changes recommended
Combining per-step Docker Agent arguments with the documented legacy environment value can emit two conflicting agent references.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds per-step runtime configuration for workflow command integrations, including deterministic resume support and Docker Agent-specific handling.
Changes:
- Resolves, validates, persists, and dispatches per-step integration arguments/options.
- Adds Docker Agent runtime options and agent references.
- Updates compatibility tests and workflow documentation.
File summaries
| File | Description |
|---|---|
workflows/README.md |
Documents runtime configuration syntax. |
tests/test_workflows.py |
Tests resolution, isolation, validation, and resume. |
tests/integrations/test_integration_docker_agent.py |
Tests Docker Agent argv and validation. |
tests/integrations/test_base.py |
Verifies base behavior and signatures. |
src/specify_cli/workflows/steps/command/__init__.py |
Resolves and dispatches runtime configuration. |
src/specify_cli/workflows/engine.py |
Persists configuration for resume. |
src/specify_cli/workflows/base.py |
Marks resumed execution contexts. |
src/specify_cli/integrations/base.py |
Extends integration runtime APIs. |
src/specify_cli/integrations/docker_agent/__init__.py |
Implements Docker Agent configuration support. |
src/specify_cli/integrations/copilot/__init__.py |
Updates custom dispatch signatures. |
src/specify_cli/integrations/agy/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/codex/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/cursor_agent/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/devin/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/droid/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/dsh/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/goose/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/grok/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/hermes/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/muse/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/omp/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/opencode/__init__.py |
Updates execution signature. |
src/specify_cli/integrations/rovodev/__init__.py |
Updates execution signature. |
Review details
- Files reviewed: 23/23 changed files
- Comments generated: 1
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback
Assisted-by: OpenAI Codex (model: GPT-5, autonomous)
|
Posted on behalf of @philo-x by OpenAI Codex (model: GPT-5). Addressed the review feedback in
Validation: 1,111 targeted tests pass; Ruff 0.15.0 and |
|
Thanks — and good that this rides on the agreed #4275 design, with disclosure. One merge-blocker to resolve from the review: when the legacy Docker-Agent env var has its documented shape (e.g. |
There was a problem hiding this comment.
🟢 Approval recommended
The implementation satisfies the linked acceptance criteria with comprehensive compatibility, isolation, validation, persistence, and resume coverage.
Review details
- Files reviewed: 24/24 changed files
- Comments generated: 0 new
- Review effort level: Balanced
Assisted-by: OpenAI Codex (model: GPT-6, autonomous)
Assisted-by: OpenAI Codex (model: GPT-6, autonomous)
|
Posted on behalf of @philo-x by OpenAI Codex (model: GPT-6, autonomous). Thanks @mnriem. The stricter precedence is implemented in For completeness, the previous head ( Regression coverage now includes legacy agent-plus-flags, flags-only, and malformed quoting. Both workflow guides document the precedence, and the PR description identifies the command-step Synced with main at @mnriem, this is ready for another review. Thanks again. |
|
Thanks — that's exactly the precedence I wanted: when a per-step |
|
Thank you! |
Upstream github#4425 (per-step integration configuration) landed after this branch was pushed and collided with it in two ways. The textual conflict is one region of dispatch_command(): github#4425 inserted a validate_runtime_config() call on the line above the one this branch changed. The two edits are independent, so both survive -- validation first, then _build_dispatch_prompt() builds the prompt. The second collision is semantic and git does not flag it. github#4425 widened build_exec_args() with integration_args/integration_options and updated all fifteen integrations that override it. Bob's override arrives with this branch, so github#4425 had nothing to update, and merging alone would raise TypeError on every Bob dispatch -- the path this branch exists to make work. tests/integrations/test_base.py enumerates the registry and catches it: AssertionError: bob TypeError: BobIntegration.build_exec_args() got an unexpected keyword argument 'integration_args' Bob therefore takes the same four lines as every other integration: the two keyword-only parameters and a validate_runtime_config() call first, copied from CursorAgentIntegration and DroidIntegration. Bob accepts no per-step runtime configuration, so the inherited default -- which rejects non-empty values rather than ignoring them -- is the correct behaviour. Verified: 2915 integration tests pass; the registry test is red without the Bob change and green with it; ruff reports nothing on the three changed files; and dispatch renders /speckit.specify for a legacy project, /speckit-git-commit for a skills project. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TqDT4qTj3sFBeg9tMRiXqZ
Assisted-by: OpenAI Codex (model: GPT-5, autonomous)
Summary
integration_argsandintegration_optionsto workflow command stepsagentandsafetyoptions, using the command-stepmodelfield for model selection while retaining the legacy extra-args path for steps without per-stepintegration_argsCloses #4275
Testing
.venv/bin/python -m pytest tests/integrations/test_base.py tests/integrations/test_integration_docker_agent.py tests/test_workflows.py -q— 1121 passed onb4bcd5f7after syncing mainE9,F63,F7,F82,S602,S604,S605)git diff --checkAI Disclosure
Implementation, tests, documentation, and this PR description were authored by OpenAI Codex (model: GPT-5, autonomous) on behalf of @philo-x.
Precedence follow-up, regression tests, documentation updates, and main synchronization authored by OpenAI Codex (model: GPT-6, autonomous) on behalf of @philo-x.