specify-cli 0.12.15__tar.gz → 0.12.16__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.15 → specify_cli-0.12.16}/CHANGELOG.md +15 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/PKG-INFO +7 -1
- {specify_cli-0.12.15 → specify_cli-0.12.16}/README.md +6 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/extensions.md +1 -0
- specify_cli-0.12.16/docs/install/pypi.md +83 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/installation.md +27 -4
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/workflows.md +10 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/toc.yml +2 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/catalog.community.json +44 -4
- specify_cli-0.12.16/extensions/git/scripts/python/auto_commit.py +187 -0
- specify_cli-0.12.16/extensions/git/scripts/python/create_new_feature_branch.py +634 -0
- specify_cli-0.12.16/extensions/git/scripts/python/git_common.py +81 -0
- specify_cli-0.12.16/extensions/git/scripts/python/initialize_repo.py +89 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/pyproject.toml +1 -1
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/commands/init.py +27 -15
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/presets/__init__.py +212 -1
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/presets/_commands.py +9 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/base.py +3 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/engine.py +17 -4
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/expressions.py +46 -5
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/do_while/__init__.py +24 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/shell/__init__.py +9 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/while_loop/__init__.py +26 -0
- specify_cli-0.12.16/tests/extensions/git/test_git_extension_python_parity.py +647 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_cli.py +12 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_markdown.py +1 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_skills.py +1 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_toml.py +1 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_yaml.py +1 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_cline.py +1 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_copilot.py +3 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_generic.py +2 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_presets.py +685 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_workflows.py +396 -1
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/README.md +7 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.editorconfig +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.gitattributes +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/CODEOWNERS +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/dependabot.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-test.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/release.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/test.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.gitignore +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.pre-commit-config.yaml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/.zenodo.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/AGENTS.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/CITATION.cff +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/DEVELOPMENT.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/LICENSE +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/SECURITY.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/SUPPORT.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/.gitignore +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/bundles.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/friends.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/overview.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/presets.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/docfx.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/index.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/one-time.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/pipx.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/uv.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/local-development.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/quickstart.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/authentication.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/bundles.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/core.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/extensions.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/integrations.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/overview.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/presets.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/template/public/main.css +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/upgrade.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/catalog.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/extension.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/.gitignore +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/LICENSE +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/extension.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/catalog.community.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/catalog.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/media/logo_large.webp +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/media/logo_small.webp +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/media/specify_cli.gif +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-April.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-February.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-June.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-March.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-May.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/catalog.community.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/catalog.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/preset.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/README.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/common.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/python/check_prerequisites.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/python/common.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/spec-driven.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/spec-kit.code-workspace +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_project.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_toml_string.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/agents.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/_commands.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/checklist-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/analyze.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/checklist.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/clarify.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/constitution.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/converge.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/implement.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/plan.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/specify.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/tasks.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/constitution-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/plan-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/spec-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/tasks-template.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/vscode-settings.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/auth_helpers.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/conftest.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/plan.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/spec.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/http_helpers.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_authentication.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_check_prerequisites_python_parity.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_check_tool.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_cli_version.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_command_template_py_scripts.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_commands_package.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_console_imports.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extensions.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_github_http.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_init_dir.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_merge.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_post_process.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_upgrade.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_utils.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_version_imports.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/catalog.community.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/catalog.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/step-catalog.json +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.12.16] - 2026-07-15
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix(workflows): raise a clear error, not a cryptic crash, on non-string filter args (#3522)
|
|
10
|
+
- feat(workflows): expose workflow source directory to steps (#3469)
|
|
11
|
+
- fix(workflows): fan-out max_concurrency .inf falls back to sequential, not crash (#3521)
|
|
12
|
+
- Update Coding Standards Drift Control extension to v0.4.0 (#3540)
|
|
13
|
+
- fix(presets): seed constitution from preset constitution-template (#3272) (#3276)
|
|
14
|
+
- docs: add PyPI as second supported install route (#3425) (#3516)
|
|
15
|
+
- fix(workflows): fail while/do-while steps on non-list steps instead of crashing (#3519)
|
|
16
|
+
- Add PatchWarden Evidence Pack extension to community catalog (#3514)
|
|
17
|
+
- feat(extensions): port git extension scripts to Python (#3400)
|
|
18
|
+
- chore: release 0.12.15, begin 0.12.16.dev0 development (#3513)
|
|
19
|
+
|
|
5
20
|
## [0.12.15] - 2026-07-14
|
|
6
21
|
|
|
7
22
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specify-cli
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.16
|
|
4
4
|
Summary: Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD).
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -71,6 +71,12 @@ Requires **[uv](https://docs.astral.sh/uv/)** ([install uv](./docs/install/uv.md
|
|
|
71
71
|
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
+
Prefer installing from PyPI? The `specify-cli` package is also published there:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
uv tool install specify-cli
|
|
78
|
+
```
|
|
79
|
+
|
|
74
80
|
See the [Installation Guide](./docs/installation.md) for alternative methods, verification, upgrade, and troubleshooting.
|
|
75
81
|
|
|
76
82
|
### 2. Initialize a project
|
|
@@ -51,6 +51,12 @@ Requires **[uv](https://docs.astral.sh/uv/)** ([install uv](./docs/install/uv.md
|
|
|
51
51
|
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
Prefer installing from PyPI? The `specify-cli` package is also published there:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
uv tool install specify-cli
|
|
58
|
+
```
|
|
59
|
+
|
|
54
60
|
See the [Installation Guide](./docs/installation.md) for alternative methods, verification, upgrade, and troubleshooting.
|
|
55
61
|
|
|
56
62
|
### 2. Initialize a project
|
|
@@ -91,6 +91,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
91
91
|
| Optimize | Audit and optimize AI governance for context efficiency — token budgets, rule health, interpretability, compression, coherence, and echo detection | `process` | Read+Write | [spec-kit-optimize](https://github.com/sakitA/spec-kit-optimize) |
|
|
92
92
|
| Orchestration Task Context Management | Adds subagent work-unit orchestration to generated Spec Kit task files | `process` | Read+Write | [spec-kit-orchestration-task-context-management](https://github.com/benizzio/spec-kit-orchestration-task-context-management) |
|
|
93
93
|
| OWASP LLM Threat Model | OWASP Top 10 for LLM Applications 2025 threat analysis on agent artifacts | `code` | Read-only | [spec-kit-threatmodel](https://github.com/NaviaSamal/spec-kit-threatmodel) |
|
|
94
|
+
| PatchWarden Evidence Pack | Map Spec Kit tasks into a guarded PatchWarden Goal and export bounded, traceable evidence for an accepted lineage. | `process` | Read+Write | [spec-kit-patchwarden](https://github.com/jiezeng2004-design/spec-kit-patchwarden) |
|
|
94
95
|
| Plan Review Gate | Require spec.md and plan.md to be merged via MR/PR before allowing task generation | `process` | Read-only | [spec-kit-plan-review-gate](https://github.com/luno/spec-kit-plan-review-gate) |
|
|
95
96
|
| PR Bridge | Auto-generate pull request descriptions, checklists, and summaries from spec artifacts | `process` | Read-only | [spec-kit-pr-bridge-](https://github.com/Quratulain-bilal/spec-kit-pr-bridge-) |
|
|
96
97
|
| Presetify | Create and validate presets and preset catalogs | `process` | Read+Write | [presetify](https://github.com/mnriem/spec-kit-extensions/tree/main/presetify) |
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Installing from PyPI
|
|
2
|
+
|
|
3
|
+
Spec Kit is published to PyPI as [`specify-cli`](https://pypi.org/project/specify-cli/), maintained by the Spec Kit maintainers. Installing from PyPI is the second supported install route alongside installing from the [GitHub source](../installation.md#install-from-source--persistent-installation-recommended). Use whichever fits your workflow — both provide the same `specify` CLI.
|
|
4
|
+
|
|
5
|
+
> [!NOTE]
|
|
6
|
+
> The PyPI release version tracks the GitHub release tags (for example, PyPI `0.12.11` corresponds to the `v0.12.11` tag). `specify version` is only a local version/runtime sanity check — it reports the installed version but not where the `specify` executable came from, so it cannot distinguish a PyPI install from a Git install. To confirm the install source, inspect the source metadata your package manager records: `pipx list --json` reports the exact install specification for each tool, and for uv/pip installs you can check the package's [PEP 610](https://peps.python.org/pep-0610/) `direct_url.json` inside its `*.dist-info` directory (a Git or URL install records the repository/archive URL there, while a plain PyPI index install does not create that file). Note that `pip show specify-cli` only prints package metadata and will not see uv/pipx-managed environments from the host interpreter.
|
|
7
|
+
|
|
8
|
+
## Install Specify CLI
|
|
9
|
+
|
|
10
|
+
Use whichever Python tool you already have:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# Using uv (recommended)
|
|
14
|
+
uv tool install specify-cli
|
|
15
|
+
|
|
16
|
+
# Or using pipx
|
|
17
|
+
pipx install specify-cli
|
|
18
|
+
|
|
19
|
+
# Or using pip
|
|
20
|
+
pip install specify-cli
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Install a specific release
|
|
24
|
+
|
|
25
|
+
Pin an exact version for reproducible installs (check [PyPI](https://pypi.org/project/specify-cli/#history) or [Releases](https://github.com/github/spec-kit/releases) for available versions):
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Using uv
|
|
29
|
+
uv tool install specify-cli==0.12.11
|
|
30
|
+
|
|
31
|
+
# Or using pipx
|
|
32
|
+
pipx install specify-cli==0.12.11
|
|
33
|
+
|
|
34
|
+
# Or using pip
|
|
35
|
+
pip install specify-cli==0.12.11
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Verify
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
specify version
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Initialize a project
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
specify init <PROJECT_NAME> --integration copilot
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Upgrade
|
|
51
|
+
|
|
52
|
+
Upgrade by reinstalling the package through the same tool you used for the original install. If you originally pinned a version, note that `uv tool upgrade` preserves that pin; to move to the newest PyPI release, use an unpinned install command so you do not keep the existing version pin:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Using uv
|
|
56
|
+
uv tool install --force specify-cli
|
|
57
|
+
|
|
58
|
+
# Or using pipx
|
|
59
|
+
pipx install --force specify-cli
|
|
60
|
+
|
|
61
|
+
# Or using pip
|
|
62
|
+
pip install --upgrade specify-cli
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
> [!NOTE]
|
|
66
|
+
> `specify self upgrade` currently rebuilds `uv tool` and `pipx` installs from the GitHub source release URL rather than preserving a PyPI-based installation. If you want to stay on the PyPI route, use the package-manager commands above. A plain `pip install specify-cli` is treated as an unmanaged install — upgrade it with `pip install --upgrade specify-cli`. See the [Upgrade Guide](../upgrade.md) for details.
|
|
67
|
+
|
|
68
|
+
## Uninstall
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Using uv
|
|
72
|
+
uv tool uninstall specify-cli
|
|
73
|
+
|
|
74
|
+
# Or using pipx
|
|
75
|
+
pipx uninstall specify-cli
|
|
76
|
+
|
|
77
|
+
# Or using pip
|
|
78
|
+
pip uninstall specify-cli
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Next steps
|
|
82
|
+
|
|
83
|
+
Head to the [Quick Start](../quickstart.md) to initialize your first project.
|
|
@@ -11,9 +11,14 @@
|
|
|
11
11
|
## Installation
|
|
12
12
|
|
|
13
13
|
> [!IMPORTANT]
|
|
14
|
-
>
|
|
14
|
+
> Spec Kit is distributed through two official channels, both published and maintained by the Spec Kit maintainers: the [github/spec-kit](https://github.com/github/spec-kit) GitHub repository (source installs) and the [`specify-cli`](https://pypi.org/project/specify-cli/) package on [PyPI](https://pypi.org/project/specify-cli/). Either route is supported for normal installs — use the commands shown below. After installing, run `specify version` as a local version/runtime sanity check. It confirms that the `specify` command is available and reports its version, but it does not prove whether the executable came from PyPI or GitHub. For offline or air-gapped environments, locally built wheels created from this repository are also valid.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Spec Kit supports two install routes:
|
|
17
|
+
|
|
18
|
+
1. **Install from source (GitHub)** — the recommended route, pinned to a release tag.
|
|
19
|
+
2. **Install from PyPI** — install the published `specify-cli` package with your usual Python tooling.
|
|
20
|
+
|
|
21
|
+
### Install from Source — Persistent Installation (Recommended)
|
|
17
22
|
|
|
18
23
|
Install once and use everywhere. Replace `vX.Y.Z` with a release tag from [Releases](https://github.com/github/spec-kit/releases) — keep the leading `v` (for example, `v0.12.11`, not `0.12.11`):
|
|
19
24
|
|
|
@@ -30,12 +35,30 @@ Then initialize a project:
|
|
|
30
35
|
specify init <PROJECT_NAME> --integration copilot
|
|
31
36
|
```
|
|
32
37
|
|
|
38
|
+
### Install from PyPI
|
|
39
|
+
|
|
40
|
+
Spec Kit is also published to PyPI as [`specify-cli`](https://pypi.org/project/specify-cli/), so you can install it with your preferred Python package manager without referencing the Git URL:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Using uv (recommended)
|
|
44
|
+
uv tool install specify-cli
|
|
45
|
+
|
|
46
|
+
# Or using pipx
|
|
47
|
+
pipx install specify-cli
|
|
48
|
+
|
|
49
|
+
# Or using pip
|
|
50
|
+
pip install specify-cli
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
To install a specific release, pin the version — for example `uv tool install specify-cli==0.12.11`. See the [PyPI installation guide](install/pypi.md) for details, including how to upgrade.
|
|
54
|
+
|
|
33
55
|
### One-time Usage
|
|
34
56
|
|
|
35
57
|
Run directly without installing — see the [One-time usage (uvx)](install/one-time.md) guide.
|
|
36
58
|
|
|
37
59
|
### Alternative Package Managers
|
|
38
60
|
|
|
61
|
+
- **PyPI** — see the [PyPI installation guide](install/pypi.md)
|
|
39
62
|
- **pipx** — see the [pipx installation guide](install/pipx.md)
|
|
40
63
|
- **Enterprise / Air-Gapped** — see the [air-gapped installation guide](install/air-gapped.md)
|
|
41
64
|
|
|
@@ -81,13 +104,13 @@ specify init <project_name> --integration claude --ignore-agent-tools
|
|
|
81
104
|
|
|
82
105
|
## Verification
|
|
83
106
|
|
|
84
|
-
After installation, run the following command
|
|
107
|
+
After installation, run the following command as a local version/runtime check:
|
|
85
108
|
|
|
86
109
|
```bash
|
|
87
110
|
specify version
|
|
88
111
|
```
|
|
89
112
|
|
|
90
|
-
This
|
|
113
|
+
This confirms that the `specify` command is available and reporting the expected version. It does not prove whether that executable came from PyPI or GitHub.
|
|
91
114
|
|
|
92
115
|
**Stay current:** Run `specify self check` periodically to learn whether a newer release is available — it is read-only and never modifies your installation. When you are ready to upgrade, follow the [Upgrade Guide](./upgrade.md).
|
|
93
116
|
|
|
@@ -305,6 +305,8 @@ Steps can reference inputs and previous step outputs using `{{ expression }}` sy
|
|
|
305
305
|
| `inputs.spec` | Workflow input values |
|
|
306
306
|
| `steps.specify.output.file` | Output from a previous step |
|
|
307
307
|
| `item` | Current item in a fan-out iteration |
|
|
308
|
+
| `context.run_id` | Current workflow run ID |
|
|
309
|
+
| `context.workflow_dir` | Resolved absolute path to the workflow source directory. Empty string for string-loaded workflows. |
|
|
308
310
|
|
|
309
311
|
Available filters: `default`, `join`, `contains`, `map`, `from_json`.
|
|
310
312
|
|
|
@@ -316,6 +318,14 @@ args: "{{ inputs.spec }}"
|
|
|
316
318
|
message: "{{ status | default('pending') }}"
|
|
317
319
|
```
|
|
318
320
|
|
|
321
|
+
## Shell Step Environment Variables
|
|
322
|
+
|
|
323
|
+
Shell steps automatically receive the following environment variables:
|
|
324
|
+
|
|
325
|
+
| Variable | Description |
|
|
326
|
+
| -------- | ----------- |
|
|
327
|
+
| `SPECKIT_WORKFLOW_DIR` | Resolved absolute path to the workflow source directory (same value as `{{ context.workflow_dir }}`). Not set when the workflow has no source path. |
|
|
328
|
+
|
|
319
329
|
## Input Types
|
|
320
330
|
|
|
321
331
|
| Type | Coercion |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-07-
|
|
3
|
+
"updated_at": "2026-07-15T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"aide": {
|
|
@@ -809,8 +809,8 @@
|
|
|
809
809
|
"id": "coding-standards-drift-control",
|
|
810
810
|
"description": "Generate coding-standards drift reports and remediation tasks for active Spec Kit features",
|
|
811
811
|
"author": "Igor Benicio de Mesquita",
|
|
812
|
-
"version": "0.
|
|
813
|
-
"download_url": "https://github.com/benizzio/spec-kit-coding-standards-drift-control/archive/refs/tags/v0.
|
|
812
|
+
"version": "0.4.0",
|
|
813
|
+
"download_url": "https://github.com/benizzio/spec-kit-coding-standards-drift-control/archive/refs/tags/v0.4.0.zip",
|
|
814
814
|
"repository": "https://github.com/benizzio/spec-kit-coding-standards-drift-control",
|
|
815
815
|
"homepage": "https://github.com/benizzio/spec-kit-coding-standards-drift-control",
|
|
816
816
|
"documentation": "https://github.com/benizzio/spec-kit-coding-standards-drift-control#readme",
|
|
@@ -835,7 +835,7 @@
|
|
|
835
835
|
"downloads": 0,
|
|
836
836
|
"stars": 0,
|
|
837
837
|
"created_at": "2026-06-11T00:00:00Z",
|
|
838
|
-
"updated_at": "2026-
|
|
838
|
+
"updated_at": "2026-07-15T00:00:00Z"
|
|
839
839
|
},
|
|
840
840
|
"companion": {
|
|
841
841
|
"name": "SpecKit Companion",
|
|
@@ -2677,6 +2677,46 @@
|
|
|
2677
2677
|
"created_at": "2026-04-24T14:00:00Z",
|
|
2678
2678
|
"updated_at": "2026-04-24T14:00:00Z"
|
|
2679
2679
|
},
|
|
2680
|
+
"patchwarden-evidence": {
|
|
2681
|
+
"name": "PatchWarden Evidence Pack",
|
|
2682
|
+
"id": "patchwarden-evidence",
|
|
2683
|
+
"description": "Map Spec Kit tasks into a guarded PatchWarden Goal and export bounded, traceable evidence for an accepted lineage.",
|
|
2684
|
+
"author": "Zengjie",
|
|
2685
|
+
"version": "1.0.1",
|
|
2686
|
+
"download_url": "https://github.com/jiezeng2004-design/spec-kit-patchwarden/archive/refs/tags/v1.0.1.zip",
|
|
2687
|
+
"repository": "https://github.com/jiezeng2004-design/spec-kit-patchwarden",
|
|
2688
|
+
"homepage": "https://github.com/jiezeng2004-design/spec-kit-patchwarden",
|
|
2689
|
+
"documentation": "https://github.com/jiezeng2004-design/spec-kit-patchwarden/blob/main/README.md",
|
|
2690
|
+
"changelog": "https://github.com/jiezeng2004-design/spec-kit-patchwarden/blob/main/CHANGELOG.md",
|
|
2691
|
+
"license": "MIT",
|
|
2692
|
+
"category": "process",
|
|
2693
|
+
"effect": "read-write",
|
|
2694
|
+
"requires": {
|
|
2695
|
+
"speckit_version": ">=0.1.0",
|
|
2696
|
+
"tools": [
|
|
2697
|
+
{
|
|
2698
|
+
"name": "patchwarden",
|
|
2699
|
+
"version": ">=1.5.1",
|
|
2700
|
+
"required": true
|
|
2701
|
+
}
|
|
2702
|
+
]
|
|
2703
|
+
},
|
|
2704
|
+
"provides": {
|
|
2705
|
+
"commands": 2,
|
|
2706
|
+
"hooks": 2
|
|
2707
|
+
},
|
|
2708
|
+
"tags": [
|
|
2709
|
+
"verification",
|
|
2710
|
+
"evidence",
|
|
2711
|
+
"traceability",
|
|
2712
|
+
"security"
|
|
2713
|
+
],
|
|
2714
|
+
"verified": false,
|
|
2715
|
+
"downloads": 0,
|
|
2716
|
+
"stars": 0,
|
|
2717
|
+
"created_at": "2026-07-14T00:00:00Z",
|
|
2718
|
+
"updated_at": "2026-07-14T00:00:00Z"
|
|
2719
|
+
},
|
|
2680
2720
|
"plan-review-gate": {
|
|
2681
2721
|
"name": "Plan Review Gate",
|
|
2682
2722
|
"id": "plan-review-gate",
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Git extension: auto_commit.py
|
|
3
|
+
|
|
4
|
+
Automatically commit changes after a Spec Kit command completes.
|
|
5
|
+
Python port of ``auto-commit.sh`` / ``auto-commit.ps1``.
|
|
6
|
+
Checks per-command config keys in git-config.yml before committing.
|
|
7
|
+
|
|
8
|
+
Usage: auto_commit.py <event_name>
|
|
9
|
+
e.g.: auto_commit.py after_specify
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import re
|
|
15
|
+
import shutil
|
|
16
|
+
import subprocess
|
|
17
|
+
import sys
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _find_project_root(start: Path) -> Path | None:
|
|
22
|
+
current = start
|
|
23
|
+
while True:
|
|
24
|
+
if (current / ".specify").is_dir() or (current / ".git").exists():
|
|
25
|
+
return current
|
|
26
|
+
if current.parent == current:
|
|
27
|
+
return None
|
|
28
|
+
current = current.parent
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _value_after_colon(line: str) -> str:
|
|
32
|
+
return re.sub(r"^[^:]*:\s*", "", line)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _strip_quotes(value: str) -> str:
|
|
36
|
+
"""Strip one leading quote and all trailing quotes, mirroring the bash sed."""
|
|
37
|
+
value = re.sub(r"^[\"']", "", value)
|
|
38
|
+
return re.sub(r"[\"']*$", "", value)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _parse_auto_commit_config(
|
|
42
|
+
config_file: Path, event_name: str
|
|
43
|
+
) -> tuple[bool, str]:
|
|
44
|
+
"""Parse the auto_commit section for this event, mirroring the bash line parser.
|
|
45
|
+
|
|
46
|
+
Returns (enabled, commit_msg). Looks for auto_commit.<event_name>.enabled
|
|
47
|
+
and .message, with auto_commit.default as fallback.
|
|
48
|
+
"""
|
|
49
|
+
enabled = False
|
|
50
|
+
commit_msg = ""
|
|
51
|
+
default_enabled = False
|
|
52
|
+
in_auto_commit = False
|
|
53
|
+
in_event = False
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
content = config_file.read_text(encoding="utf-8")
|
|
57
|
+
except (OSError, UnicodeDecodeError):
|
|
58
|
+
# Unreadable or non-UTF-8 config is treated like a missing one:
|
|
59
|
+
# auto-commit stays disabled instead of crashing with a traceback.
|
|
60
|
+
return False, ""
|
|
61
|
+
for record in content.splitlines(keepends=True):
|
|
62
|
+
if not record.endswith("\n"):
|
|
63
|
+
break
|
|
64
|
+
line = record[:-1]
|
|
65
|
+
if line.startswith("auto_commit:"):
|
|
66
|
+
in_auto_commit = True
|
|
67
|
+
in_event = False
|
|
68
|
+
continue
|
|
69
|
+
|
|
70
|
+
# Exit auto_commit section on next top-level key
|
|
71
|
+
if in_auto_commit and re.match(r"^[a-z]", line):
|
|
72
|
+
break
|
|
73
|
+
|
|
74
|
+
if not in_auto_commit:
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
if re.match(r"^\s+default:\s", line):
|
|
78
|
+
value = re.sub(r"\s", "", _value_after_colon(line)).lower()
|
|
79
|
+
if value == "true":
|
|
80
|
+
default_enabled = True
|
|
81
|
+
|
|
82
|
+
if re.match(rf"^\s+{re.escape(event_name)}:", line):
|
|
83
|
+
in_event = True
|
|
84
|
+
continue
|
|
85
|
+
|
|
86
|
+
if in_event:
|
|
87
|
+
# Exit on next sibling key (same indent level as event name)
|
|
88
|
+
if re.match(r"^\s{2}[a-z]", line) and not re.match(r"^\s{4}", line):
|
|
89
|
+
in_event = False
|
|
90
|
+
continue
|
|
91
|
+
if re.search(r"\s+enabled:", line):
|
|
92
|
+
value = re.sub(r"\s", "", _value_after_colon(line)).lower()
|
|
93
|
+
if value == "true":
|
|
94
|
+
enabled = True
|
|
95
|
+
elif value == "false":
|
|
96
|
+
enabled = False
|
|
97
|
+
if re.search(r"\s+message:", line):
|
|
98
|
+
commit_msg = _strip_quotes(_value_after_colon(line))
|
|
99
|
+
|
|
100
|
+
# If event-specific key not found, use default — but only if the event
|
|
101
|
+
# section didn't exist at all (an explicit false must win).
|
|
102
|
+
if not enabled and default_enabled:
|
|
103
|
+
if not re.search(rf"^\s*{re.escape(event_name)}:", content, re.MULTILINE):
|
|
104
|
+
enabled = True
|
|
105
|
+
|
|
106
|
+
return enabled, commit_msg
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def main(argv: list[str]) -> int:
|
|
110
|
+
event_name = argv[0] if argv else ""
|
|
111
|
+
if not event_name:
|
|
112
|
+
print(f"Usage: {Path(sys.argv[0]).name} <event_name>", file=sys.stderr)
|
|
113
|
+
return 1
|
|
114
|
+
|
|
115
|
+
script_dir = Path(__file__).resolve().parent
|
|
116
|
+
repo_root = _find_project_root(script_dir) or Path.cwd()
|
|
117
|
+
|
|
118
|
+
if shutil.which("git") is None:
|
|
119
|
+
print("[specify] Warning: Git not found; skipped auto-commit", file=sys.stderr)
|
|
120
|
+
return 0
|
|
121
|
+
|
|
122
|
+
probe = subprocess.run(
|
|
123
|
+
["git", "rev-parse", "--is-inside-work-tree"],
|
|
124
|
+
cwd=repo_root,
|
|
125
|
+
capture_output=True,
|
|
126
|
+
text=True,
|
|
127
|
+
)
|
|
128
|
+
if probe.returncode != 0:
|
|
129
|
+
print(
|
|
130
|
+
"[specify] Warning: Not a Git repository; skipped auto-commit",
|
|
131
|
+
file=sys.stderr,
|
|
132
|
+
)
|
|
133
|
+
return 0
|
|
134
|
+
|
|
135
|
+
config_file = repo_root / ".specify" / "extensions" / "git" / "git-config.yml"
|
|
136
|
+
if not config_file.is_file():
|
|
137
|
+
# No config file — auto-commit disabled by default
|
|
138
|
+
return 0
|
|
139
|
+
|
|
140
|
+
enabled, commit_msg = _parse_auto_commit_config(config_file, event_name)
|
|
141
|
+
if not enabled:
|
|
142
|
+
return 0
|
|
143
|
+
|
|
144
|
+
# Check if there are changes to commit
|
|
145
|
+
def _quiet(*args: str) -> bool:
|
|
146
|
+
return (
|
|
147
|
+
subprocess.run(
|
|
148
|
+
["git", *args], cwd=repo_root, capture_output=True, text=True
|
|
149
|
+
).returncode
|
|
150
|
+
== 0
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
untracked = subprocess.run(
|
|
154
|
+
["git", "ls-files", "--others", "--exclude-standard"],
|
|
155
|
+
cwd=repo_root,
|
|
156
|
+
capture_output=True,
|
|
157
|
+
text=True,
|
|
158
|
+
).stdout.strip()
|
|
159
|
+
if _quiet("diff", "--quiet", "HEAD") and _quiet("diff", "--cached", "--quiet") and not untracked:
|
|
160
|
+
print(f"[specify] No changes to commit after {event_name}", file=sys.stderr)
|
|
161
|
+
return 0
|
|
162
|
+
|
|
163
|
+
# Derive a human-readable command name from the event
|
|
164
|
+
# e.g., after_specify -> specify, before_plan -> plan
|
|
165
|
+
command_name = re.sub(r"^(after_|before_)", "", event_name)
|
|
166
|
+
phase = "before" if event_name.startswith("before_") else "after"
|
|
167
|
+
|
|
168
|
+
if not commit_msg:
|
|
169
|
+
commit_msg = f"[Spec Kit] Auto-commit {phase} {command_name}"
|
|
170
|
+
|
|
171
|
+
steps = [
|
|
172
|
+
(["git", "add", "."], "git add"),
|
|
173
|
+
(["git", "commit", "-q", "-m", commit_msg], "git commit"),
|
|
174
|
+
]
|
|
175
|
+
for cmd, label in steps:
|
|
176
|
+
result = subprocess.run(cmd, cwd=repo_root, capture_output=True, text=True)
|
|
177
|
+
if result.returncode != 0:
|
|
178
|
+
output = (result.stdout + result.stderr).strip()
|
|
179
|
+
print(f"[specify] Error: {label} failed: {output}", file=sys.stderr)
|
|
180
|
+
return 1
|
|
181
|
+
|
|
182
|
+
print(f"[OK] Changes committed {phase} {command_name}", file=sys.stderr)
|
|
183
|
+
return 0
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
if __name__ == "__main__":
|
|
187
|
+
raise SystemExit(main(sys.argv[1:]))
|