Conversation
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements issue #2661 — add a
--dry-runflag tospecify workflow runthat previews each step's resolved inputs, prompt, and command invocation without spawning the underlying coding-agent CLI or making any AI calls. Use it to verify what a workflow would dispatch before running for real.What ships
Engine
src/specify_cli/workflows/base.py:StepContextgainsdry_run: bool = Falsesrc/specify_cli/workflows/engine.py:WorkflowEngine.execute(..., dry_run=False)propagates the flag to every stepdry_runonRunState(save/load) and restores it inresume()so an interrupted dry-run does not silently become a real rundry_runsemantics documented in theexecute()docstringStep behavior
CommandStep(workflows/steps/command/):dry_run=Truerenders the integration'sbuild_command_invocation(command, args)preview, setsexit_code=0, returnsCOMPLETEDwithout spawning the CLIGateStep(workflows/steps/gate/):dry_run=TruereturnsCOMPLETEDimmediately with a short DRY RUN message; no interactive promptbuild_command_invocation: preview includes the command name and a one-line note explaining the fallbackexceptclause narrowed from bareExceptionto(ImportError, AttributeError, KeyError, TypeError, ValueError)so dry-run failures stay debuggableCLI
specify workflow run --dry-run(in-module, in__init__.py) — the only place the flag is exposed. After the run, the CLI prints anyoutput['dry_run']messages so the rendered previews surface in the terminal.What does not ship (intentional)
Per design review, the
specifyCLI is scaffolding + workflow orchestration only. The per-stage surface (/speckit.specify,/speckit.plan, ...) belongs to the agent, not the CLI. A previous draft of this PR addedspecify spec/specify planpreview commands; those have been removed along with the supportingstart_at/stop_afterstep filtering in the engine. Issue #2661's wording has been re-scoped to--dry-runonspecify workflow run.Tests
tests/test_workflows.pytest_dry_run_persisted_in_run_state:dry_runsurvives save/load round-triptest_resume_restores_dry_run:resume()rebuildsStepContextwith the persisted flag so an interrupted dry-run stays a dry-runtest_dry_run_returns_completed_without_dispatch:CommandStepreturnsCOMPLETEDwith the rendered preview; no CLI is spawned; usestmp_pathfor portabilitytest_dry_run_skips_interactive_gate:GateStepshort-circuits with a DRY RUN messageUsage
Closes #2661