specify-cli 0.11.7__tar.gz → 0.11.9__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.11.7 → specify_cli-0.11.9}/.devcontainer/post-create.sh +2 -2
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/ISSUE_TEMPLATE/preset_submission.yml +13 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/add-community-preset.lock.yml +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/add-community-preset.md +58 -4
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/catalog-assign.yml +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/lint.yml +12 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/publish-pypi.yml +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/test.yml +2 -2
- {specify_cli-0.11.7 → specify_cli-0.11.9}/CHANGELOG.md +33 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/CONTRIBUTING.md +10 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/PKG-INFO +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/community/extensions.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/community/friends.md +3 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/community/presets.md +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/quickstart.md +14 -14
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/authentication.md +27 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/extensions.md +1 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/integrations.md +5 -3
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/presets.md +5 -5
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/agent-context/scripts/bash/update-agent-context.sh +67 -12
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +81 -17
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/catalog.community.json +96 -20
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +4 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/PUBLISHING.md +53 -3
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/catalog.community.json +6 -7
- {specify_cli-0.11.7 → specify_cli-0.11.9}/pyproject.toml +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/__init__.py +4 -2
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_github_http.py +56 -31
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/authentication/http.py +14 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/extensions/__init__.py +8 -2
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/claude/__init__.py +11 -7
- specify_cli-0.11.9/src/specify_cli/integrations/kimi/__init__.py +489 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/presets/__init__.py +11 -2
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/presets/_commands.py +4 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/expressions.py +38 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/analyze.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/checklist.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/clarify.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/constitution.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/converge.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/implement.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/plan.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/specify.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/tasks.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/commands/taskstoissues.md +2 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/extensions/git/test_git_extension.py +33 -0
- specify_cli-0.11.9/tests/extensions/test_update_agent_context_feature_json.py +211 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_claude.py +40 -53
- specify_cli-0.11.9/tests/integrations/test_integration_kimi.py +593 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_subcommand.py +1 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_agent_config_consistency.py +3 -3
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_authentication.py +42 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_extensions.py +36 -1
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_github_http.py +114 -0
- specify_cli-0.11.9/tests/test_github_workflows.py +41 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_presets.py +110 -8
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_timestamp_branches.py +30 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_workflows.py +149 -0
- specify_cli-0.11.7/src/specify_cli/integrations/kimi/__init__.py +0 -125
- specify_cli-0.11.7/tests/integrations/test_integration_kimi.py +0 -149
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.editorconfig +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.gitattributes +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/CODEOWNERS +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/dependabot.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/release.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.gitignore +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/.zenodo.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/AGENTS.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/CITATION.cff +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/DEVELOPMENT.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/LICENSE +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/SECURITY.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/SUPPORT.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/.gitignore +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/community/overview.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/docfx.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/index.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/install/one-time.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/install/pipx.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/install/uv.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/installation.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/local-development.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/bundles.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/core.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/overview.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/reference/workflows.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/template/public/main.css +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/toc.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/docs/upgrade.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/bug/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/catalog.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/extension.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/.gitignore +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/LICENSE +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/extensions/template/extension.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/integrations/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/integrations/catalog.community.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/integrations/catalog.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/media/logo_large.webp +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/media/logo_small.webp +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/media/specify_cli.gif +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/newsletters/2026-April.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/newsletters/2026-February.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/newsletters/2026-March.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/newsletters/2026-May.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/catalog.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/lean/preset.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/scaffold/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/bash/common.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/spec-driven.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/spec-kit.code-workspace +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/agents.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/commands/init.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/iflow/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/roo/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/checklist-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/constitution-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/plan-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/spec-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/tasks-template.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/templates/vscode-settings.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/auth_helpers.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/conftest.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/hooks/plan.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/hooks/spec.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/http_helpers.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_iflow.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_roo.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_windsurf.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_check_tool.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_cli_version.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_commands_package.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_console_imports.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_init_dir.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_merge.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_upgrade.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_utils.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_version_imports.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/README.md +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/catalog.community.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/catalog.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.11.7 → specify_cli-0.11.9}/workflows/step-catalog.json +0 -0
|
@@ -88,9 +88,9 @@ fi
|
|
|
88
88
|
run_command "$kiro_binary --help > /dev/null"
|
|
89
89
|
echo "✅ Done"
|
|
90
90
|
|
|
91
|
-
echo -e "\n🤖 Installing Kimi CLI..."
|
|
91
|
+
echo -e "\n🤖 Installing Kimi Code CLI..."
|
|
92
92
|
# https://code.kimi.com
|
|
93
|
-
run_command "
|
|
93
|
+
run_command "npm install -g @moonshot-ai/kimi-code@latest"
|
|
94
94
|
echo "✅ Done"
|
|
95
95
|
|
|
96
96
|
echo -e "\n🤖 Installing CodeBuddy CLI..."
|
|
@@ -77,6 +77,18 @@ body:
|
|
|
77
77
|
validations:
|
|
78
78
|
required: true
|
|
79
79
|
|
|
80
|
+
- type: input
|
|
81
|
+
id: documentation
|
|
82
|
+
attributes:
|
|
83
|
+
label: Documentation URL
|
|
84
|
+
description: |
|
|
85
|
+
Link to the README that explains how to use **this preset** (not a general product/framework pitch).
|
|
86
|
+
Prefer the preset-scoped README (e.g. `presets/<id>/README.md` in a monorepo) over the repository root README.
|
|
87
|
+
It must contain at least one valid `specify preset add ...` install command — ideally `specify preset add --from <download-url>` using the exact Download URL above (other forms such as `specify preset add <preset-id>` or `specify preset add --dev <path>` are also accepted).
|
|
88
|
+
placeholder: "https://github.com/your-org/spec-kit-presets/blob/main/presets/your-preset/README.md"
|
|
89
|
+
validations:
|
|
90
|
+
required: true
|
|
91
|
+
|
|
80
92
|
- type: input
|
|
81
93
|
id: license
|
|
82
94
|
attributes:
|
|
@@ -175,7 +187,7 @@ body:
|
|
|
175
187
|
options:
|
|
176
188
|
- label: Valid `preset.yml` manifest included
|
|
177
189
|
required: true
|
|
178
|
-
- label: README
|
|
190
|
+
- label: Linked README (Documentation URL) explains how to use this preset and includes a valid `specify preset add ...` command (preferably `specify preset add --from <download-url>` using the exact download URL)
|
|
179
191
|
required: true
|
|
180
192
|
- label: LICENSE file included
|
|
181
193
|
required: true
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b4ba1db5fdec754fa825cc3160879924118bc454a781eed70ef6c90beab83a95","body_hash":"
|
|
1
|
+
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b4ba1db5fdec754fa825cc3160879924118bc454a781eed70ef6c90beab83a95","body_hash":"cb6c19088fa13da0a8320c174e8c14c4887d2c8a005a5cb2d2d2faa3f890de39","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
|
|
2
2
|
# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"c0338fef4749d08c21f8f975fb0e37efa17dda47","version":"v0.79.8"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
|
|
3
3
|
# This file was automatically generated by gh-aw (v0.79.8). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
|
|
4
4
|
#
|
|
@@ -73,6 +73,7 @@ fields):
|
|
|
73
73
|
| Author | `author` | Yes |
|
|
74
74
|
| Repository URL | `repository` | Yes |
|
|
75
75
|
| Download URL | `download-url` | Yes |
|
|
76
|
+
| Documentation URL | `documentation` | Yes |
|
|
76
77
|
| License | `license` | Yes |
|
|
77
78
|
| Required Spec Kit Version | `speckit-version` | Yes |
|
|
78
79
|
| Required Extensions | `required-extensions` | No |
|
|
@@ -100,17 +101,70 @@ deciding pass/fail:
|
|
|
100
101
|
### 2c. Repository validation
|
|
101
102
|
- Fetch the repository URL — confirm it exists and is publicly accessible
|
|
102
103
|
- Confirm the repository contains a `preset.yml` file
|
|
103
|
-
- Confirm the repository contains a `README.md` file
|
|
104
104
|
- Confirm the repository contains a `LICENSE` file
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
> The README requirement is enforced once, in **Step 2d**, against the specific file the
|
|
107
|
+
> `documentation` field points to — not a generic repository-root `README.md`. This avoids
|
|
108
|
+
> the monorepo false-positive where a root README exists but isn't the preset-usage doc.
|
|
109
|
+
|
|
110
|
+
### 2d. Documentation README validation
|
|
111
|
+
|
|
112
|
+
The `documentation` field must point to the README that explains **how to use this
|
|
113
|
+
preset** — not just any file named `README.md`, and not a product/framework pitch.
|
|
114
|
+
|
|
115
|
+
- **Restrict the URL to GitHub before fetching.** The `documentation` value is
|
|
116
|
+
user-provided input. Only accept GitHub-hosted README URLs:
|
|
117
|
+
- `https://github.com/<owner>/<repo>/blob/<ref>/<path>`
|
|
118
|
+
- `https://github.com/<owner>/<repo>/raw/<ref>/<path>`
|
|
119
|
+
- `https://raw.githubusercontent.com/<owner>/<repo>/<ref>/<path>`
|
|
120
|
+
|
|
121
|
+
If the URL points anywhere else (or isn't a URL), **fail this check** and do not fetch it.
|
|
122
|
+
- **Require the URL to point at a README file.** After stripping any fragment/query (see
|
|
123
|
+
below), the URL path must end with `README.md` (case-insensitive). If it points at some
|
|
124
|
+
other Markdown file, **fail this check** and ask the submitter to link the preset's README.
|
|
125
|
+
- Fetch the **exact URL** in the `documentation` field. First strip any fragment (`#...`)
|
|
126
|
+
or query string (`?...`) — these are common when copying from the browser UI and must be
|
|
127
|
+
ignored so the fetch target is deterministic. Then resolve the raw content to fetch:
|
|
128
|
+
- For a `github.com/<owner>/<repo>/blob/<ref>/<path>` URL, fetch the equivalent
|
|
129
|
+
`github.com/<owner>/<repo>/raw/<ref>/<path>` URL (only swap `/blob/` → `/raw/`).
|
|
130
|
+
- Fetch `github.com/.../raw/...` and `raw.githubusercontent.com/...` URLs as-is.
|
|
131
|
+
|
|
132
|
+
Do **not** rewrite into `raw.githubusercontent.com/<owner>/<repo>/<ref>/<path>` form — that
|
|
133
|
+
format can't reliably represent refs containing slashes (e.g. a `feature/foo` branch).
|
|
134
|
+
Confirm the fetched URL resolves to a readable Markdown file.
|
|
135
|
+
- **Validate that the README contains a valid Spec Kit CLI install command.** The fetched
|
|
136
|
+
README must contain at least one `specify preset add ...` invocation. The strongest
|
|
137
|
+
signal is the catalog-install form whose URL matches the submitted **Download URL**:
|
|
138
|
+
- `specify preset add --from <download-url>` (preferred), or
|
|
139
|
+
- `specify preset add <preset-id>`, or
|
|
140
|
+
- `specify preset add --dev <path>`
|
|
141
|
+
|
|
142
|
+
A `specify preset add --from <url>` command only counts when its `<url>` **matches the
|
|
143
|
+
submitted Download URL exactly**. A `--from` command pointing at a *different* URL does
|
|
144
|
+
**not** satisfy the install-command requirement (treat it as if absent) — but the README
|
|
145
|
+
may still pass on one of the other accepted forms (`specify preset add <preset-id>` or
|
|
146
|
+
`specify preset add --dev <path>`).
|
|
147
|
+
|
|
148
|
+
If **no** accepted `specify preset add ...` command is present, the README is treated as a
|
|
149
|
+
generic description/pitch rather than preset-usage documentation — **fail this check** and
|
|
150
|
+
tell the submitter to add a valid install command (ideally
|
|
151
|
+
`specify preset add --from <download-url>`).
|
|
152
|
+
- **Prefer a preset-scoped README in monorepos.** If `documentation` resolves to a generic
|
|
153
|
+
repository-root README in a monorepo (the preset lives in a subdirectory such as
|
|
154
|
+
`presets/<id>/` and a preset-scoped README exists there), **flag it** in your comment and
|
|
155
|
+
recommend the submitter point `documentation` at the preset-scoped README
|
|
156
|
+
(e.g. `presets/<id>/README.md`) so the catalog surfaces usage instead of marketing. Treat
|
|
157
|
+
this as a flag rather than a hard failure **only if** the root README still contains a valid
|
|
158
|
+
`specify preset add ...` command for this preset; otherwise it fails check 2d above.
|
|
159
|
+
|
|
160
|
+
### 2e. Release and download URL validation
|
|
107
161
|
- The download URL should follow the pattern
|
|
108
162
|
`https://github.com/<owner>/<repo>/archive/refs/tags/v<version>.zip`
|
|
109
163
|
or
|
|
110
164
|
`https://github.com/<owner>/<repo>/releases/download/<tag>/<asset>.zip`
|
|
111
165
|
- Verify a GitHub release exists matching the submitted version
|
|
112
166
|
|
|
113
|
-
###
|
|
167
|
+
### 2f. Submission checklists
|
|
114
168
|
- Confirm that all required checkboxes in the Testing Checklist and Submission
|
|
115
169
|
Requirements sections are checked (`[x]`)
|
|
116
170
|
|
|
@@ -154,7 +208,7 @@ Insert the entry in **alphabetical order by preset ID** within the
|
|
|
154
208
|
"repository": "<repository>",
|
|
155
209
|
"download_url": "<download_url>",
|
|
156
210
|
"homepage": "<homepage or repository>",
|
|
157
|
-
"documentation": "<documentation
|
|
211
|
+
"documentation": "<documentation URL — the validated preset-usage README>",
|
|
158
212
|
"license": "<license>",
|
|
159
213
|
"requires": {
|
|
160
214
|
"speckit_version": "<speckit_version>"
|
|
@@ -42,3 +42,15 @@ jobs:
|
|
|
42
42
|
globs: |
|
|
43
43
|
'**/*.md'
|
|
44
44
|
!extensions/**/*.md
|
|
45
|
+
|
|
46
|
+
shellcheck:
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
steps:
|
|
49
|
+
- name: Checkout
|
|
50
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
51
|
+
|
|
52
|
+
# shellcheck is preinstalled on ubuntu-latest runners.
|
|
53
|
+
# Start at --severity=error to block real bugs without flagging style
|
|
54
|
+
# (notably SC2155). Tighten in a follow-up after cleanup.
|
|
55
|
+
- name: Run shellcheck on shell scripts
|
|
56
|
+
run: git ls-files -z -- '*.sh' | xargs -0 shellcheck --severity=error
|
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
36
36
|
|
|
37
37
|
- name: Set up Python
|
|
38
|
-
uses: actions/setup-python@
|
|
38
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
39
39
|
with:
|
|
40
40
|
python-version: "3.13"
|
|
41
41
|
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
20
20
|
|
|
21
21
|
- name: Set up Python
|
|
22
|
-
uses: actions/setup-python@
|
|
22
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
23
23
|
with:
|
|
24
24
|
python-version: "3.13"
|
|
25
25
|
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
41
41
|
|
|
42
42
|
- name: Set up Python ${{ matrix.python-version }}
|
|
43
|
-
uses: actions/setup-python@
|
|
43
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
44
44
|
with:
|
|
45
45
|
python-version: ${{ matrix.python-version }}
|
|
46
46
|
|
|
@@ -2,6 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.11.9] - 2026-06-26
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Docs: add cline and zcode to multi-install-safe table (#3180)
|
|
10
|
+
- Docs: document missing flags --force and --refresh-shared-infra (#3179)
|
|
11
|
+
- fix(claude): stop forking /speckit-analyze to prevent long-session freezes (#3188)
|
|
12
|
+
- fix: derive plan path from feature.json in update-agent-context (#3069)
|
|
13
|
+
- fix(catalog): companion → README docs, version-pinned download URL, v0.11.0, refreshed tags (#2954)
|
|
14
|
+
- chore(deps): bump actions/setup-python from 6.2.0 to 6.3.0 (#3173)
|
|
15
|
+
- Update SicarioSpec Core preset to v0.5.1 (#3165)
|
|
16
|
+
- fix(extensions,presets,workflows): resolve private GHES release assets via /api/v3 (#3157)
|
|
17
|
+
- Update preset composition strategy reference (#3143)
|
|
18
|
+
- fix(scripts): keep PowerShell branch-name acronym match case-sensitive (parity with bash) (#3129)
|
|
19
|
+
- fix(extensions): tell agent to run mandatory hooks, not just emit the directive (#2901)
|
|
20
|
+
- Point sicario-core docs to preset README (#3120)
|
|
21
|
+
- chore: release 0.11.8, begin 0.11.9.dev0 development (#3156)
|
|
22
|
+
|
|
23
|
+
## [0.11.8] - 2026-06-24
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- docs: add SpecKit Assistant npm package to Community Friends (#3142)
|
|
28
|
+
- Require preset-usage README with Spec Kit CLI syntax in preset submissions (#3104)
|
|
29
|
+
- [extension] Update Jira Integration (Sync Engine) extension to v0.4.0 (#3152)
|
|
30
|
+
- Add Spec Roadmap extension to community catalog (#3153)
|
|
31
|
+
- feat(integration): update Kimi integration for Kimi Code CLI (#2979)
|
|
32
|
+
- [extension] Add Golden Demo extension to community catalog (#3151)
|
|
33
|
+
- docs: run /speckit.checklist after /speckit.plan in quickstart (#3108)
|
|
34
|
+
- fix(workflows): preserve commas inside quoted list-literal elements (#3134)
|
|
35
|
+
- ci: pin actions to commit SHAs and add shellcheck (#3126)
|
|
36
|
+
- chore: release 0.11.7, begin 0.11.8.dev0 development (#3154)
|
|
37
|
+
|
|
5
38
|
## [0.11.7] - 2026-06-24
|
|
6
39
|
|
|
7
40
|
### Changed
|
|
@@ -113,6 +113,16 @@ uv pip install -e ".[test]"
|
|
|
113
113
|
> `specify_cli` to this checkout's `src/`. This matches the gotcha documented in
|
|
114
114
|
> `AGENTS.md` (Common Pitfalls).
|
|
115
115
|
|
|
116
|
+
#### Shell scripts
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
git ls-files -z -- '*.sh' | xargs -0 shellcheck --severity=error
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The CI `lint.yml` `shellcheck` job currently reports and blocks only
|
|
123
|
+
error-severity findings. Warnings such as SC2155 are intentionally outside this
|
|
124
|
+
job until a follow-up cleanup tightens the threshold.
|
|
125
|
+
|
|
116
126
|
### Manual testing
|
|
117
127
|
|
|
118
128
|
#### Testing setup
|
|
@@ -56,6 +56,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
56
56
|
| Fleet Orchestrator | Orchestrate a full feature lifecycle with human-in-the-loop gates across all SpecKit phases | `process` | Read+Write | [spec-kit-fleet](https://github.com/sharathsatish/spec-kit-fleet) |
|
|
57
57
|
| GitHub Issues Integration 1 | Generate spec artifacts from GitHub Issues - import issues, sync updates, and maintain bidirectional traceability | `integration` | Read+Write | [spec-kit-github-issues](https://github.com/Fatima367/spec-kit-github-issues) |
|
|
58
58
|
| GitHub Issues Integration 2 | Creates and syncs local specs from an existing GitHub issue | `integration` | Read+Write | [spec-kit-issue](https://github.com/aaronrsun/spec-kit-issue) |
|
|
59
|
+
| Golden Demo | Extracts acceptance criteria from specs, builds test vectors, and produces a behavioral drift report — complementary to Architecture Guard and CDD | `docs` | Read+Write | [spec-kit-golden-demo](https://github.com/jasstt/spec-kit-golden-demo) |
|
|
59
60
|
| Improve Extension | Audits any codebase as a senior advisor and writes prioritized, self-contained spec prompts under specs/ that the spec-kit lifecycle can process | `process` | Read+Write | [spec-kit-improve](https://github.com/d0whc3r/spec-kit-improve) |
|
|
60
61
|
| Intake | Normalize PRD, design, and test-case evidence into SDD-ready intake artifacts | `docs` | Read+Write | [spec-kit-intake](https://github.com/bigsmartben/spec-kit-intake) |
|
|
61
62
|
| Intelligent Agent Orchestrator | Cross-catalog agent discovery and intelligent prompt-to-command routing | `process` | Read+Write | [spec-kit-orchestrator](https://github.com/pragya247/spec-kit-orchestrator) |
|
|
@@ -117,6 +118,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
117
118
|
| Spec Orchestrator | Cross-feature orchestration — track state, select tasks, and detect conflicts across parallel specs | `process` | Read-only | [spec-kit-orchestrator](https://github.com/Quratulain-bilal/spec-kit-orchestrator) |
|
|
118
119
|
| Spec Reference Loader | Reads the ## References section from the feature spec and loads only the listed docs into context | `docs` | Read-only | [spec-kit-spec-reference-loader](https://github.com/KevinBrown5280/spec-kit-spec-reference-loader) |
|
|
119
120
|
| Spec Refine | Update specs in-place, propagate changes to plan and tasks, and diff impact across artifacts | `process` | Read+Write | [spec-kit-refine](https://github.com/Quratulain-bilal/spec-kit-refine) |
|
|
121
|
+
| Spec Roadmap | Capture a durable spec roadmap after the constitution, then review specs against it before and after implementation so spec-specific decisions, outcomes, and constraints are never lost. | `process` | Read+Write | [speckit-roadmap](https://github.com/srobroek/speckit-roadmap) |
|
|
120
122
|
| Spec Scope | Effort estimation and scope tracking — estimate work, detect creep, and budget time per phase | `process` | Read-only | [spec-kit-scope-](https://github.com/Quratulain-bilal/spec-kit-scope-) |
|
|
121
123
|
| Spec Sync | Detect and resolve drift between specs and implementation. AI-assisted resolution with human approval | `docs` | Read+Write | [spec-kit-sync](https://github.com/bgervin/spec-kit-sync) |
|
|
122
124
|
| Spec Trace | Build a requirement → test traceability matrix from spec.md and the test suite — surface untested requirements and orphan tests | `code` | Read+Write | [spec-kit-trace](https://github.com/Quratulain-bilal/spec-kit-trace) |
|
|
@@ -7,7 +7,9 @@ Community projects that extend, visualize, or build on Spec Kit:
|
|
|
7
7
|
|
|
8
8
|
- **[cc-spex](https://github.com/rhuss/cc-spex)** — A Claude Code plugin that adds composable traits on top of Spec Kit with [Superpowers](https://github.com/obra/superpowers)-based quality gates, spec/code review, git worktree isolation, and parallel implementation via agent teams.
|
|
9
9
|
|
|
10
|
-
- **[Spec Kit Assistant](https://marketplace.visualstudio.com/items?itemName=rfsales.speckit-assistant)** — A VS Code extension that provides a visual orchestrator for the full SDD workflow (constitution → specification → planning → tasks → implementation) with phase status visualization, an interactive task checklist, DAG visualization, and support for Claude, Gemini, GitHub Copilot, and OpenAI backends. Requires the `specify` CLI in your PATH.
|
|
10
|
+
- **[VS Code Spec Kit Assistant](https://marketplace.visualstudio.com/items?itemName=rfsales.speckit-assistant)** — A VS Code extension that provides a visual orchestrator for the full SDD workflow (constitution → specification → planning → tasks → implementation) with phase status visualization, an interactive task checklist, DAG visualization, and support for Claude, Gemini, GitHub Copilot, and OpenAI backends. Requires the `specify` CLI in your PATH.
|
|
11
|
+
|
|
12
|
+
- **[SpecKit Assistant](https://www.npmjs.com/package/speckit-assistant)** — A visual orchestrator for Spec-Driven Development (SDD). It connects your local specification, planning, and task checklists with AI agents (Claude, Gemini, GitHub Copilot). No global installation required — just run it via `npx speckit-assistant`.
|
|
11
13
|
|
|
12
14
|
- **[SpecKit Companion](https://marketplace.visualstudio.com/items?itemName=alfredoperez.speckit-companion)** — A VS Code extension that brings a visual GUI to Spec Kit. Browse specs in a rich markdown viewer with clickable file references, create specifications with image attachments, comment and refine each step inline (GitHub-style review), track your progress through the SDD workflow with a visual phase stepper, and manage steering documents like constitutions and templates.
|
|
13
15
|
|
|
@@ -25,7 +25,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
|
|
|
25
25
|
| Pirate Speak (Full) | Transforms all Spec Kit output into pirate speak — specs become "Voyage Manifests", plans become "Battle Plans", tasks become "Crew Assignments" | 6 templates, 9 commands | — | [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
|
|
26
26
|
| Screenwriting | Spec-Driven Development for screenwriting/scriptwriting/tutorials: feature films, television (pilot, episode, limited series), and stage plays. Adapts the Spec Kit workflow to screenplay craft — slug lines, action lines, act breaks, beat sheets, and industry-standard pitch documents. Supports three-act, Save the Cat, TV pilot, network episode, cable/streaming episode, and stage-play structural frameworks. Export to Fountain, FTX, PDF | 26 templates, 32 commands, 1 script | — | [speckit-preset-screenwriting](https://github.com/adaumann/speckit-preset-screenwriting) |
|
|
27
27
|
| Security Governance | Adds memory-safe-language preference, language-specific secure coding profiles, audit-ready Spec-Kit run evidence, ASVS verification, SBOM/AI-SBOM supply-chain transparency, CRA awareness, and regulatory applicability screening for NIS2, CRA, EU AI Act, and DORA | 14 templates, 3 commands | — | [spec-kit-preset-security-governance](https://github.com/hindermath/spec-kit-preset-security-governance) |
|
|
28
|
-
| SicarioSpec Core |
|
|
28
|
+
| SicarioSpec Core | Baseline secure-by-default Spec Kit governance profile. | 5 templates | — | [sicario-spec](https://github.com/dfirs1car1o/sicario-spec) |
|
|
29
29
|
| 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
30
|
| 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) |
|
|
31
31
|
| 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) |
|
|
@@ -13,10 +13,10 @@ This guide will help you get started with Spec-Driven Development using Spec Kit
|
|
|
13
13
|
After installing Spec Kit and defining your project constitution, quick experiments can use the lean feature path: `/speckit.specify` -> `/speckit.plan` -> `/speckit.tasks` -> `/speckit.implement`. For production features or any work with meaningful ambiguity, treat `/speckit.clarify`, `/speckit.checklist`, and `/speckit.analyze` as regular quality gates:
|
|
14
14
|
|
|
15
15
|
```text
|
|
16
|
-
/speckit.constitution -> /speckit.specify -> /speckit.clarify -> /speckit.
|
|
16
|
+
/speckit.constitution -> /speckit.specify -> /speckit.clarify -> /speckit.plan -> /speckit.checklist -> /speckit.tasks -> /speckit.analyze -> /speckit.implement
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
Use `/speckit.clarify` to reduce requirement ambiguity before planning, `/speckit.checklist` to validate requirements
|
|
19
|
+
Use `/speckit.clarify` to reduce requirement ambiguity before planning, `/speckit.checklist` (after `/speckit.plan`) to generate quality checklists that validate requirements completeness, clarity, and consistency, and `/speckit.analyze` to check spec/plan/task consistency before implementation starts. You can repeat `/speckit.analyze` after implementation as an extra review, but keep the first analysis before `/speckit.implement` so gaps are caught while the plan and tasks can still be adjusted.
|
|
20
20
|
|
|
21
21
|
### Step 1: Install Specify
|
|
22
22
|
|
|
@@ -75,12 +75,6 @@ uvx --from git+https://github.com/github/spec-kit.git specify init <PROJECT_NAME
|
|
|
75
75
|
/speckit.clarify Focus on security and performance requirements.
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
Then validate the requirements with `/speckit.checklist` before creating the technical plan:
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
/speckit.checklist
|
|
82
|
-
```
|
|
83
|
-
|
|
84
78
|
### Step 5: Create a Technical Implementation Plan
|
|
85
79
|
|
|
86
80
|
**In the chat**, use the `/speckit.plan` slash command to provide your tech stack and architecture choices.
|
|
@@ -89,6 +83,12 @@ Then validate the requirements with `/speckit.checklist` before creating the tec
|
|
|
89
83
|
/speckit.plan The application uses Vite with minimal number of libraries. Use vanilla HTML, CSS, and JavaScript as much as possible. Images are not uploaded anywhere and metadata is stored in a local SQLite database.
|
|
90
84
|
```
|
|
91
85
|
|
|
86
|
+
Then generate quality checklists with `/speckit.checklist` once the plan exists:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
/speckit.checklist
|
|
90
|
+
```
|
|
91
|
+
|
|
92
92
|
### Step 6: Break Down, Analyze, and Implement
|
|
93
93
|
|
|
94
94
|
**In the chat**, use the `/speckit.tasks` slash command to create an actionable task list.
|
|
@@ -150,20 +150,20 @@ You can continue to refine the spec with more details using `/speckit.clarify`:
|
|
|
150
150
|
/speckit.clarify When you first launch Taskify, it's going to give you a list of the five users to pick from. There will be no password required. When you click on a user, you go into the main view, which displays the list of projects. When you click on a project, you open the Kanban board for that project. You're going to see the columns. You'll be able to drag and drop cards back and forth between different columns. You will see any cards that are assigned to you, the currently logged in user, in a different color from all the other ones, so you can quickly see yours. You can edit any comments that you make, but you can't edit comments that other people made. You can delete any comments that you made, but you can't delete comments anybody else made.
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
### Step 4:
|
|
153
|
+
### Step 4: Generate Technical Plan with `/speckit.plan`
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
Be specific about your tech stack and technical requirements:
|
|
156
156
|
|
|
157
157
|
```bash
|
|
158
|
-
/speckit.
|
|
158
|
+
/speckit.plan We are going to generate this using .NET Aspire, using Postgres as the database. The frontend should use Blazor server with drag-and-drop task boards, real-time updates. There should be a REST API created with a projects API, tasks API, and a notifications API.
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
### Step 5:
|
|
161
|
+
### Step 5: Validate the Spec
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
Generate quality checklists to validate the specification using the `/speckit.checklist` command:
|
|
164
164
|
|
|
165
165
|
```bash
|
|
166
|
-
/speckit.
|
|
166
|
+
/speckit.checklist
|
|
167
167
|
```
|
|
168
168
|
|
|
169
169
|
### Step 6: Define Tasks
|
|
@@ -69,6 +69,33 @@ Either `token` or `token_env` must be set for `bearer` and `basic-pat` schemes.
|
|
|
69
69
|
}
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
+
### GitHub Enterprise Server (GHES)
|
|
73
|
+
|
|
74
|
+
To use a private catalog or extension hosted on a GitHub Enterprise Server
|
|
75
|
+
instance, add a `github` entry listing your GHES host(s). The same entry
|
|
76
|
+
authenticates both catalog JSON fetches **and** private release-asset
|
|
77
|
+
downloads — Specify recognizes the listed hosts as GitHub Enterprise and
|
|
78
|
+
resolves release downloads through the GHES REST API (`/api/v3`).
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"providers": [
|
|
83
|
+
{
|
|
84
|
+
"hosts": ["ghes.example.com", "raw.ghes.example.com", "codeload.ghes.example.com"],
|
|
85
|
+
"provider": "github",
|
|
86
|
+
"auth": "bearer",
|
|
87
|
+
"token_env": "GH_ENTERPRISE_TOKEN"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
List the **bare** web host (e.g. `ghes.example.com`) — release-download URLs
|
|
94
|
+
live there. If your instance uses subdomain isolation, also list the `raw.`
|
|
95
|
+
and `codeload.` subdomains your catalog/extension URLs use. A
|
|
96
|
+
`*.ghes.example.com` wildcard matches subdomains but **not** the bare host,
|
|
97
|
+
so always include the bare host explicitly.
|
|
98
|
+
|
|
72
99
|
### Azure DevOps (`azure-devops`)
|
|
73
100
|
|
|
74
101
|
| Scheme | Header | Use for |
|
|
@@ -26,6 +26,7 @@ specify extension add <name>
|
|
|
26
26
|
| --------------- | -------------------------------------------------------- |
|
|
27
27
|
| `--dev` | Install from a local directory (for development) |
|
|
28
28
|
| `--from <url>` | Install from a custom URL instead of the catalog |
|
|
29
|
+
| `--force` | Overwrite if already installed |
|
|
29
30
|
| `--priority <N>`| Resolution priority (default: 10; lower = higher precedence) |
|
|
30
31
|
|
|
31
32
|
Installs an extension from the catalog, a URL, or a local directory. Extension commands are automatically registered with the currently installed AI coding agent integration.
|
|
@@ -25,7 +25,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
25
25
|
| [iFlow CLI](https://docs.iflow.cn/en/cli/quickstart) | `iflow` | |
|
|
26
26
|
| [Junie](https://junie.jetbrains.com/) | `junie` | |
|
|
27
27
|
| [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | |
|
|
28
|
-
| [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration;
|
|
28
|
+
| [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths, and (when the `agent-context` extension is enabled) migrates `KIMI.md` context into `AGENTS.md` |
|
|
29
29
|
| [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
|
|
30
30
|
| [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
|
|
31
31
|
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
|
|
@@ -100,6 +100,7 @@ specify integration switch <key>
|
|
|
100
100
|
| ------------------------ | ------------------------------------------------------------------------ |
|
|
101
101
|
| `--script sh\|ps` | Script type: `sh` (bash/zsh) or `ps` (PowerShell) |
|
|
102
102
|
| `--force` | Force removal of modified files during uninstall; when the target is already installed, overwrite managed shared templates while changing the default |
|
|
103
|
+
| `--refresh-shared-infra` | Also overwrite shared infrastructure files even if you customized them (otherwise customizations are preserved) |
|
|
103
104
|
| `--integration-options` | Options for the target integration when it is not already installed |
|
|
104
105
|
|
|
105
106
|
If the target integration is not already installed, equivalent to running `uninstall` followed by `install` in a single step. In this mode, `--force` controls whether modified files from the removed integration are deleted. If the target integration is already installed, `switch` only changes the default integration, like `use`; in this mode, `--force` controls whether managed shared templates are overwritten while the default changes. `--integration-options` is rejected for already-installed targets because changing integration options requires reinstalling managed files; run `upgrade <key> --integration-options ...` first, then `use <key>`.
|
|
@@ -158,7 +159,7 @@ Some integrations accept additional options via `--integration-options`:
|
|
|
158
159
|
| Integration | Option | Description |
|
|
159
160
|
| ----------- | ------------------- | -------------------------------------------------------------- |
|
|
160
161
|
| `generic` | `--commands-dir` | Required. Directory for command files |
|
|
161
|
-
| `kimi` | `--migrate-legacy` | Migrate legacy dotted
|
|
162
|
+
| `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated directory names); when the `agent-context` extension is enabled, also migrates `KIMI.md` to `AGENTS.md` |
|
|
162
163
|
|
|
163
164
|
Example:
|
|
164
165
|
|
|
@@ -184,6 +185,7 @@ The currently declared multi-install safe integrations are:
|
|
|
184
185
|
| --- | --------- |
|
|
185
186
|
| `auggie` | `.augment/commands`, `.augment/rules/specify-rules.md` |
|
|
186
187
|
| `claude` | `.claude/skills`, `CLAUDE.md` |
|
|
188
|
+
| `cline` | `.clinerules/workflows`, `.clinerules/specify-rules.md` |
|
|
187
189
|
| `codebuddy` | `.codebuddy/commands`, `CODEBUDDY.md` |
|
|
188
190
|
| `codex` | `.agents/skills`, `AGENTS.md` |
|
|
189
191
|
| `cursor-agent` | `.cursor/skills`, `.cursor/rules/specify-rules.mdc` |
|
|
@@ -192,7 +194,6 @@ The currently declared multi-install safe integrations are:
|
|
|
192
194
|
| `iflow` | `.iflow/commands`, `IFLOW.md` |
|
|
193
195
|
| `junie` | `.junie/commands`, `.junie/AGENTS.md` |
|
|
194
196
|
| `kilocode` | `.kilocode/workflows`, `.kilocode/rules/specify-rules.md` |
|
|
195
|
-
| `kimi` | `.kimi/skills`, `KIMI.md` |
|
|
196
197
|
| `qodercli` | `.qoder/commands`, `QODER.md` |
|
|
197
198
|
| `qwen` | `.qwen/commands`, `QWEN.md` |
|
|
198
199
|
| `roo` | `.roo/commands`, `.roo/rules/specify-rules.md` |
|
|
@@ -200,6 +201,7 @@ The currently declared multi-install safe integrations are:
|
|
|
200
201
|
| `tabnine` | `.tabnine/agent/commands`, `TABNINE.md` |
|
|
201
202
|
| `trae` | `.trae/skills`, `.trae/rules/project_rules.md` |
|
|
202
203
|
| `windsurf` | `.windsurf/workflows`, `.windsurf/rules/specify-rules.md` |
|
|
204
|
+
| `zcode` | `.zcode/skills`, `ZCODE.md` |
|
|
203
205
|
|
|
204
206
|
Integrations that share a context file or command directory with another integration, require dynamic install paths such as `--commands-dir`, or merge shared tool settings are not declared safe by default. They can still be installed alongside another integration with `--force`.
|
|
205
207
|
|
|
@@ -137,9 +137,11 @@ catalogs:
|
|
|
137
137
|
|
|
138
138
|
## File Resolution
|
|
139
139
|
|
|
140
|
-
Presets can provide command files, template files (like `plan-template.md`), and script files.
|
|
140
|
+
Presets can provide command files, template files (like `plan-template.md`), and script files. Each file name is evaluated independently against the priority stack, so different files can come from different layers.
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
Templates and scripts are looked up from the stack when Spec Kit needs them. Commands use the same stack for replacement and composition, but are materialized into detected agent directories instead of being re-resolved by agents. During preset install, Spec Kit registers command files for the preset being installed; post-install and post-removal reconciliation then recomputes and writes the effective command content for affected command names based on the active stack. Agents do not re-resolve the stack each time they run a command.
|
|
143
|
+
|
|
144
|
+
By default, files use a **replace** strategy: the first match in the priority stack wins and is used entirely. Templates and commands can also use composition strategies: **prepend** places preset content before lower-priority content, **append** places it after lower-priority content, and **wrap** replaces `{CORE_TEMPLATE}` with lower-priority content. Scripts support **replace** and **wrap**; script wrappers use `$CORE_SCRIPT` as the placeholder.
|
|
143
145
|
|
|
144
146
|
The resolution stack, from highest to lowest precedence:
|
|
145
147
|
|
|
@@ -148,8 +150,6 @@ The resolution stack, from highest to lowest precedence:
|
|
|
148
150
|
3. **Installed extensions** — sorted by priority
|
|
149
151
|
4. **Spec Kit core** — `.specify/templates/`
|
|
150
152
|
|
|
151
|
-
Commands are registered at install time (not resolved through the stack at runtime).
|
|
152
|
-
|
|
153
153
|
### Resolution Stack
|
|
154
154
|
|
|
155
155
|
```mermaid
|
|
@@ -215,7 +215,7 @@ Run `specify preset resolve <name>` to trace the resolution stack and see which
|
|
|
215
215
|
|
|
216
216
|
### What's the difference between disabling and removing a preset?
|
|
217
217
|
|
|
218
|
-
**Disabling** (`specify preset disable`) keeps the preset installed but excludes
|
|
218
|
+
**Disabling** (`specify preset disable`) keeps the preset installed but excludes it from future template and script resolution. Previously registered commands remain available in your AI coding agent until preset removal, so use removal when you need command changes to stop taking effect. Disabling is useful for temporarily testing template/script behavior without a preset, or comparing template/script output with and without it. Re-enable anytime with `specify preset enable`.
|
|
219
219
|
|
|
220
220
|
**Removing** (`specify preset remove`) fully uninstalls the preset — deletes its files, unregisters its commands from your AI coding agent, and removes it from the registry.
|
|
221
221
|
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Usage: update-agent-context.sh [plan_path]
|
|
12
12
|
#
|
|
13
|
-
# When `plan_path` is omitted, the script
|
|
14
|
-
#
|
|
15
|
-
#
|
|
13
|
+
# When `plan_path` is omitted, the script derives it from `.specify/feature.json`
|
|
14
|
+
# (written by /speckit-specify). Falls back to the most recently modified
|
|
15
|
+
# `specs/*/plan.md` only when feature.json is absent or its plan does not exist yet.
|
|
16
16
|
|
|
17
17
|
set -euo pipefail
|
|
18
18
|
|
|
@@ -202,23 +202,78 @@ unset _cf_parts _seg
|
|
|
202
202
|
|
|
203
203
|
PLAN_PATH="${1:-}"
|
|
204
204
|
if [[ -z "$PLAN_PATH" ]]; then
|
|
205
|
-
#
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
import sys,
|
|
205
|
+
# Prefer .specify/feature.json (written by /speckit-specify) over mtime heuristic.
|
|
206
|
+
_feature_json="$PROJECT_ROOT/.specify/feature.json"
|
|
207
|
+
if [[ -f "$_feature_json" ]]; then
|
|
208
|
+
_feature_dir="$("$_python" - "$_feature_json" <<'PY'
|
|
209
|
+
import sys, json
|
|
210
|
+
try:
|
|
211
|
+
with open(sys.argv[1], encoding="utf-8") as fh:
|
|
212
|
+
d = json.load(fh)
|
|
213
|
+
val = d.get("feature_directory", "")
|
|
214
|
+
print(val if isinstance(val, str) else "")
|
|
215
|
+
except Exception:
|
|
216
|
+
print("")
|
|
217
|
+
PY
|
|
218
|
+
)"
|
|
219
|
+
# Normalize backslashes (written by PS on Windows) to forward slashes before path ops.
|
|
220
|
+
_feature_dir="$(printf '%s' "$_feature_dir" | tr '\\' '/')"
|
|
221
|
+
_feature_dir="${_feature_dir%/}"
|
|
222
|
+
if [[ -n "$_feature_dir" ]]; then
|
|
223
|
+
# feature_directory may be relative or absolute (absolute paths outside PROJECT_ROOT
|
|
224
|
+
# are preserved as-is by _persist_feature_json in common.sh).
|
|
225
|
+
# Also match drive-qualified paths (C:/...) written by PowerShell on Windows.
|
|
226
|
+
if [[ "$_feature_dir" == /* ]] || [[ "$_feature_dir" =~ ^[A-Za-z]:/ ]]; then
|
|
227
|
+
_candidate="$_feature_dir/plan.md"
|
|
228
|
+
else
|
|
229
|
+
_candidate="$PROJECT_ROOT/$_feature_dir/plan.md"
|
|
230
|
+
fi
|
|
231
|
+
if [[ -f "$_candidate" ]]; then
|
|
232
|
+
# Resolve symlinks before comparing so paths like /var/… vs /private/var/…
|
|
233
|
+
# (macOS) are treated as equivalent. Mirrors the mtime-fallback approach.
|
|
234
|
+
PLAN_PATH="$("$_python" - "$PROJECT_ROOT" "$_candidate" <<'PY'
|
|
235
|
+
import sys
|
|
210
236
|
from pathlib import Path
|
|
211
|
-
|
|
237
|
+
root = Path(sys.argv[1]).resolve()
|
|
238
|
+
cand = Path(sys.argv[2]).resolve()
|
|
239
|
+
try:
|
|
240
|
+
print(cand.relative_to(root).as_posix())
|
|
241
|
+
except ValueError:
|
|
242
|
+
# Outside project root: emit the resolved path in POSIX form.
|
|
243
|
+
# as_posix() converts backslashes correctly on native Windows Python.
|
|
244
|
+
print(cand.as_posix())
|
|
245
|
+
PY
|
|
246
|
+
)"
|
|
247
|
+
fi
|
|
248
|
+
fi
|
|
249
|
+
fi
|
|
250
|
+
|
|
251
|
+
# Fall back to mtime only when feature.json is absent or its plan does not exist yet.
|
|
252
|
+
# Python emits a project-relative POSIX path directly to avoid bash prefix-strip
|
|
253
|
+
# issues with backslash paths on Windows (Git bash / MSYS2).
|
|
254
|
+
if [[ -z "$PLAN_PATH" ]]; then
|
|
255
|
+
_plan_rel="$("$_python" - "$PROJECT_ROOT" <<'PY'
|
|
256
|
+
import sys
|
|
257
|
+
from pathlib import Path
|
|
258
|
+
root = Path(sys.argv[1]).resolve()
|
|
259
|
+
specs = root / "specs"
|
|
212
260
|
plans = sorted(
|
|
213
261
|
specs.glob("*/plan.md"),
|
|
214
262
|
key=lambda p: p.stat().st_mtime,
|
|
215
263
|
reverse=True,
|
|
216
264
|
)
|
|
217
|
-
|
|
265
|
+
if plans:
|
|
266
|
+
try:
|
|
267
|
+
print(plans[0].relative_to(root).as_posix())
|
|
268
|
+
except ValueError:
|
|
269
|
+
print("")
|
|
270
|
+
else:
|
|
271
|
+
print("")
|
|
218
272
|
PY
|
|
219
273
|
)"
|
|
220
|
-
|
|
221
|
-
|
|
274
|
+
if [[ -n "$_plan_rel" ]]; then
|
|
275
|
+
PLAN_PATH="$_plan_rel"
|
|
276
|
+
fi
|
|
222
277
|
fi
|
|
223
278
|
fi
|
|
224
279
|
|