specify-cli 0.12.13__tar.gz → 0.12.14__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.13 → specify_cli-0.12.14}/CHANGELOG.md +16 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/PKG-INFO +1 -1
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/extensions.md +2 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/presets.md +2 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/catalog.community.json +88 -1
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/catalog.community.json +57 -1
- {specify_cli-0.12.13 → specify_cli-0.12.14}/pyproject.toml +1 -1
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/commands/init.py +34 -5
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_helpers.py +9 -1
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kiro_cli/__init__.py +7 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/presets/__init__.py +68 -23
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/command/__init__.py +38 -2
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/fan_in/__init__.py +18 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_cli.py +59 -1
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_subcommand.py +21 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_registry.py +14 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_presets.py +180 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_workflows.py +50 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.editorconfig +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.gitattributes +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/CODEOWNERS +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/dependabot.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-test.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/release.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/test.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.gitignore +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.pre-commit-config.yaml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/.zenodo.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/AGENTS.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/CITATION.cff +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/DEVELOPMENT.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/LICENSE +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/SECURITY.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/SUPPORT.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/.gitignore +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/bundles.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/friends.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/overview.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/docfx.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/index.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/one-time.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/pipx.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/uv.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/installation.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/local-development.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/quickstart.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/authentication.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/bundles.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/core.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/extensions.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/integrations.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/overview.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/presets.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/workflows.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/template/public/main.css +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/toc.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/upgrade.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/catalog.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/extension.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/.gitignore +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/LICENSE +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/extension.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/catalog.community.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/catalog.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/media/logo_large.webp +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/media/logo_small.webp +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/media/specify_cli.gif +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-April.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-February.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-June.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-March.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-May.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/catalog.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/preset.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/common.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/python/check_prerequisites.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/python/common.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/spec-driven.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/spec-kit.code-workspace +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_project.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_toml_string.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/agents.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/_commands.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/checklist-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/analyze.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/checklist.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/clarify.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/constitution.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/converge.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/implement.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/plan.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/specify.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/tasks.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/constitution-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/plan-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/spec-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/tasks-template.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/vscode-settings.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/auth_helpers.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/conftest.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/plan.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/spec.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/http_helpers.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_authentication.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_check_prerequisites_python_parity.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_check_tool.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_cli_version.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_command_template_py_scripts.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_commands_package.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_console_imports.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extensions.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_github_http.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_init_dir.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_merge.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_post_process.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_upgrade.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_utils.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_version_imports.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/README.md +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/catalog.community.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/catalog.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/step-catalog.json +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.12.14] - 2026-07-13
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- [extension] Add Spec Kit Memory extension to community catalog (#3455)
|
|
10
|
+
- Add Test-First Governance preset to community catalog (#3504)
|
|
11
|
+
- Add Autonomous Run Governance preset to community catalog (#3501)
|
|
12
|
+
- fix(workflows): validate command step input/options are mappings (#3262)
|
|
13
|
+
- fix(presets): resolve() honors manifest-declared file: for installed presets (#3351)
|
|
14
|
+
- fix(init): don't block on confirmation for 'init --here' without a TTY (#3236)
|
|
15
|
+
- [extension] Add Quality Gates (Enforcement Layer) extension to community catalog (#3431)
|
|
16
|
+
- fix(integrations): exit cleanly on unbalanced quote in --integration-options (#3457) (#3466)
|
|
17
|
+
- fix(integrations): declare kiro-cli multi-install safe (#3471) (#3485)
|
|
18
|
+
- fix(workflows): fail fan-in step on non-list wait_for instead of crashing (#3482)
|
|
19
|
+
- chore: release 0.12.13, begin 0.12.14.dev0 development (#3498)
|
|
20
|
+
|
|
5
21
|
## [0.12.13] - 2026-07-13
|
|
6
22
|
|
|
7
23
|
### Changed
|
|
@@ -98,6 +98,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
98
98
|
| Project Health Check | Diagnose a Spec Kit project and report health issues across structure, agents, features, scripts, extensions, and git | `visibility` | Read-only | [spec-kit-doctor](https://github.com/KhawarHabibKhan/spec-kit-doctor) |
|
|
99
99
|
| Project Status | Show current SDD workflow progress — active feature, artifact status, task completion, workflow phase, and extensions summary | `visibility` | Read-only | [spec-kit-status](https://github.com/KhawarHabibKhan/spec-kit-status) |
|
|
100
100
|
| QA Testing Extension | Systematic QA testing with browser-driven or CLI-based validation of acceptance criteria from spec | `code` | Read-only | [spec-kit-qa](https://github.com/arunt14/spec-kit-qa) |
|
|
101
|
+
| Quality Gates (Enforcement Layer) | Deterministic quality enforcement for Spec Kit projects at three boundaries — agent hooks, git pre-commit, CI — with one policy file and provable enforcement (attestations, canaries, verified parity). | `process` | Read+Write | [spec-gates](https://github.com/schwichtgit/spec-gates) |
|
|
101
102
|
| RAG Azure Builder | Spec Kit extension for onboarding and operating an Azure RAG stack with guided workflows. | `process` | Read+Write | [spec-kit-extension-rag-azure-builder](https://github.com/Sertxito/spec-kit-extension-rag-azure-builder) |
|
|
102
103
|
| Ralph Loop | Autonomous implementation loop using AI agent CLI | `code` | Read+Write | [spec-kit-ralph](https://github.com/Rubiss-Projects/spec-kit-ralph) |
|
|
103
104
|
| Reconcile Extension | Reconcile implementation drift by surgically updating feature artifacts. | `docs` | Read+Write | [spec-kit-reconcile](https://github.com/stn1slv/spec-kit-reconcile) |
|
|
@@ -119,6 +120,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
119
120
|
| Spec Diagram | Auto-generate Mermaid diagrams of SDD workflow state, feature progress, and task dependencies | `visibility` | Read-only | [spec-kit-diagram-](https://github.com/Quratulain-bilal/spec-kit-diagram-) |
|
|
120
121
|
| Spec Kit Discovery Extension | Run technical discovery commands for feasibility, technology selection, scenario-specific technical decisions, legacy codebase assessment, implementation understanding, and proof-of-concept validation | `process` | Read+Write | [spec-kit-discovery](https://github.com/bigsmartben/spec-kit-discovery) |
|
|
121
122
|
| Spec Kit Figma | Agent-agnostic SpecKit extension that grounds spec, plan & task generation in Figma design context — REST + optional MCP, single/mono/multi-repo, macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-figma](https://github.com/Fyloss/spec-kit-figma) |
|
|
123
|
+
| Spec Kit Memory | Recalls prior specs and decisions from configurable memory tools (e.g. memsearch) before SDLC stages, so planning and specification start from what the project already knows | `docs` | Read+Write | [spec-kit-memory](https://github.com/zaytsevand/spec-kit-memory) |
|
|
122
124
|
| Spec Kit Preview | Generate evidence-backed low, mid, or high fidelity previews from Spec Kit artifacts as Markdown or self-contained HTML | `docs` | Read+Write | [spec-kit-preview](https://github.com/bigsmartben/spec-kit-preview) |
|
|
123
125
|
| Spec Kit Schedule | Optimal multi-agent task scheduling via CP-SAT — DAG precedence, hallucination-aware caps, file-conflict avoidance, stochastic durations, replanning, and interactive HTML output | `process` | Read+Write | [spec-kit-schedule](https://github.com/jfranc38/spec-kit-schedule) |
|
|
124
126
|
| Spec Kit TLDR | Render a feature's spec.md / plan.md into a review-oriented TLDR (self-contained HTML dashboard + PR-native Markdown) that surfaces risks for faster PR review. | `visibility` | Read+Write | [speckit-tldr](https://github.com/qurore/speckit-tldr) |
|
|
@@ -11,6 +11,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
|
|
|
11
11
|
| Agent Parity Governance | Adds shared-guidance parity, audit-ready Spec-Kit run evidence, and agent-neutral model-routing guidance across a project's declared AI-agent instruction surfaces so agent guidance does not drift. | 6 templates, 3 commands | — | [spec-kit-preset-agent-parity-governance](https://github.com/hindermath/spec-kit-preset-agent-parity-governance) |
|
|
12
12
|
| AIDE In-Place Migration | Adapts the AIDE extension workflow for in-place technology migrations (X → Y pattern) — adds migration objectives, verification gates, knowledge documents, and behavioral equivalence criteria | 2 templates, 8 commands | AIDE extension | [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
|
|
13
13
|
| Architecture Governance | Adds secure software architecture, STRIDE+CAPEC threat modeling, arc42 security cross-cutting concepts, S-ADRs, Zero Trust applicability, OWASP SAMM governance, BSI C3A cloud autonomy, BSI C5 cloud compliance assurance, and audit-ready Spec Kit run evidence | 13 templates, 3 commands | — | [spec-kit-preset-architecture-governance](https://github.com/hindermath/spec-kit-preset-architecture-governance) |
|
|
14
|
+
| Autonomous Run Governance | Adds permission-bounded, evidence-first governance for autonomous Spec Kit delivery, convergence, resume, closeout, and retrospective learning. | 10 templates, 2 commands | — | [spec-kit-preset-autonomous-run-governance](https://github.com/hindermath/spec-kit-preset-autonomous-run-governance) |
|
|
14
15
|
| Canon Core | Adapts original Spec Kit workflow to work together with Canon extension | 2 templates, 8 commands | — | [spec-kit-canon](https://github.com/maximiliamus/spec-kit-canon) |
|
|
15
16
|
| Claude AskUserQuestion | Upgrades `/speckit.clarify` and `/speckit.checklist` on Claude Code from Markdown-table prompts to the native AskUserQuestion picker, with a recommended option and reasoning on every question | 2 commands | — | [spec-kit-preset-claude-ask-questions](https://github.com/0xrafasec/spec-kit-preset-claude-ask-questions) |
|
|
16
17
|
| Command Density | Compacts the nine core Spec Kit command prompts while preserving scripts, handoffs, placeholders, hook output blocks, and rule structure | 9 commands | — | [spec-kit-preset-command-density](https://github.com/Xopoko/spec-kit-preset-command-density) |
|
|
@@ -28,6 +29,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
|
|
|
28
29
|
| SicarioSpec Core | Baseline secure-by-default Spec Kit governance profile. | 5 templates | — | [sicario-spec](https://github.com/dfirs1car1o/sicario-spec) |
|
|
29
30
|
| Spec2Cloud | Spec-driven workflow tuned for shipping to Azure: spec → plan → tasks → implement → deploy | 5 templates, 8 commands | — | [spec2cloud](https://github.com/Azure-Samples/Spec2Cloud) |
|
|
30
31
|
| Table of Contents Navigation | Adds a navigable Table of Contents to generated spec.md, plan.md, and tasks.md documents | 3 templates, 3 commands | — | [spec-kit-preset-toc-navigation](https://github.com/Quratulain-bilal/spec-kit-preset-toc-navigation) |
|
|
32
|
+
| Test-First Governance | Governs TDD with coverage-complete BDD/ATDD Gherkin scenarios, explicit suite ownership, professional test reports, traceability, and risk-based quality gates. | 10 templates, 8 commands | — | [spec-kit-preset-test-first-governance](https://github.com/ka-zo/spec-kit-preset-test-first-governance) |
|
|
31
33
|
| VS Code Ask Questions | Enhances the clarify command to use `vscode/askQuestions` for batched interactive questioning. | 1 command | — | [spec-kit-presets](https://github.com/fdcastel/spec-kit-presets) |
|
|
32
34
|
| Workflow Preset | Behavior-first specification, design artifacts, and agent-native handoff orchestration — adds requirement-phase behavior drafts, formal BDD/UIF/behavior contracts, optional design artifacts, and scoped implementation handoffs with Core Agent, Vertical Planner Agent, and Worker Agent modes | 22 templates, 8 commands | — | [spec-kit-workflow-preset](https://github.com/bigsmartben/spec-kit-workflow-preset) |
|
|
33
35
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-07-
|
|
3
|
+
"updated_at": "2026-07-13T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"aide": {
|
|
@@ -1427,6 +1427,57 @@
|
|
|
1427
1427
|
"created_at": "2026-05-06T00:00:00Z",
|
|
1428
1428
|
"updated_at": "2026-05-06T00:00:00Z"
|
|
1429
1429
|
},
|
|
1430
|
+
"gates": {
|
|
1431
|
+
"name": "Quality Gates (Enforcement Layer)",
|
|
1432
|
+
"id": "gates",
|
|
1433
|
+
"description": "Deterministic quality enforcement for Spec Kit projects at three boundaries — agent hooks, git pre-commit, CI — with one policy file and provable enforcement (attestations, canaries, verified parity).",
|
|
1434
|
+
"author": "schwichtgit",
|
|
1435
|
+
"version": "0.1.0",
|
|
1436
|
+
"download_url": "https://github.com/schwichtgit/spec-gates/releases/download/v0.1.0/gates-0.1.0.zip",
|
|
1437
|
+
"repository": "https://github.com/schwichtgit/spec-gates",
|
|
1438
|
+
"homepage": "https://github.com/schwichtgit/spec-gates",
|
|
1439
|
+
"documentation": "https://github.com/schwichtgit/spec-gates/blob/main/docs/how-it-works.md",
|
|
1440
|
+
"license": "MIT",
|
|
1441
|
+
"category": "process",
|
|
1442
|
+
"effect": "read-write",
|
|
1443
|
+
"requires": {
|
|
1444
|
+
"speckit_version": ">=0.12.0",
|
|
1445
|
+
"tools": [
|
|
1446
|
+
{
|
|
1447
|
+
"name": "jq",
|
|
1448
|
+
"required": true
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
"name": "git",
|
|
1452
|
+
"required": true
|
|
1453
|
+
},
|
|
1454
|
+
{
|
|
1455
|
+
"name": "node",
|
|
1456
|
+
"required": false
|
|
1457
|
+
},
|
|
1458
|
+
{
|
|
1459
|
+
"name": "shellcheck",
|
|
1460
|
+
"required": false
|
|
1461
|
+
}
|
|
1462
|
+
]
|
|
1463
|
+
},
|
|
1464
|
+
"provides": {
|
|
1465
|
+
"commands": 5,
|
|
1466
|
+
"hooks": 1
|
|
1467
|
+
},
|
|
1468
|
+
"tags": [
|
|
1469
|
+
"quality",
|
|
1470
|
+
"enforcement",
|
|
1471
|
+
"hooks",
|
|
1472
|
+
"ci",
|
|
1473
|
+
"governance"
|
|
1474
|
+
],
|
|
1475
|
+
"verified": false,
|
|
1476
|
+
"downloads": 0,
|
|
1477
|
+
"stars": 0,
|
|
1478
|
+
"created_at": "2026-07-09T00:00:00Z",
|
|
1479
|
+
"updated_at": "2026-07-13T00:00:00Z"
|
|
1480
|
+
},
|
|
1430
1481
|
"github-issues": {
|
|
1431
1482
|
"name": "GitHub Issues Integration 1",
|
|
1432
1483
|
"id": "github-issues",
|
|
@@ -2217,6 +2268,42 @@
|
|
|
2217
2268
|
"created_at": "2026-05-08T00:00:00Z",
|
|
2218
2269
|
"updated_at": "2026-05-08T00:00:00Z"
|
|
2219
2270
|
},
|
|
2271
|
+
"memory": {
|
|
2272
|
+
"name": "Spec Kit Memory",
|
|
2273
|
+
"id": "memory",
|
|
2274
|
+
"description": "Recalls prior specs and decisions from configurable memory tools (e.g. memsearch) before SDLC stages, so planning and specification start from what the project already knows.",
|
|
2275
|
+
"author": "Andrey Zaytsev",
|
|
2276
|
+
"version": "0.3.0",
|
|
2277
|
+
"download_url": "https://github.com/zaytsevand/spec-kit-memory/archive/refs/tags/v0.3.0.zip",
|
|
2278
|
+
"repository": "https://github.com/zaytsevand/spec-kit-memory",
|
|
2279
|
+
"homepage": "https://github.com/zaytsevand/spec-kit-memory",
|
|
2280
|
+
"documentation": "https://github.com/zaytsevand/spec-kit-memory/blob/main/README.md",
|
|
2281
|
+
"changelog": "",
|
|
2282
|
+
"license": "MIT",
|
|
2283
|
+
"category": "docs",
|
|
2284
|
+
"effect": "read-write",
|
|
2285
|
+
"requires": {
|
|
2286
|
+
"speckit_version": ">=0.2.0",
|
|
2287
|
+
"tools": [
|
|
2288
|
+
{ "name": "memsearch", "required": false }
|
|
2289
|
+
]
|
|
2290
|
+
},
|
|
2291
|
+
"provides": {
|
|
2292
|
+
"commands": 2,
|
|
2293
|
+
"hooks": 3
|
|
2294
|
+
},
|
|
2295
|
+
"tags": [
|
|
2296
|
+
"memory",
|
|
2297
|
+
"recall",
|
|
2298
|
+
"research",
|
|
2299
|
+
"memsearch"
|
|
2300
|
+
],
|
|
2301
|
+
"verified": false,
|
|
2302
|
+
"downloads": 0,
|
|
2303
|
+
"stars": 0,
|
|
2304
|
+
"created_at": "2026-07-10T00:00:00Z",
|
|
2305
|
+
"updated_at": "2026-07-10T00:00:00Z"
|
|
2306
|
+
},
|
|
2220
2307
|
"memory-loader": {
|
|
2221
2308
|
"name": "Memory Loader",
|
|
2222
2309
|
"id": "memory-loader",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-
|
|
3
|
+
"updated_at": "2026-07-13T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/presets/catalog.community.json",
|
|
5
5
|
"presets": {
|
|
6
6
|
"a11y-governance": {
|
|
@@ -131,6 +131,34 @@
|
|
|
131
131
|
"created_at": "2026-04-27T00:00:00Z",
|
|
132
132
|
"updated_at": "2026-06-14T00:00:00Z"
|
|
133
133
|
},
|
|
134
|
+
"autonomous-run-governance": {
|
|
135
|
+
"name": "Autonomous Run Governance",
|
|
136
|
+
"id": "autonomous-run-governance",
|
|
137
|
+
"version": "0.1.1",
|
|
138
|
+
"description": "Adds permission-bounded, evidence-first governance for autonomous Spec Kit delivery, convergence, resume, closeout, and retrospective learning.",
|
|
139
|
+
"author": "Thorsten Hindermann",
|
|
140
|
+
"repository": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance",
|
|
141
|
+
"download_url": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance/archive/refs/tags/v0.1.1.zip",
|
|
142
|
+
"homepage": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance",
|
|
143
|
+
"documentation": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance/blob/main/README.md",
|
|
144
|
+
"license": "MIT",
|
|
145
|
+
"requires": {
|
|
146
|
+
"speckit_version": ">=0.8.3"
|
|
147
|
+
},
|
|
148
|
+
"provides": {
|
|
149
|
+
"templates": 10,
|
|
150
|
+
"commands": 2
|
|
151
|
+
},
|
|
152
|
+
"tags": [
|
|
153
|
+
"autonomous",
|
|
154
|
+
"governance",
|
|
155
|
+
"evidence",
|
|
156
|
+
"permissions",
|
|
157
|
+
"retrospective"
|
|
158
|
+
],
|
|
159
|
+
"created_at": "2026-07-13T00:00:00Z",
|
|
160
|
+
"updated_at": "2026-07-13T00:00:00Z"
|
|
161
|
+
},
|
|
134
162
|
"canon-core": {
|
|
135
163
|
"name": "Canon Core",
|
|
136
164
|
"id": "canon-core",
|
|
@@ -618,6 +646,34 @@
|
|
|
618
646
|
"created_at": "2026-04-30T00:00:00Z",
|
|
619
647
|
"updated_at": "2026-04-30T00:00:00Z"
|
|
620
648
|
},
|
|
649
|
+
"test-first-governance": {
|
|
650
|
+
"name": "Test-First Governance",
|
|
651
|
+
"id": "test-first-governance",
|
|
652
|
+
"version": "1.3.0",
|
|
653
|
+
"description": "Governs TDD with coverage-complete BDD/ATDD Gherkin scenarios, explicit suite ownership, professional test reports, traceability, and risk-based quality gates.",
|
|
654
|
+
"author": "Zoltán Katona, PhD",
|
|
655
|
+
"repository": "https://github.com/ka-zo/spec-kit-preset-test-first-governance",
|
|
656
|
+
"download_url": "https://github.com/ka-zo/spec-kit-preset-test-first-governance/archive/refs/tags/1.3.0.zip",
|
|
657
|
+
"homepage": "https://github.com/ka-zo/spec-kit-preset-test-first-governance",
|
|
658
|
+
"documentation": "https://github.com/ka-zo/spec-kit-preset-test-first-governance/blob/main/README.md",
|
|
659
|
+
"license": "MIT",
|
|
660
|
+
"requires": {
|
|
661
|
+
"speckit_version": ">=0.12.11"
|
|
662
|
+
},
|
|
663
|
+
"provides": {
|
|
664
|
+
"templates": 10,
|
|
665
|
+
"commands": 8
|
|
666
|
+
},
|
|
667
|
+
"tags": [
|
|
668
|
+
"tdd",
|
|
669
|
+
"bdd",
|
|
670
|
+
"atdd",
|
|
671
|
+
"quality-gates",
|
|
672
|
+
"traceability"
|
|
673
|
+
],
|
|
674
|
+
"created_at": "2026-07-13T00:00:00Z",
|
|
675
|
+
"updated_at": "2026-07-13T00:00:00Z"
|
|
676
|
+
},
|
|
621
677
|
"toc-navigation": {
|
|
622
678
|
"name": "Table of Contents Navigation",
|
|
623
679
|
"id": "toc-navigation",
|
|
@@ -220,16 +220,45 @@ def register(app: typer.Typer) -> None:
|
|
|
220
220
|
console.print(
|
|
221
221
|
f"[yellow]Warning:[/yellow] Current directory is not empty ({len(existing_items)} items)"
|
|
222
222
|
)
|
|
223
|
-
console.print(
|
|
224
|
-
"[yellow]Template files will be merged with existing content and may overwrite existing files[/yellow]"
|
|
225
|
-
)
|
|
226
223
|
if force:
|
|
224
|
+
# Proceeding: the merge/overwrite warning is accurate here.
|
|
225
|
+
console.print(
|
|
226
|
+
"[yellow]Template files will be merged with existing content and may overwrite existing files[/yellow]"
|
|
227
|
+
)
|
|
227
228
|
console.print(
|
|
228
229
|
"[cyan]--force supplied: skipping confirmation and proceeding with merge[/cyan]"
|
|
229
230
|
)
|
|
230
231
|
else:
|
|
231
|
-
|
|
232
|
-
|
|
232
|
+
# Fold the merge risk into the confirmation prompt rather than
|
|
233
|
+
# printing it unconditionally first: on the EOF/no-input path
|
|
234
|
+
# below the command exits without changing anything, so a
|
|
235
|
+
# standalone "will be merged" line would mislead. Interactive
|
|
236
|
+
# users still see the risk as part of the question.
|
|
237
|
+
#
|
|
238
|
+
# Call typer.confirm normally so piped y/n is honored — e.g.
|
|
239
|
+
# `echo y | specify init --here` keeps reaching the
|
|
240
|
+
# non-destructive preserve-merge path.
|
|
241
|
+
try:
|
|
242
|
+
proceed = typer.confirm(
|
|
243
|
+
"Template files will be merged with existing content "
|
|
244
|
+
"and may overwrite existing files. Do you want to continue?"
|
|
245
|
+
)
|
|
246
|
+
except (typer.Abort, EOFError):
|
|
247
|
+
# typer.confirm raises Abort for BOTH an interactive Ctrl+C
|
|
248
|
+
# and an EOF on closed/empty stdin. Distinguish them: a real
|
|
249
|
+
# TTY cancellation is a normal exit (0, "cancelled"), while a
|
|
250
|
+
# missing-input EOF (non-interactive) becomes an actionable
|
|
251
|
+
# error pointing at --force.
|
|
252
|
+
if _stdin_is_interactive():
|
|
253
|
+
console.print("[yellow]Operation cancelled[/yellow]")
|
|
254
|
+
raise typer.Exit(0) from None
|
|
255
|
+
console.print(
|
|
256
|
+
"[red]Error:[/red] Current directory is not empty and no "
|
|
257
|
+
"confirmation input is available. Re-run with "
|
|
258
|
+
"[bold]--force[/bold] to merge into it."
|
|
259
|
+
)
|
|
260
|
+
raise typer.Exit(1) from None
|
|
261
|
+
if not proceed:
|
|
233
262
|
console.print("[yellow]Operation cancelled[/yellow]")
|
|
234
263
|
raise typer.Exit(0)
|
|
235
264
|
else:
|
|
@@ -190,7 +190,15 @@ def _parse_integration_options(integration: Any, raw_options: str) -> dict[str,
|
|
|
190
190
|
"""
|
|
191
191
|
import shlex
|
|
192
192
|
parsed: dict[str, Any] = {}
|
|
193
|
-
|
|
193
|
+
try:
|
|
194
|
+
tokens = shlex.split(raw_options)
|
|
195
|
+
except ValueError as exc:
|
|
196
|
+
# An unbalanced quote (e.g. --integration-options='--commands-dir "foo')
|
|
197
|
+
# makes shlex raise "No closing quotation". Translate it into the same
|
|
198
|
+
# clean exit-1 UX as every other bad-input path below rather than
|
|
199
|
+
# letting a raw traceback escape.
|
|
200
|
+
console.print(f"[red]Error:[/red] Could not parse integration options: {exc}.")
|
|
201
|
+
raise typer.Exit(1)
|
|
194
202
|
declared_options = list(integration.options())
|
|
195
203
|
declared = {opt.name.lstrip("-"): opt for opt in declared_options}
|
|
196
204
|
allowed = ", ".join(sorted(opt.name for opt in declared_options))
|
{specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kiro_cli/__init__.py
RENAMED
|
@@ -27,3 +27,10 @@ class KiroCliIntegration(MarkdownIntegration):
|
|
|
27
27
|
"args": _KIRO_ARG_FALLBACK,
|
|
28
28
|
"extension": ".md",
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
# Kiro CLI keeps everything under a static, isolated agent root
|
|
32
|
+
# (``.kiro/`` with commands in ``.kiro/prompts``) that no other
|
|
33
|
+
# integration writes to, so it is safe to install alongside others
|
|
34
|
+
# (issue #3471). The registry's multi-install-safe contract tests
|
|
35
|
+
# enforce that isolation for every integration setting this flag.
|
|
36
|
+
multi_install_safe = True
|
|
@@ -2588,6 +2588,39 @@ class PresetResolver:
|
|
|
2588
2588
|
self._manifest_cache[key] = None
|
|
2589
2589
|
return self._manifest_cache[key]
|
|
2590
2590
|
|
|
2591
|
+
def _manifest_declared_template(
|
|
2592
|
+
self, pack_dir: Path, template_name: str, template_type: str
|
|
2593
|
+
) -> tuple[dict | None, Path | None]:
|
|
2594
|
+
"""Resolve a preset's manifest-declared template entry and usable file.
|
|
2595
|
+
|
|
2596
|
+
Returns ``(entry, candidate)``:
|
|
2597
|
+
- ``entry`` is the matching ``provides.templates`` mapping, or ``None`` if
|
|
2598
|
+
the manifest is absent or does not list this ``(name, type)``.
|
|
2599
|
+
- ``candidate`` is the declared ``file:`` resolved under ``pack_dir`` IFF
|
|
2600
|
+
it is a regular file (``is_file()``); ``None`` otherwise — a missing,
|
|
2601
|
+
empty, or non-file (e.g. directory) declaration yields ``(entry, None)``.
|
|
2602
|
+
|
|
2603
|
+
The manifest is authoritative: when it declares a template (``entry`` is
|
|
2604
|
+
not ``None``) but the file is unusable (``candidate`` is ``None``),
|
|
2605
|
+
callers must NOT fall back to the convention lookup — that would mask a
|
|
2606
|
+
typo or pick up an undeclared file. Shared by ``resolve()`` and
|
|
2607
|
+
``collect_all_layers()`` so their manifest-first resolution cannot
|
|
2608
|
+
silently diverge again (the divergence this fix addressed).
|
|
2609
|
+
"""
|
|
2610
|
+
manifest = self._get_manifest(pack_dir)
|
|
2611
|
+
if not manifest:
|
|
2612
|
+
return None, None
|
|
2613
|
+
for tmpl in manifest.templates:
|
|
2614
|
+
if tmpl.get("name") == template_name and tmpl.get("type") == template_type:
|
|
2615
|
+
file_path = tmpl.get("file")
|
|
2616
|
+
if file_path:
|
|
2617
|
+
manifest_candidate = pack_dir / file_path
|
|
2618
|
+
return tmpl, (
|
|
2619
|
+
manifest_candidate if manifest_candidate.is_file() else None
|
|
2620
|
+
)
|
|
2621
|
+
return tmpl, None
|
|
2622
|
+
return None, None
|
|
2623
|
+
|
|
2591
2624
|
def _get_all_extensions_by_priority(self) -> list[tuple[int, str, dict | None]]:
|
|
2592
2625
|
"""Build unified list of registered and unregistered extensions sorted by priority.
|
|
2593
2626
|
|
|
@@ -2690,6 +2723,27 @@ class PresetResolver:
|
|
|
2690
2723
|
registry = PresetRegistry(self.presets_dir)
|
|
2691
2724
|
for pack_id, _metadata in registry.list_by_priority():
|
|
2692
2725
|
pack_dir = self.presets_dir / pack_id
|
|
2726
|
+
# The preset manifest is authoritative: if it declares this
|
|
2727
|
+
# template with an explicit ``file:``, resolve to that path —
|
|
2728
|
+
# and do NOT fall back to convention when it's missing, to
|
|
2729
|
+
# avoid masking typos or picking up an undeclared file. Only
|
|
2730
|
+
# when the manifest is absent or doesn't list this template do
|
|
2731
|
+
# we use the convention-based subdir lookup. Mirrors
|
|
2732
|
+
# collect_all_layers()/resolve_content() so resolve() and
|
|
2733
|
+
# resolve_with_source() agree with them instead of returning
|
|
2734
|
+
# the core template (or a stray convention file).
|
|
2735
|
+
entry, manifest_candidate = self._manifest_declared_template(
|
|
2736
|
+
pack_dir, template_name, template_type
|
|
2737
|
+
)
|
|
2738
|
+
if manifest_candidate is not None:
|
|
2739
|
+
return manifest_candidate
|
|
2740
|
+
if entry is not None:
|
|
2741
|
+
# Manifest declares this template but the file is missing,
|
|
2742
|
+
# non-file (e.g. a directory), or an empty/falsey ``file``
|
|
2743
|
+
# value. The manifest is authoritative, so skip this pack's
|
|
2744
|
+
# convention fallback rather than mask a typo — mirrors
|
|
2745
|
+
# collect_all_layers().
|
|
2746
|
+
continue
|
|
2693
2747
|
for subdir in subdirs:
|
|
2694
2748
|
if subdir:
|
|
2695
2749
|
candidate = pack_dir / subdir / f"{template_name}{ext}"
|
|
@@ -2957,31 +3011,22 @@ class PresetResolver:
|
|
|
2957
3011
|
pack_dir = self.presets_dir / pack_id
|
|
2958
3012
|
# Read strategy and manifest file path from preset manifest
|
|
2959
3013
|
strategy = "replace"
|
|
2960
|
-
manifest_file_path = None
|
|
2961
3014
|
manifest_has_strategy = False
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
# Use manifest file path if specified, otherwise convention-based
|
|
2974
|
-
# lookup — but only when the manifest doesn't exist or doesn't
|
|
2975
|
-
# list this template, so preset.yml stays authoritative.
|
|
3015
|
+
entry, manifest_candidate = self._manifest_declared_template(
|
|
3016
|
+
pack_dir, template_name, template_type
|
|
3017
|
+
)
|
|
3018
|
+
if entry is not None:
|
|
3019
|
+
strategy = entry.get("strategy", "replace")
|
|
3020
|
+
manifest_has_strategy = "strategy" in entry
|
|
3021
|
+
# Use the manifest's declared file when it's a usable regular file;
|
|
3022
|
+
# only fall back to convention-based lookup when the manifest
|
|
3023
|
+
# doesn't list this template at all, so preset.yml stays
|
|
3024
|
+
# authoritative (a declared-but-unusable file skips convention —
|
|
3025
|
+
# parity with resolve()).
|
|
2976
3026
|
candidate = None
|
|
2977
|
-
if
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
candidate = manifest_candidate
|
|
2981
|
-
# Explicit file path that doesn't exist: skip convention
|
|
2982
|
-
# fallback to avoid masking typos or picking up unintended files.
|
|
2983
|
-
elif not manifest_found_entry:
|
|
2984
|
-
# Manifest doesn't list this template — check convention paths
|
|
3027
|
+
if manifest_candidate is not None:
|
|
3028
|
+
candidate = manifest_candidate
|
|
3029
|
+
elif entry is None:
|
|
2985
3030
|
candidate = _find_in_subdirs(pack_dir)
|
|
2986
3031
|
if candidate:
|
|
2987
3032
|
# Legacy fallback: if manifest doesn't explicitly declare a
|
{specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/command/__init__.py
RENAMED
|
@@ -31,6 +31,20 @@ class CommandStep(StepBase):
|
|
|
31
31
|
def execute(self, config: dict[str, Any], context: StepContext) -> StepResult:
|
|
32
32
|
command = config.get("command", "")
|
|
33
33
|
input_data = config.get("input", {})
|
|
34
|
+
# validate() rejects a non-mapping input, but the engine does not
|
|
35
|
+
# auto-validate before execute(); a workflow that skipped validation can
|
|
36
|
+
# still reach here. Fail the step with the same contract error rather
|
|
37
|
+
# than silently coercing to {} and dispatching with empty args — that
|
|
38
|
+
# would change the command's meaning, hide the config error, and report
|
|
39
|
+
# COMPLETED, defeating the per-step FAILED / continue_on_error behavior.
|
|
40
|
+
if not isinstance(input_data, dict):
|
|
41
|
+
return StepResult(
|
|
42
|
+
status=StepStatus.FAILED,
|
|
43
|
+
error=(
|
|
44
|
+
f"Command step {config.get('id', '?')!r}: 'input' must be a "
|
|
45
|
+
f"mapping, got {type(input_data).__name__}."
|
|
46
|
+
),
|
|
47
|
+
)
|
|
34
48
|
|
|
35
49
|
# Resolve expressions in input
|
|
36
50
|
resolved_input: dict[str, Any] = {}
|
|
@@ -50,8 +64,18 @@ class CommandStep(StepBase):
|
|
|
50
64
|
# Merge options (workflow defaults ← step overrides)
|
|
51
65
|
options = dict(context.default_options)
|
|
52
66
|
step_options = config.get("options", {})
|
|
53
|
-
|
|
54
|
-
|
|
67
|
+
# Same rationale as 'input': a malformed options fails the step rather
|
|
68
|
+
# than being silently ignored (which would let an invalid step run and
|
|
69
|
+
# apparently complete).
|
|
70
|
+
if not isinstance(step_options, dict):
|
|
71
|
+
return StepResult(
|
|
72
|
+
status=StepStatus.FAILED,
|
|
73
|
+
error=(
|
|
74
|
+
f"Command step {config.get('id', '?')!r}: 'options' must be a "
|
|
75
|
+
f"mapping, got {type(step_options).__name__}."
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
options.update(step_options)
|
|
55
79
|
|
|
56
80
|
# Attempt CLI dispatch
|
|
57
81
|
args_str = str(resolved_input.get("args", ""))
|
|
@@ -155,4 +179,16 @@ class CommandStep(StepBase):
|
|
|
155
179
|
errors.append(
|
|
156
180
|
f"Command step {config.get('id', '?')!r} is missing 'command' field."
|
|
157
181
|
)
|
|
182
|
+
# execute() iterates input.items() and options.update(step_options); a
|
|
183
|
+
# non-mapping here would raise at run time. Validate the shape like the
|
|
184
|
+
# sibling steps (switch 'cases', fan-out 'step') so it is reported, not
|
|
185
|
+
# crashed on.
|
|
186
|
+
if "input" in config and not isinstance(config["input"], dict):
|
|
187
|
+
errors.append(
|
|
188
|
+
f"Command step {config.get('id', '?')!r}: 'input' must be a mapping."
|
|
189
|
+
)
|
|
190
|
+
if "options" in config and not isinstance(config["options"], dict):
|
|
191
|
+
errors.append(
|
|
192
|
+
f"Command step {config.get('id', '?')!r}: 'options' must be a mapping."
|
|
193
|
+
)
|
|
158
194
|
return errors
|
{specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/fan_in/__init__.py
RENAMED
|
@@ -24,6 +24,24 @@ class FanInStep(StepBase):
|
|
|
24
24
|
if not isinstance(output_config, dict):
|
|
25
25
|
output_config = {}
|
|
26
26
|
|
|
27
|
+
# The engine does not auto-validate step config, so an unvalidated run
|
|
28
|
+
# with a non-list ``wait_for`` reaches here raw. Iterating it then
|
|
29
|
+
# either crashes the whole run (a scalar like an int or None raises
|
|
30
|
+
# TypeError) or, worse, silently iterates a string's characters and
|
|
31
|
+
# yields a bogus join of empty results with a COMPLETED status — the
|
|
32
|
+
# exact "silent empty result + COMPLETED" wiring bug the engine's
|
|
33
|
+
# fan-in validation guards against. Fail this step loudly instead,
|
|
34
|
+
# mirroring the fan-out step's non-list ``items`` handling.
|
|
35
|
+
if not isinstance(wait_for, list):
|
|
36
|
+
return StepResult(
|
|
37
|
+
status=StepStatus.FAILED,
|
|
38
|
+
error=(
|
|
39
|
+
f"Fan-in step {config.get('id', '?')!r}: 'wait_for' must be "
|
|
40
|
+
f"a list of step IDs, got {type(wait_for).__name__}."
|
|
41
|
+
),
|
|
42
|
+
output={"results": []},
|
|
43
|
+
)
|
|
44
|
+
|
|
27
45
|
# Collect results from referenced steps
|
|
28
46
|
results = []
|
|
29
47
|
for step_id in wait_for:
|
|
@@ -115,6 +115,63 @@ class TestInitIntegrationFlag:
|
|
|
115
115
|
data = json.loads((project / ".specify" / "integration.json").read_text(encoding="utf-8"))
|
|
116
116
|
assert data["integration"] == specify_cli.DEFAULT_INIT_INTEGRATION
|
|
117
117
|
|
|
118
|
+
def test_init_here_nonempty_noninteractive_errors_with_force_guidance(self, tmp_path):
|
|
119
|
+
"""`init --here` on a non-empty directory with no confirmation input (empty
|
|
120
|
+
stdin) must fail fast with guidance to use --force, instead of the bare
|
|
121
|
+
'Aborted.' from an EOF on typer.confirm. CliRunner with no `input=` provides
|
|
122
|
+
empty stdin, so typer.confirm raises Abort, which the command converts to the
|
|
123
|
+
actionable error."""
|
|
124
|
+
from typer.testing import CliRunner
|
|
125
|
+
from specify_cli import app
|
|
126
|
+
|
|
127
|
+
project = tmp_path / "nonempty-here"
|
|
128
|
+
project.mkdir()
|
|
129
|
+
(project / "existing.txt").write_text("keep me", encoding="utf-8")
|
|
130
|
+
old_cwd = os.getcwd()
|
|
131
|
+
try:
|
|
132
|
+
os.chdir(project)
|
|
133
|
+
result = CliRunner().invoke(app, [
|
|
134
|
+
"init", "--here", "--integration", "copilot", "--script", "sh", "--ignore-agent-tools",
|
|
135
|
+
], catch_exceptions=False)
|
|
136
|
+
finally:
|
|
137
|
+
os.chdir(old_cwd)
|
|
138
|
+
|
|
139
|
+
assert result.exit_code == 1, result.output
|
|
140
|
+
assert "--force" in result.output
|
|
141
|
+
# Aborted before scaffolding: the pre-existing file is untouched.
|
|
142
|
+
assert (project / "existing.txt").read_text(encoding="utf-8") == "keep me"
|
|
143
|
+
|
|
144
|
+
def test_init_here_interactive_cancel_exits_zero(self, tmp_path, monkeypatch):
|
|
145
|
+
"""An interactive Ctrl+C at the merge confirmation (typer.Abort on a TTY)
|
|
146
|
+
is a normal cancellation — exit 0, "cancelled" — NOT the missing-input
|
|
147
|
+
--force error, which is reserved for non-interactive EOF. Guards the
|
|
148
|
+
regression where Abort was caught unconditionally and every cancel became
|
|
149
|
+
an exit-1 --force error."""
|
|
150
|
+
from typer.testing import CliRunner
|
|
151
|
+
from specify_cli import app
|
|
152
|
+
import specify_cli.commands.init as init_mod
|
|
153
|
+
|
|
154
|
+
# Simulate an interactive terminal so the Abort is treated as a cancel.
|
|
155
|
+
monkeypatch.setattr(init_mod, "_stdin_is_interactive", lambda: True)
|
|
156
|
+
|
|
157
|
+
project = tmp_path / "cancel-here"
|
|
158
|
+
project.mkdir()
|
|
159
|
+
(project / "existing.txt").write_text("keep me", encoding="utf-8")
|
|
160
|
+
old_cwd = os.getcwd()
|
|
161
|
+
try:
|
|
162
|
+
os.chdir(project)
|
|
163
|
+
# No input → typer.confirm raises Abort (stands in for Ctrl+C).
|
|
164
|
+
result = CliRunner().invoke(app, [
|
|
165
|
+
"init", "--here", "--integration", "copilot", "--script", "sh", "--ignore-agent-tools",
|
|
166
|
+
], catch_exceptions=False)
|
|
167
|
+
finally:
|
|
168
|
+
os.chdir(old_cwd)
|
|
169
|
+
|
|
170
|
+
assert result.exit_code == 0, result.output
|
|
171
|
+
assert "cancelled" in result.output.lower()
|
|
172
|
+
assert "--force" not in result.output # not the missing-input error
|
|
173
|
+
assert (project / "existing.txt").read_text(encoding="utf-8") == "keep me"
|
|
174
|
+
|
|
118
175
|
def test_integration_copilot_auto_promotes(self, tmp_path):
|
|
119
176
|
from typer.testing import CliRunner
|
|
120
177
|
from specify_cli import app
|
|
@@ -835,7 +892,8 @@ class TestInitIntegrationFlag:
|
|
|
835
892
|
assert (scripts_dir / "common.sh").read_text(encoding="utf-8") != custom_content
|
|
836
893
|
|
|
837
894
|
def test_init_here_without_force_preserves_shared_infra(self, tmp_path):
|
|
838
|
-
"""E2E:
|
|
895
|
+
"""E2E: confirming the merge with piped "y" (no --force) preserves
|
|
896
|
+
existing shared infra files (unlike --force, which overwrites them)."""
|
|
839
897
|
from typer.testing import CliRunner
|
|
840
898
|
from specify_cli import app
|
|
841
899
|
|