specify-cli 0.11.6__tar.gz → 0.11.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.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/agent_request.yml +1 -1
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/feature_request.yml +1 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/CHANGELOG.md +15 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/PKG-INFO +2 -2
- {specify_cli-0.11.6 → specify_cli-0.11.7}/README.md +1 -1
- specify_cli-0.11.7/docs/guides/monorepo.md +111 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/installation.md +2 -1
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/integrations.md +1 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/workflows.md +2 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/toc.yml +2 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/upgrade.md +5 -1
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-PUBLISHING-GUIDE.md +1 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/catalog.json +10 -1
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/PUBLISHING.md +1 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/pyproject.toml +11 -1
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/check-prerequisites.ps1 +6 -6
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/create-new-feature.ps1 +5 -2
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_utils.py +21 -4
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/agents.py +34 -4
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/extensions/__init__.py +14 -5
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/__init__.py +2 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/base.py +3 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/codex/__init__.py +1 -0
- specify_cli-0.11.7/src/specify_cli/integrations/omp/__init__.py +45 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/presets/__init__.py +5 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/shared_infra.py +71 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/engine.py +51 -3
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/shell/__init__.py +1 -1
- specify_cli-0.11.7/tests/integrations/test_integration_omp.py +31 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_agent_config_consistency.py +7 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_check_prerequisites_paths_only.py +60 -4
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extension_skills.py +78 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extensions.py +255 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_presets.py +84 -0
- specify_cli-0.11.7/tests/test_shared_infra_integrity.py +101 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_timestamp_branches.py +46 -0
- specify_cli-0.11.7/tests/test_utils.py +15 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_workflows.py +142 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/PUBLISHING.md +12 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.editorconfig +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.gitattributes +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/CODEOWNERS +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/dependabot.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/release.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/test.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.gitignore +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/.zenodo.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/AGENTS.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/CITATION.cff +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/DEVELOPMENT.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/LICENSE +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/SECURITY.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/SUPPORT.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/.gitignore +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/extensions.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/friends.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/overview.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/presets.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/docfx.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/index.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/one-time.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/pipx.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/uv.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/local-development.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/quickstart.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/authentication.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/bundles.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/core.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/extensions.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/overview.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/presets.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/template/public/main.css +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/catalog.community.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/catalog.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/extension.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/.gitignore +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/LICENSE +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/extension.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/catalog.community.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/media/logo_large.webp +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/media/logo_small.webp +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/media/specify_cli.gif +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-April.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-February.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-March.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-May.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/catalog.community.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/catalog.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/preset.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/common.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/spec-driven.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/spec-kit.code-workspace +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/commands/init.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/iflow/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/roo/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/checklist-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/analyze.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/checklist.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/clarify.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/constitution.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/converge.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/implement.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/plan.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/specify.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/tasks.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/constitution-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/plan-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/spec-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/tasks-template.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/vscode-settings.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/auth_helpers.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/conftest.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/plan.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/spec.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/http_helpers.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_iflow.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_roo.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_windsurf.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_authentication.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_check_tool.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_cli_version.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_commands_package.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_console_imports.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_github_http.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_init_dir.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_merge.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_upgrade.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_version_imports.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/README.md +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/catalog.community.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/catalog.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/step-catalog.json +0 -0
|
@@ -8,7 +8,7 @@ body:
|
|
|
8
8
|
value: |
|
|
9
9
|
Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
|
|
10
10
|
|
|
11
|
-
**Currently supported agents**: Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Cursor, Devin for Terminal, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Hermes Agent, IBM Bob, iFlow CLI, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, Roo Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, Windsurf, ZCode, Zed
|
|
11
|
+
**Currently supported agents**: Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Cursor, Devin for Terminal, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Hermes Agent, IBM Bob, iFlow CLI, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, Roo Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, Windsurf, ZCode, Zed
|
|
12
12
|
|
|
13
13
|
- type: input
|
|
14
14
|
id: agent-name
|
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.11.7] - 2026-06-24
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- feat(extensions): verify catalog archive sha256 before install (#3080)
|
|
10
|
+
- fix(workflows): validate requires keys and reject phantom permissions gate (#3079)
|
|
11
|
+
- fix(scripts): use case-sensitive match for acronym retention in PS branch names (#3130)
|
|
12
|
+
- feat(integrations): add omp support (#3107)
|
|
13
|
+
- fix: render valid TOML when a command body contains backslashes (#3135)
|
|
14
|
+
- harden: reject shell=True in run_command (#3132)
|
|
15
|
+
- docs: add monorepo guide (#3084)
|
|
16
|
+
- fix(scripts): send check-prerequisites.ps1 errors to stderr (#3123)
|
|
17
|
+
- fix: write Codex dev skills as files (#2988)
|
|
18
|
+
- chore: release 0.11.6, begin 0.11.7.dev0 development (#3121)
|
|
19
|
+
|
|
5
20
|
## [0.11.6] - 2026-06-23
|
|
6
21
|
|
|
7
22
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specify-cli
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.7
|
|
4
4
|
Summary: Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD).
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -423,7 +423,7 @@ specify init . --force --integration copilot
|
|
|
423
423
|
specify init --here --force --integration copilot
|
|
424
424
|
```
|
|
425
425
|
|
|
426
|
-
The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
|
|
426
|
+
The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
|
|
427
427
|
|
|
428
428
|
```bash
|
|
429
429
|
specify init <project_name> --integration copilot --ignore-agent-tools
|
|
@@ -403,7 +403,7 @@ specify init . --force --integration copilot
|
|
|
403
403
|
specify init --here --force --integration copilot
|
|
404
404
|
```
|
|
405
405
|
|
|
406
|
-
The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
|
|
406
|
+
The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
|
|
407
407
|
|
|
408
408
|
```bash
|
|
409
409
|
specify init <project_name> --integration copilot --ignore-agent-tools
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Using Spec Kit in a Monorepo
|
|
2
|
+
|
|
3
|
+
A Spec Kit project is **directory-scoped**: the project is whichever directory
|
|
4
|
+
contains `.specify/`. A monorepo can hold several independent Spec Kit projects
|
|
5
|
+
under one repository root, each with its own `.specify/`, `specs/`, constitution,
|
|
6
|
+
and feature numbering.
|
|
7
|
+
|
|
8
|
+
Root resolution already prefers the **nearest** `.specify/` over the Git
|
|
9
|
+
toplevel, so commands run from inside a member project resolve to that project,
|
|
10
|
+
not the repo root.
|
|
11
|
+
|
|
12
|
+
## Layout
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
my-monorepo/
|
|
16
|
+
├── .git/ # one Git repository at the root
|
|
17
|
+
├── apps/
|
|
18
|
+
│ ├── web/
|
|
19
|
+
│ │ └── .specify/ # Spec Kit project "web"
|
|
20
|
+
│ │ └── memory/constitution.md
|
|
21
|
+
│ └── api/
|
|
22
|
+
│ └── .specify/ # Spec Kit project "api"
|
|
23
|
+
│ └── memory/constitution.md
|
|
24
|
+
└── packages/
|
|
25
|
+
└── ui/
|
|
26
|
+
└── .specify/ # Spec Kit project "ui"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Initialize each member project independently:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
specify init apps/web --integration claude
|
|
33
|
+
specify init apps/api --integration claude
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Each project keeps its own `specs/` directory and numbers features
|
|
37
|
+
independently (`apps/web/specs/001-…`, `apps/api/specs/001-…`).
|
|
38
|
+
|
|
39
|
+
## Working inside a member project
|
|
40
|
+
|
|
41
|
+
The default workflow is unchanged: change into the project directory and run the
|
|
42
|
+
slash commands. Root resolution finds the nearest `.specify/`.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cd apps/web
|
|
46
|
+
# then run /speckit.specify, /speckit.plan, … in your agent
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Targeting a member project from the repo root
|
|
50
|
+
|
|
51
|
+
For non-interactive or CI runs where you do not want to `cd`, set
|
|
52
|
+
**`SPECIFY_INIT_DIR`** to the member project root (the directory *containing*
|
|
53
|
+
`.specify/`). Relative paths resolve against the current directory.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# operate on apps/web from the monorepo root (no cd required)
|
|
57
|
+
export SPECIFY_INIT_DIR=apps/web
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The path must exist and contain `.specify/`. If it does not, the command
|
|
61
|
+
**errors and does not fall back** to the current directory or the Git toplevel.
|
|
62
|
+
This is deliberate: a typo never writes specs into the wrong project. A
|
|
63
|
+
nonexistent path is reported as you typed it; a path that exists but is not a
|
|
64
|
+
Spec Kit project is reported as its resolved absolute path:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
# SPECIFY_INIT_DIR=apps/wbe (typo: no such directory)
|
|
68
|
+
ERROR: SPECIFY_INIT_DIR does not point to an existing directory: apps/wbe
|
|
69
|
+
|
|
70
|
+
# SPECIFY_INIT_DIR=apps (exists, but has no .specify/ of its own)
|
|
71
|
+
ERROR: SPECIFY_INIT_DIR is not a Spec Kit project (no .specify/ directory): /home/you/my-monorepo/apps
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`SPECIFY_INIT_DIR` selects the **project**; `SPECIFY_FEATURE_DIRECTORY` selects
|
|
75
|
+
the **feature** within it. They compose: set both to pick a project and a
|
|
76
|
+
feature non-interactively. See the
|
|
77
|
+
[`SPECIFY_INIT_DIR` reference](../reference/core.md#environment-variables) for
|
|
78
|
+
the full contract and the two-axes model.
|
|
79
|
+
|
|
80
|
+
## How `SPECIFY_INIT_DIR` reaches your agent
|
|
81
|
+
|
|
82
|
+
`SPECIFY_INIT_DIR` is read by the shell scripts that the slash commands invoke
|
|
83
|
+
(`get_repo_root` in Bash, `Get-RepoRoot` in PowerShell). It takes effect only
|
|
84
|
+
when it is present in the environment of the shell that runs those scripts.
|
|
85
|
+
|
|
86
|
+
- **Scripted / CI runs:** export it in the same shell that drives the commands;
|
|
87
|
+
it is reliable there.
|
|
88
|
+
- **Interactive agents:** whether an exported variable reaches the shell tool an
|
|
89
|
+
agent uses is agent-specific. Export `SPECIFY_INIT_DIR` *before* launching the
|
|
90
|
+
agent, and verify once (e.g. run `/speckit.specify` and confirm the new feature
|
|
91
|
+
landed under the intended project's `specs/`).
|
|
92
|
+
|
|
93
|
+
## Git in a monorepo
|
|
94
|
+
|
|
95
|
+
> [!NOTE]
|
|
96
|
+
> Spec Kit project files are scoped to the **resolved project root**, but Git
|
|
97
|
+
> operations still run in the containing Git work tree. In a monorepo with a
|
|
98
|
+
> single Git repository at the root and projects in subdirectories, feature
|
|
99
|
+
> branch creation creates or switches branches in the shared root repository.
|
|
100
|
+
> Spec directories still live under the selected member project, while the Git
|
|
101
|
+
> branch namespace is shared by the whole monorepo. Manage branches and commits
|
|
102
|
+
> at the repository root, or initialize Git per member project if you want
|
|
103
|
+
> isolated per-project branch namespaces.
|
|
104
|
+
|
|
105
|
+
## Constitutions
|
|
106
|
+
|
|
107
|
+
Each member project has its own `.specify/memory/constitution.md` and
|
|
108
|
+
`/speckit.constitution` edits the local project's file. Spec Kit does not provide
|
|
109
|
+
a built-in base/inheritance mechanism; if you want one constitution to reference
|
|
110
|
+
shared rules elsewhere in the monorepo, you need to maintain that wiring yourself.
|
|
111
|
+
Otherwise, duplicate or sync shared engineering rules per project.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Prerequisites
|
|
4
4
|
|
|
5
5
|
- **Linux/macOS** (or Windows; PowerShell scripts now supported without WSL)
|
|
6
|
-
- AI coding agent: [Claude Code](https://www.anthropic.com/claude-code), [GitHub Copilot](https://code.visualstudio.com/), [Codebuddy CLI](https://www.codebuddy.ai/cli), [Gemini CLI](https://github.com/google-gemini/gemini-cli),
|
|
6
|
+
- AI coding agent: [Claude Code](https://www.anthropic.com/claude-code), [GitHub Copilot](https://code.visualstudio.com/), [Codebuddy CLI](https://www.codebuddy.ai/cli), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Pi Coding Agent](https://pi.dev), or [Oh My Pi](https://www.npmjs.com/package/@oh-my-pi/pi-coding-agent)
|
|
7
7
|
- [uv](https://docs.astral.sh/uv/) for package management (recommended) or [pipx](https://pipx.pypa.io/) for persistent installation
|
|
8
8
|
- [Python 3.11+](https://www.python.org/downloads/)
|
|
9
9
|
- [Git](https://git-scm.com/downloads) _(optional — required only when the git extension is enabled)_
|
|
@@ -51,6 +51,7 @@ specify init <project_name> --integration gemini
|
|
|
51
51
|
specify init <project_name> --integration copilot
|
|
52
52
|
specify init <project_name> --integration codebuddy
|
|
53
53
|
specify init <project_name> --integration pi
|
|
54
|
+
specify init <project_name> --integration omp
|
|
54
55
|
```
|
|
55
56
|
|
|
56
57
|
### Specify Script Type (Shell vs PowerShell)
|
|
@@ -29,6 +29,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
29
29
|
| [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
|
|
30
30
|
| [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
|
|
31
31
|
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
|
|
32
|
+
| [Oh My Pi](https://www.npmjs.com/package/@oh-my-pi/pi-coding-agent) | `omp` | Installs slash commands into `.omp/commands` |
|
|
32
33
|
| [opencode](https://opencode.ai/) | `opencode` | |
|
|
33
34
|
| [Pi Coding Agent](https://pi.dev) | `pi` | Pi doesn't have MCP support out of the box, so `taskstoissues` won't work as intended. MCP support can be added via [extensions](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent#extensions) |
|
|
34
35
|
| [Qoder CLI](https://qoder.com/cli) | `qodercli` | |
|
|
@@ -270,6 +270,8 @@ specify workflow run speckit -i spec="Build a kanban board with drag-and-drop ta
|
|
|
270
270
|
| `fan-out` | Dispatch a step for each item in a list |
|
|
271
271
|
| `fan-in` | Aggregate results from a fan-out step |
|
|
272
272
|
|
|
273
|
+
> **Security note:** a `shell` step runs a local command with **your** privileges. There is no capability sandbox — `requires` is an advisory pre-condition block (spec-kit version, integrations), not a runtime gate, so it does **not** restrict what a step can do. In particular there is no `requires.permissions` capability gate: it is rejected by validation precisely because it would imply a sandbox that does not exist. Review any catalog or downloaded workflow before running it, and use a `gate` step to require explicit approval before sensitive or destructive shell commands.
|
|
274
|
+
|
|
273
275
|
## Expressions
|
|
274
276
|
|
|
275
277
|
Steps can reference inputs and previous step outputs using `{{ expression }}` syntax:
|
|
@@ -308,6 +308,7 @@ Alternatively, run the `/speckit.specify` command which creates `.specify/featur
|
|
|
308
308
|
ls -la .gemini/commands/ # Gemini
|
|
309
309
|
ls -la .cursor/skills/ # Cursor
|
|
310
310
|
ls -la .pi/prompts/ # Pi Coding Agent
|
|
311
|
+
ls -la .omp/commands/ # Oh My Pi
|
|
311
312
|
```
|
|
312
313
|
|
|
313
314
|
3. **Check agent-specific setup:**
|
|
@@ -427,7 +428,7 @@ The `specify` CLI tool is used for:
|
|
|
427
428
|
- **Upgrades:** `specify init --here --force` to update templates and commands
|
|
428
429
|
- **Diagnostics:** `specify check` to verify tool installation
|
|
429
430
|
|
|
430
|
-
Once you've run `specify init`, the slash commands (like `/speckit.specify`, `/speckit.plan`, etc.) are **permanently installed** in your project's agent folder (`.claude/`, `.github/prompts/`, `.pi/prompts/`, etc.). Your AI coding agent reads these command files directly—no need to run `specify` again.
|
|
431
|
+
Once you've run `specify init`, the slash commands (like `/speckit.specify`, `/speckit.plan`, etc.) are **permanently installed** in your project's agent folder (`.claude/`, `.github/prompts/`, `.pi/prompts/`, `.omp/commands/`, etc.). Your AI coding agent reads these command files directly—no need to run `specify` again.
|
|
431
432
|
|
|
432
433
|
**If your agent isn't recognizing slash commands:**
|
|
433
434
|
|
|
@@ -442,6 +443,9 @@ Once you've run `specify init`, the slash commands (like `/speckit.specify`, `/s
|
|
|
442
443
|
|
|
443
444
|
# For Pi
|
|
444
445
|
ls -la .pi/prompts/
|
|
446
|
+
|
|
447
|
+
# For Oh My Pi
|
|
448
|
+
ls -la .omp/commands/
|
|
445
449
|
```
|
|
446
450
|
|
|
447
451
|
2. **Restart your IDE/editor completely** (not just reload window)
|
|
@@ -320,6 +320,7 @@ A: Extensions should be free and open-source. Commercial support/services are al
|
|
|
320
320
|
"author": "string (required)",
|
|
321
321
|
"version": "string (required, semver)",
|
|
322
322
|
"download_url": "string (required, valid URL)",
|
|
323
|
+
"sha256": "string (optional, SHA-256 hex digest of the archive at download_url; verified before install)",
|
|
323
324
|
"repository": "string (required, valid URL)",
|
|
324
325
|
"homepage": "string (optional, valid URL)",
|
|
325
326
|
"documentation": "string (optional, valid URL)",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
|
-
"updated_at": "2026-06-
|
|
3
|
+
"updated_at": "2026-06-23T00:00:00Z",
|
|
4
4
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json",
|
|
5
5
|
"integrations": {
|
|
6
6
|
"claude": {
|
|
@@ -255,6 +255,15 @@
|
|
|
255
255
|
"repository": "https://github.com/github/spec-kit",
|
|
256
256
|
"tags": ["cli"]
|
|
257
257
|
},
|
|
258
|
+
"omp": {
|
|
259
|
+
"id": "omp",
|
|
260
|
+
"name": "Oh My Pi",
|
|
261
|
+
"version": "1.0.0",
|
|
262
|
+
"description": "Oh My Pi (omp) terminal coding agent prompt-based integration",
|
|
263
|
+
"author": "spec-kit-core",
|
|
264
|
+
"repository": "https://github.com/github/spec-kit",
|
|
265
|
+
"tags": ["cli"]
|
|
266
|
+
},
|
|
258
267
|
"iflow": {
|
|
259
268
|
"id": "iflow",
|
|
260
269
|
"name": "iFlow CLI",
|
|
@@ -185,6 +185,7 @@ Edit `presets/catalog.community.json` and add your preset.
|
|
|
185
185
|
"author": "Your Name",
|
|
186
186
|
"version": "1.0.0",
|
|
187
187
|
"download_url": "https://github.com/your-org/spec-kit-preset-your-preset/archive/refs/tags/v1.0.0.zip",
|
|
188
|
+
"sha256": "OPTIONAL: SHA-256 hex digest of the archive above; verified before install",
|
|
188
189
|
"repository": "https://github.com/your-org/spec-kit-preset-your-preset",
|
|
189
190
|
"license": "MIT",
|
|
190
191
|
"requires": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "specify-cli"
|
|
3
|
-
version = "0.11.
|
|
3
|
+
version = "0.11.7"
|
|
4
4
|
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -74,3 +74,13 @@ precision = 2
|
|
|
74
74
|
show_missing = true
|
|
75
75
|
skip_covered = false
|
|
76
76
|
|
|
77
|
+
[tool.ruff.lint]
|
|
78
|
+
# Lock in subprocess security posture: any reintroduction of shell=True
|
|
79
|
+
# (or os.system / popen2) must be acknowledged with an explicit `# noqa`
|
|
80
|
+
# pointing at the rule, making the deviation visible in review.
|
|
81
|
+
extend-select = [
|
|
82
|
+
"S602", # subprocess-popen-with-shell-equals-true
|
|
83
|
+
"S604", # call-with-shell-equals-true
|
|
84
|
+
"S605", # start-process-with-a-shell
|
|
85
|
+
]
|
|
86
|
+
|
|
@@ -83,24 +83,24 @@ if ($PathsOnly) {
|
|
|
83
83
|
|
|
84
84
|
# Validate required directories and files
|
|
85
85
|
if (-not (Test-Path $paths.FEATURE_DIR -PathType Container)) {
|
|
86
|
-
|
|
86
|
+
[Console]::Error.WriteLine("ERROR: Feature directory not found: $($paths.FEATURE_DIR)")
|
|
87
87
|
$specifyCommand = Format-SpecKitCommand -CommandName 'specify' -RepoRoot $paths.REPO_ROOT
|
|
88
|
-
|
|
88
|
+
[Console]::Error.WriteLine("Run $specifyCommand first to create the feature structure.")
|
|
89
89
|
exit 1
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
|
|
93
|
-
|
|
93
|
+
[Console]::Error.WriteLine("ERROR: plan.md not found in $($paths.FEATURE_DIR)")
|
|
94
94
|
$planCommand = Format-SpecKitCommand -CommandName 'plan' -RepoRoot $paths.REPO_ROOT
|
|
95
|
-
|
|
95
|
+
[Console]::Error.WriteLine("Run $planCommand first to create the implementation plan.")
|
|
96
96
|
exit 1
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
# Check for tasks.md if required
|
|
100
100
|
if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
|
|
101
|
-
|
|
101
|
+
[Console]::Error.WriteLine("ERROR: tasks.md not found in $($paths.FEATURE_DIR)")
|
|
102
102
|
$tasksCommand = Format-SpecKitCommand -CommandName 'tasks' -RepoRoot $paths.REPO_ROOT
|
|
103
|
-
|
|
103
|
+
[Console]::Error.WriteLine("Run $tasksCommand first to create the task list.")
|
|
104
104
|
exit 1
|
|
105
105
|
}
|
|
106
106
|
|
|
@@ -111,8 +111,11 @@ function Get-BranchName {
|
|
|
111
111
|
# Keep words that are length >= 3 OR appear as uppercase in original (likely acronyms)
|
|
112
112
|
if ($word.Length -ge 3) {
|
|
113
113
|
$meaningfulWords += $word
|
|
114
|
-
} elseif ($Description -
|
|
115
|
-
# Keep short words if they appear as uppercase in original (likely
|
|
114
|
+
} elseif ($Description -cmatch "\b$($word.ToUpper())\b") {
|
|
115
|
+
# Keep short words only if they appear as uppercase in original (likely
|
|
116
|
+
# acronyms). Use -cmatch so the comparison is case-sensitive, matching the
|
|
117
|
+
# bash script's case-sensitive grep; -match would be case-insensitive and
|
|
118
|
+
# would keep every short word.
|
|
116
119
|
$meaningfulWords += $word
|
|
117
120
|
}
|
|
118
121
|
}
|
|
@@ -65,14 +65,31 @@ def dump_frontmatter(data: dict[str, Any]) -> str:
|
|
|
65
65
|
return yaml.safe_dump(data, sort_keys=False, allow_unicode=True).strip()
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def run_command(
|
|
69
|
-
|
|
68
|
+
def run_command(
|
|
69
|
+
cmd: list[str],
|
|
70
|
+
check_return: bool = True,
|
|
71
|
+
capture: bool = False,
|
|
72
|
+
shell: bool = False,
|
|
73
|
+
) -> str | None:
|
|
74
|
+
"""Run a command without invoking a shell and optionally capture output.
|
|
75
|
+
|
|
76
|
+
The ``shell`` parameter is kept in the signature so existing keyword
|
|
77
|
+
callers (and the re-export from ``specify_cli``) don't raise ``TypeError``,
|
|
78
|
+
but only the default ``shell=False`` is honoured. ``shell=True`` is
|
|
79
|
+
rejected with ``ValueError`` rather than silently ignored, so the
|
|
80
|
+
unsupported mode fails loudly instead of running with a different meaning.
|
|
81
|
+
"""
|
|
82
|
+
if shell:
|
|
83
|
+
raise ValueError(
|
|
84
|
+
"run_command() does not support shell=True; pass argv as a list"
|
|
85
|
+
)
|
|
86
|
+
|
|
70
87
|
try:
|
|
71
88
|
if capture:
|
|
72
|
-
result = subprocess.run(cmd, check=check_return, capture_output=True, text=True
|
|
89
|
+
result = subprocess.run(cmd, check=check_return, capture_output=True, text=True)
|
|
73
90
|
return result.stdout.strip()
|
|
74
91
|
else:
|
|
75
|
-
subprocess.run(cmd, check=check_return
|
|
92
|
+
subprocess.run(cmd, check=check_return)
|
|
76
93
|
return None
|
|
77
94
|
except subprocess.CalledProcessError as e:
|
|
78
95
|
if check_return:
|
|
@@ -37,6 +37,8 @@ def _build_agent_configs() -> dict[str, Any]:
|
|
|
37
37
|
# when register_commands() resolves __SPECKIT_COMMAND_*__ tokens.
|
|
38
38
|
if "invoke_separator" not in config:
|
|
39
39
|
config["invoke_separator"] = integration.invoke_separator
|
|
40
|
+
if integration.dev_no_symlink:
|
|
41
|
+
config["dev_no_symlink"] = True
|
|
40
42
|
configs[key] = config
|
|
41
43
|
return configs
|
|
42
44
|
|
|
@@ -234,9 +236,14 @@ class CommandRegistrar:
|
|
|
234
236
|
toml_lines.append(f"# Source: {source_id}")
|
|
235
237
|
toml_lines.append("")
|
|
236
238
|
|
|
237
|
-
# Keep TOML output valid even when body contains triple-quote delimiters
|
|
238
|
-
# Prefer multiline forms, then fall back to escaped basic
|
|
239
|
-
|
|
239
|
+
# Keep TOML output valid even when body contains triple-quote delimiters
|
|
240
|
+
# or backslashes. Prefer multiline forms, then fall back to escaped basic
|
|
241
|
+
# string. A multiline *basic* string ("""...""") processes backslash escape
|
|
242
|
+
# sequences, so a body containing a backslash (e.g. a Windows path
|
|
243
|
+
# ``C:\\Users\\...`` whose ``\\U`` reads as an invalid unicode escape) would
|
|
244
|
+
# produce unparseable TOML — route those to the *literal* form ('''...'''),
|
|
245
|
+
# which does not process escapes, or to the escaped basic string.
|
|
246
|
+
if '"""' not in body and "\\" not in body:
|
|
240
247
|
toml_lines.append('prompt = """')
|
|
241
248
|
toml_lines.append(body)
|
|
242
249
|
toml_lines.append('"""')
|
|
@@ -714,6 +721,7 @@ class CommandRegistrar:
|
|
|
714
721
|
output_name,
|
|
715
722
|
agent_config["extension"],
|
|
716
723
|
link_outputs,
|
|
724
|
+
agent_config,
|
|
717
725
|
)
|
|
718
726
|
|
|
719
727
|
if agent_name == "copilot":
|
|
@@ -788,6 +796,7 @@ class CommandRegistrar:
|
|
|
788
796
|
alias_output_name,
|
|
789
797
|
agent_config["extension"],
|
|
790
798
|
link_outputs,
|
|
799
|
+
agent_config,
|
|
791
800
|
)
|
|
792
801
|
if agent_name == "copilot":
|
|
793
802
|
self.write_copilot_prompt(project_root, alias)
|
|
@@ -804,9 +813,12 @@ class CommandRegistrar:
|
|
|
804
813
|
output_name: str,
|
|
805
814
|
extension: str,
|
|
806
815
|
link_outputs: bool,
|
|
816
|
+
agent_config: dict[str, Any] | None = None,
|
|
807
817
|
) -> None:
|
|
808
818
|
"""Write a rendered agent artifact, optionally as a dev-mode symlink."""
|
|
809
|
-
if not link_outputs:
|
|
819
|
+
if not link_outputs or (agent_config or {}).get("dev_no_symlink"):
|
|
820
|
+
if dest_file.is_symlink():
|
|
821
|
+
dest_file.unlink()
|
|
810
822
|
dest_file.write_text(content, encoding="utf-8")
|
|
811
823
|
return
|
|
812
824
|
|
|
@@ -927,6 +939,16 @@ class CommandRegistrar:
|
|
|
927
939
|
self._active_skills_agent(project_root)
|
|
928
940
|
if create_missing_active_skills_dir else None
|
|
929
941
|
)
|
|
942
|
+
active_skills_dir: Optional[Path] = None
|
|
943
|
+
if active_skills_agent:
|
|
944
|
+
active_skills_config = self.AGENT_CONFIGS.get(active_skills_agent)
|
|
945
|
+
if (
|
|
946
|
+
active_skills_config
|
|
947
|
+
and active_skills_config.get("extension") == "/SKILL.md"
|
|
948
|
+
):
|
|
949
|
+
active_skills_dir = self._resolve_agent_dir(
|
|
950
|
+
active_skills_agent, active_skills_config, project_root,
|
|
951
|
+
)
|
|
930
952
|
active_created_skills_dir: Optional[Path] = None
|
|
931
953
|
for agent_name, agent_config in self.AGENT_CONFIGS.items():
|
|
932
954
|
active_skills_output = (
|
|
@@ -958,6 +980,14 @@ class CommandRegistrar:
|
|
|
958
980
|
agent_dir = self._resolve_agent_dir(
|
|
959
981
|
agent_name, agent_config, project_root,
|
|
960
982
|
)
|
|
983
|
+
shares_active_skills_dir = (
|
|
984
|
+
active_skills_dir is not None
|
|
985
|
+
and agent_name != active_skills_agent
|
|
986
|
+
and agent_config.get("extension") == "/SKILL.md"
|
|
987
|
+
and self._same_lexical_path(agent_dir, active_skills_dir)
|
|
988
|
+
)
|
|
989
|
+
if shares_active_skills_dir:
|
|
990
|
+
continue
|
|
961
991
|
|
|
962
992
|
agent_dir_existed = agent_dir.is_dir()
|
|
963
993
|
register_missing_active_skills_agent = (
|
|
@@ -31,6 +31,7 @@ from .._invocation_style import is_dollar_skills_agent, is_slash_skills_agent
|
|
|
31
31
|
from .._utils import dump_frontmatter, relative_extension_path_violation
|
|
32
32
|
from ..catalogs import CatalogEntry as BaseCatalogEntry
|
|
33
33
|
from ..catalogs import CatalogStackBase
|
|
34
|
+
from ..shared_infra import verify_archive_sha256
|
|
34
35
|
|
|
35
36
|
_FALLBACK_CORE_COMMAND_NAMES = frozenset(
|
|
36
37
|
{
|
|
@@ -997,6 +998,7 @@ class ExtensionManager:
|
|
|
997
998
|
if not isinstance(selected_ai, str) or not selected_ai:
|
|
998
999
|
return []
|
|
999
1000
|
registrar = CommandRegistrar()
|
|
1001
|
+
agent_config = registrar.AGENT_CONFIGS.get(selected_ai, {})
|
|
1000
1002
|
integration = get_integration(selected_ai)
|
|
1001
1003
|
|
|
1002
1004
|
for cmd_info in manifest.commands:
|
|
@@ -1030,15 +1032,16 @@ class ExtensionManager:
|
|
|
1030
1032
|
skill_file = skill_subdir / "SKILL.md"
|
|
1031
1033
|
cache_root = extension_dir / ".specify-dev" / "extension-skills"
|
|
1032
1034
|
cache_file = cache_root / skill_name / "SKILL.md"
|
|
1035
|
+
use_dev_symlink = link_outputs and not agent_config.get("dev_no_symlink")
|
|
1033
1036
|
CommandRegistrar._ensure_inside(cache_file, cache_root)
|
|
1034
1037
|
if skill_file.exists() or skill_file.is_symlink():
|
|
1038
|
+
is_expected_dev_symlink = self._is_expected_dev_symlink(
|
|
1039
|
+
skill_file, cache_file
|
|
1040
|
+
)
|
|
1035
1041
|
# Do not overwrite user-customized skills, but allow dev-mode
|
|
1036
1042
|
# symlinks that point back to this extension's generated cache
|
|
1037
1043
|
# to be refreshed on a subsequent dev install.
|
|
1038
|
-
if not
|
|
1039
|
-
link_outputs
|
|
1040
|
-
and self._is_expected_dev_symlink(skill_file, cache_file)
|
|
1041
|
-
):
|
|
1044
|
+
if not is_expected_dev_symlink:
|
|
1042
1045
|
continue
|
|
1043
1046
|
|
|
1044
1047
|
# Create skill directory; track whether we created it so we can clean
|
|
@@ -1093,7 +1096,7 @@ class ExtensionManager:
|
|
|
1093
1096
|
):
|
|
1094
1097
|
skill_content = integration.post_process_skill_content(skill_content)
|
|
1095
1098
|
|
|
1096
|
-
if
|
|
1099
|
+
if use_dev_symlink:
|
|
1097
1100
|
try:
|
|
1098
1101
|
cache_file.parent.mkdir(parents=True, exist_ok=True)
|
|
1099
1102
|
cache_file.write_text(skill_content, encoding="utf-8")
|
|
@@ -1106,6 +1109,8 @@ class ExtensionManager:
|
|
|
1106
1109
|
skill_file.unlink()
|
|
1107
1110
|
skill_file.write_text(skill_content, encoding="utf-8")
|
|
1108
1111
|
else:
|
|
1112
|
+
if skill_file.is_symlink():
|
|
1113
|
+
skill_file.unlink()
|
|
1109
1114
|
skill_file.write_text(skill_content, encoding="utf-8")
|
|
1110
1115
|
written.append(skill_name)
|
|
1111
1116
|
|
|
@@ -2617,6 +2622,10 @@ class ExtensionCatalog(CatalogStackBase):
|
|
|
2617
2622
|
) as response:
|
|
2618
2623
|
zip_data = response.read()
|
|
2619
2624
|
|
|
2625
|
+
verify_archive_sha256(
|
|
2626
|
+
zip_data, ext_info.get("sha256"), extension_id, ExtensionError
|
|
2627
|
+
)
|
|
2628
|
+
|
|
2620
2629
|
zip_path.write_bytes(zip_data)
|
|
2621
2630
|
return zip_path
|
|
2622
2631
|
|
|
@@ -70,6 +70,7 @@ def _register_builtins() -> None:
|
|
|
70
70
|
from .kimi import KimiIntegration
|
|
71
71
|
from .kiro_cli import KiroCliIntegration
|
|
72
72
|
from .lingma import LingmaIntegration
|
|
73
|
+
from .omp import OmpIntegration
|
|
73
74
|
from .opencode import OpencodeIntegration
|
|
74
75
|
from .pi import PiIntegration
|
|
75
76
|
from .qodercli import QodercliIntegration
|
|
@@ -108,6 +109,7 @@ def _register_builtins() -> None:
|
|
|
108
109
|
_register(KimiIntegration())
|
|
109
110
|
_register(KiroCliIntegration())
|
|
110
111
|
_register(LingmaIntegration())
|
|
112
|
+
_register(OmpIntegration())
|
|
111
113
|
_register(OpencodeIntegration())
|
|
112
114
|
_register(PiIntegration())
|
|
113
115
|
_register(QodercliIntegration())
|
|
@@ -119,6 +119,9 @@ class IntegrationBase(ABC):
|
|
|
119
119
|
invoke_separator: str = "."
|
|
120
120
|
"""Separator used in slash-command invocations (``"."`` → ``/speckit.plan``)."""
|
|
121
121
|
|
|
122
|
+
dev_no_symlink: bool = False
|
|
123
|
+
"""Whether dev-mode registration should write files instead of symlinks."""
|
|
124
|
+
|
|
122
125
|
multi_install_safe: bool = False
|
|
123
126
|
"""Whether this integration is declared safe to install alongside others.
|
|
124
127
|
|