specify-cli 1.0.2__tar.gz → 1.0.3__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-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/agent_request.yml +1 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/feature_request.yml +1 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/codeql.yml +2 -2
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/publish-pypi.yml +5 -3
- {specify_cli-1.0.2 → specify_cli-1.0.3}/AGENTS.md +2 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/CHANGELOG.md +25 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/PKG-INFO +22 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/README.md +21 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/extensions.md +2 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/integrations.md +1 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-PUBLISHING-GUIDE.md +1 -2
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/catalog.community.json +47 -8
- {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/catalog.json +10 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/pyproject.toml +1 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/check-prerequisites.sh +13 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/setup-plan.sh +2 -2
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/check-prerequisites.ps1 +11 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/setup-plan.ps1 +5 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/check_prerequisites.py +14 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/setup_plan.py +3 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_github_http.py +3 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_utils.py +41 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/primitives.py +5 -3
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/events.py +1 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/__init__.py +2 -0
- specify_cli-1.0.3/src/specify_cli/integrations/docker_agent/__init__.py +126 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/presets/__init__.py +4 -2
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/catalog.py +8 -4
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/expressions.py +36 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/do_while/__init__.py +16 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/if_then/__init__.py +16 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/while_loop/__init__.py +16 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/analyze.md +3 -3
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/converge.md +3 -3
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_bundle_cli.py +4 -1
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_events.py +16 -0
- specify_cli-1.0.3/tests/integrations/test_integration_docker_agent.py +133 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_agent_config_consistency.py +1 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_check_prerequisites_python_parity.py +72 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_check_tool.py +36 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_github_http.py +18 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_github_workflows.py +86 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_presets.py +35 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_plan_python_parity.py +10 -8
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_workflows.py +24 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_primitives.py +114 -15
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_condition_expression_block.py +71 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.devcontainer/post-create.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.editorconfig +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.gitattributes +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/CODEOWNERS +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/aw/actions-lock.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/dependabot.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/scripts/check_security_requirements.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/security-audit-requirements.txt +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-bundle.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-bundle.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-test.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/docs.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/feature-assess.lock.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/feature-assess.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/lint.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/release.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/security.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/stale.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/test.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.gitignore +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.pre-commit-config.yaml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/.zenodo.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/CITATION.cff +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/CONTRIBUTING.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/DEVELOPMENT.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/LICENSE +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/README.zh-CN.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/SECURITY.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/SUPPORT.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/bundles/catalog.community.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/.gitignore +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/bundles.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/friends.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/overview.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/presets.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/walkthroughs.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/complex-features.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/sdd.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/spec-of-specs.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/docfx.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/guides/existing-projects.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/guides/monorepo.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/history.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/images/spec-kit-logo.webp +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/index.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/air-gapped.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/one-time.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/pipx.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/pypi.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/uv.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/installation.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/local-development.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/quickstart.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/agentic-bugfix.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/agentic-sdd.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/authentication.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/bundles.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/core.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/extensions.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/overview.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/presets.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/workflows.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/template/public/main.css +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/toc.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/upgrade.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/developer/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.decide.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.define.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.intake.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.research.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.shape.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/extension.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/extension.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/catalog.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/config-template.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/extension.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/git-config.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/auto_commit.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/git_common.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/initialize_repo.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/selftest/extension.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/.gitignore +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/LICENSE +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/commands/example.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/config-template.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/extension.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/catalog.community.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/media/logo_large.webp +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/media/logo_small.webp +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/media/specify_cli.gif +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-April.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-February.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-July.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-June.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-March.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-May.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/PUBLISHING.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/catalog.community.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/catalog.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/constitution-sync/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/constitution-sync/commands/speckit.constitution.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/constitution-sync/preset.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/preset.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/preset.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/preset.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/common.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/resolve-template.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/resolve-template.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/common.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/create_new_feature.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/resolve_template.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/setup_tasks.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/spec-driven.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/spec-kit.code-workspace +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_assets.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_console.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_download_security.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_project.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_toml_string.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_version.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/agents.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/event.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/init.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/command_code/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/droid/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/grok/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/composer.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/merge.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/schema.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/checklist-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/checklist.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/clarify.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/constitution.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/implement.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/plan.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/specify.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/tasks.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/constitution-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/plan-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/spec-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/tasks-template.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/vscode-settings.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/auth_helpers.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/bundler_helpers.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/conftest.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_wheel_bundled_presets.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/assess/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/assess/test_assess_extension.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/TESTING.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/plan.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/spec.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/tasks.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/http_helpers.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/__init__.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/conftest.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_base.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_cli.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_alquimia.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_command_code.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_droid.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_grok.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_registry.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/parity_helpers.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_authentication.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_branch_numbering.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_cli_version.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_command_template_py_scripts.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_commands_package.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_console_imports.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_create_new_feature_python_parity.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_download_security.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_event_command.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_add_path_traversal.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_registration.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_skills.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extensions.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_init_dir.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_init_output_markup.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_merge.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_post_process.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_resolve_template_python_parity.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_security_workflow.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_tasks.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_tasks_python_parity.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_shared_infra_gitignore.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_skill_placeholder_py.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_specify_template_numbering.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_upgrade.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_utils.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_version_imports.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundle_download_url.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_yamlio.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/conftest.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_commands.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_composer.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_layer_sources.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_merge.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_schema.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_security.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_resolver_integration.py +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/PUBLISHING.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/README.md +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/catalog.community.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/catalog.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/step-catalog.community.json +0 -0
- {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/step-catalog.json +0 -0
|
@@ -8,7 +8,7 @@ body:
|
|
|
8
8
|
value: |
|
|
9
9
|
Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
|
|
10
10
|
|
|
11
|
-
**Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Factory Droid, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
|
|
11
|
+
**Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Docker Agent, Factory Droid, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
|
|
12
12
|
|
|
13
13
|
- type: input
|
|
14
14
|
id: agent-name
|
|
@@ -22,11 +22,11 @@ jobs:
|
|
|
22
22
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
23
23
|
|
|
24
24
|
- name: Initialize CodeQL
|
|
25
|
-
uses: github/codeql-action/init@
|
|
25
|
+
uses: github/codeql-action/init@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
|
|
26
26
|
with:
|
|
27
27
|
languages: ${{ matrix.language }}
|
|
28
28
|
|
|
29
29
|
- name: Perform CodeQL Analysis
|
|
30
|
-
uses: github/codeql-action/analyze@
|
|
30
|
+
uses: github/codeql-action/analyze@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
|
|
31
31
|
with:
|
|
32
32
|
category: "/language:${{ matrix.language }}"
|
|
@@ -19,8 +19,9 @@ jobs:
|
|
|
19
19
|
actions: write
|
|
20
20
|
steps:
|
|
21
21
|
- name: Verify tag format
|
|
22
|
+
env:
|
|
23
|
+
TAG: ${{ inputs.tag }}
|
|
22
24
|
run: |
|
|
23
|
-
TAG="${{ inputs.tag }}"
|
|
24
25
|
if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
25
26
|
echo "Error: '$TAG' is not a valid release tag (expected vX.Y.Z)"
|
|
26
27
|
exit 1
|
|
@@ -40,9 +41,10 @@ jobs:
|
|
|
40
41
|
python-version: "3.13"
|
|
41
42
|
|
|
42
43
|
- name: Verify tag matches package version
|
|
44
|
+
env:
|
|
45
|
+
TAG: ${{ inputs.tag }}
|
|
43
46
|
run: |
|
|
44
|
-
TAG_VERSION="${
|
|
45
|
-
TAG_VERSION="${TAG_VERSION#v}"
|
|
47
|
+
TAG_VERSION="${TAG#v}"
|
|
46
48
|
PROJECT_VERSION="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
|
|
47
49
|
if [[ "$TAG_VERSION" != "$PROJECT_VERSION" ]]; then
|
|
48
50
|
echo "Error: Tag version ($TAG_VERSION) does not match pyproject.toml version ($PROJECT_VERSION)"
|
|
@@ -41,6 +41,8 @@ src/specify_cli/integrations/
|
|
|
41
41
|
│ └── __init__.py
|
|
42
42
|
├── copilot/ # Example: IntegrationBase subclass (custom setup)
|
|
43
43
|
│ └── __init__.py
|
|
44
|
+
├── docker_agent/ # Example: Docker Agent SkillsIntegration subclass
|
|
45
|
+
│ └── __init__.py
|
|
44
46
|
└── ... # One subpackage per supported agent
|
|
45
47
|
```
|
|
46
48
|
|
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [1.0.3] - 2026-09-01
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix(workflows): reject malformed step config on remove (#4095)
|
|
10
|
+
- fix(workflows): reject malformed workflow config on remove (#4096)
|
|
11
|
+
- fix(events): skip unreadable extension manifests (#4089)
|
|
12
|
+
- docs(extensions): fix private catalog FAQ command (#4373)
|
|
13
|
+
- [extension] Add Vurnix Honest Gate extension to community catalog (#4388)
|
|
14
|
+
- fix(presets): fail closed on unreadable provenance (#4092)
|
|
15
|
+
- docs: explain how Spec Kit dogfoods itself (#4381)
|
|
16
|
+
- add --require-spec to check-prerequisites (#4367)
|
|
17
|
+
- fix(ci): harden PyPI release tag handling (#4386)
|
|
18
|
+
- fix(github-http): reject malformed explicit URL ports (#4372)
|
|
19
|
+
- fix: scaffold extension config when installing via bundler (#4285)
|
|
20
|
+
- fix: reject unknown setup-plan arguments (#4371)
|
|
21
|
+
- feat(docker-agent): add Docker Agent integration (#4302)
|
|
22
|
+
- fix(workflows): reject a condition that is spliced into text, not evaluated (#4292)
|
|
23
|
+
- fix(bundler): pass explicit workflow_add options from bundle install (#4284)
|
|
24
|
+
- test(bundle): join across wrap points in the build output-path assertion (#4280)
|
|
25
|
+
- chore(deps): bump the codeql-action group with 2 updates (#4357)
|
|
26
|
+
- [extension] Update Spec Kit Figma extension to v3.1.1 (#4377)
|
|
27
|
+
- fix(presets): reject falsy non-mapping catalog roots (#4088)
|
|
28
|
+
- chore: release 1.0.2, begin 1.0.3.dev0 development (#4379)
|
|
29
|
+
|
|
5
30
|
## [1.0.2] - 2026-08-31
|
|
6
31
|
|
|
7
32
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: specify-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
4
4
|
Summary: Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD).
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -64,6 +64,7 @@ Description-Content-Type: text/markdown
|
|
|
64
64
|
- [🧩 Making Spec Kit Your Own: Extensions & Presets](#-making-spec-kit-your-own-extensions--presets)
|
|
65
65
|
- [📦 Bundles: Role-Based Setups](#-bundles-role-based-setups)
|
|
66
66
|
- [📚 Core Philosophy](#-core-philosophy)
|
|
67
|
+
- [🪞 Does Spec Kit Use Spec Kit?](#-does-spec-kit-use-spec-kit)
|
|
67
68
|
- [🌟 Development Phases](#-development-phases)
|
|
68
69
|
- [🎯 Experimental Goals](#-experimental-goals)
|
|
69
70
|
- [🔧 Prerequisites](#-prerequisites)
|
|
@@ -421,6 +422,26 @@ Spec-Driven Development is a structured process that emphasizes:
|
|
|
421
422
|
- **Multi-step refinement** rather than one-shot code generation from prompts
|
|
422
423
|
- **Heavy reliance** on advanced AI model capabilities for specification interpretation
|
|
423
424
|
|
|
425
|
+
## 🪞 Does Spec Kit Use Spec Kit?
|
|
426
|
+
|
|
427
|
+
Yes — we dogfood Spec Kit while developing Spec Kit, especially for substantial
|
|
428
|
+
features and changes to the development workflow. Contributors are asked to test
|
|
429
|
+
relevant changes through the Spec-Driven Development commands. The
|
|
430
|
+
[feature assessment workflow](./.github/workflows/feature-assess.md) is currently
|
|
431
|
+
the automated dogfooding path: its setup uses the CLI from the current checkout
|
|
432
|
+
to initialize Copilot and install the `assess` extension, after which Copilot
|
|
433
|
+
follows the generated assessment skills against feature requests. The other
|
|
434
|
+
agentic workflows currently operate independently of the Specify CLI.
|
|
435
|
+
|
|
436
|
+
This does not mean every change goes through the full workflow. Small fixes can
|
|
437
|
+
use the normal issue, pull request, review, and test process. Dogfooding
|
|
438
|
+
scaffolding and artifacts under `.github/agents/`, `.github/prompts/`,
|
|
439
|
+
`.github/copilot-instructions.md`, `.grok/`, `.specify/`, and `specs/` are
|
|
440
|
+
intentionally gitignored. The automated assessment workflow is ephemeral and
|
|
441
|
+
neither commits nor pushes its generated Copilot skills, so its output does not
|
|
442
|
+
enter repository history. See the [contributor development
|
|
443
|
+
workflow](./CONTRIBUTING.md#development-workflow) for the validation expectations.
|
|
444
|
+
|
|
424
445
|
## 🌟 Development Phases
|
|
425
446
|
|
|
426
447
|
| Phase | Focus | Key Activities |
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
- [🧩 Making Spec Kit Your Own: Extensions & Presets](#-making-spec-kit-your-own-extensions--presets)
|
|
45
45
|
- [📦 Bundles: Role-Based Setups](#-bundles-role-based-setups)
|
|
46
46
|
- [📚 Core Philosophy](#-core-philosophy)
|
|
47
|
+
- [🪞 Does Spec Kit Use Spec Kit?](#-does-spec-kit-use-spec-kit)
|
|
47
48
|
- [🌟 Development Phases](#-development-phases)
|
|
48
49
|
- [🎯 Experimental Goals](#-experimental-goals)
|
|
49
50
|
- [🔧 Prerequisites](#-prerequisites)
|
|
@@ -401,6 +402,26 @@ Spec-Driven Development is a structured process that emphasizes:
|
|
|
401
402
|
- **Multi-step refinement** rather than one-shot code generation from prompts
|
|
402
403
|
- **Heavy reliance** on advanced AI model capabilities for specification interpretation
|
|
403
404
|
|
|
405
|
+
## 🪞 Does Spec Kit Use Spec Kit?
|
|
406
|
+
|
|
407
|
+
Yes — we dogfood Spec Kit while developing Spec Kit, especially for substantial
|
|
408
|
+
features and changes to the development workflow. Contributors are asked to test
|
|
409
|
+
relevant changes through the Spec-Driven Development commands. The
|
|
410
|
+
[feature assessment workflow](./.github/workflows/feature-assess.md) is currently
|
|
411
|
+
the automated dogfooding path: its setup uses the CLI from the current checkout
|
|
412
|
+
to initialize Copilot and install the `assess` extension, after which Copilot
|
|
413
|
+
follows the generated assessment skills against feature requests. The other
|
|
414
|
+
agentic workflows currently operate independently of the Specify CLI.
|
|
415
|
+
|
|
416
|
+
This does not mean every change goes through the full workflow. Small fixes can
|
|
417
|
+
use the normal issue, pull request, review, and test process. Dogfooding
|
|
418
|
+
scaffolding and artifacts under `.github/agents/`, `.github/prompts/`,
|
|
419
|
+
`.github/copilot-instructions.md`, `.grok/`, `.specify/`, and `specs/` are
|
|
420
|
+
intentionally gitignored. The automated assessment workflow is ephemeral and
|
|
421
|
+
neither commits nor pushes its generated Copilot skills, so its output does not
|
|
422
|
+
enter repository history. See the [contributor development
|
|
423
|
+
workflow](./CONTRIBUTING.md#development-workflow) for the validation expectations.
|
|
424
|
+
|
|
404
425
|
## 🌟 Development Phases
|
|
405
426
|
|
|
406
427
|
| Phase | Focus | Key Activities |
|
|
@@ -142,7 +142,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
142
142
|
| 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-) |
|
|
143
143
|
| Spec Inventory | Read-only inventory of live requirement and task IDs, with focused per-task context packs instead of whole-file dumps | `visibility` | Read-only | [spec-kit-inventory-alignment](https://github.com/Yash-Chindam/spec-kit-inventory-alignment) |
|
|
144
144
|
| 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) |
|
|
145
|
-
| Spec Kit Figma |
|
|
145
|
+
| Spec Kit Figma | Grounds SpecKit spec/plan/tasks in Figma design context via REST or MCP, on macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-figma](https://github.com/Fyloss/spec-kit-figma) |
|
|
146
146
|
| 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) |
|
|
147
147
|
| 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) |
|
|
148
148
|
| 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) |
|
|
@@ -182,6 +182,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
182
182
|
| Verify Review Ship | Post-convergence operational verification, technical review, learning governance, and transactional delivery. | `process` | Read+Write | [spec-kit-verify-review-ship](https://github.com/cadugevaerd/spec-kit-verify-review-ship) |
|
|
183
183
|
| Verify Tasks Extension | Detect phantom completions: tasks marked [X] in tasks.md with no real implementation | `code` | Read-only | [spec-kit-verify-tasks](https://github.com/datastone-inc/spec-kit-verify-tasks) |
|
|
184
184
|
| Version Guard | Verify tech stack versions against live npm registries before planning and implementation | `process` | Read-only | [spec-kit-version-guard](https://github.com/KevinBrown5280/spec-kit-version-guard) |
|
|
185
|
+
| Vurnix Honest Gate | Deterministic three-state honest gate for AI-written code: compile + phantom-import + honest test count in one verdict, executed as code — not as agent self-review. PASS/BLOCK/UNPROVEN by exit code. | `process` | Read-only | [vurnix-spec-kit](https://github.com/shiersa/vurnix-spec-kit) |
|
|
185
186
|
| What-if Analysis | Preview the downstream impact (complexity, effort, tasks, risks) of requirement changes before committing to them | `visibility` | Read-only | [spec-kit-whatif](https://github.com/DevAbdullah90/spec-kit-whatif) |
|
|
186
187
|
| Wireframe Visual Feedback Loop | SVG wireframe generation, review, and sign-off for spec-driven development. Approved wireframes become spec constraints honored by /speckit.plan, /speckit.tasks, and /speckit.implement | `visibility` | Read+Write | [spec-kit-extension-wireframe](https://github.com/TortoiseWolfe/spec-kit-extension-wireframe) |
|
|
187
188
|
| Work IQ | Integrate Microsoft 365 organizational knowledge into spec-driven development workflows | `integration` | Read-only | [spec-kit-workiq](https://github.com/sakitA/spec-kit-workiq) |
|
|
@@ -17,6 +17,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
17
17
|
| [Command Code](https://commandcode.ai/docs) | `command-code` | Skills-based integration; installs skills into `.commandcode/skills/` and invokes them as `$speckit-<command>` |
|
|
18
18
|
| [Cursor](https://cursor.sh/) | `cursor-agent` | |
|
|
19
19
|
| [Devin for Terminal](https://cli.devin.ai/docs) | `devin` | Skills-based integration; installs skills into `.devin/skills/` and invokes them as `/speckit-<command>` |
|
|
20
|
+
| [Docker Agent](https://docs.docker.com/ai/docker-agent/) | `docker-agent` | Skills-based integration; installs skills into `.agents/skills/` (the same directory used by Codex and Zed). In the selected agent YAML, enable local skills with `skills: true` and provide filesystem read access. Detects either the standalone `docker-agent` binary or the Docker CLI plugin (`docker agent`). Configure workflow dispatch with `SPECKIT_INTEGRATION_DOCKER_AGENT_EXTRA_ARGS=./agent.yaml`; the Spec Kit prompt is appended after these arguments. Not multi-install safe by default because the skills directory is shared. |
|
|
20
21
|
| [Factory Droid](https://docs.factory.ai/cli/getting-started/overview) | `droid` | Skills-based integration; installs skills into `.factory/skills/` and invokes them as `/speckit-<command>` |
|
|
21
22
|
| [Firebender](https://firebender.com/) | `firebender` | IDE-based agent for Android Studio / IntelliJ |
|
|
22
23
|
| [Forge](https://forgecode.dev/) | `forge` | |
|
|
@@ -274,8 +274,7 @@ When releasing a new version:
|
|
|
274
274
|
A: The main catalog is for public extensions only. For private extensions:
|
|
275
275
|
|
|
276
276
|
- Host your own catalog.json file
|
|
277
|
-
-
|
|
278
|
-
- Not yet implemented - coming in Phase 4
|
|
277
|
+
- In a Spec Kit project, users add your catalog: `specify extension catalog add https://your-domain.com/catalog.json --name private-catalog`
|
|
279
278
|
|
|
280
279
|
### Q: How long does review take?
|
|
281
280
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-
|
|
3
|
+
"updated_at": "2026-09-01T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"adrkit": {
|
|
@@ -1783,10 +1783,10 @@
|
|
|
1783
1783
|
"figma": {
|
|
1784
1784
|
"name": "Spec Kit Figma",
|
|
1785
1785
|
"id": "figma",
|
|
1786
|
-
"description": "
|
|
1786
|
+
"description": "Grounds SpecKit spec/plan/tasks in Figma design context via REST or MCP, on macOS/Linux/Windows.",
|
|
1787
1787
|
"author": "Fyloss",
|
|
1788
|
-
"version": "1.
|
|
1789
|
-
"download_url": "https://github.com/Fyloss/spec-kit-figma/archive/refs/tags/
|
|
1788
|
+
"version": "3.1.1",
|
|
1789
|
+
"download_url": "https://github.com/Fyloss/spec-kit-figma/archive/refs/tags/v3.1.1.zip",
|
|
1790
1790
|
"repository": "https://github.com/Fyloss/spec-kit-figma",
|
|
1791
1791
|
"homepage": "https://github.com/Fyloss/spec-kit-figma",
|
|
1792
1792
|
"documentation": "https://github.com/Fyloss/spec-kit-figma/blob/main/docs/INSTALL.md",
|
|
@@ -1795,7 +1795,7 @@
|
|
|
1795
1795
|
"category": "integration",
|
|
1796
1796
|
"effect": "read-write",
|
|
1797
1797
|
"requires": {
|
|
1798
|
-
"speckit_version": ">=0.
|
|
1798
|
+
"speckit_version": ">=0.11.2",
|
|
1799
1799
|
"tools": [
|
|
1800
1800
|
{
|
|
1801
1801
|
"name": "git",
|
|
@@ -1820,8 +1820,8 @@
|
|
|
1820
1820
|
]
|
|
1821
1821
|
},
|
|
1822
1822
|
"provides": {
|
|
1823
|
-
"commands":
|
|
1824
|
-
"hooks":
|
|
1823
|
+
"commands": 7,
|
|
1824
|
+
"hooks": 11
|
|
1825
1825
|
},
|
|
1826
1826
|
"tags": [
|
|
1827
1827
|
"figma",
|
|
@@ -1834,7 +1834,7 @@
|
|
|
1834
1834
|
"downloads": 0,
|
|
1835
1835
|
"stars": 0,
|
|
1836
1836
|
"created_at": "2026-07-08T00:00:00Z",
|
|
1837
|
-
"updated_at": "2026-
|
|
1837
|
+
"updated_at": "2026-08-31T00:00:00Z"
|
|
1838
1838
|
},
|
|
1839
1839
|
"figma-starter": {
|
|
1840
1840
|
"name": "Figma Starter",
|
|
@@ -5796,6 +5796,45 @@
|
|
|
5796
5796
|
"created_at": "2026-04-20T00:00:00Z",
|
|
5797
5797
|
"updated_at": "2026-04-22T21:10:00Z"
|
|
5798
5798
|
},
|
|
5799
|
+
"vurnix": {
|
|
5800
|
+
"name": "Vurnix Honest Gate",
|
|
5801
|
+
"id": "vurnix",
|
|
5802
|
+
"description": "Deterministic three-state honest gate for AI-written code: compile + phantom-import + honest test count, executed as code — not agent self-review. PASS/BLOCK/UNPROVEN by exit code.",
|
|
5803
|
+
"author": "shiersa",
|
|
5804
|
+
"version": "0.1.1",
|
|
5805
|
+
"download_url": "https://github.com/shiersa/vurnix-spec-kit/releases/download/v0.1.1/vurnix-0.1.1.zip",
|
|
5806
|
+
"repository": "https://github.com/shiersa/vurnix-spec-kit",
|
|
5807
|
+
"homepage": "https://vurnix.dev",
|
|
5808
|
+
"documentation": "https://github.com/shiersa/vurnix-spec-kit#readme",
|
|
5809
|
+
"changelog": "",
|
|
5810
|
+
"license": "MIT",
|
|
5811
|
+
"category": "process",
|
|
5812
|
+
"effect": "read-only",
|
|
5813
|
+
"requires": {
|
|
5814
|
+
"speckit_version": ">=0.16.2",
|
|
5815
|
+
"tools": [
|
|
5816
|
+
{ "name": "python3", "version": ">=3.10", "required": true },
|
|
5817
|
+
{ "name": "vurnix", "version": ">=0.3.0", "required": true },
|
|
5818
|
+
{ "name": "bash", "required": true }
|
|
5819
|
+
]
|
|
5820
|
+
},
|
|
5821
|
+
"provides": {
|
|
5822
|
+
"commands": 1,
|
|
5823
|
+
"hooks": 1
|
|
5824
|
+
},
|
|
5825
|
+
"tags": [
|
|
5826
|
+
"deterministic",
|
|
5827
|
+
"honest-gate",
|
|
5828
|
+
"test-integrity",
|
|
5829
|
+
"quality",
|
|
5830
|
+
"fail-closed"
|
|
5831
|
+
],
|
|
5832
|
+
"verified": false,
|
|
5833
|
+
"downloads": 0,
|
|
5834
|
+
"stars": 0,
|
|
5835
|
+
"created_at": "2026-09-01T00:00:00Z",
|
|
5836
|
+
"updated_at": "2026-09-01T00:00:00Z"
|
|
5837
|
+
},
|
|
5799
5838
|
"whatif": {
|
|
5800
5839
|
"name": "What-if Analysis",
|
|
5801
5840
|
"id": "whatif",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-
|
|
3
|
+
"updated_at": "2026-08-26T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json",
|
|
5
5
|
"integrations": {
|
|
6
6
|
"alquimia": {
|
|
@@ -102,6 +102,15 @@
|
|
|
102
102
|
"repository": "https://github.com/github/spec-kit",
|
|
103
103
|
"tags": ["cli", "skills"]
|
|
104
104
|
},
|
|
105
|
+
"docker-agent": {
|
|
106
|
+
"id": "docker-agent",
|
|
107
|
+
"name": "Docker Agent",
|
|
108
|
+
"version": "1.0.0",
|
|
109
|
+
"description": "Docker Agent skills-based integration",
|
|
110
|
+
"author": "spec-kit-core",
|
|
111
|
+
"repository": "https://github.com/github/spec-kit",
|
|
112
|
+
"tags": ["cli", "skills", "docker"]
|
|
113
|
+
},
|
|
105
114
|
"qwen": {
|
|
106
115
|
"id": "qwen",
|
|
107
116
|
"name": "Qwen Code",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# OPTIONS:
|
|
11
11
|
# --json Output in JSON format
|
|
12
|
+
# --require-spec Require spec.md to exist (for analysis phase)
|
|
12
13
|
# --require-tasks Require tasks.md to exist (for implementation phase)
|
|
13
14
|
# --include-tasks Include tasks.md in AVAILABLE_DOCS list
|
|
14
15
|
# --paths-only Only output path variables (no validation)
|
|
@@ -24,6 +25,7 @@ set -e
|
|
|
24
25
|
|
|
25
26
|
# Parse command line arguments
|
|
26
27
|
JSON_MODE=false
|
|
28
|
+
REQUIRE_SPEC=false
|
|
27
29
|
REQUIRE_TASKS=false
|
|
28
30
|
INCLUDE_TASKS=false
|
|
29
31
|
PATHS_ONLY=false
|
|
@@ -34,6 +36,9 @@ while [[ $# -gt 0 ]]; do
|
|
|
34
36
|
--json)
|
|
35
37
|
JSON_MODE=true
|
|
36
38
|
;;
|
|
39
|
+
--require-spec)
|
|
40
|
+
REQUIRE_SPEC=true
|
|
41
|
+
;;
|
|
37
42
|
--require-tasks)
|
|
38
43
|
REQUIRE_TASKS=true
|
|
39
44
|
;;
|
|
@@ -59,6 +64,7 @@ Consolidated prerequisite checking for Spec-Driven Development workflow.
|
|
|
59
64
|
|
|
60
65
|
OPTIONS:
|
|
61
66
|
--json Output in JSON format
|
|
67
|
+
--require-spec Require spec.md to exist (for analysis phase)
|
|
62
68
|
--require-tasks Require tasks.md to exist (for implementation phase)
|
|
63
69
|
--include-tasks Include tasks.md in AVAILABLE_DOCS list
|
|
64
70
|
--paths-only Only output path variables (no prerequisite validation)
|
|
@@ -142,6 +148,13 @@ if [[ ! -f "$IMPL_PLAN" ]]; then
|
|
|
142
148
|
exit 1
|
|
143
149
|
fi
|
|
144
150
|
|
|
151
|
+
# Check for spec.md if required
|
|
152
|
+
if $REQUIRE_SPEC && [[ ! -f "$FEATURE_SPEC" ]]; then
|
|
153
|
+
echo "ERROR: spec.md not found in $FEATURE_DIR" >&2
|
|
154
|
+
echo "Run $(format_speckit_command specify "$REPO_ROOT") first to create the feature specification." >&2
|
|
155
|
+
exit 1
|
|
156
|
+
fi
|
|
157
|
+
|
|
145
158
|
# Check for tasks.md if required
|
|
146
159
|
if $REQUIRE_TASKS && [[ ! -f "$TASKS" ]]; then
|
|
147
160
|
echo "ERROR: tasks.md not found in $FEATURE_DIR" >&2
|
|
@@ -4,7 +4,6 @@ set -e
|
|
|
4
4
|
|
|
5
5
|
# Parse command line arguments
|
|
6
6
|
JSON_MODE=false
|
|
7
|
-
ARGS=()
|
|
8
7
|
|
|
9
8
|
for arg in "$@"; do
|
|
10
9
|
case "$arg" in
|
|
@@ -18,7 +17,8 @@ for arg in "$@"; do
|
|
|
18
17
|
exit 0
|
|
19
18
|
;;
|
|
20
19
|
*)
|
|
21
|
-
|
|
20
|
+
echo "ERROR: Unknown option '$arg'" >&2
|
|
21
|
+
exit 1
|
|
22
22
|
;;
|
|
23
23
|
esac
|
|
24
24
|
done
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# OPTIONS:
|
|
11
11
|
# -Json Output in JSON format
|
|
12
|
+
# -RequireSpec Require spec.md to exist (for analysis phase)
|
|
12
13
|
# -RequireTasks Require tasks.md to exist (for implementation phase)
|
|
13
14
|
# -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
|
|
14
15
|
# -PathsOnly Only output path variables (no validation)
|
|
@@ -18,6 +19,7 @@
|
|
|
18
19
|
[CmdletBinding()]
|
|
19
20
|
param(
|
|
20
21
|
[switch]$Json,
|
|
22
|
+
[switch]$RequireSpec,
|
|
21
23
|
[switch]$RequireTasks,
|
|
22
24
|
[switch]$IncludeTasks,
|
|
23
25
|
[switch]$PathsOnly,
|
|
@@ -36,6 +38,7 @@ Consolidated prerequisite checking for Spec-Driven Development workflow.
|
|
|
36
38
|
|
|
37
39
|
OPTIONS:
|
|
38
40
|
-Json Output in JSON format
|
|
41
|
+
-RequireSpec Require spec.md to exist (for analysis phase)
|
|
39
42
|
-RequireTasks Require tasks.md to exist (for implementation phase)
|
|
40
43
|
-IncludeTasks Include tasks.md in AVAILABLE_DOCS list
|
|
41
44
|
-PathsOnly Only output path variables (no prerequisite validation)
|
|
@@ -105,6 +108,14 @@ if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
|
|
|
105
108
|
exit 1
|
|
106
109
|
}
|
|
107
110
|
|
|
111
|
+
# Check for spec.md if required
|
|
112
|
+
if ($RequireSpec -and -not (Test-Path $paths.FEATURE_SPEC -PathType Leaf)) {
|
|
113
|
+
[Console]::Error.WriteLine("ERROR: spec.md not found in $($paths.FEATURE_DIR)")
|
|
114
|
+
$specifyCommand = Format-SpecKitCommand -CommandName 'specify' -RepoRoot $paths.REPO_ROOT
|
|
115
|
+
[Console]::Error.WriteLine("Run $specifyCommand first to create the feature specification.")
|
|
116
|
+
exit 1
|
|
117
|
+
}
|
|
118
|
+
|
|
108
119
|
# Check for tasks.md if required
|
|
109
120
|
if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
|
|
110
121
|
[Console]::Error.WriteLine("ERROR: tasks.md not found in $($paths.FEATURE_DIR)")
|
|
@@ -37,6 +37,7 @@ Consolidated prerequisite checking for Spec-Driven Development workflow.
|
|
|
37
37
|
|
|
38
38
|
OPTIONS:
|
|
39
39
|
--json Output in JSON format
|
|
40
|
+
--require-spec Require spec.md to exist (for analysis phase)
|
|
40
41
|
--require-tasks Require tasks.md to exist (for implementation phase)
|
|
41
42
|
--include-tasks Include tasks.md in AVAILABLE_DOCS list
|
|
42
43
|
--paths-only Only output path variables (no prerequisite validation)
|
|
@@ -59,6 +60,7 @@ EXAMPLES:
|
|
|
59
60
|
@dataclass(frozen=True)
|
|
60
61
|
class Args:
|
|
61
62
|
json_mode: bool = False
|
|
63
|
+
require_spec: bool = False
|
|
62
64
|
require_tasks: bool = False
|
|
63
65
|
include_tasks: bool = False
|
|
64
66
|
paths_only: bool = False
|
|
@@ -67,6 +69,7 @@ class Args:
|
|
|
67
69
|
|
|
68
70
|
def _parse_args(argv: list[str]) -> Args:
|
|
69
71
|
json_mode = False
|
|
72
|
+
require_spec = False
|
|
70
73
|
require_tasks = False
|
|
71
74
|
include_tasks = False
|
|
72
75
|
paths_only = False
|
|
@@ -77,6 +80,8 @@ def _parse_args(argv: list[str]) -> Args:
|
|
|
77
80
|
arg = argv[index]
|
|
78
81
|
if arg == "--json":
|
|
79
82
|
json_mode = True
|
|
83
|
+
elif arg == "--require-spec":
|
|
84
|
+
require_spec = True
|
|
80
85
|
elif arg == "--require-tasks":
|
|
81
86
|
require_tasks = True
|
|
82
87
|
elif arg == "--include-tasks":
|
|
@@ -105,6 +110,7 @@ def _parse_args(argv: list[str]) -> Args:
|
|
|
105
110
|
|
|
106
111
|
return Args(
|
|
107
112
|
json_mode=json_mode,
|
|
113
|
+
require_spec=require_spec,
|
|
108
114
|
require_tasks=require_tasks,
|
|
109
115
|
include_tasks=include_tasks,
|
|
110
116
|
paths_only=paths_only,
|
|
@@ -230,6 +236,14 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
230
236
|
)
|
|
231
237
|
return 1
|
|
232
238
|
|
|
239
|
+
if args.require_spec and not paths.feature_spec.is_file():
|
|
240
|
+
print(f"ERROR: spec.md not found in {paths.feature_dir}", file=sys.stderr)
|
|
241
|
+
print(
|
|
242
|
+
f"Run {format_speckit_command('specify', paths.repo_root)} first to create the feature specification.",
|
|
243
|
+
file=sys.stderr,
|
|
244
|
+
)
|
|
245
|
+
return 1
|
|
246
|
+
|
|
233
247
|
if args.require_tasks and not paths.tasks.is_file():
|
|
234
248
|
print(f"ERROR: tasks.md not found in {paths.feature_dir}", file=sys.stderr)
|
|
235
249
|
print(
|
|
@@ -42,7 +42,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
42
42
|
elif arg in {"--help", "-h"}:
|
|
43
43
|
sys.stdout.write(_help_text(sys.argv[0]))
|
|
44
44
|
return 0
|
|
45
|
-
|
|
45
|
+
else:
|
|
46
|
+
print(f"ERROR: Unknown option '{arg}'", file=sys.stderr)
|
|
47
|
+
return 1
|
|
46
48
|
|
|
47
49
|
try:
|
|
48
50
|
paths = get_feature_paths(script_file=Path(__file__))
|
|
@@ -39,6 +39,7 @@ def build_github_request(url: str) -> urllib.request.Request:
|
|
|
39
39
|
ValueError: If ``url`` is empty or whitespace-only.
|
|
40
40
|
ValueError: If ``url`` does not use the ``http`` or ``https`` scheme.
|
|
41
41
|
ValueError: If ``url`` does not include a hostname.
|
|
42
|
+
ValueError: If ``url`` includes a malformed explicit port.
|
|
42
43
|
"""
|
|
43
44
|
headers: Dict[str, str] = {}
|
|
44
45
|
url = url.strip()
|
|
@@ -49,6 +50,8 @@ def build_github_request(url: str) -> urllib.request.Request:
|
|
|
49
50
|
raise ValueError(f"url must start with http:// or https://, got: {url!r}")
|
|
50
51
|
if not parsed.hostname:
|
|
51
52
|
raise ValueError(f"url must include a hostname, got: {url!r}")
|
|
53
|
+
# Accessing ``port`` validates any explicit port before request construction.
|
|
54
|
+
parsed.port
|
|
52
55
|
github_token = (os.environ.get("GITHUB_TOKEN") or "").strip()
|
|
53
56
|
gh_token = (os.environ.get("GH_TOKEN") or "").strip()
|
|
54
57
|
token = github_token or gh_token or None
|
|
@@ -16,6 +16,45 @@ from ._download_security import normalize_zip_member_name
|
|
|
16
16
|
|
|
17
17
|
CLAUDE_LOCAL_PATH = Path.home() / ".claude" / "local" / "claude"
|
|
18
18
|
CLAUDE_NPM_LOCAL_PATH = Path.home() / ".claude" / "local" / "node_modules" / ".bin" / "claude"
|
|
19
|
+
DOCKER_AGENT_CHECK_TIMEOUT = 5
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def docker_agent_command(executable: str | None = None) -> list[str] | None:
|
|
23
|
+
"""Return a runnable Docker Agent command, or ``None`` if unavailable.
|
|
24
|
+
|
|
25
|
+
Docker Agent is distributed either as the standalone ``docker-agent``
|
|
26
|
+
executable or as the ``docker agent`` Docker CLI plugin. The plugin form
|
|
27
|
+
is verified with a bounded, read-only version probe so a plain Docker CLI
|
|
28
|
+
is not mistaken for an installed Docker Agent.
|
|
29
|
+
"""
|
|
30
|
+
resolved_from_path = executable is None
|
|
31
|
+
if executable is None:
|
|
32
|
+
if shutil.which("docker-agent"):
|
|
33
|
+
return ["docker-agent", "run"]
|
|
34
|
+
executable = shutil.which("docker")
|
|
35
|
+
if executable is None:
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
executable_name = Path(executable).name.lower()
|
|
39
|
+
if executable_name in {"docker", "docker.exe"}:
|
|
40
|
+
command = [executable, "agent", "version"]
|
|
41
|
+
run_command = [executable, "agent", "run"]
|
|
42
|
+
else:
|
|
43
|
+
# An explicit non-Docker executable is an operator override. Preserve
|
|
44
|
+
# the existing override contract without probing a custom binary.
|
|
45
|
+
return [executable, "run"]
|
|
46
|
+
try:
|
|
47
|
+
result = subprocess.run(
|
|
48
|
+
command,
|
|
49
|
+
capture_output=True,
|
|
50
|
+
check=False,
|
|
51
|
+
timeout=DOCKER_AGENT_CHECK_TIMEOUT,
|
|
52
|
+
)
|
|
53
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
54
|
+
return None
|
|
55
|
+
if result.returncode != 0:
|
|
56
|
+
return None
|
|
57
|
+
return ["docker", "agent", "run"] if resolved_from_path else run_command
|
|
19
58
|
|
|
20
59
|
|
|
21
60
|
def relative_extension_path_violation(value: Any) -> str | None:
|
|
@@ -137,6 +176,8 @@ def check_tool(tool: str, tracker=None) -> bool:
|
|
|
137
176
|
found = shutil.which("kiro-cli") is not None or shutil.which("kiro") is not None
|
|
138
177
|
elif tool == "rovodev":
|
|
139
178
|
found = shutil.which("acli") is not None
|
|
179
|
+
elif tool == "docker-agent":
|
|
180
|
+
found = docker_agent_command() is not None
|
|
140
181
|
else:
|
|
141
182
|
found = shutil.which(tool) is not None
|
|
142
183
|
|