feat(scripts): port create-new-feature, setup-plan and setup-tasks to Python#3386
Open
marcelsafin wants to merge 9 commits into
Open
feat(scripts): port create-new-feature, setup-plan and setup-tasks to Python#3386marcelsafin wants to merge 9 commits into
marcelsafin wants to merge 9 commits into
Conversation
… Python Ports the three core workflow scripts to Python as part of github#3280, following the check-prerequisites PoC pattern from github#3302. Adds resolve_template() to the shared common.py module and parity tests that run bash and Python side by side. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Ports three core Spec Kit workflow scripts (create-new-feature, setup-plan, setup-tasks) to Python while preserving the existing shell implementations, and adds parity tests to ensure the Python ports match Bash/PowerShell output and exit behavior.
Changes:
- Added Python implementations for
create-new-feature,setup-plan, andsetup-tasks, plus sharedresolve_template()logic inscripts/python/common.py. - Added shared parity-test utilities (
tests/parity_helpers.py) to run Bash/PowerShell/Python twins in temporary repos with normalized output comparisons. - Added parity test suites for the three newly-ported scripts, including JSON/text output parity and PowerShell JSON parity where available.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tests/test_setup_tasks_python_parity.py | Adds Bash/Python + PowerShell/Python parity tests for setup-tasks. |
| tests/test_setup_plan_python_parity.py | Adds Bash/Python + PowerShell/Python parity tests for setup-plan. |
| tests/test_create_new_feature_python_parity.py | Adds parity tests for create-new-feature including numbering, truncation, errors, and persistence. |
| tests/parity_helpers.py | Introduces reusable helpers for parity tests (repo scaffolding, command builders, normalization, subprocess runner). |
| scripts/python/setup_tasks.py | Python port of setup-tasks including prereq checks + template resolution and JSON/text output. |
| scripts/python/setup_plan.py | Python port of setup-plan including template copy behavior and JSON-mode stderr status messages. |
| scripts/python/create_new_feature.py | Python port of create-new-feature including naming rules, numbering/timestamp modes, truncation, and feature.json persistence. |
| scripts/python/common.py | Adds resolve_template() and preset ordering helper to mirror Bash template resolution priority. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… hidden preset dirs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This was referenced Jul 7, 2026
Ships with the scripts they reference; the remaining templates got their py: lines in github#3403. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
resolve_skill_placeholders only accepted sh/ps, so a py init option
fell into the fallback path and {SCRIPT} rendered without an
interpreter prefix. Accept py and prefix the resolved interpreter,
matching process_template. Also guard ps_cmd against a missing
PowerShell with a clear assert.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The loop accepts and silently ignores extra positional args (it doesn't build a collected list); match the wording to what the code and setup-plan.sh actually do. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
src/specify_cli/agents.py:418
- When a Python-configured project encounters a command without a
pyentry, this fallback selectssh(orpson Windows). Shared infra installs only the selected script variant, so ascript=pyproject does not contain.specify/scripts/bash/powershell; commands such asclarify.md, which currently has onlysh/ps, therefore resolve{SCRIPT}to a path that does not exist. Please ensure those commands provide/use their installed Python twin, or install the chosen fallback variant rather than merely replacing the placeholder.
if script_variant not in {"sh", "ps", "py"} or script_variant not in scripts:
fallback_order = []
default_variant = (
"ps" if platform.system().lower().startswith("win") else "sh"
)
…10# parity The bash twin uses $((10#$BRANCH_NUMBER)), which rejects signed and whitespace-padded values. Python's int() accepted them (e.g. -1), producing a malformed -01-... prefix that sequential scans ignore. Restrict --number to unsigned decimal digits before conversion, and pin the parity with a bash-comparison test. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
Description
Ports the three core workflow scripts to Python, per #3280. Follows the pattern established by the check-prerequisites PoC (#3302): additive port with parity tests that run the bash and Python versions side by side and compare output. Two small non-additive touches:
templates/commands/plan.mdandtemplates/commands/tasks.mdgain ascripts.pyentry, andresolve_skill_placeholdersacceptspyas a script variant (with interpreter prefixing and a fallback when a command's frontmatter lacks the configured variant).Scope:
scripts/python/create_new_feature.py— port ofcreate-new-feature.sh, including branch-name generation (stop words, acronym detection, word limits), feature numbering (specs scan + timestamp-dir handling), the 244-char ref-length truncation,--allow-existing-branchmode, andfeature.jsonpersistence (byte-identical to the jq output).scripts/python/setup_plan.py— port ofsetup-plan.sh, including plan template resolution and the status messages that go to stderr in--jsonmode.scripts/python/setup_tasks.py— port ofsetup-tasks.sh, including plan/spec validation and the tasks-template requirement.scripts/python/common.py— addsresolve_template()(overrides → presets via registry → extensions → core), shared by the three scripts above.tests/parity_helpers.py— shared fixtures/helpers for parity tests, extracted from the pattern intest_check_prerequisites_python_parity.py.pwshis unavailable).One deliberate deviation:
--number abcproduces a clean error message in Python where bash surfaces a raw arithmetic error (10#abc: value too great for base). The parity test asserts exit code and empty stdout for that case, not the stderr text.Testing
uv run specify --helpuv sync && uv run pytest(3801 passed, 110 skipped)AI Disclosure
Ported and tested with GitHub Copilot CLI. I reviewed the diff and verified parity behavior manually.
Fixes #3280