specify-cli 0.14.4__tar.gz → 0.15.0__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.14.4 → specify_cli-0.15.0}/.github/scripts/check_security_requirements.py +10 -2
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/security.yml +1 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/CHANGELOG.md +28 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/PKG-INFO +1 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/extensions.md +1 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/catalog.community.json +35 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/pyproject.toml +1 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/__init__.py +5 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_version.py +13 -2
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/agents.py +13 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/manifest.py +26 -10
- specify_cli-0.15.0/src/specify_cli/commands/event.py +39 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/commands/init.py +8 -0
- specify_cli-0.15.0/src/specify_cli/events.py +2096 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/extensions/__init__.py +77 -13
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/extensions/_commands.py +47 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_helpers.py +8 -3
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_install_commands.py +9 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_migrate_commands.py +17 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/base.py +65 -2
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/claude/__init__.py +11 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/codex/__init__.py +16 -3
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/copilot/__init__.py +36 -8
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/cursor_agent/__init__.py +16 -3
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/devin/__init__.py +21 -2
- specify_cli-0.15.0/src/specify_cli/integrations/gemini/__init__.py +40 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/manifest.py +13 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/opencode/__init__.py +9 -0
- specify_cli-0.15.0/src/specify_cli/integrations/qwen/__init__.py +38 -0
- specify_cli-0.15.0/src/specify_cli/integrations/tabnine/__init__.py +41 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/presets/__init__.py +2 -2
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/presets/_commands.py +68 -25
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/prompt/__init__.py +59 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/shell/__init__.py +14 -6
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_manifest_schema.py +39 -0
- specify_cli-0.15.0/tests/integrations/test_events.py +2226 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_copilot.py +15 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_subcommand.py +62 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_manifest.py +28 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extension_skills.py +129 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extensions.py +92 -1
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_presets.py +284 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_security_workflow.py +21 -5
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_verification.py +20 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_workflows.py +191 -3
- specify_cli-0.15.0/workflows/catalog.community.json +50 -0
- specify_cli-0.14.4/src/specify_cli/integrations/gemini/__init__.py +0 -21
- specify_cli-0.14.4/src/specify_cli/integrations/qwen/__init__.py +0 -21
- specify_cli-0.14.4/src/specify_cli/integrations/tabnine/__init__.py +0 -21
- specify_cli-0.14.4/workflows/catalog.community.json +0 -27
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.editorconfig +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.gitattributes +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/CODEOWNERS +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/dependabot.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/security-audit-requirements.txt +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-bundle.lock.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-bundle.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-test.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/release.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/test.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.gitignore +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.pre-commit-config.yaml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/.zenodo.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/AGENTS.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/CITATION.cff +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/CONTRIBUTING.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/DEVELOPMENT.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/LICENSE +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/README.zh-CN.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/SECURITY.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/SUPPORT.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/bundles/catalog.community.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/.gitignore +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/bundles.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/friends.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/overview.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/presets.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/spec-of-specs.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/docfx.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/index.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/one-time.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/pipx.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/pypi.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/uv.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/installation.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/local-development.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/quickstart.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/agentic-bugfix.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/agentic-sdd.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/authentication.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/bundles.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/core.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/extensions.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/integrations.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/overview.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/presets.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/workflows.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/template/public/main.css +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/toc.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/upgrade.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.decide.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.define.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.intake.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.research.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.shape.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/extension.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/catalog.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/extension.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/auto_commit.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/git_common.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/initialize_repo.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/.gitignore +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/LICENSE +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/extension.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/catalog.community.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/catalog.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/media/logo_large.webp +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/media/logo_small.webp +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/media/specify_cli.gif +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-April.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-February.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-June.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-March.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-May.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/catalog.community.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/catalog.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/preset.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/common.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/check_prerequisites.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/common.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/create_new_feature.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/setup_plan.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/setup_tasks.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/spec-driven.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/spec-kit.code-workspace +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_download_security.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_project.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_toml_string.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/droid/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/grok/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/_commands.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/_commands.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/composer.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/merge.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/schema.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/checklist-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/analyze.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/checklist.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/clarify.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/constitution.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/converge.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/implement.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/plan.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/specify.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/tasks.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/constitution-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/plan-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/spec-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/tasks-template.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/vscode-settings.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/auth_helpers.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/conftest.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/assess/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/assess/test_assess_extension.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/plan.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/spec.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/http_helpers.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_alquimia.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_droid.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_grok.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/parity_helpers.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_authentication.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_check_prerequisites_python_parity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_check_tool.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_cli_version.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_command_template_py_scripts.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_commands_package.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_console_imports.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_create_new_feature_python_parity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_download_security.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_github_http.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_init_dir.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_merge.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_post_process.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_plan_python_parity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_tasks_python_parity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_skill_placeholder_py.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_specify_template_numbering.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_upgrade.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_utils.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_version_imports.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundle_download_url.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_yamlio.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/conftest.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_commands.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_composer.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_layer_sources.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_merge.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_schema.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_security.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_resolver_integration.py +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/README.md +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/catalog.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/step-catalog.json +0 -0
|
@@ -29,12 +29,20 @@ def _dependency_diff_refs() -> tuple[str, str]:
|
|
|
29
29
|
def _dependency_inputs_changed() -> bool:
|
|
30
30
|
base_ref, head_ref = _dependency_diff_refs()
|
|
31
31
|
try:
|
|
32
|
+
merge_base = subprocess.run(
|
|
33
|
+
["git", "merge-base", base_ref, head_ref],
|
|
34
|
+
check=True,
|
|
35
|
+
cwd=REPO_ROOT,
|
|
36
|
+
stderr=subprocess.PIPE,
|
|
37
|
+
stdout=subprocess.PIPE,
|
|
38
|
+
text=True,
|
|
39
|
+
).stdout.strip()
|
|
32
40
|
result = subprocess.run(
|
|
33
41
|
[
|
|
34
42
|
"git",
|
|
35
43
|
"diff",
|
|
36
44
|
"--name-only",
|
|
37
|
-
|
|
45
|
+
merge_base,
|
|
38
46
|
head_ref,
|
|
39
47
|
"--",
|
|
40
48
|
*DEPENDENCY_INPUTS,
|
|
@@ -77,6 +85,7 @@ def main() -> int:
|
|
|
77
85
|
|
|
78
86
|
generated_requirements = Path(generated_requirements_env)
|
|
79
87
|
generated_requirements.parent.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
generated_requirements.write_bytes(COMMITTED_REQUIREMENTS.read_bytes())
|
|
80
89
|
|
|
81
90
|
subprocess.run(
|
|
82
91
|
[
|
|
@@ -87,7 +96,6 @@ def main() -> int:
|
|
|
87
96
|
"--extra",
|
|
88
97
|
"test",
|
|
89
98
|
"--universal",
|
|
90
|
-
"--upgrade",
|
|
91
99
|
"--generate-hashes",
|
|
92
100
|
"--quiet",
|
|
93
101
|
"--no-header",
|
|
@@ -34,7 +34,7 @@ jobs:
|
|
|
34
34
|
- name: Check committed audit requirements are current
|
|
35
35
|
env:
|
|
36
36
|
DEPENDENCY_DIFF_BASE: ${{ github.event.pull_request.base.sha || github.event.before || '' }}
|
|
37
|
-
DEPENDENCY_DIFF_HEAD: ${{ github.sha }}
|
|
37
|
+
DEPENDENCY_DIFF_HEAD: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
38
38
|
GENERATED_REQUIREMENTS: ${{ runner.temp }}/security-audit-requirements.txt
|
|
39
39
|
run: python .github/scripts/check_security_requirements.py
|
|
40
40
|
|
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.15.0] - 2026-07-30
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Add yolo to community workflow catalog (#3864)
|
|
10
|
+
- fix(workflows): guard the shell step's timeout check against OverflowError (#3865)
|
|
11
|
+
- Add Intent Reconciliation extension to community catalog (#3858)
|
|
12
|
+
- fix(workflows): validate prompt step 'timeout' like the shell step (#3847)
|
|
13
|
+
- fix: add utf-8 encoding to registry file open calls (#3816)
|
|
14
|
+
- fix: eliminate TOCTOU race in file unlink calls (#3815)
|
|
15
|
+
- test(workflows): name the condition-rejection tests for the real boundary (#3808)
|
|
16
|
+
- fix: eliminate TOCTOU race in file unlink calls (#3811)
|
|
17
|
+
- fix(presets): escape user-supplied catalog name/URL in add/remove output (#3806)
|
|
18
|
+
- fix: add missing utf-8 encoding to registry file open calls (#3810)
|
|
19
|
+
- [bug-fix] Fix upgrade-overwrites-copilot-skills: pass force=True to extension skill re-registration after upgrade (#3853)
|
|
20
|
+
- fix(integrations): don't abort uninstall when the manifest can't be deleted (#3805)
|
|
21
|
+
- test(extensions): update stale manifest validation message assertion (#3859)
|
|
22
|
+
- fix(agents): coerce a non-string description in TOML command rendering (#3799)
|
|
23
|
+
- fix(workflows): make security requirements sync deterministic (#3832)
|
|
24
|
+
- fix(cli): render the literal [suffix] in --tag help and rejection message (#3800)
|
|
25
|
+
- fix(integrations): preserve non-UTF-8 VS Code settings (#3833)
|
|
26
|
+
- fix(bundler): treat an explicit-null manifest field as missing, not the text "None" (#3798)
|
|
27
|
+
- feat: first-class agent-native runtime hooks for integrations (#3704)
|
|
28
|
+
- fix(extensions): guard the required manifest sections so one bad extension cannot break `extension list` (#3797)
|
|
29
|
+
- fix(presets): escape installed preset metadata in Rich output (#3826)
|
|
30
|
+
- fix(workflows): dispatch prompt steps via the resolved executable (#3793)
|
|
31
|
+
- chore: release 0.14.4, begin 0.14.5.dev0 development (#3850)
|
|
32
|
+
|
|
5
33
|
## [0.14.4] - 2026-07-29
|
|
6
34
|
|
|
7
35
|
### Changed
|
|
@@ -66,6 +66,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
66
66
|
| 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) |
|
|
67
67
|
| Intake | Normalize PRD, design, HTML SSOT, and test-case evidence into SDD-ready intake artifacts. | `docs` | Read+Write | [spec-kit-intake](https://github.com/bigsmartben/spec-kit-intake) |
|
|
68
68
|
| 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) |
|
|
69
|
+
| Intent Reconciliation | Reconcile implementation-discovered decisions against approved feature intent | `process` | Read+Write | [spec-kit-reconcile](https://github.com/SuhaibAslam/spec-kit-reconcile) |
|
|
69
70
|
| Iterate | Iterate on spec documents with a two-phase define-and-apply workflow — refine specs mid-implementation and go straight back to building | `docs` | Read+Write | [spec-kit-iterate](https://github.com/imviancagrace/spec-kit-iterate) |
|
|
70
71
|
| Jira Integration | Create Jira Epics, Stories, and Issues from spec-kit specifications and task breakdowns with configurable hierarchy and custom field support | `integration` | Read+Write | [spec-kit-jira](https://github.com/mbachorik/spec-kit-jira) |
|
|
71
72
|
| Jira Integration (Sync Engine) | Idempotent, drift-aware, fail-closed reconcile engine mirroring spec-kit specs into Jira (Epic per repo, Story per spec, Subtask per phase) | `integration` | Read+Write | [spec-kit-jira-sync](https://github.com/ashbrener/spec-kit-jira-sync) |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-07-
|
|
3
|
+
"updated_at": "2026-07-29T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"aide": {
|
|
@@ -1861,6 +1861,40 @@
|
|
|
1861
1861
|
"created_at": "2026-06-23T00:00:00Z",
|
|
1862
1862
|
"updated_at": "2026-06-30T00:00:00Z"
|
|
1863
1863
|
},
|
|
1864
|
+
"intent": {
|
|
1865
|
+
"name": "Intent Reconciliation",
|
|
1866
|
+
"id": "intent",
|
|
1867
|
+
"description": "Reconcile implementation-discovered decisions against approved feature intent",
|
|
1868
|
+
"author": "SuhaibAslam",
|
|
1869
|
+
"version": "1.0.2",
|
|
1870
|
+
"download_url": "https://github.com/SuhaibAslam/spec-kit-reconcile/archive/refs/tags/v1.0.2.zip",
|
|
1871
|
+
"repository": "https://github.com/SuhaibAslam/spec-kit-reconcile",
|
|
1872
|
+
"homepage": "https://github.com/SuhaibAslam/spec-kit-reconcile",
|
|
1873
|
+
"documentation": "https://github.com/SuhaibAslam/spec-kit-reconcile/blob/main/README.md",
|
|
1874
|
+
"changelog": "https://github.com/SuhaibAslam/spec-kit-reconcile/blob/main/CHANGELOG.md",
|
|
1875
|
+
"license": "MIT",
|
|
1876
|
+
"category": "process",
|
|
1877
|
+
"effect": "read-write",
|
|
1878
|
+
"requires": {
|
|
1879
|
+
"speckit_version": ">=0.12.0"
|
|
1880
|
+
},
|
|
1881
|
+
"provides": {
|
|
1882
|
+
"commands": 3,
|
|
1883
|
+
"hooks": 0
|
|
1884
|
+
},
|
|
1885
|
+
"tags": [
|
|
1886
|
+
"intent",
|
|
1887
|
+
"decisions",
|
|
1888
|
+
"reconciliation",
|
|
1889
|
+
"drift",
|
|
1890
|
+
"workflow"
|
|
1891
|
+
],
|
|
1892
|
+
"verified": false,
|
|
1893
|
+
"downloads": 0,
|
|
1894
|
+
"stars": 0,
|
|
1895
|
+
"created_at": "2026-07-29T00:00:00Z",
|
|
1896
|
+
"updated_at": "2026-07-29T00:00:00Z"
|
|
1897
|
+
},
|
|
1864
1898
|
"issue": {
|
|
1865
1899
|
"name": "GitHub Issues Integration 2",
|
|
1866
1900
|
"id": "issue",
|
|
@@ -514,6 +514,11 @@ _register_extension_cmds(app)
|
|
|
514
514
|
from .integrations._commands import register as _register_integration_cmds # noqa: E402
|
|
515
515
|
_register_integration_cmds(app)
|
|
516
516
|
|
|
517
|
+
|
|
518
|
+
# ===== Event Commands =====
|
|
519
|
+
from .commands.event import register as _register_event_cmds # noqa: E402
|
|
520
|
+
_register_event_cmds(app)
|
|
521
|
+
|
|
517
522
|
# Re-export selected helpers to preserve the public import surface.
|
|
518
523
|
from .integrations._helpers import ( # noqa: E402
|
|
519
524
|
_clear_init_options_for_integration as _clear_init_options_for_integration,
|
|
@@ -27,6 +27,7 @@ from pathlib import Path
|
|
|
27
27
|
|
|
28
28
|
import typer
|
|
29
29
|
from packaging.version import InvalidVersion, Version
|
|
30
|
+
from rich.markup import escape as _escape_markup
|
|
30
31
|
|
|
31
32
|
from ._download_security import MAX_JSON_METADATA_BYTES, read_response_limited
|
|
32
33
|
from ._console import console
|
|
@@ -1230,7 +1231,10 @@ def self_upgrade(
|
|
|
1230
1231
|
tag: str | None = typer.Option(
|
|
1231
1232
|
None,
|
|
1232
1233
|
"--tag",
|
|
1233
|
-
help
|
|
1234
|
+
# Typer renders help through Rich, so escape the literal bracket (\[)
|
|
1235
|
+
# or `[suffix]` is parsed as a style tag and dropped -- `--help` then
|
|
1236
|
+
# advertises only `(vX.Y.Z)`, contradicting docs/upgrade.md and README.
|
|
1237
|
+
help="Pin the target version (vX.Y.Z\\[suffix]). Without --tag, the "
|
|
1234
1238
|
"latest stable release is resolved via GitHub Releases.",
|
|
1235
1239
|
),
|
|
1236
1240
|
) -> None:
|
|
@@ -1270,7 +1274,14 @@ def self_upgrade(
|
|
|
1270
1274
|
try:
|
|
1271
1275
|
tag = _validate_tag(tag)
|
|
1272
1276
|
except typer.BadParameter as exc:
|
|
1273
|
-
|
|
1277
|
+
# Escape at the print site rather than baking `\[` into
|
|
1278
|
+
# _INVALID_TAG_MESSAGE: the message is also raised through
|
|
1279
|
+
# typer.BadParameter, which Click renders without Rich, so the
|
|
1280
|
+
# constant must stay plain text. Unescaped, Rich parses the literal
|
|
1281
|
+
# `[suffix]` as a style tag and drops it, leaving the user with
|
|
1282
|
+
# "expected vMAJOR.MINOR.PATCH" -- implying a bare vX.Y.Z is the only
|
|
1283
|
+
# accepted form when -rc1 / .dev0 / +build.42 are all valid.
|
|
1284
|
+
console.print(_escape_markup(str(exc)), soft_wrap=True)
|
|
1274
1285
|
raise typer.Exit(1) from exc
|
|
1275
1286
|
|
|
1276
1287
|
plan, failure_reason = _build_upgrade_plan(target_tag_override=tag)
|
|
@@ -302,8 +302,20 @@ class CommandRegistrar:
|
|
|
302
302
|
toml_lines = []
|
|
303
303
|
|
|
304
304
|
if "description" in frontmatter:
|
|
305
|
+
# Frontmatter comes from ``yaml.safe_load``, so ``description`` can
|
|
306
|
+
# be any YAML type: ``description:`` with no value yields None,
|
|
307
|
+
# ``description: 2`` an int, an unquoted ``true`` a bool.
|
|
308
|
+
# ``_render_basic_toml_string`` iterates the value and calls ord()
|
|
309
|
+
# on each character, so a non-string raises a raw TypeError -- and a
|
|
310
|
+
# list of single-character items is silently concatenated into a
|
|
311
|
+
# wrong value (``["a", "b"]`` -> ``"ab"``). Coerce first, matching
|
|
312
|
+
# ``render_yaml_command`` below and ``TomlIntegration
|
|
313
|
+
# ._extract_description``, which both normalise it already.
|
|
314
|
+
description = frontmatter["description"]
|
|
315
|
+
if not isinstance(description, str):
|
|
316
|
+
description = str(description) if description is not None else ""
|
|
305
317
|
toml_lines.append(
|
|
306
|
-
f"description = {self._render_basic_toml_string(
|
|
318
|
+
f"description = {self._render_basic_toml_string(description)}"
|
|
307
319
|
)
|
|
308
320
|
toml_lines.append("")
|
|
309
321
|
|
|
@@ -96,19 +96,19 @@ class BundleManifest:
|
|
|
96
96
|
if not isinstance(data, dict):
|
|
97
97
|
raise BundlerError("Manifest must be a YAML mapping at the top level.")
|
|
98
98
|
|
|
99
|
-
schema_version =
|
|
99
|
+
schema_version = _text(data.get("schema_version"))
|
|
100
100
|
|
|
101
101
|
bundle_raw = data.get("bundle")
|
|
102
102
|
if not isinstance(bundle_raw, dict):
|
|
103
103
|
raise BundlerError("Manifest is missing the required 'bundle' mapping.")
|
|
104
104
|
meta = BundleMeta(
|
|
105
|
-
id=
|
|
106
|
-
name=
|
|
107
|
-
version=
|
|
108
|
-
role=
|
|
109
|
-
description=
|
|
110
|
-
author=
|
|
111
|
-
license=
|
|
105
|
+
id=_text(bundle_raw.get("id")),
|
|
106
|
+
name=_text(bundle_raw.get("name")),
|
|
107
|
+
version=_text(bundle_raw.get("version")),
|
|
108
|
+
role=_text(bundle_raw.get("role")),
|
|
109
|
+
description=_text(bundle_raw.get("description")),
|
|
110
|
+
author=_text(bundle_raw.get("author")),
|
|
111
|
+
license=_text(bundle_raw.get("license")),
|
|
112
112
|
)
|
|
113
113
|
|
|
114
114
|
requires_raw = data.get("requires")
|
|
@@ -117,7 +117,7 @@ class BundleManifest:
|
|
|
117
117
|
elif not isinstance(requires_raw, dict):
|
|
118
118
|
raise BundlerError("'requires' must be a mapping when present.")
|
|
119
119
|
requires = Requires(
|
|
120
|
-
speckit_version=
|
|
120
|
+
speckit_version=_text(requires_raw.get("speckit_version")),
|
|
121
121
|
tools=_parse_str_list(requires_raw.get("tools"), "requires.tools"),
|
|
122
122
|
mcp=_parse_str_list(requires_raw.get("mcp"), "requires.mcp"),
|
|
123
123
|
)
|
|
@@ -220,6 +220,22 @@ class BundleManifest:
|
|
|
220
220
|
return self.integration is None
|
|
221
221
|
|
|
222
222
|
|
|
223
|
+
def _text(raw: Any) -> str:
|
|
224
|
+
"""Coerce a manifest scalar into stripped text, mapping an explicit null to ``""``.
|
|
225
|
+
|
|
226
|
+
A ``.get(key, "")`` default only covers a *missing* key. A key that is
|
|
227
|
+
present but null -- how YAML spells an empty field (``author:`` with nothing
|
|
228
|
+
after it) -- yields ``None``, and ``str(None)`` is the literal ``"None"``.
|
|
229
|
+
That text is non-empty, so it sailed past the ``if not value`` required-field
|
|
230
|
+
checks in :meth:`BundleManifest.structural_errors`: an empty required field
|
|
231
|
+
was silently accepted and the bundle shipped ``"None"`` as its
|
|
232
|
+
author/license/description.
|
|
233
|
+
"""
|
|
234
|
+
if raw is None:
|
|
235
|
+
return ""
|
|
236
|
+
return str(raw).strip()
|
|
237
|
+
|
|
238
|
+
|
|
223
239
|
def _parse_str_list(raw: Any, field_name: str) -> tuple[str, ...]:
|
|
224
240
|
"""Coerce a manifest list-of-strings field into a tuple of strings.
|
|
225
241
|
|
|
@@ -247,7 +263,7 @@ def _parse_refs(kind: str, raw: Any) -> list[ComponentRef]:
|
|
|
247
263
|
refs.append(
|
|
248
264
|
ComponentRef(
|
|
249
265
|
kind=kind,
|
|
250
|
-
id=
|
|
266
|
+
id=_text(item.get("id")),
|
|
251
267
|
version=(str(item["version"]).strip() if item.get("version") else None),
|
|
252
268
|
source=(str(item["source"]).strip() if item.get("source") else None),
|
|
253
269
|
priority=priority,
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""specify event * command handlers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
import sys
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
event_app = typer.Typer(
|
|
10
|
+
name="event",
|
|
11
|
+
help="Manage and execute event-driven commands",
|
|
12
|
+
add_completion=False,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@event_app.command("run")
|
|
17
|
+
def event_run(
|
|
18
|
+
command_name: str = typer.Argument(..., help="Name of the command to execute"),
|
|
19
|
+
event_name: str = typer.Argument(..., help="Canonical event name (e.g., session_start)"),
|
|
20
|
+
timeout: int = typer.Argument(
|
|
21
|
+
120, help="Per-handler timeout in seconds (passed through from the native hook config)"
|
|
22
|
+
),
|
|
23
|
+
):
|
|
24
|
+
"""Resolve and run an event-driven command script with stdin payload."""
|
|
25
|
+
from ..events import resolve_and_run_event_command
|
|
26
|
+
|
|
27
|
+
# Read payload from stdin if available
|
|
28
|
+
payload = sys.stdin.read() if not sys.stdin.isatty() else "{}"
|
|
29
|
+
|
|
30
|
+
# Run the event command
|
|
31
|
+
project_root = Path.cwd() # The agent runs events from project root
|
|
32
|
+
exit_code = resolve_and_run_event_command(
|
|
33
|
+
command_name, event_name, payload, project_root, timeout=timeout
|
|
34
|
+
)
|
|
35
|
+
raise typer.Exit(code=exit_code)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def register(app: typer.Typer) -> None:
|
|
39
|
+
app.add_typer(event_app, name="event")
|
|
@@ -443,12 +443,20 @@ def register(app: typer.Typer) -> None:
|
|
|
443
443
|
if extra:
|
|
444
444
|
integration_parsed_options.update(extra)
|
|
445
445
|
|
|
446
|
+
from ..events import resolve_events
|
|
447
|
+
events_map = resolve_events(
|
|
448
|
+
resolved_integration.key,
|
|
449
|
+
resolved_integration.config,
|
|
450
|
+
project_path,
|
|
451
|
+
integration_parsed_options or None,
|
|
452
|
+
)
|
|
446
453
|
resolved_integration.setup(
|
|
447
454
|
project_path,
|
|
448
455
|
manifest,
|
|
449
456
|
parsed_options=integration_parsed_options or None,
|
|
450
457
|
script_type=selected_script,
|
|
451
458
|
raw_options=integration_options,
|
|
459
|
+
events=events_map,
|
|
452
460
|
)
|
|
453
461
|
manifest.save()
|
|
454
462
|
|