specify-cli 0.12.4__tar.gz → 0.12.5__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.
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/docs.yml +1 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/CHANGELOG.md +15 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/PKG-INFO +1 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/integrations.md +2 -2
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/README.md +15 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.feature.md +16 -2
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.validate.md +6 -6
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/config-template.yml +10 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/extension.yml +4 -2
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/git-config.yml +10 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/create-new-feature-branch.sh +192 -32
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/git-common.sh +7 -5
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +185 -33
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/git-common.ps1 +7 -6
- {specify_cli-0.12.4 → specify_cli-0.12.5}/pyproject.toml +1 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/adapters.py +5 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/catalog_stack.py +14 -6
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/cursor_agent/__init__.py +9 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/expressions.py +91 -14
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/gate/__init__.py +8 -1
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/git/test_git_extension.py +416 -3
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_catalog_stack.py +41 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_cursor_agent.py +49 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_workflows.py +125 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_adapters.py +27 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.editorconfig +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.gitattributes +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/CODEOWNERS +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/dependabot.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-test.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/release.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/test.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.gitignore +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/.zenodo.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/AGENTS.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/CITATION.cff +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/DEVELOPMENT.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/LICENSE +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/SECURITY.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/SUPPORT.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/.gitignore +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/bundles.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/extensions.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/friends.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/overview.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/presets.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/docfx.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/index.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/one-time.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/pipx.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/uv.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/installation.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/local-development.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/quickstart.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/authentication.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/bundles.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/core.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/extensions.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/overview.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/presets.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/workflows.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/template/public/main.css +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/toc.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/upgrade.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/catalog.community.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/catalog.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/.gitignore +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/LICENSE +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/extension.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/catalog.community.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/catalog.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/media/logo_large.webp +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/media/logo_small.webp +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/media/specify_cli.gif +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-April.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-February.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-June.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-March.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-May.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/catalog.community.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/catalog.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/preset.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/common.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/spec-driven.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/spec-kit.code-workspace +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_project.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/agents.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/commands/init.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/presets/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/_commands.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/checklist-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/analyze.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/checklist.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/clarify.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/constitution.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/converge.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/implement.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/plan.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/specify.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/tasks.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/constitution-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/plan-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/spec-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/tasks-template.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/vscode-settings.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/auth_helpers.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/conftest.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/plan.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/spec.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/http_helpers.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_authentication.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_check_tool.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_cli_version.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_commands_package.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_console_imports.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extensions.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_github_http.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_init_dir.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_merge.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_presets.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_upgrade.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_utils.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_version_imports.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/README.md +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/catalog.community.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/catalog.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/step-catalog.json +0 -0
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
fetch-depth: 0 # Fetch all history for git info
|
|
36
36
|
|
|
37
37
|
- name: Setup .NET
|
|
38
|
-
uses: actions/setup-dotnet@
|
|
38
|
+
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
|
|
39
39
|
with:
|
|
40
40
|
dotnet-version: '8.x'
|
|
41
41
|
|
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.12.5] - 2026-07-06
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix(workflows): match gate reject option case-insensitively (#3335)
|
|
10
|
+
- fix(bundler): reject host-less catalog URLs in adapters (use hostname, not netloc) (#3333)
|
|
11
|
+
- fix(bundler): resolve catalog search at highest-precedence source before filtering (#3331)
|
|
12
|
+
- fix(workflows): compare non-numeric strings lexicographically instead of returning False (#3323)
|
|
13
|
+
- fix(workflows): quote-aware interpolation so a literal }} in a filter arg doesn't break multi-expression templates (#3307)
|
|
14
|
+
- Support namespaced git feature branch templates (#3293)
|
|
15
|
+
- chore(deps): bump actions/setup-dotnet from 5.3.0 to 5.4.0 (#3315)
|
|
16
|
+
- fix(integrations): cursor-agent honors executable/extra-args env overrides (#3265)
|
|
17
|
+
- docs: drop stale kimi KIMI.md->AGENTS.md migration note (#3291)
|
|
18
|
+
- chore: release 0.12.4, begin 0.12.5.dev0 development (#3305)
|
|
19
|
+
|
|
5
20
|
## [0.12.4] - 2026-07-02
|
|
6
21
|
|
|
7
22
|
### Changed
|
|
@@ -24,7 +24,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
24
24
|
| [IBM Bob](https://www.ibm.com/products/bob) | `bob` | IDE-based agent |
|
|
25
25
|
| [Junie](https://junie.jetbrains.com/) | `junie` | |
|
|
26
26
|
| [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | |
|
|
27
|
-
| [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths
|
|
27
|
+
| [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths |
|
|
28
28
|
| [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
|
|
29
29
|
| [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
|
|
30
30
|
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
|
|
@@ -218,7 +218,7 @@ Some integrations accept additional options via `--integration-options`:
|
|
|
218
218
|
| Integration | Option | Description |
|
|
219
219
|
| ----------- | ------------------- | -------------------------------------------------------------- |
|
|
220
220
|
| `generic` | `--commands-dir` | Required. Directory for command files |
|
|
221
|
-
| `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated
|
|
221
|
+
| `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated skill naming, e.g. `speckit.xxx` → `speckit-xxx`) |
|
|
222
222
|
|
|
223
223
|
Example:
|
|
224
224
|
|
|
@@ -7,7 +7,7 @@ Git repository initialization, feature branch creation, numbering (sequential/ti
|
|
|
7
7
|
This extension provides Git operations as an optional, self-contained module. It manages:
|
|
8
8
|
|
|
9
9
|
- **Repository initialization** with configurable commit messages
|
|
10
|
-
- **Feature branch creation** with sequential (`001-feature-name`) or timestamp (`20260319-143022-feature-name`) numbering
|
|
10
|
+
- **Feature branch creation** with sequential (`001-feature-name`) or timestamp (`20260319-143022-feature-name`) numbering and optional templates for branch namespaces
|
|
11
11
|
- **Branch validation** to ensure branches follow naming conventions
|
|
12
12
|
- **Git remote detection** for GitHub integration (e.g., issue creation)
|
|
13
13
|
- **Auto-commit** after core commands (configurable per-command with custom messages)
|
|
@@ -53,6 +53,16 @@ Configuration is stored in `.specify/extensions/git/git-config.yml`:
|
|
|
53
53
|
# Branch numbering strategy: "sequential" or "timestamp"
|
|
54
54
|
branch_numbering: sequential
|
|
55
55
|
|
|
56
|
+
# Optional branch name template. Leave empty for the default "{number}-{slug}".
|
|
57
|
+
# Supported tokens: {author}, {app}, {number}, {slug}; {slug} must not appear
|
|
58
|
+
# before {number}, and the final path segment must start with {number}-.
|
|
59
|
+
# Example for monorepos: "{author}/{app}/{number}-{slug}"
|
|
60
|
+
branch_template: ""
|
|
61
|
+
|
|
62
|
+
# Optional shorthand namespace. Leave empty to use branch_template/default behavior.
|
|
63
|
+
# Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
|
|
64
|
+
branch_prefix: ""
|
|
65
|
+
|
|
56
66
|
# Custom commit message for git init
|
|
57
67
|
init_commit_message: "[Spec Kit] Initial commit"
|
|
58
68
|
|
|
@@ -65,6 +75,10 @@ auto_commit:
|
|
|
65
75
|
message: "[Spec Kit] Add specification"
|
|
66
76
|
```
|
|
67
77
|
|
|
78
|
+
`{author}` is derived from Git config and sanitized for branch names. `{app}` is derived from the Spec Kit init directory name. Custom templates must not put `{slug}` before `{number}`, and must put `{number}-` at the start of the final path segment so generated names remain valid feature branches. For a monorepo project at `apps/web/.specify/`, a template such as `{author}/{app}/{number}-{slug}` produces branches like `jdoe/web/008-guided-tour`.
|
|
79
|
+
|
|
80
|
+
For simple namespace-only customization, `branch_prefix` is also accepted as a shorthand and expands to `<branch_prefix>/{number}-{slug}`.
|
|
81
|
+
|
|
68
82
|
## Installation
|
|
69
83
|
|
|
70
84
|
```bash
|
|
@@ -19,7 +19,7 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
19
19
|
If the user explicitly provided `GIT_BRANCH_NAME` (e.g., via environment variable, argument, or in their request), pass it through to the script by setting the `GIT_BRANCH_NAME` environment variable before invoking the script. When `GIT_BRANCH_NAME` is set:
|
|
20
20
|
- The script uses the exact value as the branch name, bypassing all prefix/suffix generation
|
|
21
21
|
- `--short-name`, `--number`, and `--timestamp` flags are ignored
|
|
22
|
-
- `FEATURE_NUM` is extracted
|
|
22
|
+
- `FEATURE_NUM` is extracted when the final path segment starts with a numeric or timestamp feature marker (for example `042-name`, `feat/042-name`, or `jdoe/app/042-name`), otherwise set to the full branch name
|
|
23
23
|
|
|
24
24
|
## Prerequisites
|
|
25
25
|
|
|
@@ -35,6 +35,19 @@ Determine the branch numbering strategy by checking configuration in this order:
|
|
|
35
35
|
3. Check `.specify/init-options.json` for `branch_numbering` value (deprecated, backward compatibility — will be removed in a future release)
|
|
36
36
|
4. Default to `sequential` if none of the above exist
|
|
37
37
|
|
|
38
|
+
## Branch Name Template
|
|
39
|
+
|
|
40
|
+
Check `.specify/extensions/git/git-config.yml` for an optional `branch_template` value. If it is empty or missing, use the default branch shape `{number}-{slug}`. If it is set, `{slug}` must not appear before `{number}`, its final path segment must start with `{number}-`, and the script expands these tokens:
|
|
41
|
+
|
|
42
|
+
- `{author}`: sanitized Git config author (`user.name`, falling back to the email local part)
|
|
43
|
+
- `{app}`: sanitized Spec Kit init directory name
|
|
44
|
+
- `{number}`: sequential number or timestamp
|
|
45
|
+
- `{slug}`: generated short branch slug
|
|
46
|
+
|
|
47
|
+
For monorepos, a template such as `{author}/{app}/{number}-{slug}` creates names like `jdoe/web/008-guided-tour` while preserving per-project feature numbering.
|
|
48
|
+
|
|
49
|
+
The script also accepts `branch_prefix` as a shorthand for simple namespaces; it expands to `<branch_prefix>/{number}-{slug}`.
|
|
50
|
+
|
|
38
51
|
## Execution
|
|
39
52
|
|
|
40
53
|
Generate a concise short name (2-4 words) for the branch:
|
|
@@ -54,6 +67,7 @@ Run the appropriate script based on your platform:
|
|
|
54
67
|
- Always include the JSON flag (`--json` for Bash, `-Json` for PowerShell) so the output can be parsed reliably
|
|
55
68
|
- You must only ever run this script once per feature
|
|
56
69
|
- The JSON output will contain `BRANCH_NAME` and `FEATURE_NUM`
|
|
70
|
+
- Do not manually expand `branch_template`; the script reads the git extension config and applies it consistently
|
|
57
71
|
|
|
58
72
|
## Graceful Degradation
|
|
59
73
|
|
|
@@ -64,5 +78,5 @@ If Git is not installed or the current directory is not a Git repository:
|
|
|
64
78
|
## Output
|
|
65
79
|
|
|
66
80
|
The script outputs JSON with:
|
|
67
|
-
- `BRANCH_NAME`: The branch name (e.g., `003-user-auth
|
|
81
|
+
- `BRANCH_NAME`: The branch name (e.g., `003-user-auth`, `20260319-143022-user-auth`, or `jdoe/web/003-user-auth`)
|
|
68
82
|
- `FEATURE_NUM`: The numeric or timestamp prefix used
|
|
@@ -22,24 +22,24 @@ Get the current branch name:
|
|
|
22
22
|
git rev-parse --abbrev-ref HEAD
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
The branch name must
|
|
25
|
+
The branch name's final path segment must start with one of these feature markers:
|
|
26
26
|
|
|
27
|
-
1. **Sequential**:
|
|
28
|
-
2. **Timestamp**:
|
|
27
|
+
1. **Sequential**: `[0-9]{3,}-` (e.g., `001-feature-name`, `042-fix-bug`, `1000-big-feature`, `jdoe/web/008-guided-tour`)
|
|
28
|
+
2. **Timestamp**: `[0-9]{8}-[0-9]{6}-` (e.g., `20260319-143022-feature-name`, `jdoe/web/20260319-143022-feature-name`)
|
|
29
29
|
|
|
30
30
|
## Execution
|
|
31
31
|
|
|
32
32
|
If on a feature branch (matches either pattern):
|
|
33
33
|
- Output: `✓ On feature branch: <branch-name>`
|
|
34
34
|
- Check if the corresponding spec directory exists under `specs/`:
|
|
35
|
-
- For sequential branches, look for `specs/<prefix>-*` where prefix matches the numeric portion
|
|
36
|
-
- For timestamp branches, look for `specs/<prefix>-*` where prefix matches the `YYYYMMDD-HHMMSS` portion
|
|
35
|
+
- For sequential branches, look for `specs/<prefix>-*` where prefix matches the numeric portion, regardless of branch namespace prefixes
|
|
36
|
+
- For timestamp branches, look for `specs/<prefix>-*` where prefix matches the `YYYYMMDD-HHMMSS` portion, regardless of branch namespace prefixes
|
|
37
37
|
- If spec directory exists: `✓ Spec directory found: <path>`
|
|
38
38
|
- If spec directory missing: `⚠ No spec directory found for prefix <prefix>`
|
|
39
39
|
|
|
40
40
|
If NOT on a feature branch:
|
|
41
41
|
- Output: `✗ Not on a feature branch. Current branch: <branch-name>`
|
|
42
|
-
- Output: `Feature branches should be named like: 001-feature-name
|
|
42
|
+
- Output: `Feature branches should be named like: 001-feature-name, 20260319-143022-feature-name, or <namespace>/001-feature-name`
|
|
43
43
|
|
|
44
44
|
## Graceful Degradation
|
|
45
45
|
|
|
@@ -4,6 +4,16 @@
|
|
|
4
4
|
# Branch numbering strategy: "sequential" (001, 002, ...) or "timestamp" (YYYYMMDD-HHMMSS)
|
|
5
5
|
branch_numbering: sequential
|
|
6
6
|
|
|
7
|
+
# Optional branch name template. Leave empty for the default "{number}-{slug}".
|
|
8
|
+
# Supported tokens: {author}, {app}, {number}, {slug}
|
|
9
|
+
# {slug} must not appear before {number}; final path segment must start with {number}-.
|
|
10
|
+
# Example for monorepos: "{author}/{app}/{number}-{slug}"
|
|
11
|
+
branch_template: ""
|
|
12
|
+
|
|
13
|
+
# Optional shorthand namespace. Leave empty to use branch_template/default behavior.
|
|
14
|
+
# Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
|
|
15
|
+
branch_prefix: ""
|
|
16
|
+
|
|
7
17
|
# Commit message used by `git commit` during repository initialization
|
|
8
18
|
init_commit_message: "[Spec Kit] Initial commit"
|
|
9
19
|
|
|
@@ -4,7 +4,7 @@ extension:
|
|
|
4
4
|
id: git
|
|
5
5
|
name: "Git Branching Workflow"
|
|
6
6
|
version: "1.0.0"
|
|
7
|
-
description: "Feature branch creation, numbering (sequential/timestamp), validation, and Git remote detection"
|
|
7
|
+
description: "Feature branch creation, numbering (sequential/timestamp), templating, validation, and Git remote detection"
|
|
8
8
|
author: spec-kit-core
|
|
9
9
|
repository: https://github.com/github/spec-kit
|
|
10
10
|
license: MIT
|
|
@@ -19,7 +19,7 @@ provides:
|
|
|
19
19
|
commands:
|
|
20
20
|
- name: speckit.git.feature
|
|
21
21
|
file: commands/speckit.git.feature.md
|
|
22
|
-
description: "Create a feature branch with sequential or timestamp numbering"
|
|
22
|
+
description: "Create a feature branch with sequential or timestamp numbering and optional templates"
|
|
23
23
|
- name: speckit.git.validate
|
|
24
24
|
file: commands/speckit.git.validate.md
|
|
25
25
|
description: "Validate current branch follows feature branch naming conventions"
|
|
@@ -137,4 +137,6 @@ tags:
|
|
|
137
137
|
config:
|
|
138
138
|
defaults:
|
|
139
139
|
branch_numbering: sequential
|
|
140
|
+
branch_template: ""
|
|
141
|
+
branch_prefix: ""
|
|
140
142
|
init_commit_message: "[Spec Kit] Initial commit"
|
|
@@ -4,6 +4,16 @@
|
|
|
4
4
|
# Branch numbering strategy: "sequential" (001, 002, ...) or "timestamp" (YYYYMMDD-HHMMSS)
|
|
5
5
|
branch_numbering: sequential
|
|
6
6
|
|
|
7
|
+
# Optional branch name template. Leave empty for the default "{number}-{slug}".
|
|
8
|
+
# Supported tokens: {author}, {app}, {number}, {slug}
|
|
9
|
+
# {slug} must not appear before {number}; final path segment must start with {number}-.
|
|
10
|
+
# Example for monorepos: "{author}/{app}/{number}-{slug}"
|
|
11
|
+
branch_template: ""
|
|
12
|
+
|
|
13
|
+
# Optional shorthand namespace. Leave empty to use branch_template/default behavior.
|
|
14
|
+
# Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
|
|
15
|
+
branch_prefix: ""
|
|
16
|
+
|
|
7
17
|
# Commit message used by `git commit` during repository initialization
|
|
8
18
|
init_commit_message: "[Spec Kit] Initial commit"
|
|
9
19
|
|
{specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/create-new-feature-branch.sh
RENAMED
|
@@ -75,6 +75,10 @@ while [ $i -le $# ]; do
|
|
|
75
75
|
echo "Environment variables:"
|
|
76
76
|
echo " GIT_BRANCH_NAME Use this exact branch name, bypassing all prefix/suffix generation"
|
|
77
77
|
echo ""
|
|
78
|
+
echo "Configuration:"
|
|
79
|
+
echo " branch_template Optional git-config.yml template with {author}, {app}, {number}, {slug}"
|
|
80
|
+
echo " branch_prefix Optional shorthand namespace expanded before {number}-{slug}"
|
|
81
|
+
echo ""
|
|
78
82
|
echo "Examples:"
|
|
79
83
|
echo " $0 'Add user authentication system' --short-name 'user-auth'"
|
|
80
84
|
echo " $0 'Implement OAuth2 integration for API' --number 5"
|
|
@@ -127,16 +131,28 @@ get_highest_from_specs() {
|
|
|
127
131
|
|
|
128
132
|
# Function to get highest number from git branches
|
|
129
133
|
get_highest_from_branches() {
|
|
130
|
-
|
|
134
|
+
local scope_prefix="${1:-}"
|
|
135
|
+
git branch -a 2>/dev/null | sed -E 's/^[+*][[:space:]]+//; s/^[[:space:]]+//; s|^remotes/[^/]*/||' | _extract_highest_number "$scope_prefix"
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
# Extract the highest sequential feature number from a list of ref names (one per line).
|
|
134
139
|
_extract_highest_number() {
|
|
140
|
+
local scope_prefix="${1:-}"
|
|
135
141
|
local highest=0
|
|
136
142
|
while IFS= read -r name; do
|
|
137
143
|
[ -z "$name" ] && continue
|
|
138
|
-
if
|
|
139
|
-
|
|
144
|
+
if [ -n "$scope_prefix" ]; then
|
|
145
|
+
case "$name" in
|
|
146
|
+
"$scope_prefix"*) name="${name#"$scope_prefix"}" ;;
|
|
147
|
+
*) continue ;;
|
|
148
|
+
esac
|
|
149
|
+
fi
|
|
150
|
+
name="${name##*/}"
|
|
151
|
+
if echo "$name" | grep -Eq '^[0-9]{3,}-' \
|
|
152
|
+
&& ! echo "$name" | grep -Eq '^[0-9]{8}-[0-9]{6}-' \
|
|
153
|
+
&& ! echo "$name" | grep -Eq '^[0-9]{7}-[0-9]{6}-' \
|
|
154
|
+
&& ! echo "$name" | grep -Eq '^[0-9]{7,8}-[0-9]{6}$'; then
|
|
155
|
+
number=$(echo "$name" | grep -Eo '^[0-9]{3,}-' | sed -E 's/-$//' || echo "0")
|
|
140
156
|
number=$((10#$number))
|
|
141
157
|
if [ "$number" -gt "$highest" ]; then
|
|
142
158
|
highest=$number
|
|
@@ -148,11 +164,12 @@ _extract_highest_number() {
|
|
|
148
164
|
|
|
149
165
|
# Function to get highest number from remote branches without fetching (side-effect-free)
|
|
150
166
|
get_highest_from_remote_refs() {
|
|
167
|
+
local scope_prefix="${1:-}"
|
|
151
168
|
local highest=0
|
|
152
169
|
|
|
153
170
|
for remote in $(git remote 2>/dev/null); do
|
|
154
171
|
local remote_highest
|
|
155
|
-
remote_highest=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads "$remote" 2>/dev/null | sed 's|.*refs/heads/||' | _extract_highest_number)
|
|
172
|
+
remote_highest=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads "$remote" 2>/dev/null | sed 's|.*refs/heads/||' | _extract_highest_number "$scope_prefix")
|
|
156
173
|
if [ "$remote_highest" -gt "$highest" ]; then
|
|
157
174
|
highest=$remote_highest
|
|
158
175
|
fi
|
|
@@ -165,16 +182,17 @@ get_highest_from_remote_refs() {
|
|
|
165
182
|
check_existing_branches() {
|
|
166
183
|
local specs_dir="$1"
|
|
167
184
|
local skip_fetch="${2:-false}"
|
|
185
|
+
local scope_prefix="${3:-}"
|
|
168
186
|
|
|
169
187
|
if [ "$skip_fetch" = true ]; then
|
|
170
|
-
local highest_remote=$(get_highest_from_remote_refs)
|
|
171
|
-
local highest_branch=$(get_highest_from_branches)
|
|
188
|
+
local highest_remote=$(get_highest_from_remote_refs "$scope_prefix")
|
|
189
|
+
local highest_branch=$(get_highest_from_branches "$scope_prefix")
|
|
172
190
|
if [ "$highest_remote" -gt "$highest_branch" ]; then
|
|
173
191
|
highest_branch=$highest_remote
|
|
174
192
|
fi
|
|
175
193
|
else
|
|
176
194
|
git fetch --all --prune >/dev/null 2>&1 || true
|
|
177
|
-
local highest_branch=$(get_highest_from_branches)
|
|
195
|
+
local highest_branch=$(get_highest_from_branches "$scope_prefix")
|
|
178
196
|
fi
|
|
179
197
|
|
|
180
198
|
local highest_spec=$(get_highest_from_specs "$specs_dir")
|
|
@@ -273,6 +291,152 @@ fi
|
|
|
273
291
|
cd "$REPO_ROOT"
|
|
274
292
|
|
|
275
293
|
SPECS_DIR="$REPO_ROOT/specs"
|
|
294
|
+
CONFIG_FILE="$REPO_ROOT/.specify/extensions/git/git-config.yml"
|
|
295
|
+
|
|
296
|
+
read_git_config_value() {
|
|
297
|
+
local key="$1"
|
|
298
|
+
[ -f "$CONFIG_FILE" ] || return 0
|
|
299
|
+
grep -E "^[[:space:]]*${key}:" "$CONFIG_FILE" 2>/dev/null \
|
|
300
|
+
| head -n 1 \
|
|
301
|
+
| sed -E "s/^[[:space:]]*${key}:[[:space:]]*//" \
|
|
302
|
+
| sed -E 's/[[:space:]]+#.*$//' \
|
|
303
|
+
| sed -E 's/^[[:space:]]+|[[:space:]]+$//g' \
|
|
304
|
+
| sed -E 's/^"//; s/"$//' \
|
|
305
|
+
| sed -E "s/^'//; s/'$//"
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
branch_token() {
|
|
309
|
+
local value="$1"
|
|
310
|
+
local fallback="$2"
|
|
311
|
+
local cleaned
|
|
312
|
+
cleaned=$(clean_branch_name "$value")
|
|
313
|
+
if [ -n "$cleaned" ]; then
|
|
314
|
+
printf '%s\n' "$cleaned"
|
|
315
|
+
else
|
|
316
|
+
printf '%s\n' "$fallback"
|
|
317
|
+
fi
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
get_author_token() {
|
|
321
|
+
local author=""
|
|
322
|
+
if command -v git >/dev/null 2>&1; then
|
|
323
|
+
author=$(git config user.name 2>/dev/null || true)
|
|
324
|
+
if [ -z "$author" ]; then
|
|
325
|
+
author=$(git config user.email 2>/dev/null | sed 's/@.*$//' || true)
|
|
326
|
+
fi
|
|
327
|
+
fi
|
|
328
|
+
if [ -z "$author" ]; then
|
|
329
|
+
author="${USER:-unknown}"
|
|
330
|
+
fi
|
|
331
|
+
branch_token "$author" "unknown"
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
get_app_token() {
|
|
335
|
+
branch_token "$(basename "$REPO_ROOT")" "app"
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
resolve_branch_template() {
|
|
339
|
+
local template
|
|
340
|
+
local prefix
|
|
341
|
+
template=$(read_git_config_value "branch_template")
|
|
342
|
+
if [ -n "$template" ]; then
|
|
343
|
+
printf '%s\n' "$template"
|
|
344
|
+
return
|
|
345
|
+
fi
|
|
346
|
+
|
|
347
|
+
prefix=$(read_git_config_value "branch_prefix")
|
|
348
|
+
if [ -z "$prefix" ]; then
|
|
349
|
+
printf '%s\n' ""
|
|
350
|
+
return
|
|
351
|
+
fi
|
|
352
|
+
case "$prefix" in
|
|
353
|
+
*/) printf '%s%s\n' "$prefix" "{number}-{slug}" ;;
|
|
354
|
+
*) printf '%s/%s\n' "$prefix" "{number}-{slug}" ;;
|
|
355
|
+
esac
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
render_branch_template() {
|
|
359
|
+
local template="$1"
|
|
360
|
+
local feature_num="$2"
|
|
361
|
+
local branch_suffix="$3"
|
|
362
|
+
local rendered="$template"
|
|
363
|
+
rendered=${rendered//\{author\}/$AUTHOR_TOKEN}
|
|
364
|
+
rendered=${rendered//\{app\}/$APP_TOKEN}
|
|
365
|
+
rendered=${rendered//\{number\}/$feature_num}
|
|
366
|
+
rendered=${rendered//\{slug\}/$branch_suffix}
|
|
367
|
+
printf '%s\n' "$rendered"
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
validate_branch_template() {
|
|
371
|
+
local template="$1"
|
|
372
|
+
[ -n "$template" ] || return 0
|
|
373
|
+
local feature_segment
|
|
374
|
+
feature_segment="${template##*/}"
|
|
375
|
+
case "$template" in
|
|
376
|
+
*"{number}"*) ;;
|
|
377
|
+
*)
|
|
378
|
+
>&2 echo "Error: branch_template must include the {number} token so generated branches remain valid feature branches."
|
|
379
|
+
exit 1
|
|
380
|
+
;;
|
|
381
|
+
esac
|
|
382
|
+
case "$template" in
|
|
383
|
+
*"{slug}"*"{number}"*)
|
|
384
|
+
>&2 echo "Error: branch_template must not place {slug} before {number}; use {slug} only in the final feature segment."
|
|
385
|
+
exit 1
|
|
386
|
+
;;
|
|
387
|
+
esac
|
|
388
|
+
case "$feature_segment" in
|
|
389
|
+
"{number}-"*) ;;
|
|
390
|
+
*)
|
|
391
|
+
>&2 echo "Error: branch_template must put {number}- at the start of the final path segment so generated branches remain valid feature branches."
|
|
392
|
+
exit 1
|
|
393
|
+
;;
|
|
394
|
+
esac
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
build_branch_name() {
|
|
398
|
+
local feature_num="$1"
|
|
399
|
+
local branch_suffix="$2"
|
|
400
|
+
if [ -n "$BRANCH_TEMPLATE" ]; then
|
|
401
|
+
render_branch_template "$BRANCH_TEMPLATE" "$feature_num" "$branch_suffix"
|
|
402
|
+
else
|
|
403
|
+
printf '%s-%s\n' "$feature_num" "$branch_suffix"
|
|
404
|
+
fi
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
branch_scope_prefix() {
|
|
408
|
+
local template="$1"
|
|
409
|
+
local prefix="$template"
|
|
410
|
+
[ -n "$prefix" ] || return 0
|
|
411
|
+
case "$prefix" in
|
|
412
|
+
*"{number}"*) prefix="${prefix%%\{number\}*}" ;;
|
|
413
|
+
*"{slug}"*) prefix="${prefix%%\{slug\}*}" ;;
|
|
414
|
+
*) return 0 ;;
|
|
415
|
+
esac
|
|
416
|
+
render_branch_template "$prefix" "" "$BRANCH_SUFFIX"
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
extract_feature_num_from_branch() {
|
|
420
|
+
local branch_name="$1"
|
|
421
|
+
local feature_segment="${branch_name##*/}"
|
|
422
|
+
local match
|
|
423
|
+
match=$(printf '%s\n' "$feature_segment" | grep -Eo '^[0-9]{8}-[0-9]{6}-' | head -n 1 || true)
|
|
424
|
+
if [ -n "$match" ]; then
|
|
425
|
+
printf '%s\n' "$match" | sed -E 's/-$//'
|
|
426
|
+
return
|
|
427
|
+
fi
|
|
428
|
+
match=$(printf '%s\n' "$feature_segment" | grep -Eo '^[0-9]+-' | head -n 1 || true)
|
|
429
|
+
if [ -n "$match" ]; then
|
|
430
|
+
printf '%s\n' "$match" | sed -E 's/-$//'
|
|
431
|
+
return
|
|
432
|
+
fi
|
|
433
|
+
printf '%s\n' "$branch_name"
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
AUTHOR_TOKEN=$(get_author_token)
|
|
437
|
+
APP_TOKEN=$(get_app_token)
|
|
438
|
+
BRANCH_TEMPLATE=$(resolve_branch_template)
|
|
439
|
+
validate_branch_template "$BRANCH_TEMPLATE"
|
|
276
440
|
|
|
277
441
|
# Function to generate branch name with stop word filtering
|
|
278
442
|
generate_branch_name() {
|
|
@@ -318,18 +482,8 @@ generate_branch_name() {
|
|
|
318
482
|
# Check for GIT_BRANCH_NAME env var override (exact branch name, no prefix/suffix)
|
|
319
483
|
if [ -n "${GIT_BRANCH_NAME:-}" ]; then
|
|
320
484
|
BRANCH_NAME="$GIT_BRANCH_NAME"
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
if echo "$BRANCH_NAME" | grep -Eq '^[0-9]{8}-[0-9]{6}-'; then
|
|
324
|
-
FEATURE_NUM=$(echo "$BRANCH_NAME" | grep -Eo '^[0-9]{8}-[0-9]{6}')
|
|
325
|
-
BRANCH_SUFFIX="${BRANCH_NAME#${FEATURE_NUM}-}"
|
|
326
|
-
elif echo "$BRANCH_NAME" | grep -Eq '^[0-9]+-'; then
|
|
327
|
-
FEATURE_NUM=$(echo "$BRANCH_NAME" | grep -Eo '^[0-9]+')
|
|
328
|
-
BRANCH_SUFFIX="${BRANCH_NAME#${FEATURE_NUM}-}"
|
|
329
|
-
else
|
|
330
|
-
FEATURE_NUM="$BRANCH_NAME"
|
|
331
|
-
BRANCH_SUFFIX="$BRANCH_NAME"
|
|
332
|
-
fi
|
|
485
|
+
FEATURE_NUM=$(extract_feature_num_from_branch "$BRANCH_NAME")
|
|
486
|
+
BRANCH_SUFFIX="$BRANCH_NAME"
|
|
333
487
|
else
|
|
334
488
|
# Generate branch name
|
|
335
489
|
if [ -n "$SHORT_NAME" ]; then
|
|
@@ -347,16 +501,17 @@ else
|
|
|
347
501
|
# Determine branch prefix
|
|
348
502
|
if [ "$USE_TIMESTAMP" = true ]; then
|
|
349
503
|
FEATURE_NUM=$(date +%Y%m%d-%H%M%S)
|
|
350
|
-
BRANCH_NAME
|
|
504
|
+
BRANCH_NAME=$(build_branch_name "$FEATURE_NUM" "$BRANCH_SUFFIX")
|
|
351
505
|
else
|
|
506
|
+
BRANCH_SCOPE_PREFIX=$(branch_scope_prefix "$BRANCH_TEMPLATE")
|
|
352
507
|
if [ -z "$BRANCH_NUMBER" ]; then
|
|
353
508
|
if [ "$DRY_RUN" = true ] && [ "$HAS_GIT" = true ]; then
|
|
354
|
-
BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR" true)
|
|
509
|
+
BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR" true "$BRANCH_SCOPE_PREFIX")
|
|
355
510
|
elif [ "$DRY_RUN" = true ]; then
|
|
356
511
|
HIGHEST=$(get_highest_from_specs "$SPECS_DIR")
|
|
357
512
|
BRANCH_NUMBER=$((HIGHEST + 1))
|
|
358
513
|
elif [ "$HAS_GIT" = true ]; then
|
|
359
|
-
BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR")
|
|
514
|
+
BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR" false "$BRANCH_SCOPE_PREFIX")
|
|
360
515
|
else
|
|
361
516
|
HIGHEST=$(get_highest_from_specs "$SPECS_DIR")
|
|
362
517
|
BRANCH_NUMBER=$((HIGHEST + 1))
|
|
@@ -364,7 +519,7 @@ else
|
|
|
364
519
|
fi
|
|
365
520
|
|
|
366
521
|
FEATURE_NUM=$(printf "%03d" "$((10#$BRANCH_NUMBER))")
|
|
367
|
-
BRANCH_NAME
|
|
522
|
+
BRANCH_NAME=$(build_branch_name "$FEATURE_NUM" "$BRANCH_SUFFIX")
|
|
368
523
|
fi
|
|
369
524
|
fi
|
|
370
525
|
|
|
@@ -376,18 +531,23 @@ if [ -n "${GIT_BRANCH_NAME:-}" ] && [ "$BRANCH_BYTE_LEN" -gt $MAX_BRANCH_LENGTH
|
|
|
376
531
|
>&2 echo "Error: GIT_BRANCH_NAME must be 244 bytes or fewer in UTF-8. Provided value is ${BRANCH_BYTE_LEN} bytes."
|
|
377
532
|
exit 1
|
|
378
533
|
elif [ "$BRANCH_BYTE_LEN" -gt $MAX_BRANCH_LENGTH ]; then
|
|
379
|
-
PREFIX_LENGTH=$(( ${#FEATURE_NUM} + 1 ))
|
|
380
|
-
MAX_SUFFIX_LENGTH=$((MAX_BRANCH_LENGTH - PREFIX_LENGTH))
|
|
381
|
-
|
|
382
|
-
TRUNCATED_SUFFIX=$(echo "$BRANCH_SUFFIX" | cut -c1-$MAX_SUFFIX_LENGTH)
|
|
383
|
-
TRUNCATED_SUFFIX=$(echo "$TRUNCATED_SUFFIX" | sed 's/-$//')
|
|
384
|
-
|
|
385
534
|
ORIGINAL_BRANCH_NAME="$BRANCH_NAME"
|
|
386
|
-
|
|
535
|
+
TRUNCATED_SUFFIX="$BRANCH_SUFFIX"
|
|
536
|
+
while [ "$(_byte_length "$BRANCH_NAME")" -gt "$MAX_BRANCH_LENGTH" ] && [ -n "$TRUNCATED_SUFFIX" ]; do
|
|
537
|
+
TRUNCATED_SUFFIX="${TRUNCATED_SUFFIX%?}"
|
|
538
|
+
TRUNCATED_SUFFIX="${TRUNCATED_SUFFIX%-}"
|
|
539
|
+
BRANCH_NAME=$(build_branch_name "$FEATURE_NUM" "$TRUNCATED_SUFFIX")
|
|
540
|
+
done
|
|
541
|
+
if [ "$(_byte_length "$BRANCH_NAME")" -gt "$MAX_BRANCH_LENGTH" ]; then
|
|
542
|
+
>&2 echo "Error: Branch template prefix exceeds GitHub's 244-byte branch name limit."
|
|
543
|
+
exit 1
|
|
544
|
+
fi
|
|
387
545
|
|
|
388
546
|
>&2 echo "[specify] Warning: Branch name exceeded GitHub's 244-byte limit"
|
|
389
|
-
|
|
390
|
-
|
|
547
|
+
ORIGINAL_BRANCH_BYTE_LEN=$(_byte_length "$ORIGINAL_BRANCH_NAME")
|
|
548
|
+
TRUNCATED_BRANCH_BYTE_LEN=$(_byte_length "$BRANCH_NAME")
|
|
549
|
+
>&2 echo "[specify] Original: $ORIGINAL_BRANCH_NAME (${ORIGINAL_BRANCH_BYTE_LEN} bytes)"
|
|
550
|
+
>&2 echo "[specify] Truncated to: $BRANCH_NAME (${TRUNCATED_BRANCH_BYTE_LEN} bytes)"
|
|
391
551
|
fi
|
|
392
552
|
|
|
393
553
|
if [ "$DRY_RUN" != true ]; then
|
|
@@ -23,8 +23,9 @@ spec_kit_effective_branch_name() {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
# Validate that a branch name matches the expected feature branch pattern.
|
|
26
|
-
# Accepts sequential (###-* with >=3 digits) or timestamp (YYYYMMDD-HHMMSS-*) formats
|
|
27
|
-
#
|
|
26
|
+
# Accepts sequential (###-* with >=3 digits) or timestamp (YYYYMMDD-HHMMSS-*) formats,
|
|
27
|
+
# either at the start of the branch or after path-style namespace prefixes.
|
|
28
|
+
# Logic aligned with the git extension's PowerShell Test-FeatureBranch twin.
|
|
28
29
|
check_feature_branch() {
|
|
29
30
|
local raw="$1"
|
|
30
31
|
local has_git_repo="$2"
|
|
@@ -37,16 +38,17 @@ check_feature_branch() {
|
|
|
37
38
|
|
|
38
39
|
local branch
|
|
39
40
|
branch=$(spec_kit_effective_branch_name "$raw")
|
|
41
|
+
local feature_segment="${branch##*/}"
|
|
40
42
|
|
|
41
43
|
# Accept sequential prefix (3+ digits) but exclude malformed timestamps
|
|
42
44
|
# Malformed: 7-or-8 digit date + 6-digit time with no trailing slug (e.g. "2026031-143022" or "20260319-143022")
|
|
43
45
|
local is_sequential=false
|
|
44
|
-
if [[ "$
|
|
46
|
+
if [[ "$feature_segment" =~ ^[0-9]{3,}- ]] && [[ ! "$feature_segment" =~ ^[0-9]{7}-[0-9]{6}- ]] && [[ ! "$feature_segment" =~ ^[0-9]{7,8}-[0-9]{6}$ ]]; then
|
|
45
47
|
is_sequential=true
|
|
46
48
|
fi
|
|
47
|
-
if [[ "$is_sequential" != "true" ]] && [[ ! "$
|
|
49
|
+
if [[ "$is_sequential" != "true" ]] && [[ ! "$feature_segment" =~ ^[0-9]{8}-[0-9]{6}- ]]; then
|
|
48
50
|
echo "ERROR: Not on a feature branch. Current branch: $raw" >&2
|
|
49
|
-
echo "Feature branches should be named like: 001-feature-name, 1234-feature-name,
|
|
51
|
+
echo "Feature branches should be named like: 001-feature-name, 1234-feature-name, 20260319-143022-feature-name, or <prefix>/001-feature-name" >&2
|
|
50
52
|
return 1
|
|
51
53
|
fi
|
|
52
54
|
|