specify-cli 0.11.10__tar.gz → 0.12.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/test.yml +3 -3
- {specify_cli-0.11.10 → specify_cli-0.12.1}/AGENTS.md +8 -11
- {specify_cli-0.11.10 → specify_cli-0.12.1}/CHANGELOG.md +30 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/PKG-INFO +2 -2
- {specify_cli-0.11.10 → specify_cli-0.12.1}/README.md +1 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/integrations.md +75 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/workflows.md +1 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/agent-context/README.md +8 -7
- specify_cli-0.12.1/extensions/agent-context/agent-context-defaults.json +42 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/agent-context/scripts/bash/update-agent-context.sh +115 -16
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +90 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/catalog.community.json +5 -5
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/bash/create-new-feature-branch.sh +1 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/bash/initialize-repo.sh +1 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +3 -2
- {specify_cli-0.11.10 → specify_cli-0.12.1}/pyproject.toml +1 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/bash/check-prerequisites.sh +8 -2
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/bash/common.sh +14 -2
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/bash/create-new-feature.sh +1 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/powershell/check-prerequisites.ps1 +8 -2
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/powershell/common.ps1 +19 -3
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/powershell/create-new-feature.ps1 +4 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/powershell/setup-plan.ps1 +8 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/__init__.py +1 -77
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_console.py +4 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/agents.py +0 -31
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/commands/bundle/__init__.py +4 -2
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/commands/init.py +0 -44
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integration_scaffold.py +1 -7
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/_helpers.py +6 -56
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/agy/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/amp/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/auggie/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/base.py +16 -549
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/bob/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/claude/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/cline/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/codebuddy/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/codex/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/copilot/__init__.py +0 -7
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/devin/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/firebender/__init__.py +2 -3
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/forge/__init__.py +0 -5
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/gemini/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/generic/__init__.py +0 -5
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/goose/__init__.py +2 -3
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/hermes/__init__.py +1 -9
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/iflow/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/junie/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/kilocode/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/kimi/__init__.py +3 -121
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/lingma/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/omp/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/opencode/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/pi/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/qodercli/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/qwen/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/roo/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/rovodev/__init__.py +1 -3
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/shai/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/tabnine/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/trae/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/vibe/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/windsurf/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/zcode/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/zed/__init__.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/engine.py +34 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/expressions.py +7 -5
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/gate/__init__.py +8 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/plan.md +2 -5
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/contract/test_bundle_cli.py +15 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/extensions/git/test_git_extension.py +40 -0
- specify_cli-0.12.1/tests/extensions/test_agent_context_cli_free.py +57 -0
- specify_cli-0.12.1/tests/extensions/test_extension_agent_context.py +873 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/conftest.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_base.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_cli.py +5 -12
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_extra_args.py +0 -5
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_agy.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_amp.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_auggie.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_base_markdown.py +27 -74
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_base_skills.py +30 -57
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_base_toml.py +27 -73
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_base_yaml.py +27 -73
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_bob.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_claude.py +16 -48
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_cline.py +0 -16
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_codebuddy.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_codex.py +24 -50
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_copilot.py +12 -50
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_cursor_agent.py +0 -78
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_devin.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_firebender.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_forge.py +8 -12
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_gemini.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_generic.py +9 -57
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_goose.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_hermes.py +3 -8
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_iflow.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_junie.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_kilocode.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_kimi.py +0 -207
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_kiro_cli.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_lingma.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_omp.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_opencode.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_pi.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_qodercli.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_qwen.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_roo.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_rovodev.py +2 -11
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_shai.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_tabnine.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_trae.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_vibe.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_windsurf.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_zcode.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_zed.py +0 -1
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_registry.py +0 -43
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_check_prerequisites_paths_only.py +121 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_setup_plan_no_overwrite.py +24 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_setup_tasks.py +51 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_timestamp_branches.py +21 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_workflows.py +160 -0
- specify_cli-0.11.10/tests/extensions/test_extension_agent_context.py +0 -1235
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.editorconfig +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.gitattributes +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/CODEOWNERS +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/dependabot.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/release.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.gitignore +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/.zenodo.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/CITATION.cff +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/DEVELOPMENT.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/LICENSE +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/SECURITY.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/SUPPORT.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/.gitignore +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/community/bundles.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/community/extensions.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/community/friends.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/community/overview.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/community/presets.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/docfx.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/guides/monorepo.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/index.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/install/one-time.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/install/pipx.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/install/uv.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/installation.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/local-development.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/quickstart.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/authentication.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/bundles.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/core.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/extensions.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/overview.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/reference/presets.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/template/public/main.css +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/toc.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/docs/upgrade.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/bug/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/catalog.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/extension.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/.gitignore +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/LICENSE +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/extensions/template/extension.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/integrations/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/integrations/catalog.community.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/integrations/catalog.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/media/logo_large.webp +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/media/logo_small.webp +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/media/specify_cli.gif +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/newsletters/2026-April.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/newsletters/2026-February.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/newsletters/2026-March.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/newsletters/2026-May.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/catalog.community.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/catalog.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/lean/preset.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/scaffold/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/spec-driven.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/spec-kit.code-workspace +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/extensions/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/extensions/_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/presets/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/checklist-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/analyze.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/checklist.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/clarify.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/constitution.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/converge.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/implement.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/specify.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/tasks.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/constitution-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/plan-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/spec-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/tasks-template.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/templates/vscode-settings.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/auth_helpers.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/conftest.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/hooks/plan.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/hooks/spec.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/http_helpers.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_authentication.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_check_tool.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_cli_version.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_commands_package.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_console_imports.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_extensions.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_github_http.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_github_workflows.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_init_dir.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_merge.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_presets.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_upgrade.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_utils.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_version_imports.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/README.md +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/catalog.community.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/catalog.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.11.10 → specify_cli-0.12.1}/workflows/step-catalog.json +0 -0
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
- name: Set up Python
|
|
22
22
|
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
|
|
23
23
|
with:
|
|
24
|
-
python-version: "3.
|
|
24
|
+
python-version: "3.14"
|
|
25
25
|
|
|
26
26
|
- name: Run ruff check
|
|
27
27
|
run: uvx ruff check src/
|
|
@@ -30,8 +30,8 @@ jobs:
|
|
|
30
30
|
runs-on: ${{ matrix.os }}
|
|
31
31
|
strategy:
|
|
32
32
|
matrix:
|
|
33
|
-
os: [ubuntu-latest, windows-latest]
|
|
34
|
-
python-version: ["3.
|
|
33
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
34
|
+
python-version: ["3.13", "3.14"]
|
|
35
35
|
steps:
|
|
36
36
|
- name: Checkout
|
|
37
37
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
@@ -75,7 +75,6 @@ class WindsurfIntegration(MarkdownIntegration):
|
|
|
75
75
|
"args": "$ARGUMENTS",
|
|
76
76
|
"extension": ".md",
|
|
77
77
|
}
|
|
78
|
-
context_file = ".windsurf/rules/specify-rules.md"
|
|
79
78
|
```
|
|
80
79
|
|
|
81
80
|
**TOML agent (Gemini):**
|
|
@@ -101,7 +100,6 @@ class GeminiIntegration(TomlIntegration):
|
|
|
101
100
|
"args": "{{args}}",
|
|
102
101
|
"extension": ".toml",
|
|
103
102
|
}
|
|
104
|
-
context_file = "GEMINI.md"
|
|
105
103
|
```
|
|
106
104
|
|
|
107
105
|
**Skills agent (Codex):**
|
|
@@ -129,7 +127,6 @@ class CodexIntegration(SkillsIntegration):
|
|
|
129
127
|
"args": "$ARGUMENTS",
|
|
130
128
|
"extension": "/SKILL.md",
|
|
131
129
|
}
|
|
132
|
-
context_file = "AGENTS.md"
|
|
133
130
|
|
|
134
131
|
@classmethod
|
|
135
132
|
def options(cls) -> list[IntegrationOption]:
|
|
@@ -150,7 +147,6 @@ class CodexIntegration(SkillsIntegration):
|
|
|
150
147
|
| `key` | Class attribute | Unique identifier; for CLI-based integrations (`requires_cli: True`), must match the CLI executable name |
|
|
151
148
|
| `config` | Class attribute (dict) | Agent metadata: `name`, `folder`, `commands_subdir`, `install_url`, `requires_cli` |
|
|
152
149
|
| `registrar_config` | Class attribute (dict) | Command output config: `dir`, `format`, `args` placeholder, file `extension` |
|
|
153
|
-
| `context_file` | Class attribute (str or None) | Path to agent context/instructions file (e.g., `"CLAUDE.md"`, `".github/copilot-instructions.md"`) |
|
|
154
150
|
|
|
155
151
|
**Key design rule:** For CLI-based integrations (`requires_cli: True`), `key` must be the actual executable name (e.g., `"cursor-agent"` not `"cursor"`). This ensures `shutil.which(key)` works for CLI-tool checks without special-case mappings. IDE-based integrations (`requires_cli: False`) should use their canonical identifier (e.g., `"windsurf"`, `"copilot"`).
|
|
156
152
|
|
|
@@ -175,9 +171,11 @@ def _register_builtins() -> None:
|
|
|
175
171
|
|
|
176
172
|
### 4. Context file behavior
|
|
177
173
|
|
|
178
|
-
|
|
174
|
+
The Specify CLI carries **no agent-context state whatsoever**. Integration classes do **not** declare a `context_file`, and the CLI never creates, updates, removes, resolves, or migrates a context/instruction file (`CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, …). New integrations add nothing for context handling.
|
|
179
175
|
|
|
180
|
-
|
|
176
|
+
Managing the "Spec Kit" section in the context file is fully owned by the bundled `agent-context` extension (`extensions/agent-context/`), which is a **full opt-in**: `specify init` does not install it. A user adds/enables it through the standard extension verbs, after which the extension's own bundled scripts maintain the context section. When the extension is absent or disabled, nothing in Spec Kit touches the context file.
|
|
177
|
+
|
|
178
|
+
The extension reads its own config file at `.specify/extensions/agent-context/agent-context-config.yml`:
|
|
181
179
|
|
|
182
180
|
```yaml
|
|
183
181
|
# Path to the coding agent context file managed by this extension
|
|
@@ -189,10 +187,10 @@ context_markers:
|
|
|
189
187
|
end: "<!-- SPECKIT END -->"
|
|
190
188
|
```
|
|
191
189
|
|
|
192
|
-
- `context_file` is
|
|
193
|
-
- `context_markers.{start,end}`
|
|
190
|
+
- The Specify CLI does **not** write this config. When `context_file` is empty, the extension's bundled scripts self-seed it by looking up the active integration's key in the extension's own `agent-context-defaults.json` map (`extensions/agent-context/scripts/bash/update-agent-context.sh` and `.ps1`). The CLI registry is never consulted — all agent→context-file knowledge lives inside the extension.
|
|
191
|
+
- `context_markers.{start,end}` are read solely by the extension's scripts; they default to the Spec Kit markers shown above and can be customized by editing `agent-context-config.yml` directly.
|
|
194
192
|
|
|
195
|
-
|
|
193
|
+
Existing projects created by older Spec Kit versions keep working: any previously written managed section or extension config is left intact and is only ever updated by the extension when run.
|
|
196
194
|
|
|
197
195
|
Only add custom setup logic when the agent needs non-standard behavior. Integrations no longer require per-agent thin wrapper scripts or shared context-update dispatcher scripts — the `agent-context` extension is fully generic.
|
|
198
196
|
|
|
@@ -401,7 +399,6 @@ Implementation: Extends `YamlIntegration` (parallel to `TomlIntegration`):
|
|
|
401
399
|
2. Extracts title and description from frontmatter
|
|
402
400
|
3. Renders output as Goose recipe YAML (version, title, description, author, extensions, activities, prompt)
|
|
403
401
|
4. Uses `yaml.safe_dump()` for header fields to ensure proper escaping
|
|
404
|
-
5. Sets `context_file = "AGENTS.md"` so the base setup manages the Spec Kit context section there
|
|
405
402
|
|
|
406
403
|
## Branch Naming Convention
|
|
407
404
|
|
|
@@ -466,7 +463,7 @@ Disclosure is **continuous**, not a one-time event. A single AI-disclosure parag
|
|
|
466
463
|
## Common Pitfalls
|
|
467
464
|
|
|
468
465
|
1. **Using shorthand keys for CLI-based integrations**: For CLI-based integrations (`requires_cli: True`), the `key` must match the executable name (e.g., `"cursor-agent"` not `"cursor"`). `shutil.which(key)` is used for CLI tool checks — mismatches require special-case mappings. IDE-based integrations (`requires_cli: False`) are not subject to this constraint.
|
|
469
|
-
2. **
|
|
466
|
+
2. **Reintroducing context handling into the CLI**: The opt-in `agent-context` extension owns everything about context files — including the per-agent default mapping in `agent-context-defaults.json`. Integration classes must **not** declare a `context_file`, and no CLI code should read, write, resolve, or migrate context files. All context-file logic lives in `.specify/extensions/agent-context/` and its bundled scripts.
|
|
470
467
|
3. **Incorrect `requires_cli` value**: Set to `True` only for agents that have a CLI tool; set to `False` for IDE-based agents.
|
|
471
468
|
4. **Wrong argument format**: Use `$ARGUMENTS` for Markdown agents, `{{args}}` for TOML agents.
|
|
472
469
|
5. **Skipping registration**: The import and `_register()` call in `_register_builtins()` must both be added.
|
|
@@ -2,6 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.12.1] - 2026-06-30
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- chore: align CI Python matrix with devguide lifecycle + fix bash 3.2 portability (#3244)
|
|
10
|
+
- fix: stop check-prerequisites --paths-only from writing feature.json (#3025) (#3190)
|
|
11
|
+
- docs: document integration catalog subcommands (#3206)
|
|
12
|
+
- fix(scripts): use ASCII [OK] marker in initialize-repo.sh (parity with PowerShell twin) (#3231)
|
|
13
|
+
- docs: document integration `search`/`info`/`scaffold` subcommands (#3174) (#3194)
|
|
14
|
+
- docs: remove Cursor from `specify check` agent list (#3178) (#3193)
|
|
15
|
+
- fix(goose): repoint install_url and docs to goose-docs.ai (#3171) (#3215)
|
|
16
|
+
- fix(scripts): route 'Plan template not found' per --json in setup-plan.ps1 (parity with bash) (#3241)
|
|
17
|
+
- fix(bundle): send command errors to stderr so --json stdout stays parseable (#3235)
|
|
18
|
+
- chore: release 0.12.0, begin 0.12.1.dev0 development (#3243)
|
|
19
|
+
|
|
20
|
+
## [0.12.0] - 2026-06-29
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- feat: make agent-context extension a full opt-in (#3097)
|
|
25
|
+
- docs(workflows): add the built-in 'init' step type to the Step Types table (#3234)
|
|
26
|
+
- fix(workflows): gate validate() must not crash on non-string options (#3233)
|
|
27
|
+
- fix(workflows): make pipe-filter detection quote-aware in expressions (#3232)
|
|
28
|
+
- fix(workflows): reject a fan-in wait_for that names an unknown step at validation (#3225)
|
|
29
|
+
- fix(scripts): warn when spec template is missing in create-new-feature.ps1 (parity with bash) (#3230)
|
|
30
|
+
- fix(scripts): count subdirectory-only dirs as non-empty in PowerShell (parity with bash) (#3137)
|
|
31
|
+
- fix(scripts): drop HAS_GIT from PowerShell git-extension output (parity with bash) (#3195)
|
|
32
|
+
- Update Product Spec Extension to v1.0.1 (#3226)
|
|
33
|
+
- chore: release 0.11.10, begin 0.11.11.dev0 development (#3240)
|
|
34
|
+
|
|
5
35
|
## [0.11.10] - 2026-06-29
|
|
6
36
|
|
|
7
37
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specify-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.1
|
|
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
|
|
@@ -426,7 +426,7 @@ specify init . --force --integration copilot
|
|
|
426
426
|
specify init --here --force --integration copilot
|
|
427
427
|
```
|
|
428
428
|
|
|
429
|
-
The CLI will check
|
|
429
|
+
The CLI will check that your selected agent's CLI tool is installed (for integrations that require a CLI), such as Claude Code, Gemini CLI, Qwen Code, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi Coding Agent, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode. If you don't have the required tool installed, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
|
|
430
430
|
|
|
431
431
|
```bash
|
|
432
432
|
specify init <project_name> --integration copilot --ignore-agent-tools
|
|
@@ -406,7 +406,7 @@ specify init . --force --integration copilot
|
|
|
406
406
|
specify init --here --force --integration copilot
|
|
407
407
|
```
|
|
408
408
|
|
|
409
|
-
The CLI will check
|
|
409
|
+
The CLI will check that your selected agent's CLI tool is installed (for integrations that require a CLI), such as Claude Code, Gemini CLI, Qwen Code, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi Coding Agent, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode. If you don't have the required tool installed, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
|
|
410
410
|
|
|
411
411
|
```bash
|
|
412
412
|
specify init <project_name> --integration copilot --ignore-agent-tools
|
|
@@ -19,7 +19,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
19
19
|
| [Forge](https://forgecode.dev/) | `forge` | |
|
|
20
20
|
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `gemini` | |
|
|
21
21
|
| [GitHub Copilot](https://code.visualstudio.com/) | `copilot` | |
|
|
22
|
-
| [Goose](https://
|
|
22
|
+
| [Goose](https://goose-docs.ai/) | `goose` | Uses YAML recipe format in `.goose/recipes/` |
|
|
23
23
|
| [Hermes](https://github.com/NousResearch/hermes-agent) | `hermes` | Skills-based integration; installs skills globally into `~/.hermes/skills/` |
|
|
24
24
|
| [IBM Bob](https://www.ibm.com/products/bob) | `bob` | IDE-based agent |
|
|
25
25
|
| [iFlow CLI](https://docs.iflow.cn/en/cli/quickstart) | `iflow` | |
|
|
@@ -54,6 +54,27 @@ Shows all available integrations, which one is currently installed, and whether
|
|
|
54
54
|
When multiple integrations are installed, the list marks the default integration separately from the other installed integrations.
|
|
55
55
|
The list also shows whether each built-in integration is declared multi-install safe.
|
|
56
56
|
|
|
57
|
+
## Search Available Integrations
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
specify integration search [query]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Option | Description |
|
|
64
|
+
| ---------- | ------------------ |
|
|
65
|
+
| `--tag` | Filter by tag |
|
|
66
|
+
| `--author` | Filter by author |
|
|
67
|
+
|
|
68
|
+
Searches the active catalog stack for integrations matching the query. Without a query, lists all available integrations. Must be run inside a Spec Kit project.
|
|
69
|
+
|
|
70
|
+
## Integration Info
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
specify integration info <integration_id>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Shows catalog details for a single integration, including its description, author, license, tags, source catalog, repository (when available), and whether it is currently active. Must be run inside a Spec Kit project.
|
|
77
|
+
|
|
57
78
|
## Install an Integration
|
|
58
79
|
|
|
59
80
|
```bash
|
|
@@ -152,6 +173,47 @@ is `null` when no installed integration set can be evaluated, such as when the
|
|
|
152
173
|
integration state is missing, unreadable, lacks a valid recorded integration
|
|
153
174
|
list, or records no installed integrations.
|
|
154
175
|
|
|
176
|
+
## Catalog Management
|
|
177
|
+
|
|
178
|
+
Integration catalogs control where the discovery commands (`search` and `info`) look for integrations. Catalogs are checked in priority order.
|
|
179
|
+
|
|
180
|
+
### List Catalogs
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
specify integration catalog list
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Shows the active catalog sources. Project-level sources (when configured) are removable by index; otherwise the active sources are shown as non-removable.
|
|
187
|
+
|
|
188
|
+
### Add a Catalog
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
specify integration catalog add <url>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
| Option | Description |
|
|
195
|
+
| --------------- | ----------------------------- |
|
|
196
|
+
| `--name <name>` | Optional name for the catalog |
|
|
197
|
+
|
|
198
|
+
Adds a custom catalog URL to the project's `.specify/integration-catalogs.yml`. The URL must use HTTPS (except `http://localhost`, `http://127.0.0.1`, or `http://[::1]` for local testing).
|
|
199
|
+
|
|
200
|
+
### Remove a Catalog
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
specify integration catalog remove <index>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Removes a project catalog source by its 0-based index in `catalog list`.
|
|
207
|
+
|
|
208
|
+
### Catalog Resolution Order
|
|
209
|
+
|
|
210
|
+
Catalogs are resolved in this order (first match wins):
|
|
211
|
+
|
|
212
|
+
1. **Environment variable** — `SPECKIT_INTEGRATION_CATALOG_URL` overrides all catalogs
|
|
213
|
+
2. **Project config** — `.specify/integration-catalogs.yml`
|
|
214
|
+
3. **User config** — `~/.specify/integration-catalogs.yml`
|
|
215
|
+
4. **Built-in defaults** — official catalog + community catalog
|
|
216
|
+
|
|
155
217
|
## Integration-Specific Options
|
|
156
218
|
|
|
157
219
|
Some integrations accept additional options via `--integration-options`:
|
|
@@ -167,6 +229,18 @@ Example:
|
|
|
167
229
|
specify integration install generic --integration-options="--commands-dir .myagent/cmds"
|
|
168
230
|
```
|
|
169
231
|
|
|
232
|
+
## Scaffold a New Integration
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
specify integration scaffold <key>
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Creates a minimal built-in integration package and a matching test skeleton in the Spec Kit repository, then prints the next steps for wiring it up. Run this command from the Spec Kit repository root. The `<key>` must be lowercase kebab-case (for example, `my-agent`).
|
|
239
|
+
|
|
240
|
+
| Option | Description |
|
|
241
|
+
| -------- | ---------------------------------------------------------------- |
|
|
242
|
+
| `--type` | Scaffold template to use: `markdown` (default), `skills`, `toml`, or `yaml` |
|
|
243
|
+
|
|
170
244
|
## FAQ
|
|
171
245
|
|
|
172
246
|
### Can I install multiple integrations in the same project?
|
|
@@ -262,6 +262,7 @@ specify workflow run speckit -i spec="Build a kanban board with drag-and-drop ta
|
|
|
262
262
|
| `command` | Invoke a Spec Kit command (e.g., `speckit.plan`) |
|
|
263
263
|
| `prompt` | Send an arbitrary prompt to the AI coding agent |
|
|
264
264
|
| `shell` | Execute a shell command and capture output |
|
|
265
|
+
| `init` | Bootstrap a project (like `specify init`) |
|
|
265
266
|
| `gate` | Pause for human approval before continuing |
|
|
266
267
|
| `if` | Conditional branching (then/else) |
|
|
267
268
|
| `switch` | Multi-branch dispatch on an expression |
|
|
@@ -6,15 +6,17 @@ It owns the lifecycle of the managed section delimited by the configurable start
|
|
|
6
6
|
|
|
7
7
|
## Why an extension?
|
|
8
8
|
|
|
9
|
-
Not every Spec Kit user wants Spec Kit to write into the coding agent's context file.
|
|
9
|
+
Not every Spec Kit user wants Spec Kit to write into the coding agent's context file. Keeping this behavior in a dedicated, **opt-in** extension lets users:
|
|
10
10
|
|
|
11
|
-
- **
|
|
12
|
-
- **Customize the markers** by editing `.specify/extensions/agent-context/agent-context-config.yml` —
|
|
11
|
+
- **Choose whether to install it at all** — `specify init` does not install it. Add it explicitly when you want Spec Kit to manage the agent context file; if it is absent or disabled, Spec Kit never creates or modifies that file.
|
|
12
|
+
- **Customize the markers** by editing `.specify/extensions/agent-context/agent-context-config.yml` — the bundled scripts honor the `context_markers` value.
|
|
13
13
|
- **Synchronize multiple agent anchors** by setting `context_files` when a project intentionally uses more than one coding agent context file, such as `AGENTS.md` and `CLAUDE.md`.
|
|
14
|
-
- **Refresh on demand**
|
|
14
|
+
- **Refresh on demand** by running the `speckit.agent-context.update` command in your agent, or automatically through the hooks declared in `extension.yml` (`after_specify`, `after_plan`). Invoke it using your agent's slash-command separator — `/speckit.agent-context.update` for dot-separator agents or `/speckit-agent-context-update` for hyphen-separator agents (e.g. Forge, Cline).
|
|
15
15
|
|
|
16
16
|
## Commands
|
|
17
17
|
|
|
18
|
+
The command ID below is canonical. When invoking it as a slash command, use your agent's separator: `/speckit.agent-context.update` for dot-separator agents or `/speckit-agent-context-update` for hyphen-separator agents (e.g. Forge, Cline).
|
|
19
|
+
|
|
18
20
|
| Command | Description |
|
|
19
21
|
|---------|-------------|
|
|
20
22
|
| `speckit.agent-context.update` | Refresh the managed section in the agent context file with the current plan path. |
|
|
@@ -40,7 +42,7 @@ context_markers:
|
|
|
40
42
|
end: "<!-- SPECKIT END -->"
|
|
41
43
|
```
|
|
42
44
|
|
|
43
|
-
- `context_file` — the project-relative path to the coding agent context file,
|
|
45
|
+
- `context_file` — the project-relative path to the coding agent context file. When empty, the bundled update scripts self-seed it by looking up the active integration's key in this extension's own `agent-context-defaults.json` map. The Specify CLI is never consulted.
|
|
44
46
|
- `context_files` — optional project-relative paths to multiple coding agent context files. When non-empty, the list takes precedence over `context_file`. Absolute paths, backslash separators, and `..` path segments are rejected.
|
|
45
47
|
- `context_markers.start` / `.end` — the delimiters around the managed section. Edit these to use custom markers.
|
|
46
48
|
|
|
@@ -62,5 +64,4 @@ pip install pyyaml
|
|
|
62
64
|
specify extension disable agent-context
|
|
63
65
|
```
|
|
64
66
|
|
|
65
|
-
When disabled, Spec Kit
|
|
66
|
-
Disabled projects also ignore stale `context_files` values during command rendering so disabling the extension remains a complete opt-out.
|
|
67
|
+
When disabled (or never installed), Spec Kit performs no agent context file creation, updates, or removal — the extension's bundled scripts are the only code that ever touches the managed section. The Specify CLI carries no agent-context state at all: it never reads this config, never resolves a context file, and the `__CONTEXT_FILE__` placeholder (if present in any template) is left untouched. All context-file knowledge — including the per-agent default mapping in `agent-context-defaults.json` — lives entirely within this extension, so disabling it is a complete opt-out.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Default coding agent context file per integration, owned by the agent-context extension. Used to self-seed agent-context-config.yml when it declares no context_file/context_files. Keyed by the Spec Kit integration key recorded in .specify/init-options.json. This mapping is independent of the Specify CLI by design.",
|
|
3
|
+
"agents": {
|
|
4
|
+
"agy": "AGENTS.md",
|
|
5
|
+
"amp": "AGENTS.md",
|
|
6
|
+
"auggie": ".augment/rules/specify-rules.md",
|
|
7
|
+
"bob": "AGENTS.md",
|
|
8
|
+
"claude": "CLAUDE.md",
|
|
9
|
+
"cline": ".clinerules/specify-rules.md",
|
|
10
|
+
"codebuddy": "CODEBUDDY.md",
|
|
11
|
+
"codex": "AGENTS.md",
|
|
12
|
+
"copilot": ".github/copilot-instructions.md",
|
|
13
|
+
"cursor-agent": ".cursor/rules/specify-rules.mdc",
|
|
14
|
+
"devin": "AGENTS.md",
|
|
15
|
+
"firebender": ".firebender/rules/specify-rules.mdc",
|
|
16
|
+
"forge": "AGENTS.md",
|
|
17
|
+
"gemini": "GEMINI.md",
|
|
18
|
+
"generic": "AGENTS.md",
|
|
19
|
+
"goose": "AGENTS.md",
|
|
20
|
+
"hermes": "AGENTS.md",
|
|
21
|
+
"iflow": "IFLOW.md",
|
|
22
|
+
"junie": ".junie/AGENTS.md",
|
|
23
|
+
"kilocode": ".kilocode/rules/specify-rules.md",
|
|
24
|
+
"kimi": "AGENTS.md",
|
|
25
|
+
"kiro-cli": "AGENTS.md",
|
|
26
|
+
"lingma": ".lingma/rules/specify-rules.md",
|
|
27
|
+
"omp": "AGENTS.md",
|
|
28
|
+
"opencode": "AGENTS.md",
|
|
29
|
+
"pi": "AGENTS.md",
|
|
30
|
+
"qodercli": "QODER.md",
|
|
31
|
+
"qwen": "QWEN.md",
|
|
32
|
+
"roo": ".roo/rules/specify-rules.md",
|
|
33
|
+
"rovodev": "AGENTS.md",
|
|
34
|
+
"shai": "SHAI.md",
|
|
35
|
+
"tabnine": "TABNINE.md",
|
|
36
|
+
"trae": ".trae/rules/project_rules.md",
|
|
37
|
+
"vibe": "AGENTS.md",
|
|
38
|
+
"windsurf": ".windsurf/rules/specify-rules.md",
|
|
39
|
+
"zcode": "ZCODE.md",
|
|
40
|
+
"zed": "AGENTS.md"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -59,7 +59,14 @@ case "$(uname -s 2>/dev/null || true)" in
|
|
|
59
59
|
esac
|
|
60
60
|
|
|
61
61
|
# Parse extension config once; emit context files as JSON, followed by marker strings.
|
|
62
|
-
|
|
62
|
+
#
|
|
63
|
+
# NOTE (bash 3.2 / macOS portability): the embedded Python heredocs below run
|
|
64
|
+
# inside $(...) command substitution. bash 3.2 (the system /bin/bash on macOS)
|
|
65
|
+
# mis-parses a single-quote/apostrophe in a heredoc body nested in $(...),
|
|
66
|
+
# failing with "unexpected EOF while looking for matching `''". Keep these
|
|
67
|
+
# $(...)-nested heredoc bodies free of apostrophes (use double quotes in Python
|
|
68
|
+
# string literals and avoid contractions in comments).
|
|
69
|
+
if ! _raw_opts="$("$_python" - "$EXT_CONFIG" "$_case_insensitive_context_files" "$PROJECT_ROOT" <<'PY'
|
|
63
70
|
import json
|
|
64
71
|
import sys
|
|
65
72
|
try:
|
|
@@ -95,24 +102,67 @@ def get_str(obj, *keys):
|
|
|
95
102
|
context_files = []
|
|
96
103
|
seen_context_files = set()
|
|
97
104
|
case_insensitive = sys.argv[2] == "1" or sys.platform.startswith(("win32", "cygwin"))
|
|
105
|
+
def add_context_file(value):
|
|
106
|
+
if not isinstance(value, str):
|
|
107
|
+
return
|
|
108
|
+
candidate = value.strip()
|
|
109
|
+
if not candidate:
|
|
110
|
+
return
|
|
111
|
+
key = candidate.casefold() if case_insensitive else candidate
|
|
112
|
+
if key in seen_context_files:
|
|
113
|
+
return
|
|
114
|
+
context_files.append(candidate)
|
|
115
|
+
seen_context_files.add(key)
|
|
98
116
|
raw_files = data.get("context_files")
|
|
99
117
|
if isinstance(raw_files, list):
|
|
100
118
|
for value in raw_files:
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if not candidate:
|
|
105
|
-
continue
|
|
106
|
-
key = candidate.casefold() if case_insensitive else candidate
|
|
107
|
-
if key in seen_context_files:
|
|
108
|
-
continue
|
|
109
|
-
context_files.append(candidate)
|
|
110
|
-
seen_context_files.add(key)
|
|
119
|
+
add_context_file(value)
|
|
120
|
+
if not context_files:
|
|
121
|
+
add_context_file(get_str(data, "context_file"))
|
|
111
122
|
if not context_files:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
123
|
+
# Self-seed: the agent-context extension manages its own lifecycle, so when
|
|
124
|
+
# its config declares no target, it derives one from the active integration
|
|
125
|
+
# recorded in init-options.json, mapped through the bundled
|
|
126
|
+
# agent-context-defaults.json file. This is independent of the Specify CLI
|
|
127
|
+
# by design; nothing here imports specify_cli.
|
|
128
|
+
project_root = sys.argv[3] if len(sys.argv) > 3 else "."
|
|
129
|
+
integration_key = ""
|
|
130
|
+
try:
|
|
131
|
+
with open(
|
|
132
|
+
f"{project_root}/.specify/init-options.json", "r", encoding="utf-8"
|
|
133
|
+
) as fh:
|
|
134
|
+
opts = json.load(fh)
|
|
135
|
+
if isinstance(opts, dict):
|
|
136
|
+
value = opts.get("integration") or opts.get("ai") or ""
|
|
137
|
+
integration_key = value if isinstance(value, str) else ""
|
|
138
|
+
except Exception:
|
|
139
|
+
integration_key = ""
|
|
140
|
+
if integration_key:
|
|
141
|
+
defaults_path = (
|
|
142
|
+
f"{project_root}/.specify/extensions/agent-context/"
|
|
143
|
+
"agent-context-defaults.json"
|
|
144
|
+
)
|
|
145
|
+
mapping = {}
|
|
146
|
+
try:
|
|
147
|
+
with open(defaults_path, "r", encoding="utf-8") as fh:
|
|
148
|
+
loaded = json.load(fh)
|
|
149
|
+
agents = loaded.get("agents", {}) if isinstance(loaded, dict) else {}
|
|
150
|
+
mapping = agents if isinstance(agents, dict) else {}
|
|
151
|
+
except Exception:
|
|
152
|
+
print(
|
|
153
|
+
"agent-context: unable to read %s; cannot self-seed the context "
|
|
154
|
+
"file. Set context_file in the extension config." % defaults_path,
|
|
155
|
+
file=sys.stderr,
|
|
156
|
+
)
|
|
157
|
+
mapping = {}
|
|
158
|
+
add_context_file(mapping.get(integration_key, "") or "")
|
|
159
|
+
if not context_files:
|
|
160
|
+
print(
|
|
161
|
+
"agent-context: no default context file is known for integration "
|
|
162
|
+
"%s. Set context_file in the extension config to choose one."
|
|
163
|
+
% integration_key,
|
|
164
|
+
file=sys.stderr,
|
|
165
|
+
)
|
|
116
166
|
print(json.dumps(context_files))
|
|
117
167
|
print(get_str(data, "context_markers", "start"))
|
|
118
168
|
print(get_str(data, "context_markers", "end"))
|
|
@@ -295,11 +345,58 @@ for CONTEXT_FILE in "${CONTEXT_FILES[@]}"; do
|
|
|
295
345
|
mkdir -p "$(dirname "$CTX_PATH")"
|
|
296
346
|
|
|
297
347
|
"$_python" - "$CTX_PATH" "$MARKER_START" "$MARKER_END" "$TMP_SECTION" <<'PY'
|
|
298
|
-
import
|
|
348
|
+
import os
|
|
349
|
+
import re
|
|
350
|
+
import sys
|
|
351
|
+
|
|
299
352
|
ctx_path, start, end, section_path = sys.argv[1:5]
|
|
300
353
|
with open(section_path, "r", encoding="utf-8") as fh:
|
|
301
354
|
section = fh.read().rstrip("\n") + "\n"
|
|
302
355
|
|
|
356
|
+
|
|
357
|
+
def ensure_mdc_frontmatter(content):
|
|
358
|
+
"""Ensure ``.mdc`` content has YAML frontmatter with ``alwaysApply: true``.
|
|
359
|
+
|
|
360
|
+
Cursor only auto-loads ``.mdc`` rule files that carry frontmatter with
|
|
361
|
+
``alwaysApply: true``. Prepend it when missing, or repair the value while
|
|
362
|
+
preserving any existing frontmatter comments/formatting.
|
|
363
|
+
"""
|
|
364
|
+
leading_ws = len(content) - len(content.lstrip())
|
|
365
|
+
leading = content[:leading_ws]
|
|
366
|
+
stripped = content[leading_ws:]
|
|
367
|
+
|
|
368
|
+
if not stripped.startswith("---"):
|
|
369
|
+
return "---\nalwaysApply: true\n---\n\n" + content
|
|
370
|
+
|
|
371
|
+
match = re.match(
|
|
372
|
+
r"^(---[ \t]*\r?\n)(.*?)(\r?\n---[ \t]*)(\r?\n|$)(.*)",
|
|
373
|
+
stripped,
|
|
374
|
+
re.DOTALL,
|
|
375
|
+
)
|
|
376
|
+
if not match:
|
|
377
|
+
return "---\nalwaysApply: true\n---\n\n" + content
|
|
378
|
+
|
|
379
|
+
opening, fm_text, closing, sep, rest = match.groups()
|
|
380
|
+
newline = "\r\n" if "\r\n" in opening else "\n"
|
|
381
|
+
|
|
382
|
+
if re.search(r"(?m)^[ \t]*alwaysApply[ \t]*:[ \t]*true[ \t]*(?:#.*)?$", fm_text):
|
|
383
|
+
return content
|
|
384
|
+
|
|
385
|
+
if re.search(r"(?m)^[ \t]*alwaysApply[ \t]*:", fm_text):
|
|
386
|
+
fm_text = re.sub(
|
|
387
|
+
r"(?m)^([ \t]*)alwaysApply[ \t]*:.*?([ \t]*(?:#.*)?)$",
|
|
388
|
+
r"\1alwaysApply: true\2",
|
|
389
|
+
fm_text,
|
|
390
|
+
count=1,
|
|
391
|
+
)
|
|
392
|
+
elif fm_text.strip():
|
|
393
|
+
fm_text = fm_text + newline + "alwaysApply: true"
|
|
394
|
+
else:
|
|
395
|
+
fm_text = "alwaysApply: true"
|
|
396
|
+
|
|
397
|
+
return f"{leading}{opening}{fm_text}{closing}{sep}{rest}"
|
|
398
|
+
|
|
399
|
+
|
|
303
400
|
if os.path.exists(ctx_path):
|
|
304
401
|
with open(ctx_path, "r", encoding="utf-8-sig") as fh:
|
|
305
402
|
content = fh.read()
|
|
@@ -329,6 +426,8 @@ else:
|
|
|
329
426
|
new_content = section
|
|
330
427
|
|
|
331
428
|
new_content = new_content.replace("\r\n", "\n").replace("\r", "\n")
|
|
429
|
+
if ctx_path.casefold().endswith(".mdc"):
|
|
430
|
+
new_content = ensure_mdc_frontmatter(new_content)
|
|
332
431
|
with open(ctx_path, "wb") as fh:
|
|
333
432
|
fh.write(new_content.encode("utf-8"))
|
|
334
433
|
PY
|
|
@@ -20,6 +20,56 @@ param(
|
|
|
20
20
|
[string]$PlanPath
|
|
21
21
|
)
|
|
22
22
|
|
|
23
|
+
function Add-MdcFrontmatter {
|
|
24
|
+
<#
|
|
25
|
+
Ensure .mdc content has YAML frontmatter with alwaysApply: true.
|
|
26
|
+
|
|
27
|
+
Cursor only auto-loads .mdc rule files that carry frontmatter with
|
|
28
|
+
alwaysApply: true. Prepend it when missing, or repair the value while
|
|
29
|
+
preserving any existing frontmatter comments/formatting.
|
|
30
|
+
#>
|
|
31
|
+
param([Parameter(Mandatory = $true)][AllowEmptyString()][string]$Content)
|
|
32
|
+
|
|
33
|
+
$leading = ''
|
|
34
|
+
$stripped = $Content
|
|
35
|
+
$m = [regex]::Match($Content, '^\s*')
|
|
36
|
+
if ($m.Success) {
|
|
37
|
+
$leading = $m.Value
|
|
38
|
+
$stripped = $Content.Substring($m.Length)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (-not $stripped.StartsWith('---')) {
|
|
42
|
+
return "---`nalwaysApply: true`n---`n`n" + $Content
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
$fm = [regex]::Match($stripped, '^(---[ \t]*\r?\n)(.*?)(\r?\n---[ \t]*)(\r?\n|$)(.*)', [System.Text.RegularExpressions.RegexOptions]::Singleline)
|
|
46
|
+
if (-not $fm.Success) {
|
|
47
|
+
return "---`nalwaysApply: true`n---`n`n" + $Content
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
$opening = $fm.Groups[1].Value
|
|
51
|
+
$fmText = $fm.Groups[2].Value
|
|
52
|
+
$closing = $fm.Groups[3].Value
|
|
53
|
+
$sep = $fm.Groups[4].Value
|
|
54
|
+
$rest = $fm.Groups[5].Value
|
|
55
|
+
$newline = if ($opening.Contains("`r`n")) { "`r`n" } else { "`n" }
|
|
56
|
+
|
|
57
|
+
if ([regex]::IsMatch($fmText, '(?m)^[ \t]*alwaysApply[ \t]*:[ \t]*true[ \t]*(?:#.*)?$')) {
|
|
58
|
+
return $Content
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if ([regex]::IsMatch($fmText, '(?m)^[ \t]*alwaysApply[ \t]*:')) {
|
|
62
|
+
$alwaysApplyRegex = [regex]'(?m)^([ \t]*)alwaysApply[ \t]*:.*?([ \t]*(?:#.*)?)$'
|
|
63
|
+
$fmText = $alwaysApplyRegex.Replace($fmText, '${1}alwaysApply: true${2}', 1)
|
|
64
|
+
} elseif ($fmText.Trim()) {
|
|
65
|
+
$fmText = $fmText + $newline + 'alwaysApply: true'
|
|
66
|
+
} else {
|
|
67
|
+
$fmText = 'alwaysApply: true'
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return "$leading$opening$fmText$closing$sep$rest"
|
|
71
|
+
}
|
|
72
|
+
|
|
23
73
|
function Get-ConfigValue {
|
|
24
74
|
param(
|
|
25
75
|
[AllowNull()][object]$Object,
|
|
@@ -250,6 +300,43 @@ foreach ($ContextFile in $ContextFiles) {
|
|
|
250
300
|
}
|
|
251
301
|
}
|
|
252
302
|
$ContextFiles = $dedupedContextFiles
|
|
303
|
+
if ($ContextFiles.Count -eq 0) {
|
|
304
|
+
# Self-seed: the agent-context extension owns its lifecycle, so when its
|
|
305
|
+
# own config declares no target it derives one from the active integration
|
|
306
|
+
# recorded in init-options.json, using the extension's OWN bundled mapping
|
|
307
|
+
# (agent-context-defaults.json). Independent of the Specify CLI by design.
|
|
308
|
+
$initOptionsPath = Join-Path $ProjectRoot '.specify/init-options.json'
|
|
309
|
+
if (Test-Path -LiteralPath $initOptionsPath) {
|
|
310
|
+
try {
|
|
311
|
+
$initOpts = Get-Content -LiteralPath $initOptionsPath -Raw | ConvertFrom-Json -ErrorAction Stop
|
|
312
|
+
$integrationKey = $null
|
|
313
|
+
if ($initOpts.PSObject.Properties['integration'] -and $initOpts.integration) {
|
|
314
|
+
$integrationKey = [string]$initOpts.integration
|
|
315
|
+
} elseif ($initOpts.PSObject.Properties['ai'] -and $initOpts.ai) {
|
|
316
|
+
$integrationKey = [string]$initOpts.ai
|
|
317
|
+
}
|
|
318
|
+
if ($integrationKey) {
|
|
319
|
+
$defaultsPath = Join-Path $ProjectRoot '.specify/extensions/agent-context/agent-context-defaults.json'
|
|
320
|
+
if (Test-Path -LiteralPath $defaultsPath) {
|
|
321
|
+
$defaults = Get-Content -LiteralPath $defaultsPath -Raw | ConvertFrom-Json -ErrorAction Stop
|
|
322
|
+
$derived = $null
|
|
323
|
+
if ($defaults.PSObject.Properties['agents'] -and $defaults.agents.PSObject.Properties[$integrationKey]) {
|
|
324
|
+
$derived = [string]$defaults.agents.PSObject.Properties[$integrationKey].Value
|
|
325
|
+
}
|
|
326
|
+
if ($derived -and -not [string]::IsNullOrWhiteSpace($derived)) {
|
|
327
|
+
$ContextFiles += $derived.Trim()
|
|
328
|
+
} else {
|
|
329
|
+
Write-Warning ("agent-context: no default context file is known for integration '{0}'; set 'context_file' in the extension config to choose one." -f $integrationKey)
|
|
330
|
+
}
|
|
331
|
+
} else {
|
|
332
|
+
Write-Warning ("agent-context: unable to read {0}; cannot self-seed the context file. Set 'context_file' in the extension config." -f $defaultsPath)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
} catch {
|
|
336
|
+
# Non-fatal: fall through to the nothing-to-do guard below.
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
253
340
|
if ($ContextFiles.Count -eq 0) {
|
|
254
341
|
Write-Warning 'agent-context: context_files/context_file not set in extension config; nothing to do.'
|
|
255
342
|
exit 0
|
|
@@ -411,6 +498,9 @@ foreach ($ContextFile in $ContextFiles) {
|
|
|
411
498
|
}
|
|
412
499
|
|
|
413
500
|
$newContent = $newContent.Replace("`r`n", "`n").Replace("`r", "`n")
|
|
501
|
+
if ($ContextFile -match '\.mdc$') {
|
|
502
|
+
$newContent = Add-MdcFrontmatter -Content $newContent
|
|
503
|
+
}
|
|
414
504
|
[System.IO.File]::WriteAllText($CtxPath, $newContent, (New-Object System.Text.UTF8Encoding($false)))
|
|
415
505
|
|
|
416
506
|
Write-Host "agent-context: updated $ContextFile"
|