specify-cli 0.12.6__tar.gz → 0.12.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specify_cli-0.12.6 → specify_cli-0.12.7}/CHANGELOG.md +15 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/PKG-INFO +1 -1
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/community/extensions.md +3 -2
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/catalog.community.json +48 -9
- {specify_cli-0.12.6 → specify_cli-0.12.7}/pyproject.toml +1 -1
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/agents.py +14 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/installer.py +22 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/agy/__init__.py +5 -1
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/base.py +13 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/_commands.py +28 -14
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/fan_in/__init__.py +9 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/shell/__init__.py +10 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integration/test_bundler_install_flow.py +65 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_agy.py +20 -0
- specify_cli-0.12.7/tests/test_post_process.py +245 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_workflow_run_without_project.py +84 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_workflows.py +41 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.editorconfig +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.gitattributes +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/CODEOWNERS +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/dependabot.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/bug-test.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/release.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.github/workflows/test.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.gitignore +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/.zenodo.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/AGENTS.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/CITATION.cff +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/DEVELOPMENT.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/LICENSE +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/SECURITY.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/SUPPORT.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/.gitignore +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/community/bundles.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/community/friends.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/community/overview.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/community/presets.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/docfx.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/index.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/install/one-time.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/install/pipx.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/install/uv.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/installation.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/local-development.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/quickstart.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/authentication.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/bundles.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/core.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/extensions.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/integrations.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/overview.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/presets.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/reference/workflows.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/template/public/main.css +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/toc.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/docs/upgrade.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/bug/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/catalog.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/extension.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/.gitignore +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/LICENSE +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/extensions/template/extension.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/integrations/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/integrations/catalog.community.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/integrations/catalog.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/media/logo_large.webp +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/media/logo_small.webp +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/media/specify_cli.gif +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/newsletters/2026-April.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/newsletters/2026-February.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/newsletters/2026-June.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/newsletters/2026-March.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/newsletters/2026-May.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/catalog.community.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/catalog.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/lean/preset.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/scaffold/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/bash/common.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/python/check_prerequisites.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/scripts/python/common.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/spec-driven.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/spec-kit.code-workspace +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_project.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/commands/init.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/omp/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/presets/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/checklist-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/analyze.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/checklist.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/clarify.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/constitution.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/converge.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/implement.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/plan.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/specify.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/tasks.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/constitution-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/plan-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/spec-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/tasks-template.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/templates/vscode-settings.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/auth_helpers.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/conftest.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/hooks/plan.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/hooks/spec.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/http_helpers.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_authentication.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_check_prerequisites_python_parity.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_check_tool.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_cli_version.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_commands_package.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_console_imports.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_extensions.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_github_http.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_init_dir.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_merge.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_presets.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_upgrade.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_utils.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/test_version_imports.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/README.md +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/catalog.community.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/catalog.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.12.6 → specify_cli-0.12.7}/workflows/step-catalog.json +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.12.7] - 2026-07-07
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix(bundler): bundle update uninstalls components dropped by new version (#3353)
|
|
10
|
+
- fix(workflows): route run/resume errors to stderr under --json (#3352)
|
|
11
|
+
- fix(workflows): fan-in validate() rejects non-mapping output (#3349)
|
|
12
|
+
- fix(workflows): shell step validate() rejects non-string run (#3348)
|
|
13
|
+
- fix(integrations): agy honors SPECKIT_INTEGRATION_AGY_EXTRA_ARGS (#3347)
|
|
14
|
+
- Add Orchestration Task Context Management extension to community catalog (#3372)
|
|
15
|
+
- Update DocGuard — CDD Enforcement extension to v0.30.0 (#3371)
|
|
16
|
+
- Update Ripple extension to v1.1.0 (#3370)
|
|
17
|
+
- feat(integrations): generalize post-processing to all format types (#3311)
|
|
18
|
+
- chore: release 0.12.6, begin 0.12.7.dev0 development (#3393)
|
|
19
|
+
|
|
5
20
|
## [0.12.6] - 2026-07-07
|
|
6
21
|
|
|
7
22
|
### Changed
|
|
@@ -51,7 +51,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
51
51
|
| Confluence Extension | Create a doc in Confluence summarizing the specifications and planning files | `integration` | Read+Write | [spec-kit-confluence](https://github.com/aaronrsun/spec-kit-confluence) |
|
|
52
52
|
| Cost Tracker | Track real LLM dollar cost across SDD workflows — per-feature budgets, per-integration comparison, and finance-ready exports | `visibility` | Read+Write | [spec-kit-cost](https://github.com/Quratulain-bilal/spec-kit-cost) |
|
|
53
53
|
| Data Model Diagram | Generates Mermaid ER diagrams from Spec Kit data models after planning | `docs` | Read+Write | [spec-kit-data-model-diagram](https://github.com/benizzio/spec-kit-data-model-diagram) |
|
|
54
|
-
| DocGuard — CDD Enforcement |
|
|
54
|
+
| DocGuard — CDD Enforcement | The only doc-integrity engine with an MCP server, SARIF output, and a deterministic zero-LLM core. Validates, scores, and traces documentation against code — 24 validators, stable finding codes, GitHub Action with PR annotations, spec-kit hooks. Pure Node.js, one pinned dep. | `docs` | Read+Write | [spec-kit-docguard](https://github.com/raccioly/docguard) |
|
|
55
55
|
| Extensify | Create and validate extensions and extension catalogs | `process` | Read+Write | [extensify](https://github.com/mnriem/spec-kit-extensions/tree/main/extensify) |
|
|
56
56
|
| Fix Findings | Automated analyze-fix-reanalyze loop that resolves spec findings until clean | `code` | Read+Write | [spec-kit-fix-findings](https://github.com/Quratulain-bilal/spec-kit-fix-findings) |
|
|
57
57
|
| FixIt Extension | Spec-aware bug fixing — maps bugs to spec artifacts, proposes a plan, applies minimal changes | `code` | Read+Write | [spec-kit-fixit](https://github.com/speckit-community/spec-kit-fixit) |
|
|
@@ -86,6 +86,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
86
86
|
| .NET Framework to Modern .NET Migration | Orchestrate end-to-end .NET Framework to modern .NET migration across 7 phases, with SDD lifecycle integration | `process` | Read+Write | [spec-kit-fx-to-net](https://github.com/RogerBestMsft/spec-kit-FxToNet) |
|
|
87
87
|
| Onboard | Contextual onboarding and progressive growth for developers new to spec-kit projects. Explains specs, maps dependencies, validates understanding, and guides the next step | `process` | Read+Write | [spec-kit-onboard](https://github.com/dmux/spec-kit-onboard) |
|
|
88
88
|
| Optimize | Audit and optimize AI governance for context efficiency — token budgets, rule health, interpretability, compression, coherence, and echo detection | `process` | Read+Write | [spec-kit-optimize](https://github.com/sakitA/spec-kit-optimize) |
|
|
89
|
+
| Orchestration Task Context Management | Adds subagent work-unit orchestration to generated Spec Kit task files | `process` | Read+Write | [spec-kit-orchestration-task-context-management](https://github.com/benizzio/spec-kit-orchestration-task-context-management) |
|
|
89
90
|
| OWASP LLM Threat Model | OWASP Top 10 for LLM Applications 2025 threat analysis on agent artifacts | `code` | Read-only | [spec-kit-threatmodel](https://github.com/NaviaSamal/spec-kit-threatmodel) |
|
|
90
91
|
| Plan Review Gate | Require spec.md and plan.md to be merged via MR/PR before allowing task generation | `process` | Read-only | [spec-kit-plan-review-gate](https://github.com/luno/spec-kit-plan-review-gate) |
|
|
91
92
|
| PR Bridge | Auto-generate pull request descriptions, checklists, and summaries from spec artifacts | `process` | Read-only | [spec-kit-pr-bridge-](https://github.com/Quratulain-bilal/spec-kit-pr-bridge-) |
|
|
@@ -106,7 +107,7 @@ The following community-contributed extensions are available in [`catalog.commun
|
|
|
106
107
|
| Retro Extension | Sprint retrospective analysis with metrics, spec accuracy assessment, and improvement suggestions | `process` | Read+Write | [spec-kit-retro](https://github.com/arunt14/spec-kit-retro) |
|
|
107
108
|
| Retrospective Extension | Post-implementation retrospective with spec adherence scoring, drift analysis, and human-gated spec updates | `docs` | Read+Write | [spec-kit-retrospective](https://github.com/emi-dm/spec-kit-retrospective) |
|
|
108
109
|
| Review Extension | Post-implementation comprehensive code review with specialized agents for code quality, comments, tests, error handling, type design, and simplification | `code` | Read-only | [spec-kit-review](https://github.com/ismaelJimenez/spec-kit-review) |
|
|
109
|
-
| Ripple | Detect side effects that tests can't catch after implementation —
|
|
110
|
+
| Ripple | Detect side effects that tests can't catch after implementation — surface hidden ripple effects across 9 analysis categories | `code` | Read+Write | [spec-kit-ripple](https://github.com/chordpli/spec-kit-ripple) |
|
|
110
111
|
| SDD Utilities | Resume interrupted workflows, validate project health, and verify spec-to-task traceability | `process` | Read+Write | [speckit-utils](https://github.com/mvanhorn/speckit-utils) |
|
|
111
112
|
| Security Review | Full-project secure-by-design security audits plus staged, branch/PR, plan, task, follow-up, and apply reviews | `code` | Read+Write | [spec-kit-security-review](https://github.com/DyanGalih/spec-kit-security-review) |
|
|
112
113
|
| SFSpeckit | Enterprise Salesforce SDLC with 18 commands for the full SDD lifecycle. | `process` | Read+Write | [spec-kit-sf](https://github.com/ysumanth06/spec-kit-sf) |
|
|
@@ -1106,10 +1106,10 @@
|
|
|
1106
1106
|
"docguard": {
|
|
1107
1107
|
"name": "DocGuard — CDD Enforcement",
|
|
1108
1108
|
"id": "docguard",
|
|
1109
|
-
"description": "
|
|
1109
|
+
"description": "The only doc-integrity engine with an MCP server, SARIF output, and a deterministic zero-LLM core. Validates, scores, and traces documentation against code — 24 validators, stable finding codes, GitHub Action with PR annotations, spec-kit hooks. Pure Node.js, one pinned dep.",
|
|
1110
1110
|
"author": "raccioly",
|
|
1111
|
-
"version": "0.
|
|
1112
|
-
"download_url": "https://github.com/raccioly/docguard/releases/download/v0.
|
|
1111
|
+
"version": "0.30.0",
|
|
1112
|
+
"download_url": "https://github.com/raccioly/docguard/releases/download/v0.30.0/spec-kit-docguard-v0.30.0.zip",
|
|
1113
1113
|
"repository": "https://github.com/raccioly/docguard",
|
|
1114
1114
|
"homepage": "https://www.npmjs.com/package/docguard-cli",
|
|
1115
1115
|
"documentation": "https://github.com/raccioly/docguard/blob/main/extensions/spec-kit-docguard/README.md",
|
|
@@ -1145,7 +1145,7 @@
|
|
|
1145
1145
|
"downloads": 0,
|
|
1146
1146
|
"stars": 0,
|
|
1147
1147
|
"created_at": "2026-03-13T00:00:00Z",
|
|
1148
|
-
"updated_at": "2026-
|
|
1148
|
+
"updated_at": "2026-07-06T00:00:00Z"
|
|
1149
1149
|
},
|
|
1150
1150
|
"doctor": {
|
|
1151
1151
|
"name": "Project Health Check",
|
|
@@ -2396,6 +2396,39 @@
|
|
|
2396
2396
|
"created_at": "2026-04-03T00:00:00Z",
|
|
2397
2397
|
"updated_at": "2026-04-03T00:00:00Z"
|
|
2398
2398
|
},
|
|
2399
|
+
"orchestration-task-context-management": {
|
|
2400
|
+
"name": "Orchestration Task Context Management",
|
|
2401
|
+
"id": "orchestration-task-context-management",
|
|
2402
|
+
"description": "Adds subagent work-unit orchestration to generated Spec Kit task files",
|
|
2403
|
+
"author": "Igor Benicio de Mesquita",
|
|
2404
|
+
"version": "0.0.0",
|
|
2405
|
+
"download_url": "https://github.com/benizzio/spec-kit-orchestration-task-context-management/archive/refs/tags/v0.0.0.zip",
|
|
2406
|
+
"repository": "https://github.com/benizzio/spec-kit-orchestration-task-context-management",
|
|
2407
|
+
"homepage": "https://github.com/benizzio/spec-kit-orchestration-task-context-management",
|
|
2408
|
+
"documentation": "https://github.com/benizzio/spec-kit-orchestration-task-context-management/blob/main/README.md",
|
|
2409
|
+
"changelog": "https://github.com/benizzio/spec-kit-orchestration-task-context-management/blob/main/CHANGELOG.md",
|
|
2410
|
+
"license": "MIT",
|
|
2411
|
+
"category": "process",
|
|
2412
|
+
"effect": "read-write",
|
|
2413
|
+
"requires": {
|
|
2414
|
+
"speckit_version": ">=0.7.2"
|
|
2415
|
+
},
|
|
2416
|
+
"provides": {
|
|
2417
|
+
"commands": 2,
|
|
2418
|
+
"hooks": 2
|
|
2419
|
+
},
|
|
2420
|
+
"tags": [
|
|
2421
|
+
"agent",
|
|
2422
|
+
"orchestration",
|
|
2423
|
+
"tasks",
|
|
2424
|
+
"context"
|
|
2425
|
+
],
|
|
2426
|
+
"verified": false,
|
|
2427
|
+
"downloads": 0,
|
|
2428
|
+
"stars": 0,
|
|
2429
|
+
"created_at": "2026-07-06T00:00:00Z",
|
|
2430
|
+
"updated_at": "2026-07-06T00:00:00Z"
|
|
2431
|
+
},
|
|
2399
2432
|
"orchestrator": {
|
|
2400
2433
|
"name": "Spec Orchestrator",
|
|
2401
2434
|
"id": "orchestrator",
|
|
@@ -3086,10 +3119,10 @@
|
|
|
3086
3119
|
"ripple": {
|
|
3087
3120
|
"name": "Ripple",
|
|
3088
3121
|
"id": "ripple",
|
|
3089
|
-
"description": "Detect side effects that tests can't catch after implementation —
|
|
3122
|
+
"description": "Detect side effects that tests can't catch after implementation — surface hidden ripple effects across 9 analysis categories",
|
|
3090
3123
|
"author": "chordpli",
|
|
3091
|
-
"version": "1.
|
|
3092
|
-
"download_url": "https://github.com/chordpli/spec-kit-ripple/archive/refs/tags/v1.
|
|
3124
|
+
"version": "1.1.0",
|
|
3125
|
+
"download_url": "https://github.com/chordpli/spec-kit-ripple/archive/refs/tags/v1.1.0.zip",
|
|
3093
3126
|
"repository": "https://github.com/chordpli/spec-kit-ripple",
|
|
3094
3127
|
"homepage": "https://github.com/chordpli/spec-kit-ripple",
|
|
3095
3128
|
"documentation": "https://github.com/chordpli/spec-kit-ripple/blob/main/README.md",
|
|
@@ -3098,7 +3131,13 @@
|
|
|
3098
3131
|
"category": "code",
|
|
3099
3132
|
"effect": "read-write",
|
|
3100
3133
|
"requires": {
|
|
3101
|
-
"speckit_version": ">=0.2.0"
|
|
3134
|
+
"speckit_version": ">=0.2.0",
|
|
3135
|
+
"tools": [
|
|
3136
|
+
{
|
|
3137
|
+
"name": "git",
|
|
3138
|
+
"required": true
|
|
3139
|
+
}
|
|
3140
|
+
]
|
|
3102
3141
|
},
|
|
3103
3142
|
"provides": {
|
|
3104
3143
|
"commands": 3,
|
|
@@ -3115,7 +3154,7 @@
|
|
|
3115
3154
|
"downloads": 0,
|
|
3116
3155
|
"stars": 0,
|
|
3117
3156
|
"created_at": "2026-04-20T00:00:00Z",
|
|
3118
|
-
"updated_at": "2026-
|
|
3157
|
+
"updated_at": "2026-07-06T00:00:00Z"
|
|
3119
3158
|
},
|
|
3120
3159
|
"roadmap": {
|
|
3121
3160
|
"name": "Spec Roadmap",
|
|
@@ -706,6 +706,17 @@ class CommandRegistrar:
|
|
|
706
706
|
else:
|
|
707
707
|
raise ValueError(f"Unsupported format: {agent_config['format']}")
|
|
708
708
|
|
|
709
|
+
# -- Post-process for non-skills agents -----------------------
|
|
710
|
+
_integration = None
|
|
711
|
+
if agent_config["extension"] != "/SKILL.md":
|
|
712
|
+
from specify_cli.integrations import ( # noqa: PLC0415
|
|
713
|
+
get_integration,
|
|
714
|
+
)
|
|
715
|
+
|
|
716
|
+
_integration = get_integration(agent_name)
|
|
717
|
+
if _integration is not None:
|
|
718
|
+
output = _integration.post_process_command_content(output)
|
|
719
|
+
|
|
709
720
|
dest_file = commands_dir / f"{output_name}{agent_config['extension']}"
|
|
710
721
|
self._ensure_inside(dest_file, commands_dir)
|
|
711
722
|
dest_file.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -766,6 +777,9 @@ class CommandRegistrar:
|
|
|
766
777
|
raise ValueError(
|
|
767
778
|
f"Unsupported format: {agent_config['format']}"
|
|
768
779
|
)
|
|
780
|
+
|
|
781
|
+
if agent_config["extension"] != "/SKILL.md" and _integration is not None:
|
|
782
|
+
alias_output = _integration.post_process_command_content(alias_output)
|
|
769
783
|
else:
|
|
770
784
|
# For other agents, reuse the primary output
|
|
771
785
|
alias_output = output
|
|
@@ -130,6 +130,28 @@ def install_bundle(
|
|
|
130
130
|
done.append(component)
|
|
131
131
|
result.installed.append(component)
|
|
132
132
|
contributed.append(component)
|
|
133
|
+
|
|
134
|
+
# On update (refresh), uninstall components this bundle used to own
|
|
135
|
+
# that the new version no longer ships. Otherwise they are dropped
|
|
136
|
+
# from the record below (contributed only holds plan.components) yet
|
|
137
|
+
# left on disk — permanently orphaned, since no bundle record can
|
|
138
|
+
# ever remove them. A stale component still owned by another bundle
|
|
139
|
+
# is kept installed and simply de-attributed here (it stays in that
|
|
140
|
+
# bundle's record). Mirrors remove_bundle's refcount logic.
|
|
141
|
+
if refresh and existing is not None:
|
|
142
|
+
planned = {(c.kind, c.id) for c in plan.components}
|
|
143
|
+
still_needed = components_still_needed(
|
|
144
|
+
records, exclude_bundle_id=plan.bundle_id
|
|
145
|
+
)
|
|
146
|
+
for component in existing.contributed_components:
|
|
147
|
+
key = (component.kind, component.id)
|
|
148
|
+
if key in planned:
|
|
149
|
+
continue
|
|
150
|
+
if key in still_needed:
|
|
151
|
+
continue
|
|
152
|
+
if installer.is_installed(project_root, component):
|
|
153
|
+
installer.remove(project_root, component)
|
|
154
|
+
result.uninstalled.append(component)
|
|
133
155
|
except BundlerError:
|
|
134
156
|
_rollback(project_root, installer, done)
|
|
135
157
|
raise
|
|
@@ -89,7 +89,11 @@ class AgyIntegration(SkillsIntegration):
|
|
|
89
89
|
output_json: bool = True,
|
|
90
90
|
) -> list[str] | None:
|
|
91
91
|
# agy does not support --model or JSON output; both params are ignored
|
|
92
|
-
|
|
92
|
+
args = [self._resolve_executable(), "--print", prompt]
|
|
93
|
+
# Honor SPECKIT_INTEGRATION_AGY_EXTRA_ARGS (operator-supplied flags),
|
|
94
|
+
# appended after the positional prompt like the devin integration.
|
|
95
|
+
self._apply_extra_args_env_var(args)
|
|
96
|
+
return args
|
|
93
97
|
|
|
94
98
|
def setup(
|
|
95
99
|
self,
|
|
@@ -123,6 +123,19 @@ class IntegrationBase(ABC):
|
|
|
123
123
|
integration that sets this flag.
|
|
124
124
|
"""
|
|
125
125
|
|
|
126
|
+
def post_process_command_content(self, content: str) -> str:
|
|
127
|
+
"""Transform command content after format rendering.
|
|
128
|
+
|
|
129
|
+
Called by ``register_commands()`` for non-skills format types
|
|
130
|
+
(Markdown, TOML, YAML) after the command has been rendered into
|
|
131
|
+
its target format and before writing to disk. Skills-format
|
|
132
|
+
agents use ``post_process_skill_content()`` instead.
|
|
133
|
+
|
|
134
|
+
Subclasses may override to inject agent-specific content.
|
|
135
|
+
The default implementation returns *content* unchanged.
|
|
136
|
+
"""
|
|
137
|
+
return content
|
|
138
|
+
|
|
126
139
|
# -- Public API -------------------------------------------------------
|
|
127
140
|
|
|
128
141
|
@classmethod
|
|
@@ -50,7 +50,17 @@ workflow_step_catalog_app = typer.Typer(
|
|
|
50
50
|
workflow_step_app.add_typer(workflow_step_catalog_app, name="catalog")
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
def
|
|
53
|
+
def _error_console(json_output: bool):
|
|
54
|
+
"""Console for error text: stderr under ``--json`` so the JSON stdout
|
|
55
|
+
stream stays parseable, the normal console otherwise. Mirrors the
|
|
56
|
+
stderr-only error routing already used by ``specify bundle``.
|
|
57
|
+
"""
|
|
58
|
+
return err_console if json_output else console
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _parse_input_values(
|
|
62
|
+
input_values: list[str] | None, *, json_output: bool = False
|
|
63
|
+
) -> dict[str, Any]:
|
|
54
64
|
"""Parse repeated ``key=value`` CLI inputs into a dict.
|
|
55
65
|
|
|
56
66
|
Shared by ``workflow run`` and ``workflow resume``. Exits with an error
|
|
@@ -59,7 +69,9 @@ def _parse_input_values(input_values: list[str] | None) -> dict[str, Any]:
|
|
|
59
69
|
inputs: dict[str, Any] = {}
|
|
60
70
|
for kv in input_values or []:
|
|
61
71
|
if "=" not in kv:
|
|
62
|
-
|
|
72
|
+
_error_console(json_output).print(
|
|
73
|
+
f"[red]Error:[/red] Invalid input format: {kv!r} (expected key=value)"
|
|
74
|
+
)
|
|
63
75
|
raise typer.Exit(1)
|
|
64
76
|
key, _, value = kv.partition("=")
|
|
65
77
|
inputs[key.strip()] = value.strip()
|
|
@@ -335,25 +347,26 @@ def workflow_run(
|
|
|
335
347
|
if not json_output:
|
|
336
348
|
engine.on_step_start = lambda sid, label: console.print(f" \u25b8 [{sid}] {label} \u2026")
|
|
337
349
|
|
|
350
|
+
err = _error_console(json_output)
|
|
338
351
|
try:
|
|
339
352
|
definition = engine.load_workflow(source_path if is_file_source else source)
|
|
340
353
|
except FileNotFoundError:
|
|
341
|
-
|
|
354
|
+
err.print(f"[red]Error:[/red] Workflow not found: {source}")
|
|
342
355
|
raise typer.Exit(1)
|
|
343
356
|
except ValueError as exc:
|
|
344
|
-
|
|
357
|
+
err.print(f"[red]Error:[/red] Invalid workflow: {exc}")
|
|
345
358
|
raise typer.Exit(1)
|
|
346
359
|
|
|
347
360
|
# Validate
|
|
348
361
|
errors = engine.validate(definition)
|
|
349
362
|
if errors:
|
|
350
|
-
|
|
351
|
-
for
|
|
352
|
-
|
|
363
|
+
err.print("[red]Workflow validation failed:[/red]")
|
|
364
|
+
for verr in errors:
|
|
365
|
+
err.print(f" • {verr}")
|
|
353
366
|
raise typer.Exit(1)
|
|
354
367
|
|
|
355
368
|
# Parse inputs
|
|
356
|
-
inputs = _parse_input_values(input_values)
|
|
369
|
+
inputs = _parse_input_values(input_values, json_output=json_output)
|
|
357
370
|
|
|
358
371
|
if not json_output:
|
|
359
372
|
console.print(f"\n[bold cyan]Running workflow:[/bold cyan] {definition.name} ({definition.id})")
|
|
@@ -363,10 +376,10 @@ def workflow_run(
|
|
|
363
376
|
with _stdout_to_stderr_when(json_output):
|
|
364
377
|
state = engine.execute(definition, inputs)
|
|
365
378
|
except ValueError as exc:
|
|
366
|
-
|
|
379
|
+
err.print(f"[red]Error:[/red] {exc}")
|
|
367
380
|
raise typer.Exit(1)
|
|
368
381
|
except Exception as exc:
|
|
369
|
-
|
|
382
|
+
err.print(f"[red]Workflow failed:[/red] {exc}")
|
|
370
383
|
raise typer.Exit(1)
|
|
371
384
|
|
|
372
385
|
if json_output:
|
|
@@ -411,19 +424,20 @@ def workflow_resume(
|
|
|
411
424
|
if not json_output:
|
|
412
425
|
engine.on_step_start = lambda sid, label: console.print(f" \u25b8 [{sid}] {label} \u2026")
|
|
413
426
|
|
|
414
|
-
inputs = _parse_input_values(input_values)
|
|
427
|
+
inputs = _parse_input_values(input_values, json_output=json_output)
|
|
428
|
+
err = _error_console(json_output)
|
|
415
429
|
|
|
416
430
|
try:
|
|
417
431
|
with _stdout_to_stderr_when(json_output):
|
|
418
432
|
state = engine.resume(run_id, inputs or None)
|
|
419
433
|
except FileNotFoundError:
|
|
420
|
-
|
|
434
|
+
err.print(f"[red]Error:[/red] Run not found: {run_id}")
|
|
421
435
|
raise typer.Exit(1)
|
|
422
436
|
except ValueError as exc:
|
|
423
|
-
|
|
437
|
+
err.print(f"[red]Error:[/red] {exc}")
|
|
424
438
|
raise typer.Exit(1)
|
|
425
439
|
except Exception as exc:
|
|
426
|
-
|
|
440
|
+
err.print(f"[red]Resume failed:[/red] {exc}")
|
|
427
441
|
raise typer.Exit(1)
|
|
428
442
|
|
|
429
443
|
if json_output:
|
{specify_cli-0.12.6 → specify_cli-0.12.7}/src/specify_cli/workflows/steps/fan_in/__init__.py
RENAMED
|
@@ -58,4 +58,13 @@ class FanInStep(StepBase):
|
|
|
58
58
|
f"Fan-in step {config.get('id', '?')!r}: "
|
|
59
59
|
f"'wait_for' must be a non-empty list of step IDs."
|
|
60
60
|
)
|
|
61
|
+
output = config.get("output")
|
|
62
|
+
if output is not None and not isinstance(output, dict):
|
|
63
|
+
# execute() silently coerces a non-mapping output to {}, so the
|
|
64
|
+
# author's declared aggregation keys would vanish with no error.
|
|
65
|
+
# Reject at validation, mirroring the command-step (#3262) fix.
|
|
66
|
+
errors.append(
|
|
67
|
+
f"Fan-in step {config.get('id', '?')!r}: 'output' must be a "
|
|
68
|
+
f"mapping of key -> expression, got {type(output).__name__}."
|
|
69
|
+
)
|
|
61
70
|
return errors
|
|
@@ -90,6 +90,16 @@ class ShellStep(StepBase):
|
|
|
90
90
|
errors.append(
|
|
91
91
|
f"Shell step {config.get('id', '?')!r} is missing 'run' field."
|
|
92
92
|
)
|
|
93
|
+
elif not isinstance(config["run"], str):
|
|
94
|
+
# execute() str()-coerces run and invokes it under shell=True, so a
|
|
95
|
+
# null or list 'run' would run the Python repr ('None', "['echo']")
|
|
96
|
+
# as a command. Reject non-strings at validation, mirroring the
|
|
97
|
+
# command-step input/options and gate options type checks. An
|
|
98
|
+
# expression like "{{ ... }}" is still a str, so it stays valid.
|
|
99
|
+
errors.append(
|
|
100
|
+
f"Shell step {config.get('id', '?')!r}: 'run' must be a string, "
|
|
101
|
+
f"got {type(config['run']).__name__}."
|
|
102
|
+
)
|
|
93
103
|
output_format = config.get("output_format")
|
|
94
104
|
if output_format is not None and output_format != "json":
|
|
95
105
|
errors.append(
|
|
@@ -220,3 +220,68 @@ def test_pre_existing_component_is_not_attributed_or_removed(tmp_path: Path):
|
|
|
220
220
|
|
|
221
221
|
remove_bundle(tmp_path, "demo-bundle", installer)
|
|
222
222
|
assert ("extensions", "ext-a") in installer.installed
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _bundle(manifest_id, ext_ids, *, version="1.0.0"):
|
|
226
|
+
data = valid_manifest_dict()
|
|
227
|
+
data["bundle"]["id"] = manifest_id
|
|
228
|
+
data["bundle"]["version"] = version
|
|
229
|
+
data["provides"] = {
|
|
230
|
+
"extensions": [{"id": e, "version": version} for e in ext_ids]
|
|
231
|
+
}
|
|
232
|
+
return BundleManifest.from_dict(data)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def test_update_uninstalls_components_dropped_by_new_version(tmp_path: Path):
|
|
236
|
+
"""`bundle update` must uninstall components the new version no longer
|
|
237
|
+
ships, instead of orphaning them (installed on disk, tracked by nothing)."""
|
|
238
|
+
make_project(tmp_path)
|
|
239
|
+
installer = FakeInstaller()
|
|
240
|
+
|
|
241
|
+
man_v1 = _bundle("demo", ["ext-a", "ext-b"])
|
|
242
|
+
install_bundle(tmp_path, _plan(man_v1), installer, manifest=man_v1)
|
|
243
|
+
assert ("extensions", "ext-b") in installer.installed
|
|
244
|
+
|
|
245
|
+
man_v2 = _bundle("demo", ["ext-a"], version="2.0.0")
|
|
246
|
+
result = install_bundle(
|
|
247
|
+
tmp_path, _plan(man_v2), installer, manifest=man_v2, refresh=True
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
# ext-b was dropped by v2 -> uninstalled and reported.
|
|
251
|
+
assert ("extensions", "ext-b") in installer.remove_calls
|
|
252
|
+
assert ("extensions", "ext-b") in {(c.kind, c.id) for c in result.uninstalled}
|
|
253
|
+
assert ("extensions", "ext-b") not in installer.installed
|
|
254
|
+
assert ("extensions", "ext-a") in installer.installed
|
|
255
|
+
|
|
256
|
+
# The saved record lists only ext-a.
|
|
257
|
+
rec = next(r for r in load_records(tmp_path) if r.bundle_id == "demo")
|
|
258
|
+
keys = {(c.kind, c.id) for c in rec.contributed_components}
|
|
259
|
+
assert ("extensions", "ext-a") in keys
|
|
260
|
+
assert ("extensions", "ext-b") not in keys
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def test_update_keeps_component_still_needed_by_sibling_bundle(tmp_path: Path):
|
|
264
|
+
"""A dropped component still owned by another bundle stays installed."""
|
|
265
|
+
make_project(tmp_path)
|
|
266
|
+
installer = FakeInstaller()
|
|
267
|
+
|
|
268
|
+
man_sib = _bundle("sibling", ["ext-b"])
|
|
269
|
+
install_bundle(tmp_path, _plan(man_sib), installer, manifest=man_sib)
|
|
270
|
+
|
|
271
|
+
man_v1 = _bundle("demo", ["ext-a", "ext-b"])
|
|
272
|
+
install_bundle(tmp_path, _plan(man_v1), installer, manifest=man_v1)
|
|
273
|
+
|
|
274
|
+
man_v2 = _bundle("demo", ["ext-a"], version="2.0.0")
|
|
275
|
+
install_bundle(
|
|
276
|
+
tmp_path, _plan(man_v2), installer, manifest=man_v2, refresh=True
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
# ext-b is still needed by 'sibling' -> not removed, stays installed.
|
|
280
|
+
assert ("extensions", "ext-b") not in installer.remove_calls
|
|
281
|
+
assert ("extensions", "ext-b") in installer.installed
|
|
282
|
+
|
|
283
|
+
# But demo's record no longer attributes it.
|
|
284
|
+
rec = next(r for r in load_records(tmp_path) if r.bundle_id == "demo")
|
|
285
|
+
assert ("extensions", "ext-b") not in {
|
|
286
|
+
(c.kind, c.id) for c in rec.contributed_components
|
|
287
|
+
}
|
|
@@ -81,6 +81,26 @@ class TestAgyBuildExecArgs:
|
|
|
81
81
|
result = i.build_exec_args("my prompt", output_json=False)
|
|
82
82
|
assert result == ["agy", "--print", "my prompt"]
|
|
83
83
|
|
|
84
|
+
def test_build_exec_args_honors_extra_args(self, monkeypatch):
|
|
85
|
+
"""SPECKIT_INTEGRATION_AGY_EXTRA_ARGS must be appended after the prompt.
|
|
86
|
+
|
|
87
|
+
agy previously skipped _apply_extra_args_env_var entirely, so the
|
|
88
|
+
documented per-integration extra-args hook was silently ignored
|
|
89
|
+
(same class as the merged cursor-agent fix #3265).
|
|
90
|
+
"""
|
|
91
|
+
from specify_cli.integrations import get_integration
|
|
92
|
+
monkeypatch.setenv("SPECKIT_INTEGRATION_AGY_EXTRA_ARGS", "--verbose")
|
|
93
|
+
i = get_integration("agy")
|
|
94
|
+
assert i.build_exec_args("my prompt") == [
|
|
95
|
+
"agy", "--print", "my prompt", "--verbose",
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
def test_build_exec_args_honors_executable_override(self, monkeypatch):
|
|
99
|
+
from specify_cli.integrations import get_integration
|
|
100
|
+
monkeypatch.setenv("SPECKIT_INTEGRATION_AGY_EXECUTABLE", "/custom/agy")
|
|
101
|
+
i = get_integration("agy")
|
|
102
|
+
assert i.build_exec_args("my prompt")[0] == "/custom/agy"
|
|
103
|
+
|
|
84
104
|
|
|
85
105
|
class TestAgyHookCommandNote:
|
|
86
106
|
"""Verify dot-to-hyphen normalization note is injected into hook sections."""
|