specify-cli 1.0.5__tar.gz → 1.0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/aw/actions-lock.json +8 -8
- specify_cli-1.0.7/.github/scripts/check_extension_version_bump.py +232 -0
- specify_cli-1.0.7/.github/skills/code-review/SKILL.md +11 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-bundle.lock.yml +2 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-bundle.md +21 -4
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-extension.lock.yml +2 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-extension.md +22 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-preset.lock.yml +2 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-preset.md +22 -3
- specify_cli-1.0.7/.github/workflows/bug-assess.lock.yml +1899 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/docs.yml +1 -1
- specify_cli-1.0.7/.github/workflows/extension-version-guard.yml +57 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/stale.yml +5 -5
- {specify_cli-1.0.5 → specify_cli-1.0.7}/AGENTS.md +1 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/CHANGELOG.md +50 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/CONTRIBUTING.md +101 -2
- specify_cli-1.0.7/PKG-INFO +215 -0
- specify_cli-1.0.7/README.md +195 -0
- specify_cli-1.0.7/README.zh-CN.md +190 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/README.md +5 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/extensions.md +7 -4
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/overview.md +12 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/presets.md +1 -0
- specify_cli-1.0.7/docs/guides/assessment.md +115 -0
- specify_cli-1.0.7/docs/guides/bugfix.md +82 -0
- specify_cli-1.0.7/docs/guides/customization.md +105 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/guides/existing-projects.md +7 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/history.md +13 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/index.md +37 -8
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/installation.md +30 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/local-development.md +4 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/quickstart.md +85 -39
- specify_cli-1.0.7/docs/reference/agentic-assessment.md +102 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/agentic-bugfix.md +6 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/agentic-sdd.md +52 -2
- specify_cli-1.0.7/docs/reference/artifacts.md +241 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/bundles.md +25 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/core.md +1 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/extensions.md +16 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/integrations.md +20 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/overview.md +21 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/presets.md +14 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/workflows.md +38 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/toc.yml +11 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +7 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/README.md +23 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/catalog.community.json +188 -47
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-August.md +3 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/catalog.community.json +35 -6
- {specify_cli-1.0.5 → specify_cli-1.0.7}/pyproject.toml +1 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/__init__.py +7 -0
- specify_cli-1.0.7/src/specify_cli/_installed_list_json.py +84 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_project.py +42 -17
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/agents.py +15 -1
- specify_cli-1.0.7/src/specify_cli/artifacts/__init__.py +37 -0
- specify_cli-1.0.7/src/specify_cli/artifacts/_commands.py +201 -0
- specify_cli-1.0.7/src/specify_cli/artifacts/_identifiers.py +162 -0
- specify_cli-1.0.7/src/specify_cli/artifacts/catalog.py +1163 -0
- specify_cli-1.0.7/src/specify_cli/artifacts/models.py +182 -0
- specify_cli-1.0.7/src/specify_cli/artifacts/resolution.py +498 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/installer.py +20 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/primitives.py +42 -12
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/bundle/__init__.py +12 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/init.py +8 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/events.py +30 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/extensions/__init__.py +36 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/extensions/_commands.py +36 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/agy/__init__.py +4 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/base.py +79 -5
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/bob/__init__.py +90 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/codex/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/copilot/__init__.py +9 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/cursor_agent/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/devin/__init__.py +6 -0
- specify_cli-1.0.7/src/specify_cli/integrations/docker_agent/__init__.py +204 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/droid/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/dsh/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/goose/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/grok/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/hermes/__init__.py +4 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/muse/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/omp/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/opencode/__init__.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/rovodev/__init__.py +4 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/presets/__init__.py +41 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/presets/_commands.py +28 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/base.py +3 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/engine.py +6 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/expressions.py +104 -109
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/command/__init__.py +109 -6
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/analyze.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/checklist.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/clarify.md +4 -4
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/constitution.md +5 -3
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/converge.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/implement.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/plan.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/specify.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/tasks.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/taskstoissues.md +2 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/conftest.py +67 -0
- specify_cli-1.0.7/tests/contract/test_bundled_extension_versions.py +83 -0
- specify_cli-1.0.7/tests/contract/test_extension_version_guard_script.py +352 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_install_flow.py +100 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_local_install.py +170 -1
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_base.py +32 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_cli.py +76 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_events.py +192 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_bob.py +179 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_docker_agent.py +145 -0
- specify_cli-1.0.7/tests/test_artifact_command.py +2819 -0
- specify_cli-1.0.7/tests/test_artifact_command_parity.py +173 -0
- specify_cli-1.0.7/tests/test_clarify_stage_gate.py +25 -0
- specify_cli-1.0.7/tests/test_command_template_hooks.py +80 -0
- specify_cli-1.0.7/tests/test_constitution_template_sync_report.py +25 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_skills.py +46 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extensions.py +90 -9
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_github_workflows.py +101 -0
- specify_cli-1.0.7/tests/test_installed_list_json.py +480 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_presets.py +81 -2
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_workflows.py +341 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_primitives.py +174 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_condition_expression_block.py +160 -7
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/README.md +33 -0
- specify_cli-1.0.5/.github/workflows/bug-assess.lock.yml +0 -1622
- specify_cli-1.0.5/PKG-INFO +0 -512
- specify_cli-1.0.5/README.md +0 -492
- specify_cli-1.0.5/README.zh-CN.md +0 -361
- specify_cli-1.0.5/src/specify_cli/integrations/docker_agent/__init__.py +0 -126
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.devcontainer/post-create.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.editorconfig +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.gitattributes +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/CODEOWNERS +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/dependabot.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/scripts/check_security_requirements.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/security-audit-requirements.txt +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-assess.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-fix.lock.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-fix.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-test.lock.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-test.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/codeql.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/feature-assess.lock.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/feature-assess.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/lint.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/publish-pypi.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/release.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/security.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/test.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.gitignore +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.pre-commit-config.yaml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/.zenodo.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/CITATION.cff +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/DEVELOPMENT.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/LICENSE +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/SECURITY.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/SUPPORT.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/bundles/catalog.community.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/.gitignore +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/bundles.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/friends.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/walkthroughs.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/complex-features.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/sdd.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/spec-of-specs.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/docfx.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/guides/evolving-specs.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/guides/monorepo.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/images/spec-kit-logo.webp +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/air-gapped.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/one-time.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/pipx.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/pypi.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/uv.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/authentication.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/template/public/main.css +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/upgrade.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/business-analyst/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/business-analyst/bundle.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/developer/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/developer/bundle.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/product-manager/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/product-manager/bundle.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/security-researcher/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/security-researcher/bundle.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/agent-context-defaults.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.decide.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.define.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.intake.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.research.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.shape.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/extension.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/extension.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/catalog.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/config-template.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/extension.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/git-config.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/auto_commit.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/git_common.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/initialize_repo.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/selftest/extension.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/.gitignore +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/LICENSE +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/commands/example.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/config-template.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/extension.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/catalog.community.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/catalog.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/media/logo_large.webp +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/media/logo_small.webp +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/media/specify_cli.gif +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-April.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-February.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-July.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-June.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-March.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-May.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/PUBLISHING.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/catalog.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/constitution-sync/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/constitution-sync/commands/speckit.constitution.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/constitution-sync/preset.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/preset.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/README.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/preset.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/preset.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/common.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/resolve-template.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/resolve-template.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/check_prerequisites.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/common.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/create_new_feature.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/resolve_template.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/setup_plan.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/setup_tasks.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/spec-driven.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/spec-kit.code-workspace +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_assets.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_console.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_download_security.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_toml_string.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_utils.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_version.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/project.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/versioning.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/yamlio.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/catalog.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/manifest.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/records.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/adapters.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/conflict.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/packager.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/references.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/resolver.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/validator.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/event.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/claude/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/command_code/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/firebender/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/zcode/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/composer.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/merge.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/schema.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/slot/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/checklist-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/constitution-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/plan-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/spec-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/tasks-template.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/vscode-settings.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/auth_helpers.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/bundler_helpers.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_bundle_cli.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_catalog_schema.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_manifest_schema.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_wheel_bundled_presets.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/assess/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/assess/test_assess_extension.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_agent_context_cli_free.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/TESTING.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/plan.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/spec.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/tasks.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/http_helpers.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_catalog_stack.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_init_install.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_offline.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_security_paths.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/__init__.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/conftest.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_home_isolation.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_alquimia.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_claude.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_command_code.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_droid.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_dsh.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_firebender.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_grok.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_muse.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_omp.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_zcode.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_registry.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/parity_helpers.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_authentication.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_branch_numbering.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_check_prerequisites_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_check_tool.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_cli_version.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_command_template_py_scripts.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_commands_package.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_console_imports.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_create_new_feature_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_download_security.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_event_command.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_add_path_traversal.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_content_staleness.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_registration.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_github_http.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_init_dir.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_init_dir_cli.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_init_output_markup.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_live_transient_windows.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_merge.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_post_process.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_resolve_template_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_security_workflow.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_plan_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_tasks.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_tasks_python_parity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_shared_infra_gitignore.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_shared_infra_integrity.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_skill_placeholder_py.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_specify_template_numbering.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_tasks_template_constraints.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_upgrade.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_utils.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_version_imports.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_workflow_run_without_project.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundle_download_url.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_adapters.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_catalog_config.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_conflict.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_packager.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_records.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_references.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_resolver.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_validator.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_versioning.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_yamlio.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/conftest.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_bundled_speckit_workflow.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_commands.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_composer.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_layer_sources.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_merge.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_schema.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_security.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_resolver_integration.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_slot_step.py +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/PUBLISHING.md +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/catalog.community.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/catalog.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/step-catalog.community.json +0 -0
- {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/step-catalog.json +0 -0
|
@@ -25,20 +25,20 @@
|
|
|
25
25
|
"version": "v7.0.0",
|
|
26
26
|
"sha": "5fda3b95a4ea91299a34e894583c3862153e4b97"
|
|
27
27
|
},
|
|
28
|
-
"astral-sh/setup-uv@v10.0.1": {
|
|
29
|
-
"repo": "astral-sh/setup-uv",
|
|
30
|
-
"version": "v10.0.1",
|
|
31
|
-
"sha": "20cfd1bf945f4377ade1205e4dbc17946fc9a30d"
|
|
32
|
-
},
|
|
33
28
|
"actions/upload-artifact@v7.0.1": {
|
|
34
29
|
"repo": "actions/upload-artifact",
|
|
35
30
|
"version": "v7.0.1",
|
|
36
31
|
"sha": "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"
|
|
37
32
|
},
|
|
38
|
-
"
|
|
33
|
+
"astral-sh/setup-uv@v10.0.1": {
|
|
34
|
+
"repo": "astral-sh/setup-uv",
|
|
35
|
+
"version": "v10.0.1",
|
|
36
|
+
"sha": "20cfd1bf945f4377ade1205e4dbc17946fc9a30d"
|
|
37
|
+
},
|
|
38
|
+
"github/gh-aw-actions/setup@v0.88.7": {
|
|
39
39
|
"repo": "github/gh-aw-actions/setup",
|
|
40
|
-
"version": "v0.
|
|
41
|
-
"sha": "
|
|
40
|
+
"version": "v0.88.7",
|
|
41
|
+
"sha": "5e508589e03a7757a7e05b26e834292f5445bfb6"
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Fail a PR that changes bundled extension content without a version bump.
|
|
3
|
+
|
|
4
|
+
Update offers from `specify extension update` are version-driven: an
|
|
5
|
+
extension is offered (and installed) only when the semver in
|
|
6
|
+
`extensions/catalog.json` exceeds the installed copy's registered
|
|
7
|
+
version. A content change shipped without a version bump is therefore
|
|
8
|
+
never delivered automatically (#4345) — a bump is what makes a change
|
|
9
|
+
actually reach existing installs, and this guard is what makes the bump
|
|
10
|
+
non-optional.
|
|
11
|
+
|
|
12
|
+
This check enforces two invariants on the extensions listed in
|
|
13
|
+
`extensions/catalog.json`:
|
|
14
|
+
|
|
15
|
+
1. Any change to a file under `extensions/<id>/` must increase the
|
|
16
|
+
`version:` in that extension's `extension.yml` (PEP 440 comparison,
|
|
17
|
+
the same semantics `extension update` uses), and the resulting
|
|
18
|
+
version must itself parse as PEP 440 — including for a brand-new
|
|
19
|
+
extension, since the CLI rejects a manifest whose version it cannot
|
|
20
|
+
parse.
|
|
21
|
+
2. Every `version` in `extensions/catalog.json` must parse as PEP 440
|
|
22
|
+
(`extension update` skips entries it cannot parse), and for entries
|
|
23
|
+
with an in-repo directory it must equal a likewise-valid
|
|
24
|
+
`extension.version` in the manifest (the catalog is what update
|
|
25
|
+
checks compare against, and the update preflight rejects a manifest
|
|
26
|
+
whose version differs from the catalog's). This runs over every
|
|
27
|
+
catalog entry, so catalog-only (hosted) entries and catalog-only
|
|
28
|
+
promotions of existing directories are covered too.
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
check_extension_version_bump.py BASE_REF [HEAD_REF]
|
|
32
|
+
|
|
33
|
+
BASE_REF is a git ref/SHA for the PR base (must be fetchable with
|
|
34
|
+
`git show`). HEAD_REF defaults to the working tree's HEAD. Exits 0 when
|
|
35
|
+
all invariants hold, 1 otherwise, printing one line per violation.
|
|
36
|
+
|
|
37
|
+
Extensions under `extensions/` that are not in the catalog (the
|
|
38
|
+
`selftest` fixture and the `template` scaffold) are exempt: no update
|
|
39
|
+
flow is driven by their versions.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
import json
|
|
45
|
+
import subprocess
|
|
46
|
+
import sys
|
|
47
|
+
from pathlib import PurePosixPath
|
|
48
|
+
|
|
49
|
+
import yaml
|
|
50
|
+
from packaging.version import InvalidVersion, Version
|
|
51
|
+
|
|
52
|
+
EXTENSIONS_ROOT = "extensions"
|
|
53
|
+
CATALOG_PATH = f"{EXTENSIONS_ROOT}/catalog.json"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _changed_paths(base_ref: str, head_ref: str) -> list[str]:
|
|
57
|
+
"""Paths under extensions/ that differ between *base_ref* and *head_ref*.
|
|
58
|
+
|
|
59
|
+
Uses NUL-delimited output (``-z``): without it git C-quotes any path
|
|
60
|
+
containing non-ASCII or control characters (``"extensions/x/caf\\303\\251"``,
|
|
61
|
+
quotes included), so the leading component would no longer equal
|
|
62
|
+
``extensions`` and that change would silently escape the guard. Paths
|
|
63
|
+
are decoded with surrogateescape so an undecodable byte can never crash
|
|
64
|
+
the check; only the ASCII ``extensions/<id>/`` prefix is interpreted.
|
|
65
|
+
"""
|
|
66
|
+
raw = subprocess.run(
|
|
67
|
+
[
|
|
68
|
+
"git", "diff", "--name-only", "-z", "--no-renames",
|
|
69
|
+
base_ref, head_ref, "--", EXTENSIONS_ROOT,
|
|
70
|
+
],
|
|
71
|
+
check=True,
|
|
72
|
+
capture_output=True,
|
|
73
|
+
).stdout
|
|
74
|
+
return [
|
|
75
|
+
chunk.decode("utf-8", errors="surrogateescape")
|
|
76
|
+
for chunk in raw.split(b"\0")
|
|
77
|
+
if chunk
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _show(ref: str, path: str) -> str | None:
|
|
82
|
+
"""Return the file's content at *ref*, or None when absent there."""
|
|
83
|
+
result = subprocess.run(
|
|
84
|
+
["git", "show", f"{ref}:{path}"], capture_output=True, text=True
|
|
85
|
+
)
|
|
86
|
+
return result.stdout if result.returncode == 0 else None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _manifest_version(manifest_text: str, origin: str) -> str:
|
|
90
|
+
data = yaml.safe_load(manifest_text)
|
|
91
|
+
if not isinstance(data, dict) or not isinstance(data.get("extension"), dict):
|
|
92
|
+
raise ValueError(f"{origin}: manifest is not a mapping with an 'extension' block")
|
|
93
|
+
version = data["extension"].get("version")
|
|
94
|
+
if not isinstance(version, str) or not version.strip():
|
|
95
|
+
raise ValueError(f"{origin}: extension.version is missing or not a string")
|
|
96
|
+
return version.strip()
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def main(argv: list[str]) -> int:
|
|
100
|
+
if len(argv) < 2 or len(argv) > 3:
|
|
101
|
+
print(__doc__, file=sys.stderr)
|
|
102
|
+
return 2
|
|
103
|
+
base_ref = argv[1]
|
|
104
|
+
head_ref = argv[2] if len(argv) == 3 else "HEAD"
|
|
105
|
+
|
|
106
|
+
catalog_text = _show(head_ref, CATALOG_PATH)
|
|
107
|
+
if catalog_text is None:
|
|
108
|
+
print(f"::error::{CATALOG_PATH} is missing at {head_ref}")
|
|
109
|
+
return 1
|
|
110
|
+
catalog = json.loads(catalog_text)
|
|
111
|
+
catalog_entries = catalog.get("extensions", {})
|
|
112
|
+
|
|
113
|
+
errors: list[str] = []
|
|
114
|
+
|
|
115
|
+
# -- Invariant 1: content change requires a version bump ---------------
|
|
116
|
+
changed_ids = {
|
|
117
|
+
parts[1]
|
|
118
|
+
for path in _changed_paths(base_ref, head_ref)
|
|
119
|
+
if len(parts := PurePosixPath(path).parts) >= 3 and parts[0] == EXTENSIONS_ROOT
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
for ext_id in sorted(changed_ids):
|
|
123
|
+
if ext_id not in catalog_entries:
|
|
124
|
+
continue # not driven by `extension update` (selftest, template)
|
|
125
|
+
manifest_path = f"{EXTENSIONS_ROOT}/{ext_id}/extension.yml"
|
|
126
|
+
head_manifest = _show(head_ref, manifest_path)
|
|
127
|
+
if head_manifest is None:
|
|
128
|
+
continue # extension removed in this PR
|
|
129
|
+
try:
|
|
130
|
+
head_version = _manifest_version(head_manifest, f"{head_ref}:{manifest_path}")
|
|
131
|
+
except ValueError as exc:
|
|
132
|
+
errors.append(str(exc))
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
# Parse the head version before the new-extension early return: the
|
|
136
|
+
# CLI's ExtensionManifest rejects a version packaging cannot parse and
|
|
137
|
+
# `extension update` skips catalog entries whose version is invalid,
|
|
138
|
+
# so a new extension shipped with e.g. "not-a-version" in both places
|
|
139
|
+
# would be uninstallable even though the catalog check below (plain
|
|
140
|
+
# string equality) passes. Same PEP 440 semantics as the CLI, so
|
|
141
|
+
# prereleases and other accepted forms are handled identically.
|
|
142
|
+
try:
|
|
143
|
+
head_parsed = Version(head_version)
|
|
144
|
+
except InvalidVersion as exc:
|
|
145
|
+
errors.append(
|
|
146
|
+
f"{manifest_path}: extension.version {head_version!r} is not a valid "
|
|
147
|
+
f"PEP 440 version ({exc}); the CLI rejects this manifest."
|
|
148
|
+
)
|
|
149
|
+
continue
|
|
150
|
+
|
|
151
|
+
base_manifest = _show(base_ref, manifest_path)
|
|
152
|
+
if base_manifest is None:
|
|
153
|
+
continue # new extension; any valid initial version is fine
|
|
154
|
+
try:
|
|
155
|
+
base_version = _manifest_version(base_manifest, f"{base_ref}:{manifest_path}")
|
|
156
|
+
except ValueError as exc:
|
|
157
|
+
errors.append(str(exc))
|
|
158
|
+
continue
|
|
159
|
+
|
|
160
|
+
# Compare with the same PEP 440 semantics the extension update and
|
|
161
|
+
# install code use, so prereleases and other accepted forms cannot
|
|
162
|
+
# bypass the guard (e.g. 2.0.0 -> 1.0.0rc1 is a downgrade). An
|
|
163
|
+
# unparseable base version fails closed.
|
|
164
|
+
try:
|
|
165
|
+
base_parsed = Version(base_version)
|
|
166
|
+
except InvalidVersion as exc:
|
|
167
|
+
errors.append(
|
|
168
|
+
f"{manifest_path}: could not compare versions "
|
|
169
|
+
f"{base_version!r} -> {head_version!r}: {exc}"
|
|
170
|
+
)
|
|
171
|
+
continue
|
|
172
|
+
if head_parsed <= base_parsed:
|
|
173
|
+
errors.append(
|
|
174
|
+
f"{manifest_path}: files under {EXTENSIONS_ROOT}/{ext_id}/ changed but "
|
|
175
|
+
f"extension.version did not increase ({base_version} -> {head_version}). "
|
|
176
|
+
f"Installed copies only receive changes when the version is bumped."
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# -- Invariant 2: catalog versions are valid and match the manifests ----
|
|
180
|
+
# Runs over every catalog entry, changed or not: a catalog-only entry
|
|
181
|
+
# (hosted elsewhere) never has files under extensions/<id>/, and a
|
|
182
|
+
# catalog-only promotion of an existing uncataloged directory never
|
|
183
|
+
# enters Invariant 1, so neither would otherwise have its version parsed.
|
|
184
|
+
for ext_id, entry in sorted(catalog_entries.items()):
|
|
185
|
+
catalog_version = entry.get("version") if isinstance(entry, dict) else None
|
|
186
|
+
if not isinstance(catalog_version, str) or not catalog_version.strip():
|
|
187
|
+
errors.append(f"{CATALOG_PATH}: entry '{ext_id}' has no string 'version'")
|
|
188
|
+
continue
|
|
189
|
+
# `extension update` skips a catalog entry whose version packaging
|
|
190
|
+
# cannot parse, so an invalid catalog version is never offered.
|
|
191
|
+
try:
|
|
192
|
+
Version(catalog_version)
|
|
193
|
+
except InvalidVersion as exc:
|
|
194
|
+
errors.append(
|
|
195
|
+
f"{CATALOG_PATH}: entry '{ext_id}' version {catalog_version!r} is not a "
|
|
196
|
+
f"valid PEP 440 version ({exc}); `extension update` skips such entries."
|
|
197
|
+
)
|
|
198
|
+
continue
|
|
199
|
+
|
|
200
|
+
manifest_path = f"{EXTENSIONS_ROOT}/{ext_id}/extension.yml"
|
|
201
|
+
head_manifest = _show(head_ref, manifest_path)
|
|
202
|
+
if head_manifest is None:
|
|
203
|
+
continue # catalog-only entry (e.g. hosted elsewhere); version checked above
|
|
204
|
+
try:
|
|
205
|
+
manifest_version = _manifest_version(head_manifest, f"{head_ref}:{manifest_path}")
|
|
206
|
+
except ValueError as exc:
|
|
207
|
+
errors.append(str(exc))
|
|
208
|
+
continue
|
|
209
|
+
try:
|
|
210
|
+
Version(manifest_version)
|
|
211
|
+
except InvalidVersion as exc:
|
|
212
|
+
errors.append(
|
|
213
|
+
f"{manifest_path}: extension.version {manifest_version!r} is not a valid "
|
|
214
|
+
f"PEP 440 version ({exc}); the CLI rejects this manifest."
|
|
215
|
+
)
|
|
216
|
+
continue
|
|
217
|
+
if catalog_version != manifest_version:
|
|
218
|
+
errors.append(
|
|
219
|
+
f"{CATALOG_PATH}: entry '{ext_id}' has version {catalog_version!r} but "
|
|
220
|
+
f"{manifest_path} declares {manifest_version!r}. `extension update` "
|
|
221
|
+
f"compares against the catalog, so the two must move together."
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
for error in errors:
|
|
225
|
+
print(f"::error::{error}")
|
|
226
|
+
if not errors:
|
|
227
|
+
print("Extension version guard: all invariants hold.")
|
|
228
|
+
return 1 if errors else 0
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
if __name__ == "__main__":
|
|
232
|
+
sys.exit(main(sys.argv))
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Reviews Spec Kit code changes for positive and negative test coverage, regression evidence for bug fixes, and consistent repository terminology. Use when reviewing a diff or pull request. Do not use for implementing changes or posting GitHub review actions.
|
|
4
|
+
argument-hint: 'Diff or pull request to review'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Code Review
|
|
8
|
+
|
|
9
|
+
1. Ensure each code change has test cases that verify what the code should do and what it should prevent.
|
|
10
|
+
2. Ensure bug-fix pull requests include a regression test that demonstrates the bug was reproducible before the change and is fixed afterward; if the reviewer cannot run the comparison, use available evidence and state that limitation.
|
|
11
|
+
3. Ensure wording changes use repository-consistent terms; exclude community-authored catalog content and its generated documentation from this check.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"
|
|
1
|
+
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"e5175ffebd1e7d54595b73aa83d4e8c1275b01ddca1eda67a6df3713e34d99d4","body_hash":"cade22e5083254b735200f4ff7d686104e4ccab848ff7355141b9689354834db","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
|
|
2
2
|
# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"c0338fef4749d08c21f8f975fb0e37efa17dda47","version":"v0.79.8"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
|
|
3
3
|
# This file was automatically generated by gh-aw (v0.79.8). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
|
|
4
4
|
#
|
|
@@ -1514,12 +1514,11 @@ jobs:
|
|
|
1514
1514
|
- name: Parse and conclude threat detection
|
|
1515
1515
|
id: detection_conclusion
|
|
1516
1516
|
if: always()
|
|
1517
|
-
continue-on-error: true
|
|
1518
1517
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
1519
1518
|
env:
|
|
1520
1519
|
RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }}
|
|
1521
1520
|
DETECTION_AGENTIC_EXECUTION_OUTCOME: ${{ steps.detection_agentic_execution.outcome }}
|
|
1522
|
-
GH_AW_DETECTION_CONTINUE_ON_ERROR: "
|
|
1521
|
+
GH_AW_DETECTION_CONTINUE_ON_ERROR: "false"
|
|
1523
1522
|
with:
|
|
1524
1523
|
script: |
|
|
1525
1524
|
try {
|
|
@@ -26,6 +26,8 @@ checkout:
|
|
|
26
26
|
safe-outputs:
|
|
27
27
|
noop:
|
|
28
28
|
report-as-issue: false
|
|
29
|
+
threat-detection:
|
|
30
|
+
continue-on-error: false
|
|
29
31
|
create-pull-request:
|
|
30
32
|
title-prefix: "[bundle] "
|
|
31
33
|
labels: [bundle-submission, automated]
|
|
@@ -118,11 +120,26 @@ Run every check and collect all failures before deciding the outcome.
|
|
|
118
120
|
|
|
119
121
|
### 2c. Release artifact
|
|
120
122
|
|
|
121
|
-
- The download URL
|
|
122
|
-
|
|
123
|
+
- The download URL MUST belong to the submitted repository
|
|
124
|
+
(`https://github.com/<owner>/<repo>/...` with the same `<owner>/<repo>` as
|
|
125
|
+
the Repository URL). Reject URLs for any other GitHub repository.
|
|
126
|
+
- The download URL MUST follow the accepted tag-pinned pattern:
|
|
123
127
|
`https://github.com/<owner>/<repo>/releases/download/<tag>/<asset>.zip`.
|
|
124
|
-
-
|
|
125
|
-
|
|
128
|
+
- If the download URL path contains `releases/latest/`, reject with an
|
|
129
|
+
explanation — this URL is floating and not acceptable. Mark this pinning
|
|
130
|
+
check failed and skip the HTTP request for this URL, then continue the
|
|
131
|
+
remaining validations.
|
|
132
|
+
- The `<tag>` segment in the URL MUST correspond to the submitted version.
|
|
133
|
+
Accept `vX.Y.Z`, `X.Y.Z`, and scoped tags whose version suffix matches
|
|
134
|
+
(for example `aide-v1.0.0` for version `1.0.0`). Reject a tag whose
|
|
135
|
+
embedded semver does not equal the submitted version.
|
|
136
|
+
- Only after all pinning checks pass, fetch the download URL and perform the
|
|
137
|
+
remaining artifact checks:
|
|
138
|
+
- Verify the URL returns HTTP 200.
|
|
139
|
+
- If `sha256` is included, verify it matches the downloaded archive. Requiring
|
|
140
|
+
`sha256` on every catalog entry is follow-up work and MUST NOT fail this
|
|
141
|
+
check when the field is absent.
|
|
142
|
+
- Confirm the release exists and the exact ZIP asset is attached to it.
|
|
126
143
|
- Confirm the asset name is versioned and consistent with the submitted bundle
|
|
127
144
|
ID and version.
|
|
128
145
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"
|
|
1
|
+
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"bf4bb9600475cf7ec1cd2aaf573ce6b2c11f644db0376c30d5b6926dd06d78b1","body_hash":"83b7e917f475d6ddf32f17e7da09dd4097a01dddbcbbf8eeec673912285de8b2","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
|
|
2
2
|
# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"c0338fef4749d08c21f8f975fb0e37efa17dda47","version":"v0.79.8"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
|
|
3
3
|
# This file was automatically generated by gh-aw (v0.79.8). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
|
|
4
4
|
#
|
|
@@ -1494,12 +1494,11 @@ jobs:
|
|
|
1494
1494
|
- name: Parse and conclude threat detection
|
|
1495
1495
|
id: detection_conclusion
|
|
1496
1496
|
if: always()
|
|
1497
|
-
continue-on-error: true
|
|
1498
1497
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
1499
1498
|
env:
|
|
1500
1499
|
RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }}
|
|
1501
1500
|
DETECTION_AGENTIC_EXECUTION_OUTCOME: ${{ steps.detection_agentic_execution.outcome }}
|
|
1502
|
-
GH_AW_DETECTION_CONTINUE_ON_ERROR: "
|
|
1501
|
+
GH_AW_DETECTION_CONTINUE_ON_ERROR: "false"
|
|
1503
1502
|
with:
|
|
1504
1503
|
script: |
|
|
1505
1504
|
try {
|
|
@@ -26,6 +26,8 @@ checkout:
|
|
|
26
26
|
safe-outputs:
|
|
27
27
|
noop:
|
|
28
28
|
report-as-issue: false
|
|
29
|
+
threat-detection:
|
|
30
|
+
continue-on-error: false
|
|
29
31
|
create-pull-request:
|
|
30
32
|
title-prefix: "[extension] "
|
|
31
33
|
labels: [extension-submission, automated]
|
|
@@ -110,11 +112,28 @@ deciding pass/fail:
|
|
|
110
112
|
- Confirm the repository contains a `LICENSE` file
|
|
111
113
|
|
|
112
114
|
### 2d. Release and download URL validation
|
|
113
|
-
- The download URL
|
|
114
|
-
`https://github.com/<owner>/<repo
|
|
115
|
+
- The download URL MUST belong to the submitted repository
|
|
116
|
+
(`https://github.com/<owner>/<repo>/...` with the same `<owner>/<repo>` as
|
|
117
|
+
the Repository URL). Reject URLs for any other GitHub repository.
|
|
118
|
+
- The download URL MUST follow one of the accepted tag-pinned patterns:
|
|
119
|
+
`https://github.com/<owner>/<repo>/archive/refs/tags/<tag>.zip`
|
|
115
120
|
or
|
|
116
121
|
`https://github.com/<owner>/<repo>/releases/download/<tag>/<asset>.zip`
|
|
117
|
-
-
|
|
122
|
+
- If the download URL path contains `releases/latest/`, reject with an
|
|
123
|
+
explanation — this URL is floating and not acceptable. Mark this pinning
|
|
124
|
+
check failed and skip the HTTP request for this URL, then continue the
|
|
125
|
+
remaining validations.
|
|
126
|
+
- The `<tag>` segment in the URL MUST correspond to the submitted version.
|
|
127
|
+
Accept `vX.Y.Z`, `X.Y.Z`, and scoped tags whose version suffix matches
|
|
128
|
+
(for example `aide-v1.0.0` for version `1.0.0`). Reject a tag whose
|
|
129
|
+
embedded semver does not equal the submitted version.
|
|
130
|
+
- Only after all pinning checks pass, fetch the download URL and perform the
|
|
131
|
+
remaining artifact checks:
|
|
132
|
+
- Verify the URL returns HTTP 200.
|
|
133
|
+
- If `sha256` is included, verify it matches the downloaded archive. Requiring
|
|
134
|
+
`sha256` on every catalog entry is follow-up work and MUST NOT fail this
|
|
135
|
+
check when the field is absent.
|
|
136
|
+
- Verify a GitHub release exists for that tag.
|
|
118
137
|
|
|
119
138
|
### 2e. Submission checklists
|
|
120
139
|
- Confirm that all required checkboxes in the Testing Checklist and Submission
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"
|
|
1
|
+
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"1efd167841504436c44dd8e18cf8b1771eda1324272d53b89bd09897bb0f04c8","body_hash":"cb6c19088fa13da0a8320c174e8c14c4887d2c8a005a5cb2d2d2faa3f890de39","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
|
|
2
2
|
# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"c0338fef4749d08c21f8f975fb0e37efa17dda47","version":"v0.79.8"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
|
|
3
3
|
# This file was automatically generated by gh-aw (v0.79.8). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
|
|
4
4
|
#
|
|
@@ -1494,12 +1494,11 @@ jobs:
|
|
|
1494
1494
|
- name: Parse and conclude threat detection
|
|
1495
1495
|
id: detection_conclusion
|
|
1496
1496
|
if: always()
|
|
1497
|
-
continue-on-error: true
|
|
1498
1497
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
1499
1498
|
env:
|
|
1500
1499
|
RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }}
|
|
1501
1500
|
DETECTION_AGENTIC_EXECUTION_OUTCOME: ${{ steps.detection_agentic_execution.outcome }}
|
|
1502
|
-
GH_AW_DETECTION_CONTINUE_ON_ERROR: "
|
|
1501
|
+
GH_AW_DETECTION_CONTINUE_ON_ERROR: "false"
|
|
1503
1502
|
with:
|
|
1504
1503
|
script: |
|
|
1505
1504
|
try {
|
|
@@ -26,6 +26,8 @@ checkout:
|
|
|
26
26
|
safe-outputs:
|
|
27
27
|
noop:
|
|
28
28
|
report-as-issue: false
|
|
29
|
+
threat-detection:
|
|
30
|
+
continue-on-error: false
|
|
29
31
|
create-pull-request:
|
|
30
32
|
title-prefix: "[preset] "
|
|
31
33
|
labels: [preset-submission, automated]
|
|
@@ -161,11 +163,28 @@ preset** — not just any file named `README.md`, and not a product/framework pi
|
|
|
161
163
|
`specify preset add ...` command for this preset; otherwise it fails check 2d above.
|
|
162
164
|
|
|
163
165
|
### 2e. Release and download URL validation
|
|
164
|
-
- The download URL
|
|
165
|
-
`https://github.com/<owner>/<repo
|
|
166
|
+
- The download URL MUST belong to the submitted repository
|
|
167
|
+
(`https://github.com/<owner>/<repo>/...` with the same `<owner>/<repo>` as
|
|
168
|
+
the Repository URL). Reject URLs for any other GitHub repository.
|
|
169
|
+
- The download URL MUST follow one of the accepted tag-pinned patterns:
|
|
170
|
+
`https://github.com/<owner>/<repo>/archive/refs/tags/<tag>.zip`
|
|
166
171
|
or
|
|
167
172
|
`https://github.com/<owner>/<repo>/releases/download/<tag>/<asset>.zip`
|
|
168
|
-
-
|
|
173
|
+
- If the download URL path contains `releases/latest/`, reject with an
|
|
174
|
+
explanation — this URL is floating and not acceptable. Mark this pinning
|
|
175
|
+
check failed and skip the HTTP request for this URL, then continue the
|
|
176
|
+
remaining validations.
|
|
177
|
+
- The `<tag>` segment in the URL MUST correspond to the submitted version.
|
|
178
|
+
Accept `vX.Y.Z`, `X.Y.Z`, and scoped tags whose version suffix matches
|
|
179
|
+
(for example `aide-v1.0.0` for version `1.0.0`). Reject a tag whose
|
|
180
|
+
embedded semver does not equal the submitted version.
|
|
181
|
+
- Only after all pinning checks pass, fetch the download URL and perform the
|
|
182
|
+
remaining artifact checks:
|
|
183
|
+
- Verify the URL returns HTTP 200.
|
|
184
|
+
- If `sha256` is included, verify it matches the downloaded archive. Requiring
|
|
185
|
+
`sha256` on every catalog entry is follow-up work and MUST NOT fail this
|
|
186
|
+
check when the field is absent.
|
|
187
|
+
- Verify a GitHub release exists for that tag.
|
|
169
188
|
|
|
170
189
|
### 2f. Submission checklists
|
|
171
190
|
- Confirm that all required checkboxes in the Testing Checklist and Submission
|