specify-cli 0.11.4__tar.gz → 0.11.5__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.5/.github/workflows/publish-pypi.yml +80 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/CHANGELOG.md +15 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/PKG-INFO +2 -2
- {specify_cli-0.11.4 → specify_cli-0.11.5}/README.md +1 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/presets.md +2 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/integrations.md +1 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/README.md +9 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/agent-context-config.yml +6 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/commands/speckit.agent-context.update.md +3 -2
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/scripts/bash/update-agent-context.sh +116 -34
- specify_cli-0.11.5/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +353 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/catalog.community.json +3 -3
- {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/catalog.json +9 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/catalog.community.json +39 -19
- {specify_cli-0.11.4 → specify_cli-0.11.5}/pyproject.toml +1 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/__init__.py +19 -1450
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_invocation_style.py +14 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/agents.py +24 -4
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/commands/init.py +12 -2
- specify_cli-0.11.4/src/specify_cli/extensions.py → specify_cli-0.11.5/src/specify_cli/extensions/__init__.py +68 -57
- specify_cli-0.11.5/src/specify_cli/extensions/_commands.py +1556 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/__init__.py +2 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_helpers.py +95 -6
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_migrate_commands.py +36 -29
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_query_commands.py +6 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/base.py +265 -89
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/copilot/__init__.py +2 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/forge/__init__.py +2 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/generic/__init__.py +2 -1
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/hermes/__init__.py +2 -1
- specify_cli-0.11.5/src/specify_cli/integrations/zcode/__init__.py +43 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/presets/__init__.py +4 -4
- specify_cli-0.11.5/tests/extensions/test_extension_agent_context.py +1235 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_cli.py +72 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_codex.py +74 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_subcommand.py +262 -7
- specify_cli-0.11.5/tests/integrations/test_integration_zcode.py +38 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extension_update_hardening.py +48 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extensions.py +561 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_presets.py +26 -0
- specify_cli-0.11.4/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -237
- specify_cli-0.11.4/tests/extensions/test_extension_agent_context.py +0 -455
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.editorconfig +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.gitattributes +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/CODEOWNERS +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/dependabot.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/bug-assess.lock.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/release.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/test.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.gitignore +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/.zenodo.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/AGENTS.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/CITATION.cff +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/DEVELOPMENT.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/LICENSE +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/SECURITY.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/SUPPORT.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/.gitignore +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/extensions.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/friends.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/overview.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/concepts/sdd.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/docfx.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/index.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/one-time.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/pipx.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/uv.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/installation.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/local-development.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/quickstart.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/authentication.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/bundles.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/core.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/extensions.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/overview.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/presets.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/workflows.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/template/public/main.css +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/toc.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/upgrade.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/developer/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/catalog.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/extension.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/.gitignore +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/LICENSE +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/extension.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/catalog.community.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/media/logo_large.webp +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/media/logo_small.webp +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/media/specify_cli.gif +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-April.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-February.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-March.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-May.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/catalog.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/preset.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/common.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/spec-driven.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/spec-kit.code-workspace +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_console.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_utils.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/installer.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/primitives.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/commands/bundle/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/iflow/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/roo/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/checklist-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/analyze.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/checklist.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/clarify.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/constitution.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/converge.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/implement.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/plan.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/specify.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/tasks.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/constitution-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/plan-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/spec-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/tasks-template.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/vscode-settings.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/auth_helpers.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/bundler_helpers.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/conftest.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/plan.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/spec.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/http_helpers.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_install_flow.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_local_install.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_iflow.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_roo.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_windsurf.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_authentication.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_check_tool.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_cli_version.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_commands_package.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_console_imports.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extension_skills.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_github_http.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_init_dir.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_merge.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_upgrade.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_version_imports.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_workflows.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_primitives.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/README.md +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/catalog.community.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/catalog.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/step-catalog.community.json +0 -0
- {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/step-catalog.json +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
tag:
|
|
7
|
+
description: 'Release tag to publish (e.g., v0.10.1)'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
actions: write
|
|
20
|
+
steps:
|
|
21
|
+
- name: Verify tag format
|
|
22
|
+
run: |
|
|
23
|
+
TAG="${{ inputs.tag }}"
|
|
24
|
+
if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
25
|
+
echo "Error: '$TAG' is not a valid release tag (expected vX.Y.Z)"
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
- name: Checkout release tag
|
|
30
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
31
|
+
with:
|
|
32
|
+
ref: refs/tags/${{ inputs.tag }}
|
|
33
|
+
|
|
34
|
+
- name: Install uv
|
|
35
|
+
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
36
|
+
|
|
37
|
+
- name: Set up Python
|
|
38
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
39
|
+
with:
|
|
40
|
+
python-version: "3.13"
|
|
41
|
+
|
|
42
|
+
- name: Verify tag matches package version
|
|
43
|
+
run: |
|
|
44
|
+
TAG_VERSION="${{ inputs.tag }}"
|
|
45
|
+
TAG_VERSION="${TAG_VERSION#v}"
|
|
46
|
+
PROJECT_VERSION="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
|
|
47
|
+
if [[ "$TAG_VERSION" != "$PROJECT_VERSION" ]]; then
|
|
48
|
+
echo "Error: Tag version ($TAG_VERSION) does not match pyproject.toml version ($PROJECT_VERSION)"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
- name: Build package
|
|
53
|
+
run: uv build
|
|
54
|
+
|
|
55
|
+
- name: Upload build artifacts
|
|
56
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
57
|
+
with:
|
|
58
|
+
name: dist
|
|
59
|
+
path: dist/
|
|
60
|
+
if-no-files-found: error
|
|
61
|
+
|
|
62
|
+
publish:
|
|
63
|
+
needs: build
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
environment: pypi
|
|
66
|
+
permissions:
|
|
67
|
+
id-token: write
|
|
68
|
+
actions: read
|
|
69
|
+
steps:
|
|
70
|
+
- name: Download build artifacts
|
|
71
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
72
|
+
with:
|
|
73
|
+
name: dist
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- name: Install uv
|
|
77
|
+
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
|
|
78
|
+
|
|
79
|
+
- name: Publish to PyPI
|
|
80
|
+
run: uv publish
|
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- insert new changelog below this comment -->
|
|
4
4
|
|
|
5
|
+
## [0.11.5] - 2026-06-22
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- fix: register enabled extensions for agent on integration use/upgrade (#2949)
|
|
10
|
+
- Add SicarioSpec Core preset to community catalog (#3102)
|
|
11
|
+
- Update Game Narrative Writing preset to v1.1.0 (#3099)
|
|
12
|
+
- feat: add PyPI publishing workflow and readme metadata (#2915)
|
|
13
|
+
- refactor: move extension command handlers to extensions/_commands.py (PR-7/8) (#3014)
|
|
14
|
+
- feat: add ZCode (Z.AI) integration (#3063)
|
|
15
|
+
- fix(agent-context): support multiple context files safely (#2969)
|
|
16
|
+
- Update DocGuard — CDD Enforcement extension to v0.27.0 (#3094)
|
|
17
|
+
- fix(presets): use _repo_root() for bundled-core source-checkout fallback (#3086) (#3091)
|
|
18
|
+
- chore: release 0.11.4, begin 0.11.5.dev0 development (#3092)
|
|
19
|
+
|
|
5
20
|
## [0.11.4] - 2026-06-22
|
|
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.5
|
|
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,
|
|
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:
|
|
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,
|
|
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:
|
|
407
407
|
|
|
408
408
|
```bash
|
|
409
409
|
specify init <project_name> --integration copilot --ignore-agent-tools
|
|
@@ -17,7 +17,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
|
|
|
17
17
|
| Cross-Platform Governance | Adds Bash + PowerShell parity, Unix man-pages, bilingual comment-based help, Verb-Noun Cmdlet discipline, and audit-ready Spec Kit run evidence for scripting projects managed with Spec Kit | 8 templates, 3 commands | — | [spec-kit-preset-cross-platform-governance](https://github.com/hindermath/spec-kit-preset-cross-platform-governance) |
|
|
18
18
|
| Explicit Task Dependencies | Adds explicit `(depends on T###)` dependency declarations and an Execution Wave DAG to tasks.md for parallel scheduling | 1 template, 1 command | — | [spec-kit-preset-explicit-task-dependencies](https://github.com/Quratulain-bilal/spec-kit-preset-explicit-task-dependencies) |
|
|
19
19
|
| Fiction Book Writing | It adapts the Spec-Driven Development workflow for storytelling to create books or audiobooks (with annotations) in 12 languages: features become story elements, specs become story briefs, plans become story structures, and tasks become scene-by-scene writing tasks. Supports single and multi-POV, all major plot structure frameworks, and two style modes: an author voice sample or humanized AI prose principles. Supports interactive elements like brainstorming, interview, roleplay, and extras like statistics, cover builder, illustration builder, and bio command. Export with templates for KDP, D2D, etc. | 26 templates, 34 commands, 2 scripts | — | [speckit-preset-fiction-book-writing](https://github.com/adaumann/speckit-preset-fiction-book-writing) |
|
|
20
|
-
| Game Narrative Writing |
|
|
20
|
+
| Game Narrative Writing | Preset for game narrative design and interactive storytelling. It adapts the Spec-Driven Development workflow for game narratives: features become story mechanics, specs become narrative briefs, plans become story maps, and tasks become dialogue and scene-writing tasks. Supports branching narratives, player agency systems, state machines, and interactive dialogue trees. | 37 templates, 34 commands, 5 scripts | — | [speckit-preset-game-narrative-writing](https://github.com/adaumann/speckit-preset-game-narrative-writing) |
|
|
21
21
|
| iSAQB Architecture Governance | Adds general iSAQB/CPSA-F and arc42 software-architecture governance, including audit-ready Spec Kit run evidence for architecture goals, views, quality scenarios, ADRs, risks, and technical debt. | 13 templates, 3 commands | — | [spec-kit-preset-isaqb-architecture-governance](https://github.com/hindermath/spec-kit-preset-isaqb-architecture-governance) |
|
|
22
22
|
| Jira Issue Tracking | Overrides `speckit.taskstoissues` to create Jira epics, stories, and tasks instead of GitHub Issues via Atlassian MCP tools | 1 command | — | [spec-kit-preset-jira](https://github.com/luno/spec-kit-preset-jira) |
|
|
23
23
|
| Model Driven Engineering | Focuses on streamlined commands, app repository support, cross-spec support, and capability-aware project memory for model-driven engineering workflows | 6 templates, 11 commands | MDE extension | [spec-kit-preset-mde](https://github.com/AI-MDE/spec-kit-preset-mde) |
|
|
@@ -25,6 +25,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
|
|
|
25
25
|
| Pirate Speak (Full) | Transforms all Spec Kit output into pirate speak — specs become "Voyage Manifests", plans become "Battle Plans", tasks become "Crew Assignments" | 6 templates, 9 commands | — | [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
|
|
26
26
|
| Screenwriting | Spec-Driven Development for screenwriting/scriptwriting/tutorials: feature films, television (pilot, episode, limited series), and stage plays. Adapts the Spec Kit workflow to screenplay craft — slug lines, action lines, act breaks, beat sheets, and industry-standard pitch documents. Supports three-act, Save the Cat, TV pilot, network episode, cable/streaming episode, and stage-play structural frameworks. Export to Fountain, FTX, PDF | 26 templates, 32 commands, 1 script | — | [speckit-preset-screenwriting](https://github.com/adaumann/speckit-preset-screenwriting) |
|
|
27
27
|
| Security Governance | Adds memory-safe-language preference, language-specific secure coding profiles, audit-ready Spec-Kit run evidence, ASVS verification, SBOM/AI-SBOM supply-chain transparency, CRA awareness, and regulatory applicability screening for NIS2, CRA, EU AI Act, and DORA | 14 templates, 3 commands | — | [spec-kit-preset-security-governance](https://github.com/hindermath/spec-kit-preset-security-governance) |
|
|
28
|
+
| SicarioSpec Core | Evidence-first security operations governance that maps feature risk to controls, gates, evidence, owners, approval, and accepted-risk decisions. | 5 templates | — | [sicario-spec](https://github.com/dfirs1car1o/sicario-spec) |
|
|
28
29
|
| Spec2Cloud | Spec-driven workflow tuned for shipping to Azure: spec → plan → tasks → implement → deploy | 5 templates, 8 commands | — | [spec2cloud](https://github.com/Azure-Samples/Spec2Cloud) |
|
|
29
30
|
| Table of Contents Navigation | Adds a navigable Table of Contents to generated spec.md, plan.md, and tasks.md documents | 3 templates, 3 commands | — | [spec-kit-preset-toc-navigation](https://github.com/Quratulain-bilal/spec-kit-preset-toc-navigation) |
|
|
30
31
|
| VS Code Ask Questions | Enhances the clarify command to use `vscode/askQuestions` for batched interactive questioning. | 1 command | — | [spec-kit-presets](https://github.com/fdcastel/spec-kit-presets) |
|
|
@@ -38,6 +38,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
|
|
|
38
38
|
| [Tabnine CLI](https://docs.tabnine.com/main/getting-started/tabnine-cli) | `tabnine` | |
|
|
39
39
|
| [Trae](https://www.trae.ai/) | `trae` | Skills-based integration; skills are installed automatically |
|
|
40
40
|
| [Windsurf](https://windsurf.com/) | `windsurf` | |
|
|
41
|
+
| [ZCode](https://zcode.z.ai/) | `zcode` | Skills-based integration; installs skills into `.zcode/skills/` and invokes them as `$speckit-<command>` |
|
|
41
42
|
| [Zed](https://zed.dev/) | `zed` | Skills-based integration; installs skills into `.agents/skills` and invokes them as `/speckit-<command>` |
|
|
42
43
|
| Generic | `generic` | Bring your own agent — use `--integration generic --integration-options="--commands-dir <path>"` for AI coding agents not listed above |
|
|
43
44
|
|
|
@@ -10,6 +10,7 @@ Not every Spec Kit user wants Spec Kit to write into the coding agent's context
|
|
|
10
10
|
|
|
11
11
|
- **Opt out** entirely with `specify extension disable agent-context` — Spec Kit will then never create or modify the agent context file.
|
|
12
12
|
- **Customize the markers** by editing `.specify/extensions/agent-context/agent-context-config.yml` — both the Python layer and the bundled scripts honor the same `context_markers` value.
|
|
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`.
|
|
13
14
|
- **Refresh on demand** with `/speckit.agent-context.update`, or automatically through the hooks declared in `extension.yml` (`after_specify`, `after_plan`).
|
|
14
15
|
|
|
15
16
|
## Commands
|
|
@@ -27,6 +28,12 @@ All configuration flows through the extension's own config file at
|
|
|
27
28
|
# Path to the coding agent context file managed by this extension
|
|
28
29
|
context_file: CLAUDE.md
|
|
29
30
|
|
|
31
|
+
# Optional list of coding agent context files to manage together.
|
|
32
|
+
# When non-empty, this takes precedence over context_file.
|
|
33
|
+
context_files:
|
|
34
|
+
- AGENTS.md
|
|
35
|
+
- CLAUDE.md
|
|
36
|
+
|
|
30
37
|
# Delimiters for the managed Spec Kit section
|
|
31
38
|
context_markers:
|
|
32
39
|
start: "<!-- SPECKIT START -->"
|
|
@@ -34,6 +41,7 @@ context_markers:
|
|
|
34
41
|
```
|
|
35
42
|
|
|
36
43
|
- `context_file` — the project-relative path to the coding agent context file, written by `specify init` and `specify integration install`.
|
|
44
|
+
- `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.
|
|
37
45
|
- `context_markers.start` / `.end` — the delimiters around the managed section. Edit these to use custom markers.
|
|
38
46
|
|
|
39
47
|
## Requirements
|
|
@@ -55,3 +63,4 @@ specify extension disable agent-context
|
|
|
55
63
|
```
|
|
56
64
|
|
|
57
65
|
When disabled, Spec Kit skips context file creation, updates, and removal (the gates are inside `upsert_context_section()` and `remove_context_section()`).
|
|
66
|
+
Disabled projects also ignore stale `context_files` values during command rendering so disabling the extension remains a complete opt-out.
|
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
# These values are populated automatically by `specify init` and
|
|
3
3
|
# `specify integration use` / `specify integration install`.
|
|
4
4
|
|
|
5
|
-
# Path (relative to the project root) to the coding agent context file
|
|
5
|
+
# Path (relative to the project root) to the default coding agent context file
|
|
6
6
|
# managed by this extension (e.g. CLAUDE.md, AGENTS.md,
|
|
7
7
|
# .github/copilot-instructions.md). Set automatically from the active
|
|
8
8
|
# integration and regenerated during `specify init` or integration switches.
|
|
9
9
|
context_file: ""
|
|
10
10
|
|
|
11
|
+
# Optional list of project-relative coding agent context files managed by this
|
|
12
|
+
# extension. When non-empty, this list takes precedence over `context_file`.
|
|
13
|
+
# Use this for projects that intentionally keep multiple agent anchors in sync.
|
|
14
|
+
context_files: []
|
|
15
|
+
|
|
11
16
|
# Delimiters for the managed Spec Kit section.
|
|
12
17
|
# Edit these to use custom markers.
|
|
13
18
|
context_markers:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Refresh the managed Spec Kit section in
|
|
2
|
+
description: "Refresh the managed Spec Kit section in coding agent context file(s)"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Update Coding Agent Context
|
|
@@ -12,11 +12,12 @@ The script reads the agent-context extension config at
|
|
|
12
12
|
`.specify/extensions/agent-context/agent-context-config.yml` to discover:
|
|
13
13
|
|
|
14
14
|
- `context_file` — the path of the coding agent context file to manage.
|
|
15
|
+
- `context_files` — optional project-relative paths for multiple coding agent context files. When non-empty, the script updates each listed file and the list takes precedence over `context_file`.
|
|
15
16
|
- `context_markers.start` / `.end` — the delimiters surrounding the managed section. Defaults to `<!-- SPECKIT START -->` and `<!-- SPECKIT END -->` when the field is missing.
|
|
16
17
|
|
|
17
18
|
It then creates, replaces, or appends the managed block so that the section points at the most recent plan path when one can be discovered (`specs/<feature>/plan.md`).
|
|
18
19
|
|
|
19
|
-
If `context_file`
|
|
20
|
+
If `context_files` and `context_file` are empty, the command reports nothing to do and exits successfully. Context file paths must stay project-relative; absolute paths, Windows drive paths, backslash separators, and `..` path segments are rejected.
|
|
20
21
|
|
|
21
22
|
## Execution
|
|
22
23
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# update-agent-context.sh
|
|
3
3
|
#
|
|
4
|
-
# Refresh the managed Spec Kit section in the coding agent's context file
|
|
4
|
+
# Refresh the managed Spec Kit section in the coding agent's context file(s)
|
|
5
5
|
# (e.g. CLAUDE.md, .github/copilot-instructions.md, AGENTS.md).
|
|
6
6
|
#
|
|
7
|
-
# Reads `
|
|
7
|
+
# Reads `context_files` or `context_file`, plus `context_markers.{start,end}`, from the
|
|
8
8
|
# agent-context extension config:
|
|
9
9
|
# .specify/extensions/agent-context/agent-context-config.yml
|
|
10
10
|
#
|
|
@@ -26,22 +26,41 @@ if [[ ! -f "$EXT_CONFIG" ]]; then
|
|
|
26
26
|
exit 0
|
|
27
27
|
fi
|
|
28
28
|
|
|
29
|
-
# Locate a
|
|
29
|
+
# Locate a Python 3 interpreter with PyYAML available.
|
|
30
30
|
_python=""
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
_python_candidates=()
|
|
32
|
+
[[ -n "${SPECKIT_PYTHON:-}" ]] && _python_candidates+=("$SPECKIT_PYTHON")
|
|
33
|
+
_python_candidates+=("python3" "python")
|
|
34
|
+
for _candidate in "${_python_candidates[@]}"; do
|
|
35
|
+
if command -v "$_candidate" >/dev/null 2>&1 \
|
|
36
|
+
&& "$_candidate" - <<'PY' >/dev/null 2>&1
|
|
37
|
+
import sys
|
|
38
|
+
try:
|
|
39
|
+
import yaml # noqa: F401
|
|
40
|
+
except ImportError:
|
|
41
|
+
sys.exit(1)
|
|
42
|
+
sys.exit(0 if sys.version_info[0] == 3 else 1)
|
|
43
|
+
PY
|
|
44
|
+
then
|
|
45
|
+
_python="$_candidate"
|
|
46
|
+
break
|
|
47
|
+
fi
|
|
48
|
+
done
|
|
49
|
+
unset _candidate _python_candidates
|
|
36
50
|
|
|
37
51
|
if [[ -z "$_python" ]]; then
|
|
38
|
-
echo "agent-context: Python 3 not found on PATH; skipping update." >&2
|
|
52
|
+
echo "agent-context: Python 3 with PyYAML not found on PATH; skipping update." >&2
|
|
53
|
+
echo " To resolve: pip install pyyaml (or install it into the environment used by python3)." >&2
|
|
39
54
|
exit 0
|
|
40
55
|
fi
|
|
56
|
+
_case_insensitive_context_files=0
|
|
57
|
+
case "$(uname -s 2>/dev/null || true)" in
|
|
58
|
+
MINGW*|MSYS*|CYGWIN*) _case_insensitive_context_files=1 ;;
|
|
59
|
+
esac
|
|
41
60
|
|
|
42
|
-
# Parse extension config once; emit
|
|
43
|
-
|
|
44
|
-
|
|
61
|
+
# Parse extension config once; emit context files as JSON, followed by marker strings.
|
|
62
|
+
if ! _raw_opts="$("$_python" - "$EXT_CONFIG" "$_case_insensitive_context_files" <<'PY'
|
|
63
|
+
import json
|
|
45
64
|
import sys
|
|
46
65
|
try:
|
|
47
66
|
import yaml
|
|
@@ -73,7 +92,28 @@ def get_str(obj, *keys):
|
|
|
73
92
|
else:
|
|
74
93
|
return ""
|
|
75
94
|
return node if isinstance(node, str) else ""
|
|
76
|
-
|
|
95
|
+
context_files = []
|
|
96
|
+
seen_context_files = set()
|
|
97
|
+
case_insensitive = sys.argv[2] == "1" or sys.platform.startswith(("win32", "cygwin"))
|
|
98
|
+
raw_files = data.get("context_files")
|
|
99
|
+
if isinstance(raw_files, list):
|
|
100
|
+
for value in raw_files:
|
|
101
|
+
if not isinstance(value, str):
|
|
102
|
+
continue
|
|
103
|
+
candidate = value.strip()
|
|
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)
|
|
111
|
+
if not context_files:
|
|
112
|
+
raw_file = get_str(data, "context_file")
|
|
113
|
+
candidate = raw_file.strip()
|
|
114
|
+
if candidate:
|
|
115
|
+
context_files.append(candidate)
|
|
116
|
+
print(json.dumps(context_files))
|
|
77
117
|
print(get_str(data, "context_markers", "start"))
|
|
78
118
|
print(get_str(data, "context_markers", "end"))
|
|
79
119
|
PY
|
|
@@ -87,31 +127,71 @@ while IFS= read -r _line || [[ -n "$_line" ]]; do
|
|
|
87
127
|
_opts_lines+=("$_line")
|
|
88
128
|
done < <(printf '%s\n' "$_raw_opts")
|
|
89
129
|
if (( ${#_opts_lines[@]} < 3 )); then
|
|
90
|
-
echo "agent-context: malformed config parser output; expected 3 lines (
|
|
130
|
+
echo "agent-context: malformed config parser output; expected 3 lines (context_files, marker_start, marker_end), got ${#_opts_lines[@]}; skipping update." >&2
|
|
91
131
|
exit 0
|
|
92
132
|
fi
|
|
93
|
-
|
|
133
|
+
CONTEXT_FILES_JSON="${_opts_lines[0]}"
|
|
94
134
|
MARKER_START="${_opts_lines[1]}"
|
|
95
135
|
MARKER_END="${_opts_lines[2]}"
|
|
96
136
|
|
|
97
|
-
if
|
|
98
|
-
|
|
137
|
+
if ! _context_files_raw="$("$_python" - "$CONTEXT_FILES_JSON" <<'PY'
|
|
138
|
+
import json
|
|
139
|
+
import sys
|
|
140
|
+
try:
|
|
141
|
+
data = json.loads(sys.argv[1])
|
|
142
|
+
except Exception:
|
|
143
|
+
data = []
|
|
144
|
+
if not isinstance(data, list):
|
|
145
|
+
data = []
|
|
146
|
+
for value in data:
|
|
147
|
+
if isinstance(value, str) and value:
|
|
148
|
+
print(value)
|
|
149
|
+
PY
|
|
150
|
+
)"; then
|
|
151
|
+
echo "agent-context: malformed context_files parser output; skipping update." >&2
|
|
99
152
|
exit 0
|
|
100
153
|
fi
|
|
101
154
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if
|
|
108
|
-
echo "agent-context: context_file
|
|
109
|
-
exit
|
|
155
|
+
CONTEXT_FILES=()
|
|
156
|
+
while IFS= read -r _line || [[ -n "$_line" ]]; do
|
|
157
|
+
[[ -n "$_line" ]] && CONTEXT_FILES+=("$_line")
|
|
158
|
+
done < <(printf '%s\n' "$_context_files_raw")
|
|
159
|
+
|
|
160
|
+
if (( ${#CONTEXT_FILES[@]} == 0 )); then
|
|
161
|
+
echo "agent-context: context_files/context_file not set in extension config; nothing to do." >&2
|
|
162
|
+
exit 0
|
|
110
163
|
fi
|
|
111
|
-
|
|
112
|
-
for
|
|
113
|
-
|
|
114
|
-
|
|
164
|
+
|
|
165
|
+
for CONTEXT_FILE in "${CONTEXT_FILES[@]}"; do
|
|
166
|
+
# Reject absolute paths, backslash separators, and '..' path segments in context files
|
|
167
|
+
if [[ "$CONTEXT_FILE" == /* ]] || [[ "$CONTEXT_FILE" =~ ^[A-Za-z]: ]]; then
|
|
168
|
+
echo "agent-context: context files must be project-relative paths; got '$CONTEXT_FILE'." >&2
|
|
169
|
+
exit 1
|
|
170
|
+
fi
|
|
171
|
+
if [[ "$CONTEXT_FILE" == *\\* ]]; then
|
|
172
|
+
echo "agent-context: context files must not contain backslash separators; got '$CONTEXT_FILE'." >&2
|
|
173
|
+
exit 1
|
|
174
|
+
fi
|
|
175
|
+
IFS='/' read -ra _cf_parts <<< "$CONTEXT_FILE"
|
|
176
|
+
for _seg in "${_cf_parts[@]}"; do
|
|
177
|
+
if [[ "$_seg" == ".." ]]; then
|
|
178
|
+
echo "agent-context: context files must not contain '..' path segments; got '$CONTEXT_FILE'." >&2
|
|
179
|
+
exit 1
|
|
180
|
+
fi
|
|
181
|
+
done
|
|
182
|
+
if ! "$_python" - "$PROJECT_ROOT" "$CONTEXT_FILE" <<'PY'
|
|
183
|
+
import sys
|
|
184
|
+
from pathlib import Path
|
|
185
|
+
|
|
186
|
+
root = Path(sys.argv[1]).resolve()
|
|
187
|
+
target = (root / sys.argv[2]).resolve(strict=False)
|
|
188
|
+
try:
|
|
189
|
+
target.relative_to(root)
|
|
190
|
+
except ValueError:
|
|
191
|
+
sys.exit(1)
|
|
192
|
+
PY
|
|
193
|
+
then
|
|
194
|
+
echo "agent-context: context file path resolves outside the project root; got '$CONTEXT_FILE'." >&2
|
|
115
195
|
exit 1
|
|
116
196
|
fi
|
|
117
197
|
done
|
|
@@ -142,9 +222,6 @@ PY
|
|
|
142
222
|
fi
|
|
143
223
|
fi
|
|
144
224
|
|
|
145
|
-
CTX_PATH="$PROJECT_ROOT/$CONTEXT_FILE"
|
|
146
|
-
mkdir -p "$(dirname "$CTX_PATH")"
|
|
147
|
-
|
|
148
225
|
# Build the managed section
|
|
149
226
|
TMP_SECTION="$(mktemp)"
|
|
150
227
|
trap 'rm -f "$TMP_SECTION"' EXIT
|
|
@@ -158,7 +235,11 @@ trap 'rm -f "$TMP_SECTION"' EXIT
|
|
|
158
235
|
echo "$MARKER_END"
|
|
159
236
|
} > "$TMP_SECTION"
|
|
160
237
|
|
|
161
|
-
|
|
238
|
+
for CONTEXT_FILE in "${CONTEXT_FILES[@]}"; do
|
|
239
|
+
CTX_PATH="$PROJECT_ROOT/$CONTEXT_FILE"
|
|
240
|
+
mkdir -p "$(dirname "$CTX_PATH")"
|
|
241
|
+
|
|
242
|
+
"$_python" - "$CTX_PATH" "$MARKER_START" "$MARKER_END" "$TMP_SECTION" <<'PY'
|
|
162
243
|
import sys, os
|
|
163
244
|
ctx_path, start, end, section_path = sys.argv[1:5]
|
|
164
245
|
with open(section_path, "r", encoding="utf-8") as fh:
|
|
@@ -197,4 +278,5 @@ with open(ctx_path, "wb") as fh:
|
|
|
197
278
|
fh.write(new_content.encode("utf-8"))
|
|
198
279
|
PY
|
|
199
280
|
|
|
200
|
-
echo "agent-context: updated $CONTEXT_FILE"
|
|
281
|
+
echo "agent-context: updated $CONTEXT_FILE"
|
|
282
|
+
done
|