specify-cli 0.13.0__tar.gz → 0.13.1__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.13.0 → specify_cli-0.13.1}/CHANGELOG.md +15 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/PKG-INFO +1 -1
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/integrations.md +5 -1
- {specify_cli-0.13.0 → specify_cli-0.13.1}/pyproject.toml +1 -1
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/catalogs.py +4 -1
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/catalog.py +4 -2
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/forge/__init__.py +12 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/presets/__init__.py +4 -1
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/_commands.py +6 -2
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/catalog.py +33 -8
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/fan_in/__init__.py +22 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/fan_out/__init__.py +34 -2
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/prompt/__init__.py +12 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_base.py +18 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_catalog.py +51 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extensions.py +30 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_presets.py +18 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_workflows.py +233 -6
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.editorconfig +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.gitattributes +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/CODEOWNERS +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/dependabot.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-test.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/release.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/test.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.gitignore +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.pre-commit-config.yaml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/.zenodo.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/AGENTS.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/CITATION.cff +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/CONTRIBUTING.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/DEVELOPMENT.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/LICENSE +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/SECURITY.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/SUPPORT.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/.gitignore +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/bundles.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/extensions.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/friends.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/overview.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/presets.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/docfx.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/index.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/one-time.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/pipx.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/pypi.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/uv.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/installation.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/local-development.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/quickstart.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/agentic-bugfix.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/agentic-sdd.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/authentication.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/bundles.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/core.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/extensions.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/overview.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/presets.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/workflows.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/template/public/main.css +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/toc.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/upgrade.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.decide.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.define.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.intake.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.research.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.shape.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/extension.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/catalog.community.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/catalog.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/extension.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/auto_commit.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/git_common.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/initialize_repo.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/.gitignore +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/LICENSE +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/extension.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/catalog.community.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/catalog.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/media/logo_large.webp +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/media/logo_small.webp +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/media/specify_cli.gif +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-April.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-February.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-June.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-March.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-May.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/catalog.community.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/catalog.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/preset.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/common.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/python/check_prerequisites.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/python/common.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/spec-driven.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/spec-kit.code-workspace +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_project.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_toml_string.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/agents.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/commands/init.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/grok/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/checklist-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/analyze.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/checklist.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/clarify.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/constitution.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/converge.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/implement.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/plan.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/specify.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/tasks.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/constitution-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/plan-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/spec-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/tasks-template.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/vscode-settings.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/auth_helpers.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/conftest.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/assess/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/assess/test_assess_extension.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/plan.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/spec.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/http_helpers.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_grok.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_authentication.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_check_prerequisites_python_parity.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_check_tool.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_cli_version.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_command_template_py_scripts.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_commands_package.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_console_imports.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_github_http.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_init_dir.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_merge.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_post_process.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_upgrade.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_utils.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_version_imports.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundle_download_url.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/README.md +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/catalog.community.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/catalog.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/step-catalog.json +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.13.1] - 2026-07-21
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix(integrations): catch OverflowError on a `priority: .inf` in add/remove (#3589)
|
|
10
|
+
- fix(workflows): reject bool / .inf catalog priority in workflow & step catalog loaders (#3526)
|
|
11
|
+
- fix(catalogs): 'priority: .inf' yields a clean validation error instead of crashing (#3525)
|
|
12
|
+
- docs(integrations): document the 'integration list --catalog' flag (#3530)
|
|
13
|
+
- fix(workflows): fail fan-in loudly on a non-string wait_for entry (#3579)
|
|
14
|
+
- fix(workflows): fail fan-out loudly on a truthy non-mapping step template (#3537)
|
|
15
|
+
- fix(workflows): reject a non-string prompt in prompt-step validate() (#3582)
|
|
16
|
+
- fix(workflows): route 'workflow status --json' errors to stderr (#3520)
|
|
17
|
+
- fix(integrations): Forge dispatches hyphenated /speckit-<cmd> invocations (#3529)
|
|
18
|
+
- chore: release 0.13.0, begin 0.13.1.dev0 development (#3588)
|
|
19
|
+
|
|
5
20
|
## [0.13.0] - 2026-07-17
|
|
6
21
|
|
|
7
22
|
### Changed
|
|
@@ -48,7 +48,11 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
48
48
|
specify integration list
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
| Option | Description |
|
|
52
|
+
| ----------- | ----------------------------------------------------------------------------------------------------------------------- |
|
|
53
|
+
| `--catalog` | Also browse the catalog (built-in **and** community). Community integrations that are not built in are only shown here. |
|
|
54
|
+
|
|
55
|
+
Shows the built-in integrations, which one is currently installed, and whether each requires a CLI tool or is IDE-based.
|
|
52
56
|
When multiple integrations are installed, the list marks the default integration separately from the other installed integrations.
|
|
53
57
|
The list also shows whether each built-in integration is declared multi-install safe.
|
|
54
58
|
|
|
@@ -149,7 +149,10 @@ class CatalogStackBase:
|
|
|
149
149
|
)
|
|
150
150
|
try:
|
|
151
151
|
priority = int(raw_priority)
|
|
152
|
-
except (TypeError, ValueError):
|
|
152
|
+
except (TypeError, ValueError, OverflowError):
|
|
153
|
+
# OverflowError: int(float("inf")) — a YAML ``priority: .inf``
|
|
154
|
+
# would otherwise escape as an uncaught traceback instead of the
|
|
155
|
+
# clean validation error.
|
|
153
156
|
raise self._validation_error(
|
|
154
157
|
f"Invalid catalog config {config_path}: "
|
|
155
158
|
f"Invalid priority for catalog '{item.get('name', idx + 1)}': "
|
|
@@ -429,7 +429,8 @@ class IntegrationCatalog(CatalogStackBase):
|
|
|
429
429
|
)
|
|
430
430
|
try:
|
|
431
431
|
normalized_priority = int(raw_priority)
|
|
432
|
-
except (TypeError, ValueError):
|
|
432
|
+
except (TypeError, ValueError, OverflowError):
|
|
433
|
+
# OverflowError: int(float("inf")) — a ``priority: .inf``.
|
|
433
434
|
raise IntegrationValidationError(
|
|
434
435
|
f"Invalid catalog entry at index {idx} in {config_path}: "
|
|
435
436
|
f"'priority' must be an integer, got "
|
|
@@ -537,7 +538,8 @@ class IntegrationCatalog(CatalogStackBase):
|
|
|
537
538
|
else:
|
|
538
539
|
try:
|
|
539
540
|
priority = int(raw_priority)
|
|
540
|
-
except (TypeError, ValueError):
|
|
541
|
+
except (TypeError, ValueError, OverflowError):
|
|
542
|
+
# OverflowError: int(float("inf")) — a ``priority: .inf``.
|
|
541
543
|
priority = yaml_idx + 1
|
|
542
544
|
priority_pairs.append((priority, yaml_idx))
|
|
543
545
|
if not priority_pairs:
|
|
@@ -91,6 +91,18 @@ class ForgeIntegration(MarkdownIntegration):
|
|
|
91
91
|
}
|
|
92
92
|
invoke_separator = "-"
|
|
93
93
|
|
|
94
|
+
def build_command_invocation(self, command_name: str, args: str = "") -> str:
|
|
95
|
+
"""Forge installs hyphenated slash-commands (``/speckit-<name>``), so the
|
|
96
|
+
dispatch invocation must match. The inherited MarkdownIntegration default
|
|
97
|
+
builds the dotted ``/speckit.<name>``, which references a command Forge
|
|
98
|
+
never registered. Reuse the same hyphenation as the installed frontmatter
|
|
99
|
+
``name`` (see ``format_forge_command_name``), mirroring the skills agents.
|
|
100
|
+
"""
|
|
101
|
+
invocation = "/" + format_forge_command_name(command_name)
|
|
102
|
+
if args:
|
|
103
|
+
invocation = f"{invocation} {args}"
|
|
104
|
+
return invocation
|
|
105
|
+
|
|
94
106
|
def setup(
|
|
95
107
|
self,
|
|
96
108
|
project_root: Path,
|
|
@@ -2235,7 +2235,10 @@ class PresetCatalog:
|
|
|
2235
2235
|
)
|
|
2236
2236
|
try:
|
|
2237
2237
|
priority = int(raw_priority)
|
|
2238
|
-
except (TypeError, ValueError):
|
|
2238
|
+
except (TypeError, ValueError, OverflowError):
|
|
2239
|
+
# OverflowError: int(float("inf")) — a YAML ``priority: .inf``
|
|
2240
|
+
# would otherwise escape as an uncaught traceback instead of the
|
|
2241
|
+
# clean validation error (mirrors catalogs.py).
|
|
2239
2242
|
raise PresetValidationError(
|
|
2240
2243
|
f"Invalid priority for catalog '{item.get('name', idx + 1)}': "
|
|
2241
2244
|
f"expected integer, got {raw_priority!r}"
|
|
@@ -1262,14 +1262,18 @@ def workflow_status(
|
|
|
1262
1262
|
engine = WorkflowEngine(project_root)
|
|
1263
1263
|
|
|
1264
1264
|
if run_id:
|
|
1265
|
+
# Route errors to stderr under --json so the stdout JSON stream stays
|
|
1266
|
+
# parseable (mirrors `workflow run`/`workflow resume`); both handlers
|
|
1267
|
+
# fire before the json_output branch below.
|
|
1268
|
+
err = _error_console(json_output)
|
|
1265
1269
|
try:
|
|
1266
1270
|
from .engine import RunState
|
|
1267
1271
|
state = RunState.load(run_id, project_root)
|
|
1268
1272
|
except FileNotFoundError:
|
|
1269
|
-
|
|
1273
|
+
err.print(f"[red]Error:[/red] Run not found: {run_id}")
|
|
1270
1274
|
raise typer.Exit(1)
|
|
1271
1275
|
except ValueError as exc:
|
|
1272
|
-
|
|
1276
|
+
err.print(f"[red]Error:[/red] {_escape_markup(str(exc))}")
|
|
1273
1277
|
raise typer.Exit(1)
|
|
1274
1278
|
|
|
1275
1279
|
if json_output:
|
|
@@ -364,13 +364,24 @@ class WorkflowCatalog:
|
|
|
364
364
|
if not url:
|
|
365
365
|
continue
|
|
366
366
|
self._validate_catalog_url(url)
|
|
367
|
+
raw_priority = item.get("priority", idx + 1)
|
|
368
|
+
# bool is an int subclass: int(True) == 1 would silently accept a
|
|
369
|
+
# ``priority: true`` as priority 1. Reject it explicitly, mirroring
|
|
370
|
+
# the base CatalogStackBase loader.
|
|
371
|
+
if isinstance(raw_priority, bool):
|
|
372
|
+
raise WorkflowValidationError(
|
|
373
|
+
f"Invalid priority for catalog "
|
|
374
|
+
f"'{item.get('name', idx + 1)}': "
|
|
375
|
+
f"expected integer, got {raw_priority!r}"
|
|
376
|
+
)
|
|
367
377
|
try:
|
|
368
|
-
priority = int(
|
|
369
|
-
except (TypeError, ValueError):
|
|
378
|
+
priority = int(raw_priority)
|
|
379
|
+
except (TypeError, ValueError, OverflowError):
|
|
380
|
+
# OverflowError: int(float("inf")) — a ``priority: .inf``.
|
|
370
381
|
raise WorkflowValidationError(
|
|
371
382
|
f"Invalid priority for catalog "
|
|
372
383
|
f"'{item.get('name', idx + 1)}': "
|
|
373
|
-
f"expected integer, got {
|
|
384
|
+
f"expected integer, got {raw_priority!r}"
|
|
374
385
|
)
|
|
375
386
|
raw_install = item.get("install_allowed", False)
|
|
376
387
|
if isinstance(raw_install, str):
|
|
@@ -685,7 +696,9 @@ class WorkflowCatalog:
|
|
|
685
696
|
def _coerce_priority(value: Any) -> int:
|
|
686
697
|
try:
|
|
687
698
|
return int(value)
|
|
688
|
-
except (TypeError, ValueError):
|
|
699
|
+
except (TypeError, ValueError, OverflowError):
|
|
700
|
+
# OverflowError: int(float("inf")) — treat an uncoercible
|
|
701
|
+
# existing priority as 0 rather than crashing 'catalog add'.
|
|
689
702
|
return 0
|
|
690
703
|
|
|
691
704
|
max_priority = max(
|
|
@@ -1007,13 +1020,23 @@ class StepCatalog:
|
|
|
1007
1020
|
if not url:
|
|
1008
1021
|
continue
|
|
1009
1022
|
self._validate_catalog_url(url)
|
|
1023
|
+
raw_priority = item.get("priority", idx + 1)
|
|
1024
|
+
# bool is an int subclass: reject ``priority: true`` explicitly rather
|
|
1025
|
+
# than silently coercing it to 1 (mirrors CatalogStackBase).
|
|
1026
|
+
if isinstance(raw_priority, bool):
|
|
1027
|
+
raise StepValidationError(
|
|
1028
|
+
f"Invalid priority for catalog "
|
|
1029
|
+
f"'{item.get('name', idx + 1)}': "
|
|
1030
|
+
f"expected integer, got {raw_priority!r}"
|
|
1031
|
+
)
|
|
1010
1032
|
try:
|
|
1011
|
-
priority = int(
|
|
1012
|
-
except (TypeError, ValueError):
|
|
1033
|
+
priority = int(raw_priority)
|
|
1034
|
+
except (TypeError, ValueError, OverflowError):
|
|
1035
|
+
# OverflowError: int(float("inf")) — a ``priority: .inf``.
|
|
1013
1036
|
raise StepValidationError(
|
|
1014
1037
|
f"Invalid priority for catalog "
|
|
1015
1038
|
f"'{item.get('name', idx + 1)}': "
|
|
1016
|
-
f"expected integer, got {
|
|
1039
|
+
f"expected integer, got {raw_priority!r}"
|
|
1017
1040
|
)
|
|
1018
1041
|
raw_install = item.get("install_allowed", False)
|
|
1019
1042
|
if isinstance(raw_install, str):
|
|
@@ -1314,7 +1337,9 @@ class StepCatalog:
|
|
|
1314
1337
|
def _coerce_priority(value: Any) -> int:
|
|
1315
1338
|
try:
|
|
1316
1339
|
return int(value)
|
|
1317
|
-
except (TypeError, ValueError):
|
|
1340
|
+
except (TypeError, ValueError, OverflowError):
|
|
1341
|
+
# OverflowError: int(float("inf")) — treat an uncoercible
|
|
1342
|
+
# existing priority as 0 rather than crashing 'catalog add'.
|
|
1318
1343
|
return 0
|
|
1319
1344
|
|
|
1320
1345
|
max_priority = max(
|
{specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/fan_in/__init__.py
RENAMED
|
@@ -42,6 +42,28 @@ class FanInStep(StepBase):
|
|
|
42
42
|
output={"results": []},
|
|
43
43
|
)
|
|
44
44
|
|
|
45
|
+
# A non-string entry can never match a real step id. An unhashable one
|
|
46
|
+
# (a list/dict from a YAML indentation slip like ``wait_for: [[a, b]]``)
|
|
47
|
+
# crashes the whole run at ``context.steps.get(step_id, ...)`` below with
|
|
48
|
+
# a raw TypeError; a hashable-but-non-string one (``wait_for: [123]``)
|
|
49
|
+
# silently joins an empty ``{}`` and still reports COMPLETED — the exact
|
|
50
|
+
# "silent empty result + COMPLETED" wiring bug the whole-list guard above
|
|
51
|
+
# and the engine's fan-in validation (engine.py) both reject. The engine
|
|
52
|
+
# does not auto-validate step config, so fail this step loudly on an
|
|
53
|
+
# unvalidated run too, using the engine's phrasing.
|
|
54
|
+
bad_entries = [w for w in wait_for if not isinstance(w, str)]
|
|
55
|
+
if bad_entries:
|
|
56
|
+
first = bad_entries[0]
|
|
57
|
+
return StepResult(
|
|
58
|
+
status=StepStatus.FAILED,
|
|
59
|
+
error=(
|
|
60
|
+
f"Fan-in step {config.get('id', '?')!r}: 'wait_for' entries "
|
|
61
|
+
f"must be step-id strings, got {type(first).__name__} "
|
|
62
|
+
f"({first!r})."
|
|
63
|
+
),
|
|
64
|
+
output={"results": []},
|
|
65
|
+
)
|
|
66
|
+
|
|
45
67
|
# Collect results from referenced steps
|
|
46
68
|
results = []
|
|
47
69
|
for step_id in wait_for:
|
{specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/fan_out/__init__.py
RENAMED
|
@@ -25,6 +25,33 @@ class FanOutStep(StepBase):
|
|
|
25
25
|
max_concurrency = config.get("max_concurrency", 1)
|
|
26
26
|
step_template = config.get("step", {})
|
|
27
27
|
|
|
28
|
+
# The engine does not auto-validate step config (see
|
|
29
|
+
# ``WorkflowEngine.load_workflow``). On a COMPLETED fan-out it reads the
|
|
30
|
+
# ``step_template`` back out and, when it is truthy, calls
|
|
31
|
+
# ``template.get("id", ...)`` in ``_run_fan_out``. A truthy non-mapping
|
|
32
|
+
# ``step`` (a scalar or list authoring mistake) would crash the whole
|
|
33
|
+
# run with AttributeError there — the engine invokes ``execute`` and
|
|
34
|
+
# ``_run_fan_out`` with no surrounding try/except. ``validate`` already
|
|
35
|
+
# rejects a non-mapping ``step``; fail this step loudly on an
|
|
36
|
+
# unvalidated run instead, mirroring the ``items`` guard below. An empty
|
|
37
|
+
# or absent ``step`` defaults to ``{}`` (falsy) and the engine's
|
|
38
|
+
# ``if template and items`` skips fan-out, so it stays valid here.
|
|
39
|
+
if not isinstance(step_template, dict):
|
|
40
|
+
return StepResult(
|
|
41
|
+
status=StepStatus.FAILED,
|
|
42
|
+
error=(
|
|
43
|
+
f"Fan-out step {config.get('id', '?')!r}: 'step' must be a "
|
|
44
|
+
f"mapping (nested step template), got "
|
|
45
|
+
f"{type(step_template).__name__}."
|
|
46
|
+
),
|
|
47
|
+
output={
|
|
48
|
+
"items": [],
|
|
49
|
+
"max_concurrency": max_concurrency,
|
|
50
|
+
"step_template": {},
|
|
51
|
+
"item_count": 0,
|
|
52
|
+
},
|
|
53
|
+
)
|
|
54
|
+
|
|
28
55
|
if not isinstance(items, list):
|
|
29
56
|
# A non-list here is a wiring error (the expression did not
|
|
30
57
|
# resolve to a collection); silently fanning out over zero
|
|
@@ -66,8 +93,13 @@ class FanOutStep(StepBase):
|
|
|
66
93
|
f"Fan-out step {config.get('id', '?')!r} is missing "
|
|
67
94
|
f"'step' field (nested step template)."
|
|
68
95
|
)
|
|
69
|
-
|
|
70
|
-
|
|
96
|
+
elif not isinstance(config["step"], dict):
|
|
97
|
+
# A present-but-non-mapping ``step`` (including an explicit
|
|
98
|
+
# ``step: null``) is an authoring mistake. ``config.get("step", {})``
|
|
99
|
+
# in ``execute`` only substitutes the ``{}`` default for an *absent*
|
|
100
|
+
# key, so an explicit ``None`` reaches the runtime guard and FAILS
|
|
101
|
+
# the step. Reject it here too so a workflow cannot pass validation
|
|
102
|
+
# and then fail during execution.
|
|
71
103
|
errors.append(
|
|
72
104
|
f"Fan-out step {config.get('id', '?')!r}: 'step' must be a mapping."
|
|
73
105
|
)
|
{specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/prompt/__init__.py
RENAMED
|
@@ -160,4 +160,16 @@ class PromptStep(StepBase):
|
|
|
160
160
|
errors.append(
|
|
161
161
|
f"Prompt step {config.get('id', '?')!r} is missing 'prompt' field."
|
|
162
162
|
)
|
|
163
|
+
elif not isinstance(config["prompt"], str):
|
|
164
|
+
# execute() str()-coerces prompt and dispatches it to the
|
|
165
|
+
# integration CLI, so a null or list 'prompt' would send the Python
|
|
166
|
+
# repr ('None', "['review', 'this']") to the model as instructions —
|
|
167
|
+
# silently wrong, with no error. Reject non-strings at validation,
|
|
168
|
+
# mirroring the shell-step 'run' and command-step input/options type
|
|
169
|
+
# checks. An expression like "{{ ... }}" is still a str, so it stays
|
|
170
|
+
# valid.
|
|
171
|
+
errors.append(
|
|
172
|
+
f"Prompt step {config.get('id', '?')!r}: 'prompt' must be a "
|
|
173
|
+
f"string, got {type(config['prompt']).__name__}."
|
|
174
|
+
)
|
|
163
175
|
return errors
|
|
@@ -216,6 +216,24 @@ class TestBuildCommandInvocation:
|
|
|
216
216
|
i = get_integration("codex")
|
|
217
217
|
assert i.build_command_invocation("speckit.git.commit", "fix typo") == "/speckit-git-commit fix typo"
|
|
218
218
|
|
|
219
|
+
def test_forge_core_command_hyphenated(self):
|
|
220
|
+
"""Forge installs hyphenated slash-commands (/speckit-<name>), so the
|
|
221
|
+
dispatch invocation must be hyphenated too — not the dotted default it
|
|
222
|
+
would inherit from MarkdownIntegration."""
|
|
223
|
+
from specify_cli.integrations import get_integration
|
|
224
|
+
i = get_integration("forge")
|
|
225
|
+
assert i.build_command_invocation("speckit.plan") == "/speckit-plan"
|
|
226
|
+
assert i.build_command_invocation("plan") == "/speckit-plan"
|
|
227
|
+
|
|
228
|
+
def test_forge_extension_command_hyphenated(self):
|
|
229
|
+
from specify_cli.integrations import get_integration
|
|
230
|
+
i = get_integration("forge")
|
|
231
|
+
assert i.build_command_invocation("speckit.git.commit") == "/speckit-git-commit"
|
|
232
|
+
assert (
|
|
233
|
+
i.build_command_invocation("speckit.git.commit", "fix typo")
|
|
234
|
+
== "/speckit-git-commit fix typo"
|
|
235
|
+
)
|
|
236
|
+
|
|
219
237
|
|
|
220
238
|
class TestResolveCommandRefs:
|
|
221
239
|
"""Tests for __SPECKIT_COMMAND_<NAME>__ placeholder resolution."""
|
|
@@ -922,6 +922,57 @@ class TestCatalogSourceManagement:
|
|
|
922
922
|
assert str(cfg_path) in message
|
|
923
923
|
assert "expected a mapping" in message
|
|
924
924
|
|
|
925
|
+
def test_add_catalog_rejects_inf_priority_in_existing_entry(
|
|
926
|
+
self, tmp_path, monkeypatch
|
|
927
|
+
):
|
|
928
|
+
# ``priority: .inf`` loads as float('inf'); int() on it raises
|
|
929
|
+
# OverflowError, which used to escape the IntegrationValidationError
|
|
930
|
+
# contract as a raw traceback (github/spec-kit#3526 fixed the sibling
|
|
931
|
+
# workflow/step loaders the same way).
|
|
932
|
+
self._isolate(tmp_path, monkeypatch)
|
|
933
|
+
cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
|
|
934
|
+
cfg_path.write_text(
|
|
935
|
+
yaml.dump(
|
|
936
|
+
{
|
|
937
|
+
"catalogs": [
|
|
938
|
+
{
|
|
939
|
+
"url": "https://a.example.com/catalog.json",
|
|
940
|
+
"priority": float("inf"),
|
|
941
|
+
}
|
|
942
|
+
]
|
|
943
|
+
}
|
|
944
|
+
),
|
|
945
|
+
encoding="utf-8",
|
|
946
|
+
)
|
|
947
|
+
cat = IntegrationCatalog(tmp_path)
|
|
948
|
+
with pytest.raises(
|
|
949
|
+
IntegrationValidationError, match="must be an integer"
|
|
950
|
+
):
|
|
951
|
+
cat.add_catalog("https://new.example.com/catalog.json")
|
|
952
|
+
|
|
953
|
+
def test_remove_catalog_tolerates_inf_priority(self, tmp_path, monkeypatch):
|
|
954
|
+
# Building the remove display order must not crash on a ``priority:
|
|
955
|
+
# .inf`` entry; it falls back to positional order like the other
|
|
956
|
+
# non-integer priorities do.
|
|
957
|
+
self._isolate(tmp_path, monkeypatch)
|
|
958
|
+
cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
|
|
959
|
+
cfg_path.write_text(
|
|
960
|
+
yaml.dump(
|
|
961
|
+
{
|
|
962
|
+
"catalogs": [
|
|
963
|
+
{
|
|
964
|
+
"url": "https://a.example.com/catalog.json",
|
|
965
|
+
"priority": float("inf"),
|
|
966
|
+
},
|
|
967
|
+
{"url": "https://b.example.com/catalog.json", "priority": 2},
|
|
968
|
+
]
|
|
969
|
+
}
|
|
970
|
+
),
|
|
971
|
+
encoding="utf-8",
|
|
972
|
+
)
|
|
973
|
+
cat = IntegrationCatalog(tmp_path)
|
|
974
|
+
cat.remove_catalog(0) # must not raise OverflowError
|
|
975
|
+
|
|
925
976
|
def test_add_catalog_skips_blank_url_entries(self, tmp_path, monkeypatch):
|
|
926
977
|
self._isolate(tmp_path, monkeypatch)
|
|
927
978
|
cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
|
|
@@ -4542,6 +4542,36 @@ class TestCatalogStack:
|
|
|
4542
4542
|
catalog.get_active_catalogs()
|
|
4543
4543
|
assert str(config_path) in str(exc_info.value)
|
|
4544
4544
|
|
|
4545
|
+
def test_load_catalog_config_rejects_infinite_priority(self, temp_dir):
|
|
4546
|
+
"""A ``priority: .inf`` yields a clean validation error, not an uncaught
|
|
4547
|
+
OverflowError from int(float('inf'))."""
|
|
4548
|
+
import yaml as yaml_module
|
|
4549
|
+
|
|
4550
|
+
project_dir = self._make_project(temp_dir)
|
|
4551
|
+
config_path = project_dir / ".specify" / "extension-catalogs.yml"
|
|
4552
|
+
config_path.write_text(
|
|
4553
|
+
yaml_module.dump(
|
|
4554
|
+
{
|
|
4555
|
+
"catalogs": [
|
|
4556
|
+
{
|
|
4557
|
+
"name": "inf-priority",
|
|
4558
|
+
"url": "https://example.com/catalog.json",
|
|
4559
|
+
"priority": float("inf"),
|
|
4560
|
+
}
|
|
4561
|
+
]
|
|
4562
|
+
}
|
|
4563
|
+
),
|
|
4564
|
+
encoding="utf-8",
|
|
4565
|
+
)
|
|
4566
|
+
|
|
4567
|
+
catalog = ExtensionCatalog(project_dir)
|
|
4568
|
+
|
|
4569
|
+
with pytest.raises(
|
|
4570
|
+
ValidationError, match="Invalid priority|expected integer"
|
|
4571
|
+
) as exc_info:
|
|
4572
|
+
catalog.get_active_catalogs()
|
|
4573
|
+
assert str(config_path) in str(exc_info.value)
|
|
4574
|
+
|
|
4545
4575
|
def test_load_catalog_config_defaults_blank_names(self, temp_dir):
|
|
4546
4576
|
"""Blank and null names normalize by valid catalog order."""
|
|
4547
4577
|
import yaml as yaml_module
|
|
@@ -2671,6 +2671,24 @@ class TestPresetCatalogMultiCatalog:
|
|
|
2671
2671
|
with pytest.raises(PresetValidationError, match="Invalid priority|expected integer"):
|
|
2672
2672
|
catalog._load_catalog_config(config_path)
|
|
2673
2673
|
|
|
2674
|
+
def test_load_catalog_config_rejects_infinite_priority(self, project_dir):
|
|
2675
|
+
"""A ``priority: .inf`` yields a clean validation error, not an uncaught
|
|
2676
|
+
OverflowError from int(float('inf'))."""
|
|
2677
|
+
config_path = project_dir / ".specify" / "preset-catalogs.yml"
|
|
2678
|
+
config_path.write_text(yaml.dump({
|
|
2679
|
+
"catalogs": [
|
|
2680
|
+
{
|
|
2681
|
+
"name": "inf-priority",
|
|
2682
|
+
"url": "https://example.com/catalog.json",
|
|
2683
|
+
"priority": float("inf"),
|
|
2684
|
+
}
|
|
2685
|
+
]
|
|
2686
|
+
}))
|
|
2687
|
+
|
|
2688
|
+
catalog = PresetCatalog(project_dir)
|
|
2689
|
+
with pytest.raises(PresetValidationError, match="Invalid priority|expected integer"):
|
|
2690
|
+
catalog._load_catalog_config(config_path)
|
|
2691
|
+
|
|
2674
2692
|
def test_load_catalog_config_install_allowed_string(self, project_dir):
|
|
2675
2693
|
"""Test that install_allowed accepts string values."""
|
|
2676
2694
|
config_path = project_dir / ".specify" / "preset-catalogs.yml"
|