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.
Files changed (585) hide show
  1. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/aw/actions-lock.json +8 -8
  2. specify_cli-1.0.7/.github/scripts/check_extension_version_bump.py +232 -0
  3. specify_cli-1.0.7/.github/skills/code-review/SKILL.md +11 -0
  4. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-bundle.lock.yml +2 -3
  5. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-bundle.md +21 -4
  6. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-extension.lock.yml +2 -3
  7. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-extension.md +22 -3
  8. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-preset.lock.yml +2 -3
  9. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/add-community-preset.md +22 -3
  10. specify_cli-1.0.7/.github/workflows/bug-assess.lock.yml +1899 -0
  11. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/docs.yml +1 -1
  12. specify_cli-1.0.7/.github/workflows/extension-version-guard.yml +57 -0
  13. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/stale.yml +5 -5
  14. {specify_cli-1.0.5 → specify_cli-1.0.7}/AGENTS.md +1 -0
  15. {specify_cli-1.0.5 → specify_cli-1.0.7}/CHANGELOG.md +50 -0
  16. {specify_cli-1.0.5 → specify_cli-1.0.7}/CONTRIBUTING.md +101 -2
  17. specify_cli-1.0.7/PKG-INFO +215 -0
  18. specify_cli-1.0.7/README.md +195 -0
  19. specify_cli-1.0.7/README.zh-CN.md +190 -0
  20. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/README.md +5 -1
  21. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/extensions.md +7 -4
  22. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/overview.md +12 -0
  23. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/presets.md +1 -0
  24. specify_cli-1.0.7/docs/guides/assessment.md +115 -0
  25. specify_cli-1.0.7/docs/guides/bugfix.md +82 -0
  26. specify_cli-1.0.7/docs/guides/customization.md +105 -0
  27. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/guides/existing-projects.md +7 -1
  28. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/history.md +13 -0
  29. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/index.md +37 -8
  30. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/installation.md +30 -0
  31. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/local-development.md +4 -0
  32. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/quickstart.md +85 -39
  33. specify_cli-1.0.7/docs/reference/agentic-assessment.md +102 -0
  34. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/agentic-bugfix.md +6 -1
  35. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/agentic-sdd.md +52 -2
  36. specify_cli-1.0.7/docs/reference/artifacts.md +241 -0
  37. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/bundles.md +25 -2
  38. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/core.md +1 -1
  39. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/extensions.md +16 -0
  40. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/integrations.md +20 -0
  41. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/overview.md +21 -1
  42. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/presets.md +14 -0
  43. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/workflows.md +38 -0
  44. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/toc.yml +11 -1
  45. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +7 -0
  46. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/README.md +23 -1
  47. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/catalog.community.json +188 -47
  48. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-August.md +3 -3
  49. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/catalog.community.json +35 -6
  50. {specify_cli-1.0.5 → specify_cli-1.0.7}/pyproject.toml +1 -1
  51. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/__init__.py +7 -0
  52. specify_cli-1.0.7/src/specify_cli/_installed_list_json.py +84 -0
  53. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_project.py +42 -17
  54. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/agents.py +15 -1
  55. specify_cli-1.0.7/src/specify_cli/artifacts/__init__.py +37 -0
  56. specify_cli-1.0.7/src/specify_cli/artifacts/_commands.py +201 -0
  57. specify_cli-1.0.7/src/specify_cli/artifacts/_identifiers.py +162 -0
  58. specify_cli-1.0.7/src/specify_cli/artifacts/catalog.py +1163 -0
  59. specify_cli-1.0.7/src/specify_cli/artifacts/models.py +182 -0
  60. specify_cli-1.0.7/src/specify_cli/artifacts/resolution.py +498 -0
  61. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/installer.py +20 -1
  62. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/primitives.py +42 -12
  63. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/bundle/__init__.py +12 -2
  64. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/init.py +8 -2
  65. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/events.py +30 -1
  66. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/extensions/__init__.py +36 -3
  67. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/extensions/_commands.py +36 -3
  68. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/agy/__init__.py +4 -0
  69. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/base.py +79 -5
  70. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/bob/__init__.py +90 -0
  71. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/codex/__init__.py +6 -0
  72. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/copilot/__init__.py +9 -0
  73. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/cursor_agent/__init__.py +6 -0
  74. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/devin/__init__.py +6 -0
  75. specify_cli-1.0.7/src/specify_cli/integrations/docker_agent/__init__.py +204 -0
  76. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/droid/__init__.py +6 -0
  77. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/dsh/__init__.py +6 -0
  78. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/goose/__init__.py +6 -0
  79. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/grok/__init__.py +6 -0
  80. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/hermes/__init__.py +4 -0
  81. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/muse/__init__.py +6 -0
  82. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/omp/__init__.py +6 -0
  83. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/opencode/__init__.py +6 -0
  84. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/rovodev/__init__.py +4 -0
  85. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/presets/__init__.py +41 -3
  86. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/presets/_commands.py +28 -2
  87. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/base.py +3 -0
  88. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/engine.py +6 -0
  89. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/expressions.py +104 -109
  90. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/command/__init__.py +109 -6
  91. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/analyze.md +2 -2
  92. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/checklist.md +2 -2
  93. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/clarify.md +4 -4
  94. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/constitution.md +5 -3
  95. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/converge.md +2 -2
  96. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/implement.md +2 -2
  97. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/plan.md +2 -2
  98. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/specify.md +2 -2
  99. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/tasks.md +2 -2
  100. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/commands/taskstoissues.md +2 -2
  101. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/conftest.py +67 -0
  102. specify_cli-1.0.7/tests/contract/test_bundled_extension_versions.py +83 -0
  103. specify_cli-1.0.7/tests/contract/test_extension_version_guard_script.py +352 -0
  104. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_install_flow.py +100 -0
  105. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_local_install.py +170 -1
  106. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_base.py +32 -0
  107. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_cli.py +76 -0
  108. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_events.py +192 -0
  109. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_bob.py +179 -0
  110. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_docker_agent.py +145 -0
  111. specify_cli-1.0.7/tests/test_artifact_command.py +2819 -0
  112. specify_cli-1.0.7/tests/test_artifact_command_parity.py +173 -0
  113. specify_cli-1.0.7/tests/test_clarify_stage_gate.py +25 -0
  114. specify_cli-1.0.7/tests/test_command_template_hooks.py +80 -0
  115. specify_cli-1.0.7/tests/test_constitution_template_sync_report.py +25 -0
  116. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_skills.py +46 -0
  117. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extensions.py +90 -9
  118. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_github_workflows.py +101 -0
  119. specify_cli-1.0.7/tests/test_installed_list_json.py +480 -0
  120. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_presets.py +81 -2
  121. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_workflows.py +341 -0
  122. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_primitives.py +174 -0
  123. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_condition_expression_block.py +160 -7
  124. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/README.md +33 -0
  125. specify_cli-1.0.5/.github/workflows/bug-assess.lock.yml +0 -1622
  126. specify_cli-1.0.5/PKG-INFO +0 -512
  127. specify_cli-1.0.5/README.md +0 -492
  128. specify_cli-1.0.5/README.zh-CN.md +0 -361
  129. specify_cli-1.0.5/src/specify_cli/integrations/docker_agent/__init__.py +0 -126
  130. {specify_cli-1.0.5 → specify_cli-1.0.7}/.devcontainer/devcontainer.json +0 -0
  131. {specify_cli-1.0.5 → specify_cli-1.0.7}/.devcontainer/post-create.sh +0 -0
  132. {specify_cli-1.0.5 → specify_cli-1.0.7}/.editorconfig +0 -0
  133. {specify_cli-1.0.5 → specify_cli-1.0.7}/.gitattributes +0 -0
  134. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/CODEOWNERS +0 -0
  135. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  136. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  137. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  138. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  139. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  140. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  141. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  142. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  143. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/dependabot.yml +0 -0
  144. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/scripts/check_security_requirements.py +0 -0
  145. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/security-audit-requirements.txt +0 -0
  146. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/skills/add-community-extension/SKILL.md +0 -0
  147. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/RELEASE-PROCESS.md +0 -0
  148. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-assess.md +0 -0
  149. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-fix.lock.yml +0 -0
  150. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-fix.md +0 -0
  151. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-test.lock.yml +0 -0
  152. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/bug-test.md +0 -0
  153. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/catalog-assign.yml +0 -0
  154. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/codeql.yml +0 -0
  155. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/feature-assess.lock.yml +0 -0
  156. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/feature-assess.md +0 -0
  157. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/lint.yml +0 -0
  158. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/publish-pypi.yml +0 -0
  159. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/release-trigger.yml +0 -0
  160. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/release.yml +0 -0
  161. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/security.yml +0 -0
  162. {specify_cli-1.0.5 → specify_cli-1.0.7}/.github/workflows/test.yml +0 -0
  163. {specify_cli-1.0.5 → specify_cli-1.0.7}/.gitignore +0 -0
  164. {specify_cli-1.0.5 → specify_cli-1.0.7}/.markdownlint-cli2.jsonc +0 -0
  165. {specify_cli-1.0.5 → specify_cli-1.0.7}/.pre-commit-config.yaml +0 -0
  166. {specify_cli-1.0.5 → specify_cli-1.0.7}/.zenodo.json +0 -0
  167. {specify_cli-1.0.5 → specify_cli-1.0.7}/CITATION.cff +0 -0
  168. {specify_cli-1.0.5 → specify_cli-1.0.7}/CODE_OF_CONDUCT.md +0 -0
  169. {specify_cli-1.0.5 → specify_cli-1.0.7}/DEVELOPMENT.md +0 -0
  170. {specify_cli-1.0.5 → specify_cli-1.0.7}/LICENSE +0 -0
  171. {specify_cli-1.0.5 → specify_cli-1.0.7}/SECURITY.md +0 -0
  172. {specify_cli-1.0.5 → specify_cli-1.0.7}/SUPPORT.md +0 -0
  173. {specify_cli-1.0.5 → specify_cli-1.0.7}/bundles/catalog.community.json +0 -0
  174. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/.gitignore +0 -0
  175. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/bundles.md +0 -0
  176. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/friends.md +0 -0
  177. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/community/walkthroughs.md +0 -0
  178. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/complex-features.md +0 -0
  179. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/sdd.md +0 -0
  180. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/spec-of-specs.md +0 -0
  181. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/concepts/spec-persistence.md +0 -0
  182. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/docfx.json +0 -0
  183. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/guides/evolving-specs.md +0 -0
  184. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/guides/monorepo.md +0 -0
  185. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/images/spec-kit-logo.webp +0 -0
  186. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/air-gapped.md +0 -0
  187. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/one-time.md +0 -0
  188. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/pipx.md +0 -0
  189. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/pypi.md +0 -0
  190. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/install/uv.md +0 -0
  191. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/reference/authentication.md +0 -0
  192. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/template/public/main.css +0 -0
  193. {specify_cli-1.0.5 → specify_cli-1.0.7}/docs/upgrade.md +0 -0
  194. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/business-analyst/README.md +0 -0
  195. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/business-analyst/bundle.yml +0 -0
  196. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/developer/README.md +0 -0
  197. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/developer/bundle.yml +0 -0
  198. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/product-manager/README.md +0 -0
  199. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/product-manager/bundle.yml +0 -0
  200. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/security-researcher/README.md +0 -0
  201. {specify_cli-1.0.5 → specify_cli-1.0.7}/examples/bundles/security-researcher/bundle.yml +0 -0
  202. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  203. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  204. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  205. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/README.md +0 -0
  206. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  207. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/README.md +0 -0
  208. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/agent-context-config.yml +0 -0
  209. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/agent-context-defaults.json +0 -0
  210. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  211. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/extension.yml +0 -0
  212. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  213. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  214. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  215. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.decide.md +0 -0
  216. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.define.md +0 -0
  217. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.intake.md +0 -0
  218. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.research.md +0 -0
  219. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/commands/speckit.assess.shape.md +0 -0
  220. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/assess/extension.yml +0 -0
  221. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/README.md +0 -0
  222. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  223. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  224. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/commands/speckit.bug.test.md +0 -0
  225. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/bug/extension.yml +0 -0
  226. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/catalog.json +0 -0
  227. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/README.md +0 -0
  228. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.commit.md +0 -0
  229. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.feature.md +0 -0
  230. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.initialize.md +0 -0
  231. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.remote.md +0 -0
  232. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/commands/speckit.git.validate.md +0 -0
  233. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/config-template.yml +0 -0
  234. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/extension.yml +0 -0
  235. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/git-config.yml +0 -0
  236. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  237. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  238. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/git-common.sh +0 -0
  239. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  240. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  241. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  242. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  243. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  244. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/auto_commit.py +0 -0
  245. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
  246. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/git_common.py +0 -0
  247. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/git/scripts/python/initialize_repo.py +0 -0
  248. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/selftest/commands/selftest.md +0 -0
  249. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/selftest/extension.yml +0 -0
  250. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/.gitignore +0 -0
  251. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/CHANGELOG.md +0 -0
  252. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/EXAMPLE-README.md +0 -0
  253. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/LICENSE +0 -0
  254. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/README.md +0 -0
  255. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/commands/example.md +0 -0
  256. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/config-template.yml +0 -0
  257. {specify_cli-1.0.5 → specify_cli-1.0.7}/extensions/template/extension.yml +0 -0
  258. {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/CONTRIBUTING.md +0 -0
  259. {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/README.md +0 -0
  260. {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/catalog.community.json +0 -0
  261. {specify_cli-1.0.5 → specify_cli-1.0.7}/integrations/catalog.json +0 -0
  262. {specify_cli-1.0.5 → specify_cli-1.0.7}/media/bootstrap-claude-code.gif +0 -0
  263. {specify_cli-1.0.5 → specify_cli-1.0.7}/media/logo_large.webp +0 -0
  264. {specify_cli-1.0.5 → specify_cli-1.0.7}/media/logo_small.webp +0 -0
  265. {specify_cli-1.0.5 → specify_cli-1.0.7}/media/spec-kit-video-header.jpg +0 -0
  266. {specify_cli-1.0.5 → specify_cli-1.0.7}/media/specify_cli.gif +0 -0
  267. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-April.md +0 -0
  268. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-February.md +0 -0
  269. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-July.md +0 -0
  270. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-June.md +0 -0
  271. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-March.md +0 -0
  272. {specify_cli-1.0.5 → specify_cli-1.0.7}/newsletters/2026-May.md +0 -0
  273. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/ARCHITECTURE.md +0 -0
  274. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/PUBLISHING.md +0 -0
  275. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/README.md +0 -0
  276. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/catalog.json +0 -0
  277. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/constitution-sync/README.md +0 -0
  278. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/constitution-sync/commands/speckit.constitution.md +0 -0
  279. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/constitution-sync/preset.yml +0 -0
  280. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/README.md +0 -0
  281. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.constitution.md +0 -0
  282. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.implement.md +0 -0
  283. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.plan.md +0 -0
  284. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.specify.md +0 -0
  285. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/commands/speckit.tasks.md +0 -0
  286. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/lean/preset.yml +0 -0
  287. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/README.md +0 -0
  288. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  289. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/commands/speckit.specify.md +0 -0
  290. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/preset.yml +0 -0
  291. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/templates/myext-template.md +0 -0
  292. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/scaffold/templates/spec-template.md +0 -0
  293. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/commands/speckit.specify.md +0 -0
  294. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  295. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/preset.yml +0 -0
  296. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/checklist-template.md +0 -0
  297. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/constitution-template.md +0 -0
  298. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/plan-template.md +0 -0
  299. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/spec-template.md +0 -0
  300. {specify_cli-1.0.5 → specify_cli-1.0.7}/presets/self-test/templates/tasks-template.md +0 -0
  301. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/check-prerequisites.sh +0 -0
  302. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/common.sh +0 -0
  303. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/create-new-feature.sh +0 -0
  304. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/resolve-template.sh +0 -0
  305. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/setup-plan.sh +0 -0
  306. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/bash/setup-tasks.sh +0 -0
  307. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/check-prerequisites.ps1 +0 -0
  308. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/common.ps1 +0 -0
  309. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/create-new-feature.ps1 +0 -0
  310. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/resolve-template.ps1 +0 -0
  311. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/setup-plan.ps1 +0 -0
  312. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/powershell/setup-tasks.ps1 +0 -0
  313. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/check_prerequisites.py +0 -0
  314. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/common.py +0 -0
  315. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/create_new_feature.py +0 -0
  316. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/resolve_template.py +0 -0
  317. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/setup_plan.py +0 -0
  318. {specify_cli-1.0.5 → specify_cli-1.0.7}/scripts/python/setup_tasks.py +0 -0
  319. {specify_cli-1.0.5 → specify_cli-1.0.7}/spec-driven.md +0 -0
  320. {specify_cli-1.0.5 → specify_cli-1.0.7}/spec-kit.code-workspace +0 -0
  321. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_agent_config.py +0 -0
  322. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_assets.py +0 -0
  323. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_console.py +0 -0
  324. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_download_security.py +0 -0
  325. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_github_http.py +0 -0
  326. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_init_options.py +0 -0
  327. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_invocation_style.py +0 -0
  328. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_toml_string.py +0 -0
  329. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_utils.py +0 -0
  330. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/_version.py +0 -0
  331. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/__init__.py +0 -0
  332. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/azure_devops.py +0 -0
  333. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/base.py +0 -0
  334. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/config.py +0 -0
  335. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/github.py +0 -0
  336. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/authentication/http.py +0 -0
  337. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/__init__.py +0 -0
  338. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  339. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  340. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/__init__.py +0 -0
  341. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/project.py +0 -0
  342. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/versioning.py +0 -0
  343. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  344. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/__init__.py +0 -0
  345. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/catalog.py +0 -0
  346. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/manifest.py +0 -0
  347. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/models/records.py +0 -0
  348. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/__init__.py +0 -0
  349. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/adapters.py +0 -0
  350. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  351. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/conflict.py +0 -0
  352. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/packager.py +0 -0
  353. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/references.py +0 -0
  354. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/resolver.py +0 -0
  355. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/bundler/services/validator.py +0 -0
  356. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/catalogs.py +0 -0
  357. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/__init__.py +0 -0
  358. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/commands/event.py +0 -0
  359. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_runtime.py +0 -0
  360. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_scaffold.py +0 -0
  361. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_state.py +0 -0
  362. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integration_status.py +0 -0
  363. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/__init__.py +0 -0
  364. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_commands.py +0 -0
  365. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_helpers.py +0 -0
  366. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_install_commands.py +0 -0
  367. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  368. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_query_commands.py +0 -0
  369. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  370. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
  371. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/amp/__init__.py +0 -0
  372. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  373. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/catalog.py +0 -0
  374. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/claude/__init__.py +0 -0
  375. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/cline/__init__.py +0 -0
  376. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  377. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/command_code/__init__.py +0 -0
  378. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  379. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/forge/__init__.py +0 -0
  380. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  381. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/generic/__init__.py +0 -0
  382. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/junie/__init__.py +0 -0
  383. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  384. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  385. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  386. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  387. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/manifest.py +0 -0
  388. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/pi/__init__.py +0 -0
  389. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  390. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  391. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/shai/__init__.py +0 -0
  392. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  393. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/trae/__init__.py +0 -0
  394. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  395. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  396. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/integrations/zed/__init__.py +0 -0
  397. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/shared_infra.py +0 -0
  398. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/__init__.py +0 -0
  399. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/_commands.py +0 -0
  400. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/catalog.py +0 -0
  401. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/__init__.py +0 -0
  402. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/_commands.py +0 -0
  403. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/composer.py +0 -0
  404. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
  405. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/merge.py +0 -0
  406. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/overlays/schema.py +0 -0
  407. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/__init__.py +0 -0
  408. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  409. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  410. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  411. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  412. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  413. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  414. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  415. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  416. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/slot/__init__.py +0 -0
  417. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  418. {specify_cli-1.0.5 → specify_cli-1.0.7}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  419. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/checklist-template.md +0 -0
  420. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/constitution-template.md +0 -0
  421. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/plan-template.md +0 -0
  422. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/spec-template.md +0 -0
  423. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/tasks-template.md +0 -0
  424. {specify_cli-1.0.5 → specify_cli-1.0.7}/templates/vscode-settings.json +0 -0
  425. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/__init__.py +0 -0
  426. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/auth_helpers.py +0 -0
  427. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/bundler_helpers.py +0 -0
  428. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_bundle_cli.py +0 -0
  429. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_catalog_schema.py +0 -0
  430. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_manifest_schema.py +0 -0
  431. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_wheel_bundled_presets.py +0 -0
  432. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
  433. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/__init__.py +0 -0
  434. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/assess/__init__.py +0 -0
  435. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/assess/test_assess_extension.py +0 -0
  436. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/bug/__init__.py +0 -0
  437. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/bug/test_bug_extension.py +0 -0
  438. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/git/__init__.py +0 -0
  439. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/git/test_git_extension.py +0 -0
  440. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
  441. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_agent_context_cli_free.py +0 -0
  442. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_extension_agent_context.py +0 -0
  443. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  444. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  445. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/TESTING.md +0 -0
  446. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/plan.md +0 -0
  447. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/spec.md +0 -0
  448. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/hooks/tasks.md +0 -0
  449. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/http_helpers.py +0 -0
  450. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_catalog_stack.py +0 -0
  451. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_init_install.py +0 -0
  452. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_offline.py +0 -0
  453. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integration/test_bundler_security_paths.py +0 -0
  454. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/__init__.py +0 -0
  455. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/conftest.py +0 -0
  456. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_extra_args.py +0 -0
  457. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_home_isolation.py +0 -0
  458. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_agy.py +0 -0
  459. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_alquimia.py +0 -0
  460. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_amp.py +0 -0
  461. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_auggie.py +0 -0
  462. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_markdown.py +0 -0
  463. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_skills.py +0 -0
  464. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_toml.py +0 -0
  465. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_base_yaml.py +0 -0
  466. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_catalog.py +0 -0
  467. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_claude.py +0 -0
  468. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_cline.py +0 -0
  469. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_codebuddy.py +0 -0
  470. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_codex.py +0 -0
  471. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_command_code.py +0 -0
  472. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_copilot.py +0 -0
  473. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_cursor_agent.py +0 -0
  474. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_devin.py +0 -0
  475. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_droid.py +0 -0
  476. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_dsh.py +0 -0
  477. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_firebender.py +0 -0
  478. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_forge.py +0 -0
  479. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_gemini.py +0 -0
  480. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_generic.py +0 -0
  481. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_goose.py +0 -0
  482. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_grok.py +0 -0
  483. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_hermes.py +0 -0
  484. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_junie.py +0 -0
  485. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_kilocode.py +0 -0
  486. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_kimi.py +0 -0
  487. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_kiro_cli.py +0 -0
  488. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_lingma.py +0 -0
  489. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_muse.py +0 -0
  490. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_omp.py +0 -0
  491. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_opencode.py +0 -0
  492. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_pi.py +0 -0
  493. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_qodercli.py +0 -0
  494. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_qwen.py +0 -0
  495. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_rovodev.py +0 -0
  496. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_scaffold.py +0 -0
  497. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_shai.py +0 -0
  498. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_state.py +0 -0
  499. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_subcommand.py +0 -0
  500. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_tabnine.py +0 -0
  501. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_trae.py +0 -0
  502. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_vibe.py +0 -0
  503. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_zcode.py +0 -0
  504. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_integration_zed.py +0 -0
  505. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_manifest.py +0 -0
  506. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_registry.py +0 -0
  507. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  508. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/parity_helpers.py +0 -0
  509. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/self_upgrade_helpers.py +0 -0
  510. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_agent_config_consistency.py +0 -0
  511. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_authentication.py +0 -0
  512. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_branch_numbering.py +0 -0
  513. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_check_prerequisites_paths_only.py +0 -0
  514. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_check_prerequisites_python_parity.py +0 -0
  515. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_check_tool.py +0 -0
  516. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_cli_version.py +0 -0
  517. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_command_template_py_scripts.py +0 -0
  518. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_commands_package.py +0 -0
  519. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_console_imports.py +0 -0
  520. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_create_new_feature_python_parity.py +0 -0
  521. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_download_security.py +0 -0
  522. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_event_command.py +0 -0
  523. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_add_path_traversal.py +0 -0
  524. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_content_staleness.py +0 -0
  525. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_registration.py +0 -0
  526. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_extension_update_hardening.py +0 -0
  527. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_github_http.py +0 -0
  528. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_init_dir.py +0 -0
  529. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_init_dir_cli.py +0 -0
  530. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_init_output_markup.py +0 -0
  531. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_live_transient_windows.py +0 -0
  532. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_merge.py +0 -0
  533. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_post_process.py +0 -0
  534. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_ps1_encoding.py +0 -0
  535. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_registrar_path_traversal.py +0 -0
  536. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_resolve_template_python_parity.py +0 -0
  537. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_security_workflow.py +0 -0
  538. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_detection.py +0 -0
  539. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_execution.py +0 -0
  540. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_guidance.py +0 -0
  541. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_self_upgrade_verification.py +0 -0
  542. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_plan_feature_json.py +0 -0
  543. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_plan_no_overwrite.py +0 -0
  544. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_plan_python_parity.py +0 -0
  545. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_tasks.py +0 -0
  546. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_setup_tasks_python_parity.py +0 -0
  547. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_shared_infra_gitignore.py +0 -0
  548. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_shared_infra_integrity.py +0 -0
  549. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_skill_placeholder_py.py +0 -0
  550. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_specify_template_numbering.py +0 -0
  551. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_tasks_template_constraints.py +0 -0
  552. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_timestamp_branches.py +0 -0
  553. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_upgrade.py +0 -0
  554. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_utils.py +0 -0
  555. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_utils_assets_imports.py +0 -0
  556. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_version_imports.py +0 -0
  557. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/test_workflow_run_without_project.py +0 -0
  558. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundle_download_url.py +0 -0
  559. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_adapters.py +0 -0
  560. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_catalog_config.py +0 -0
  561. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_conflict.py +0 -0
  562. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_packager.py +0 -0
  563. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_records.py +0 -0
  564. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_references.py +0 -0
  565. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_resolver.py +0 -0
  566. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_validator.py +0 -0
  567. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_versioning.py +0 -0
  568. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/unit/test_bundler_yamlio.py +0 -0
  569. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/conftest.py +0 -0
  570. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_bundled_speckit_workflow.py +0 -0
  571. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_commands.py +0 -0
  572. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_composer.py +0 -0
  573. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_layer_sources.py +0 -0
  574. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_merge.py +0 -0
  575. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_schema.py +0 -0
  576. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_overlay_security.py +0 -0
  577. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_resolver_integration.py +0 -0
  578. {specify_cli-1.0.5 → specify_cli-1.0.7}/tests/workflows/test_slot_step.py +0 -0
  579. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/ARCHITECTURE.md +0 -0
  580. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/PUBLISHING.md +0 -0
  581. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/catalog.community.json +0 -0
  582. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/catalog.json +0 -0
  583. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/speckit/workflow.yml +0 -0
  584. {specify_cli-1.0.5 → specify_cli-1.0.7}/workflows/step-catalog.community.json +0 -0
  585. {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
- "github/gh-aw-actions/setup@v0.79.8": {
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.79.8",
41
- "sha": "c0338fef4749d08c21f8f975fb0e37efa17dda47"
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":"c64e3dc29aca89e48108bb6d4eb877f6264b4cec9cd56dcd36827893802d2a64","body_hash":"cade22e5083254b735200f4ff7d686104e4ccab848ff7355141b9689354834db","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
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: "true"
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 must be an HTTPS GitHub release asset URL under the submitted
122
- repository:
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
- - Confirm the release exists, its tag corresponds to the submitted version
125
- (`vX.Y.Z` or `X.Y.Z`), and the exact ZIP asset is attached to that release.
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":"f9532e77722bfd32e8f626cbfbf6c5372ddcd9997963d965d53e8531b3e28a15","body_hash":"83b7e917f475d6ddf32f17e7da09dd4097a01dddbcbbf8eeec673912285de8b2","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
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: "true"
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 should follow the pattern
114
- `https://github.com/<owner>/<repo>/archive/refs/tags/v<version>.zip`
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
- - Verify a GitHub release exists matching the submitted version
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":"09fb89e95c57c7beeaa0c823fb35f38d5f9db898a419e59dd0a323e7a9209753","body_hash":"cb6c19088fa13da0a8320c174e8c14c4887d2c8a005a5cb2d2d2faa3f890de39","compiler_version":"v0.79.8","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
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: "true"
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 should follow the pattern
165
- `https://github.com/<owner>/<repo>/archive/refs/tags/v<version>.zip`
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
- - Verify a GitHub release exists matching the submitted version
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