specify-cli 1.0.4__tar.gz → 1.0.6__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 (565) hide show
  1. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/agent_request.yml +1 -1
  2. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -0
  3. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/feature_request.yml +1 -0
  4. specify_cli-1.0.6/.github/scripts/check_extension_version_bump.py +232 -0
  5. specify_cli-1.0.6/.github/skills/code-review/SKILL.md +11 -0
  6. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/codeql.yml +2 -2
  7. specify_cli-1.0.6/.github/workflows/extension-version-guard.yml +57 -0
  8. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/stale.yml +5 -5
  9. {specify_cli-1.0.4 → specify_cli-1.0.6}/CHANGELOG.md +50 -0
  10. {specify_cli-1.0.4 → specify_cli-1.0.6}/CONTRIBUTING.md +78 -0
  11. {specify_cli-1.0.4 → specify_cli-1.0.6}/PKG-INFO +1 -1
  12. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/community/extensions.md +9 -6
  13. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/core.md +1 -1
  14. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/integrations.md +1 -0
  15. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/workflows.md +84 -10
  16. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +23 -11
  17. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/agent-context-defaults.json +1 -0
  18. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/README.md +23 -1
  19. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/catalog.community.json +203 -54
  20. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/bash/create-new-feature-branch.sh +14 -1
  21. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +4 -2
  22. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/python/create_new_feature_branch.py +9 -2
  23. {specify_cli-1.0.4 → specify_cli-1.0.6}/integrations/catalog.json +9 -0
  24. specify_cli-1.0.6/newsletters/2026-August.md +130 -0
  25. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/catalog.community.json +6 -6
  26. {specify_cli-1.0.4 → specify_cli-1.0.6}/pyproject.toml +1 -1
  27. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/bash/create-new-feature.sh +15 -2
  28. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/bash/setup-plan.sh +4 -4
  29. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/powershell/create-new-feature.ps1 +4 -2
  30. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/powershell/setup-plan.ps1 +2 -2
  31. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/python/setup_plan.py +2 -2
  32. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_invocation_style.py +1 -1
  33. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/agents.py +15 -1
  34. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/primitives.py +24 -2
  35. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/commands/init.py +7 -0
  36. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/events.py +30 -1
  37. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/extensions/__init__.py +4 -1
  38. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/__init__.py +2 -0
  39. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/agy/__init__.py +4 -0
  40. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/base.py +55 -2
  41. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/cline/__init__.py +21 -5
  42. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/codex/__init__.py +6 -0
  43. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/copilot/__init__.py +9 -0
  44. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/cursor_agent/__init__.py +6 -0
  45. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/devin/__init__.py +6 -0
  46. specify_cli-1.0.6/src/specify_cli/integrations/docker_agent/__init__.py +204 -0
  47. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/droid/__init__.py +6 -0
  48. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/dsh/__init__.py +6 -0
  49. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/goose/__init__.py +6 -0
  50. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/grok/__init__.py +6 -0
  51. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/hermes/__init__.py +4 -0
  52. specify_cli-1.0.6/src/specify_cli/integrations/muse/__init__.py +69 -0
  53. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/omp/__init__.py +6 -0
  54. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/opencode/__init__.py +6 -0
  55. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/rovodev/__init__.py +4 -0
  56. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/presets/__init__.py +17 -2
  57. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/__init__.py +2 -0
  58. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/_commands.py +21 -2
  59. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/base.py +3 -0
  60. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/engine.py +14 -1
  61. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/command/__init__.py +109 -6
  62. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/do_while/__init__.py +8 -0
  63. specify_cli-1.0.6/src/specify_cli/workflows/steps/slot/__init__.py +67 -0
  64. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/while_loop/__init__.py +12 -0
  65. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/analyze.md +2 -2
  66. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/checklist.md +2 -2
  67. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/clarify.md +2 -2
  68. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/constitution.md +5 -3
  69. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/converge.md +2 -2
  70. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/implement.md +2 -2
  71. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/plan.md +3 -3
  72. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/specify.md +2 -2
  73. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/tasks.md +3 -2
  74. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/commands/taskstoissues.md +2 -2
  75. specify_cli-1.0.6/tests/contract/test_bundled_extension_versions.py +83 -0
  76. specify_cli-1.0.6/tests/contract/test_extension_version_guard_script.py +352 -0
  77. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/git/test_git_extension_python_parity.py +133 -6
  78. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_base.py +46 -0
  79. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_events.py +192 -0
  80. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_cline.py +53 -0
  81. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_docker_agent.py +145 -0
  82. specify_cli-1.0.6/tests/integrations/test_integration_muse.py +80 -0
  83. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_registry.py +1 -1
  84. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/parity_helpers.py +31 -0
  85. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_agent_config_consistency.py +1 -0
  86. specify_cli-1.0.6/tests/test_command_template_hooks.py +80 -0
  87. specify_cli-1.0.6/tests/test_constitution_template_sync_report.py +25 -0
  88. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_create_new_feature_python_parity.py +138 -1
  89. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_extension_skills.py +92 -0
  90. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_extensions.py +1 -0
  91. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_presets.py +15 -0
  92. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_setup_plan_python_parity.py +54 -0
  93. specify_cli-1.0.6/tests/test_tasks_template_constraints.py +29 -0
  94. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_workflows.py +462 -2
  95. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_primitives.py +72 -0
  96. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_references.py +2 -2
  97. specify_cli-1.0.6/tests/workflows/test_bundled_speckit_workflow.py +58 -0
  98. specify_cli-1.0.6/tests/workflows/test_slot_step.py +242 -0
  99. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/ARCHITECTURE.md +6 -2
  100. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/PUBLISHING.md +1 -1
  101. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/README.md +60 -2
  102. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/catalog.json +2 -2
  103. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/speckit/workflow.yml +1 -5
  104. specify_cli-1.0.4/src/specify_cli/integrations/docker_agent/__init__.py +0 -126
  105. {specify_cli-1.0.4 → specify_cli-1.0.6}/.devcontainer/devcontainer.json +0 -0
  106. {specify_cli-1.0.4 → specify_cli-1.0.6}/.devcontainer/post-create.sh +0 -0
  107. {specify_cli-1.0.4 → specify_cli-1.0.6}/.editorconfig +0 -0
  108. {specify_cli-1.0.4 → specify_cli-1.0.6}/.gitattributes +0 -0
  109. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/CODEOWNERS +0 -0
  110. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  111. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  112. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  113. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  114. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  115. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/aw/actions-lock.json +0 -0
  116. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/dependabot.yml +0 -0
  117. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/scripts/check_security_requirements.py +0 -0
  118. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/security-audit-requirements.txt +0 -0
  119. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/skills/add-community-extension/SKILL.md +0 -0
  120. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/RELEASE-PROCESS.md +0 -0
  121. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/add-community-bundle.lock.yml +0 -0
  122. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/add-community-bundle.md +0 -0
  123. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/add-community-extension.lock.yml +0 -0
  124. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/add-community-extension.md +0 -0
  125. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/add-community-preset.lock.yml +0 -0
  126. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/add-community-preset.md +0 -0
  127. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/bug-assess.lock.yml +0 -0
  128. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/bug-assess.md +0 -0
  129. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/bug-fix.lock.yml +0 -0
  130. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/bug-fix.md +0 -0
  131. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/bug-test.lock.yml +0 -0
  132. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/bug-test.md +0 -0
  133. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/catalog-assign.yml +0 -0
  134. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/docs.yml +0 -0
  135. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/feature-assess.lock.yml +0 -0
  136. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/feature-assess.md +0 -0
  137. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/lint.yml +0 -0
  138. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/publish-pypi.yml +0 -0
  139. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/release-trigger.yml +0 -0
  140. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/release.yml +0 -0
  141. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/security.yml +0 -0
  142. {specify_cli-1.0.4 → specify_cli-1.0.6}/.github/workflows/test.yml +0 -0
  143. {specify_cli-1.0.4 → specify_cli-1.0.6}/.gitignore +0 -0
  144. {specify_cli-1.0.4 → specify_cli-1.0.6}/.markdownlint-cli2.jsonc +0 -0
  145. {specify_cli-1.0.4 → specify_cli-1.0.6}/.pre-commit-config.yaml +0 -0
  146. {specify_cli-1.0.4 → specify_cli-1.0.6}/.zenodo.json +0 -0
  147. {specify_cli-1.0.4 → specify_cli-1.0.6}/AGENTS.md +0 -0
  148. {specify_cli-1.0.4 → specify_cli-1.0.6}/CITATION.cff +0 -0
  149. {specify_cli-1.0.4 → specify_cli-1.0.6}/CODE_OF_CONDUCT.md +0 -0
  150. {specify_cli-1.0.4 → specify_cli-1.0.6}/DEVELOPMENT.md +0 -0
  151. {specify_cli-1.0.4 → specify_cli-1.0.6}/LICENSE +0 -0
  152. {specify_cli-1.0.4 → specify_cli-1.0.6}/README.md +0 -0
  153. {specify_cli-1.0.4 → specify_cli-1.0.6}/README.zh-CN.md +0 -0
  154. {specify_cli-1.0.4 → specify_cli-1.0.6}/SECURITY.md +0 -0
  155. {specify_cli-1.0.4 → specify_cli-1.0.6}/SUPPORT.md +0 -0
  156. {specify_cli-1.0.4 → specify_cli-1.0.6}/bundles/catalog.community.json +0 -0
  157. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/.gitignore +0 -0
  158. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/README.md +0 -0
  159. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/community/bundles.md +0 -0
  160. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/community/friends.md +0 -0
  161. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/community/overview.md +0 -0
  162. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/community/presets.md +0 -0
  163. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/community/walkthroughs.md +0 -0
  164. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/concepts/complex-features.md +0 -0
  165. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/concepts/sdd.md +0 -0
  166. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/concepts/spec-of-specs.md +0 -0
  167. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/concepts/spec-persistence.md +0 -0
  168. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/docfx.json +0 -0
  169. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/guides/evolving-specs.md +0 -0
  170. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/guides/existing-projects.md +0 -0
  171. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/guides/monorepo.md +0 -0
  172. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/history.md +0 -0
  173. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/images/spec-kit-logo.webp +0 -0
  174. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/index.md +0 -0
  175. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/install/air-gapped.md +0 -0
  176. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/install/one-time.md +0 -0
  177. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/install/pipx.md +0 -0
  178. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/install/pypi.md +0 -0
  179. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/install/uv.md +0 -0
  180. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/installation.md +0 -0
  181. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/local-development.md +0 -0
  182. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/quickstart.md +0 -0
  183. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/agentic-bugfix.md +0 -0
  184. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/agentic-sdd.md +0 -0
  185. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/authentication.md +0 -0
  186. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/bundles.md +0 -0
  187. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/extensions.md +0 -0
  188. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/overview.md +0 -0
  189. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/reference/presets.md +0 -0
  190. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/template/public/main.css +0 -0
  191. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/toc.yml +0 -0
  192. {specify_cli-1.0.4 → specify_cli-1.0.6}/docs/upgrade.md +0 -0
  193. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/business-analyst/README.md +0 -0
  194. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/business-analyst/bundle.yml +0 -0
  195. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/developer/README.md +0 -0
  196. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/developer/bundle.yml +0 -0
  197. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/product-manager/README.md +0 -0
  198. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/product-manager/bundle.yml +0 -0
  199. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/security-researcher/README.md +0 -0
  200. {specify_cli-1.0.4 → specify_cli-1.0.6}/examples/bundles/security-researcher/bundle.yml +0 -0
  201. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  202. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  203. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  204. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/README.md +0 -0
  205. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  206. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/README.md +0 -0
  207. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/agent-context-config.yml +0 -0
  208. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  209. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/extension.yml +0 -0
  210. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  211. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  212. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  213. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/commands/speckit.assess.decide.md +0 -0
  214. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/commands/speckit.assess.define.md +0 -0
  215. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/commands/speckit.assess.intake.md +0 -0
  216. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/commands/speckit.assess.research.md +0 -0
  217. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/commands/speckit.assess.shape.md +0 -0
  218. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/assess/extension.yml +0 -0
  219. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/bug/README.md +0 -0
  220. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  221. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  222. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/bug/commands/speckit.bug.test.md +0 -0
  223. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/bug/extension.yml +0 -0
  224. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/catalog.json +0 -0
  225. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/README.md +0 -0
  226. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/commands/speckit.git.commit.md +0 -0
  227. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/commands/speckit.git.feature.md +0 -0
  228. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/commands/speckit.git.initialize.md +0 -0
  229. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/commands/speckit.git.remote.md +0 -0
  230. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/commands/speckit.git.validate.md +0 -0
  231. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/config-template.yml +0 -0
  232. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/extension.yml +0 -0
  233. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/git-config.yml +0 -0
  234. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  235. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/bash/git-common.sh +0 -0
  236. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  237. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  238. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  239. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  240. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/python/auto_commit.py +0 -0
  241. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/python/git_common.py +0 -0
  242. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/git/scripts/python/initialize_repo.py +0 -0
  243. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/selftest/commands/selftest.md +0 -0
  244. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/selftest/extension.yml +0 -0
  245. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/.gitignore +0 -0
  246. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/CHANGELOG.md +0 -0
  247. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/EXAMPLE-README.md +0 -0
  248. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/LICENSE +0 -0
  249. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/README.md +0 -0
  250. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/commands/example.md +0 -0
  251. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/config-template.yml +0 -0
  252. {specify_cli-1.0.4 → specify_cli-1.0.6}/extensions/template/extension.yml +0 -0
  253. {specify_cli-1.0.4 → specify_cli-1.0.6}/integrations/CONTRIBUTING.md +0 -0
  254. {specify_cli-1.0.4 → specify_cli-1.0.6}/integrations/README.md +0 -0
  255. {specify_cli-1.0.4 → specify_cli-1.0.6}/integrations/catalog.community.json +0 -0
  256. {specify_cli-1.0.4 → specify_cli-1.0.6}/media/bootstrap-claude-code.gif +0 -0
  257. {specify_cli-1.0.4 → specify_cli-1.0.6}/media/logo_large.webp +0 -0
  258. {specify_cli-1.0.4 → specify_cli-1.0.6}/media/logo_small.webp +0 -0
  259. {specify_cli-1.0.4 → specify_cli-1.0.6}/media/spec-kit-video-header.jpg +0 -0
  260. {specify_cli-1.0.4 → specify_cli-1.0.6}/media/specify_cli.gif +0 -0
  261. {specify_cli-1.0.4 → specify_cli-1.0.6}/newsletters/2026-April.md +0 -0
  262. {specify_cli-1.0.4 → specify_cli-1.0.6}/newsletters/2026-February.md +0 -0
  263. {specify_cli-1.0.4 → specify_cli-1.0.6}/newsletters/2026-July.md +0 -0
  264. {specify_cli-1.0.4 → specify_cli-1.0.6}/newsletters/2026-June.md +0 -0
  265. {specify_cli-1.0.4 → specify_cli-1.0.6}/newsletters/2026-March.md +0 -0
  266. {specify_cli-1.0.4 → specify_cli-1.0.6}/newsletters/2026-May.md +0 -0
  267. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/ARCHITECTURE.md +0 -0
  268. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/PUBLISHING.md +0 -0
  269. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/README.md +0 -0
  270. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/catalog.json +0 -0
  271. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/constitution-sync/README.md +0 -0
  272. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/constitution-sync/commands/speckit.constitution.md +0 -0
  273. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/constitution-sync/preset.yml +0 -0
  274. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/README.md +0 -0
  275. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/commands/speckit.constitution.md +0 -0
  276. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/commands/speckit.implement.md +0 -0
  277. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/commands/speckit.plan.md +0 -0
  278. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/commands/speckit.specify.md +0 -0
  279. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/commands/speckit.tasks.md +0 -0
  280. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/lean/preset.yml +0 -0
  281. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/scaffold/README.md +0 -0
  282. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  283. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/scaffold/commands/speckit.specify.md +0 -0
  284. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/scaffold/preset.yml +0 -0
  285. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/scaffold/templates/myext-template.md +0 -0
  286. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/scaffold/templates/spec-template.md +0 -0
  287. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/commands/speckit.specify.md +0 -0
  288. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  289. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/preset.yml +0 -0
  290. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/templates/checklist-template.md +0 -0
  291. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/templates/constitution-template.md +0 -0
  292. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/templates/plan-template.md +0 -0
  293. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/templates/spec-template.md +0 -0
  294. {specify_cli-1.0.4 → specify_cli-1.0.6}/presets/self-test/templates/tasks-template.md +0 -0
  295. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/bash/check-prerequisites.sh +0 -0
  296. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/bash/common.sh +0 -0
  297. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/bash/resolve-template.sh +0 -0
  298. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/bash/setup-tasks.sh +0 -0
  299. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/powershell/check-prerequisites.ps1 +0 -0
  300. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/powershell/common.ps1 +0 -0
  301. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/powershell/resolve-template.ps1 +0 -0
  302. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/powershell/setup-tasks.ps1 +0 -0
  303. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/python/check_prerequisites.py +0 -0
  304. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/python/common.py +0 -0
  305. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/python/create_new_feature.py +0 -0
  306. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/python/resolve_template.py +0 -0
  307. {specify_cli-1.0.4 → specify_cli-1.0.6}/scripts/python/setup_tasks.py +0 -0
  308. {specify_cli-1.0.4 → specify_cli-1.0.6}/spec-driven.md +0 -0
  309. {specify_cli-1.0.4 → specify_cli-1.0.6}/spec-kit.code-workspace +0 -0
  310. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/__init__.py +0 -0
  311. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_agent_config.py +0 -0
  312. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_assets.py +0 -0
  313. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_console.py +0 -0
  314. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_download_security.py +0 -0
  315. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_github_http.py +0 -0
  316. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_init_options.py +0 -0
  317. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_project.py +0 -0
  318. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_toml_string.py +0 -0
  319. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_utils.py +0 -0
  320. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/_version.py +0 -0
  321. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/authentication/__init__.py +0 -0
  322. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/authentication/azure_devops.py +0 -0
  323. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/authentication/base.py +0 -0
  324. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/authentication/config.py +0 -0
  325. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/authentication/github.py +0 -0
  326. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/authentication/http.py +0 -0
  327. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/__init__.py +0 -0
  328. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  329. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  330. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/lib/__init__.py +0 -0
  331. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/lib/project.py +0 -0
  332. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/lib/versioning.py +0 -0
  333. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  334. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/models/__init__.py +0 -0
  335. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/models/catalog.py +0 -0
  336. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/models/manifest.py +0 -0
  337. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/models/records.py +0 -0
  338. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/__init__.py +0 -0
  339. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/adapters.py +0 -0
  340. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  341. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/conflict.py +0 -0
  342. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/installer.py +0 -0
  343. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/packager.py +0 -0
  344. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/references.py +0 -0
  345. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/resolver.py +0 -0
  346. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/bundler/services/validator.py +0 -0
  347. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/catalogs.py +0 -0
  348. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/commands/__init__.py +0 -0
  349. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/commands/bundle/__init__.py +0 -0
  350. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/commands/event.py +0 -0
  351. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/extensions/_commands.py +0 -0
  352. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integration_runtime.py +0 -0
  353. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integration_scaffold.py +0 -0
  354. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integration_state.py +0 -0
  355. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integration_status.py +0 -0
  356. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/_commands.py +0 -0
  357. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/_helpers.py +0 -0
  358. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/_install_commands.py +0 -0
  359. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  360. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/_query_commands.py +0 -0
  361. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  362. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
  363. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/amp/__init__.py +0 -0
  364. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  365. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/bob/__init__.py +0 -0
  366. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/catalog.py +0 -0
  367. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/claude/__init__.py +0 -0
  368. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  369. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/command_code/__init__.py +0 -0
  370. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  371. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/forge/__init__.py +0 -0
  372. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  373. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/generic/__init__.py +0 -0
  374. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/junie/__init__.py +0 -0
  375. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  376. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  377. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  378. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  379. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/manifest.py +0 -0
  380. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/pi/__init__.py +0 -0
  381. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  382. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  383. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/shai/__init__.py +0 -0
  384. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  385. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/trae/__init__.py +0 -0
  386. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  387. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  388. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/integrations/zed/__init__.py +0 -0
  389. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/presets/_commands.py +0 -0
  390. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/shared_infra.py +0 -0
  391. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/catalog.py +0 -0
  392. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/expressions.py +0 -0
  393. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/overlays/__init__.py +0 -0
  394. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/overlays/_commands.py +0 -0
  395. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/overlays/composer.py +0 -0
  396. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
  397. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/overlays/merge.py +0 -0
  398. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/overlays/schema.py +0 -0
  399. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/__init__.py +0 -0
  400. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  401. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  402. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  403. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  404. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  405. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  406. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  407. {specify_cli-1.0.4 → specify_cli-1.0.6}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  408. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/checklist-template.md +0 -0
  409. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/constitution-template.md +0 -0
  410. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/plan-template.md +0 -0
  411. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/spec-template.md +0 -0
  412. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/tasks-template.md +0 -0
  413. {specify_cli-1.0.4 → specify_cli-1.0.6}/templates/vscode-settings.json +0 -0
  414. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/__init__.py +0 -0
  415. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/auth_helpers.py +0 -0
  416. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/bundler_helpers.py +0 -0
  417. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/conftest.py +0 -0
  418. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/contract/test_bundle_cli.py +0 -0
  419. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/contract/test_catalog_schema.py +0 -0
  420. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/contract/test_manifest_schema.py +0 -0
  421. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/contract/test_wheel_bundled_presets.py +0 -0
  422. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
  423. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/__init__.py +0 -0
  424. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/assess/__init__.py +0 -0
  425. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/assess/test_assess_extension.py +0 -0
  426. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/bug/__init__.py +0 -0
  427. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/bug/test_bug_extension.py +0 -0
  428. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/git/__init__.py +0 -0
  429. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/git/test_git_extension.py +0 -0
  430. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/test_agent_context_cli_free.py +0 -0
  431. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/test_extension_agent_context.py +0 -0
  432. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  433. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  434. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/hooks/TESTING.md +0 -0
  435. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/hooks/plan.md +0 -0
  436. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/hooks/spec.md +0 -0
  437. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/hooks/tasks.md +0 -0
  438. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/http_helpers.py +0 -0
  439. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integration/test_bundler_catalog_stack.py +0 -0
  440. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integration/test_bundler_init_install.py +0 -0
  441. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integration/test_bundler_install_flow.py +0 -0
  442. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integration/test_bundler_local_install.py +0 -0
  443. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integration/test_bundler_offline.py +0 -0
  444. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integration/test_bundler_security_paths.py +0 -0
  445. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/__init__.py +0 -0
  446. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/conftest.py +0 -0
  447. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_cli.py +0 -0
  448. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_extra_args.py +0 -0
  449. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_home_isolation.py +0 -0
  450. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_agy.py +0 -0
  451. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_alquimia.py +0 -0
  452. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_amp.py +0 -0
  453. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_auggie.py +0 -0
  454. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_base_markdown.py +0 -0
  455. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_base_skills.py +0 -0
  456. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_base_toml.py +0 -0
  457. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_base_yaml.py +0 -0
  458. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_bob.py +0 -0
  459. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_catalog.py +0 -0
  460. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_claude.py +0 -0
  461. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_codebuddy.py +0 -0
  462. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_codex.py +0 -0
  463. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_command_code.py +0 -0
  464. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_copilot.py +0 -0
  465. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_cursor_agent.py +0 -0
  466. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_devin.py +0 -0
  467. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_droid.py +0 -0
  468. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_dsh.py +0 -0
  469. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_firebender.py +0 -0
  470. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_forge.py +0 -0
  471. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_gemini.py +0 -0
  472. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_generic.py +0 -0
  473. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_goose.py +0 -0
  474. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_grok.py +0 -0
  475. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_hermes.py +0 -0
  476. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_junie.py +0 -0
  477. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_kilocode.py +0 -0
  478. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_kimi.py +0 -0
  479. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_kiro_cli.py +0 -0
  480. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_lingma.py +0 -0
  481. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_omp.py +0 -0
  482. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_opencode.py +0 -0
  483. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_pi.py +0 -0
  484. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_qodercli.py +0 -0
  485. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_qwen.py +0 -0
  486. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_rovodev.py +0 -0
  487. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_scaffold.py +0 -0
  488. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_shai.py +0 -0
  489. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_state.py +0 -0
  490. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_subcommand.py +0 -0
  491. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_tabnine.py +0 -0
  492. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_trae.py +0 -0
  493. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_vibe.py +0 -0
  494. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_zcode.py +0 -0
  495. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_integration_zed.py +0 -0
  496. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_manifest.py +0 -0
  497. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  498. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/self_upgrade_helpers.py +0 -0
  499. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_authentication.py +0 -0
  500. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_branch_numbering.py +0 -0
  501. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_check_prerequisites_paths_only.py +0 -0
  502. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_check_prerequisites_python_parity.py +0 -0
  503. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_check_tool.py +0 -0
  504. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_cli_version.py +0 -0
  505. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_command_template_py_scripts.py +0 -0
  506. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_commands_package.py +0 -0
  507. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_console_imports.py +0 -0
  508. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_download_security.py +0 -0
  509. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_event_command.py +0 -0
  510. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_extension_add_path_traversal.py +0 -0
  511. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_extension_content_staleness.py +0 -0
  512. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_extension_registration.py +0 -0
  513. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_extension_update_hardening.py +0 -0
  514. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_github_http.py +0 -0
  515. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_github_workflows.py +0 -0
  516. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_init_dir.py +0 -0
  517. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_init_dir_cli.py +0 -0
  518. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_init_output_markup.py +0 -0
  519. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_live_transient_windows.py +0 -0
  520. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_merge.py +0 -0
  521. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_post_process.py +0 -0
  522. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_ps1_encoding.py +0 -0
  523. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_registrar_path_traversal.py +0 -0
  524. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_resolve_template_python_parity.py +0 -0
  525. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_security_workflow.py +0 -0
  526. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_self_upgrade_detection.py +0 -0
  527. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_self_upgrade_execution.py +0 -0
  528. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_self_upgrade_guidance.py +0 -0
  529. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_self_upgrade_verification.py +0 -0
  530. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_setup_plan_feature_json.py +0 -0
  531. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_setup_plan_no_overwrite.py +0 -0
  532. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_setup_tasks.py +0 -0
  533. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_setup_tasks_python_parity.py +0 -0
  534. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_shared_infra_gitignore.py +0 -0
  535. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_shared_infra_integrity.py +0 -0
  536. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_skill_placeholder_py.py +0 -0
  537. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_specify_template_numbering.py +0 -0
  538. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_timestamp_branches.py +0 -0
  539. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_upgrade.py +0 -0
  540. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_utils.py +0 -0
  541. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_utils_assets_imports.py +0 -0
  542. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_version_imports.py +0 -0
  543. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/test_workflow_run_without_project.py +0 -0
  544. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundle_download_url.py +0 -0
  545. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_adapters.py +0 -0
  546. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_catalog_config.py +0 -0
  547. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_conflict.py +0 -0
  548. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_packager.py +0 -0
  549. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_records.py +0 -0
  550. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_resolver.py +0 -0
  551. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_validator.py +0 -0
  552. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_versioning.py +0 -0
  553. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_bundler_yamlio.py +0 -0
  554. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/unit/test_condition_expression_block.py +0 -0
  555. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/conftest.py +0 -0
  556. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_overlay_commands.py +0 -0
  557. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_overlay_composer.py +0 -0
  558. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_overlay_layer_sources.py +0 -0
  559. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_overlay_merge.py +0 -0
  560. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_overlay_schema.py +0 -0
  561. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_overlay_security.py +0 -0
  562. {specify_cli-1.0.4 → specify_cli-1.0.6}/tests/workflows/test_resolver_integration.py +0 -0
  563. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/catalog.community.json +0 -0
  564. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/step-catalog.community.json +0 -0
  565. {specify_cli-1.0.4 → specify_cli-1.0.6}/workflows/step-catalog.json +0 -0
@@ -8,7 +8,7 @@ body:
8
8
  value: |
9
9
  Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
10
10
 
11
- **Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Docker Agent, Factory Droid, DeepSeek Harness, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
11
+ **Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Docker Agent, Factory Droid, DeepSeek Harness, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Muse Code, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
12
12
 
13
13
  - type: input
14
14
  id: agent-name
@@ -90,6 +90,7 @@ body:
90
90
  - Kiro CLI
91
91
  - Lingma
92
92
  - Mistral Vibe
93
+ - Muse Code
93
94
  - Oh My Pi
94
95
  - opencode
95
96
  - Pi Coding Agent
@@ -84,6 +84,7 @@ body:
84
84
  - Kiro CLI
85
85
  - Lingma
86
86
  - Mistral Vibe
87
+ - Muse Code
87
88
  - Oh My Pi
88
89
  - opencode
89
90
  - Pi Coding Agent
@@ -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.
@@ -22,11 +22,11 @@ jobs:
22
22
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
23
 
24
24
  - name: Initialize CodeQL
25
- uses: github/codeql-action/init@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
25
+ uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
26
26
  with:
27
27
  languages: ${{ matrix.language }}
28
28
 
29
29
  - name: Perform CodeQL Analysis
30
- uses: github/codeql-action/analyze@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
30
+ uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
31
31
  with:
32
32
  category: "/language:${{ matrix.language }}"
@@ -0,0 +1,57 @@
1
+ name: Extension Version Guard
2
+
3
+ permissions:
4
+ contents: read
5
+
6
+ # Bundled extensions only reach existing installs through a version bump:
7
+ # `specify extension update` compares the semver in extensions/catalog.json
8
+ # against the installed copy and reports "Up to date" whenever they match.
9
+ # Content changes shipped without a bump go silently stale on every
10
+ # project that already installed the extension (#4345). This guard turns
11
+ # "please remember to bump" into a merge requirement.
12
+ #
13
+ # Deliberately no `paths:` filter: a required status check that is skipped
14
+ # by path filtering stays in "Expected" state and blocks every PR that does
15
+ # not touch extensions/**. The check runs on every pull request instead and
16
+ # the script reports success when nothing under extensions/ changed.
17
+ on:
18
+ pull_request:
19
+
20
+ jobs:
21
+ version-bump:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
+ with:
27
+ # The pull_request checkout is GitHub's merge of the PR head into
28
+ # the base tip. Depth 2 also fetches both parents of that merge
29
+ # commit, so HEAD^1 - the base the merge was actually built on -
30
+ # is available to diff against.
31
+ fetch-depth: 2
32
+
33
+ - name: Set up Python
34
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
35
+ with:
36
+ python-version: "3.14"
37
+
38
+ - name: Install check dependencies
39
+ run: python -m pip install --quiet pyyaml packaging
40
+
41
+ # Diff against the merge commit's first parent, NOT against
42
+ # github.event.pull_request.base.sha. The payload SHA is the base tip
43
+ # from when the PR was opened and is not refreshed when the base branch
44
+ # moves, while refs/pull/N/merge is rebuilt against the current tip.
45
+ # Diffing the stale SHA against the fresh merge commit attributes
46
+ # unrelated base-branch drift to the PR (observed on #4395: two
47
+ # unbumped extension changes merged to main were blamed on a PR that
48
+ # never touched them). HEAD^1 is by construction the base the merge
49
+ # was built on.
50
+ - name: Check bundled extension version bumps
51
+ run: |
52
+ set -euo pipefail
53
+ if ! git rev-parse --verify --quiet HEAD^2 >/dev/null; then
54
+ echo "::error::HEAD is not the pull request merge commit; cannot determine the PR base"
55
+ exit 1
56
+ fi
57
+ python .github/scripts/check_extension_version_bump.py HEAD^1
@@ -17,18 +17,18 @@ jobs:
17
17
  - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0
18
18
  with:
19
19
  # Days of inactivity before an issue or PR becomes stale
20
- days-before-stale: 150
20
+ days-before-stale: 60
21
21
  # Days of inactivity before a stale issue or PR is closed (after being marked stale)
22
22
  days-before-close: 30
23
23
 
24
24
  # Stale issue settings
25
- stale-issue-message: 'This issue has been automatically marked as stale because it has not had any activity for 150 days. It will be closed in 30 days if no further activity occurs.'
26
- close-issue-message: 'This issue has been automatically closed due to inactivity (180 days total). If you believe this issue is still relevant, please reopen it or create a new issue.'
25
+ stale-issue-message: 'This issue has been automatically marked as stale because it has not had any activity for 60 days. It will be closed in 30 days if no further activity occurs.'
26
+ close-issue-message: 'This issue has been automatically closed due to inactivity (90 days total). If you believe this issue is still relevant, please reopen it or create a new issue.'
27
27
  stale-issue-label: 'stale'
28
28
 
29
29
  # Stale PR settings
30
- stale-pr-message: 'This pull request has been automatically marked as stale because it has not had any activity for 150 days. It will be closed in 30 days if no further activity occurs.'
31
- close-pr-message: 'This pull request has been automatically closed due to inactivity (180 days total). If you believe this PR is still relevant, please reopen it or create a new PR.'
30
+ stale-pr-message: 'This pull request has been automatically marked as stale because it has not had any activity for 60 days. It will be closed in 30 days if no further activity occurs.'
31
+ close-pr-message: 'This pull request has been automatically closed due to inactivity (90 days total). If you believe this PR is still relevant, please reopen it or create a new PR.'
32
32
  stale-pr-label: 'stale'
33
33
 
34
34
  # Exempt issues and PRs with these labels from being marked as stale
@@ -2,6 +2,56 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [1.0.6] - 2026-09-10
6
+
7
+ ### Changed
8
+
9
+ - fix(events): cap stdin in the generated dispatcher, not just the CLI command (#4337)
10
+ - docs(core): SPECIFY_FEATURE sets the feature label, not the feature directory (#3786)
11
+ - chore: shorten stale timeline to 60 days stale, 30 days to close (#4503)
12
+ - [extension] Update Spec Kit Schedule extension to v0.7.4 (#4498)
13
+ - [preset] Update Inventory Alignment preset to v0.1.1 (#4494)
14
+ - Update Spec Inventory extension to v0.1.1 (#4496)
15
+ - docs: document contribution evidence gate and label taxonomy (#4478)
16
+ - feat(workflows): add per-step integration configuration (#4425)
17
+ - fix: preserve extension authors in generated skills (#4459)
18
+ - Add ProductShape PRODUCT workflows extension to community catalog (#4485)
19
+ - Update AgentPay x402 extension to v1.1.0 (#4482)
20
+ - Update Figma Starter extension to v1.1.0 (#4490)
21
+ - Fix #4345 (3/4): CI guard requiring version bumps on bundled extension changes (#4395)
22
+ - fix(templates): report an unreadable extensions.yml instead of skipping hooks silently (#4456)
23
+ - Add concise code review skill (#4471)
24
+ - docs(templates): clarify /constitution's Sync Impact Report is temporary, review-only material (#4431) (#4432)
25
+ - fix(bundler): re-read the step registry when rolling back a failed step refresh (#4139)
26
+ - Fix August newsletter review findings (#4444)
27
+ - docs: resolve assess clarifications by editing artifacts in place (#4402)
28
+ - chore: release 1.0.5, begin 1.0.6.dev0 development (#4479)
29
+
30
+ ## [1.0.5] - 2026-09-08
31
+
32
+ ### Changed
33
+
34
+ - Update OKF Knowledge Bundle Generator to v0.5.0 (#4475)
35
+ - Update BrownKit extension to v1.2.0 (#4474)
36
+ - chore(deps): bump the codeql-action group with 2 updates (#4436)
37
+ - fix(tasks): require field constraints from data-model.md in generated tasks (#4430)
38
+ - fix(workflows): reject falsy non-mapping step.yml in step add (#4321)
39
+ - fix(cline): stop unrelated prose from suppressing the hook command note (#4150)
40
+ - Add the August 2026 newsletter (#4442)
41
+ - Update Linear Integration extension to v0.8.0 (#4428)
42
+ - fix(presets): reject falsy non-mapping catalog config shapes (#4320)
43
+ - docs(workflows): sync the reference copy with the shipped workflow (#4424)
44
+ - fix(scripts): name setup-plan's feature directory key FEATURE_DIR (#4397)
45
+ - fix(workflows): require a 'steps' body on while and do-while loops (#4149)
46
+ - Add Evaluator Contract extension to community catalog (#4420)
47
+ - fix: remove unused scope input from bundled speckit workflow (#4401)
48
+ - feat(integrations): add Muse Code (muse) agent integration (#4413)
49
+ - feat(workflows): add workflow slots (#4352)
50
+ - fix(scripts): make bash branch-name sanitizing match the Python and PowerShell twins (#4286)
51
+ - allow hyphen in command ref token names (#4356)
52
+ - [extension] Add Axi Extension to community catalog (#4412)
53
+ - chore: release 1.0.4, begin 1.0.5.dev0 development (#4411)
54
+
5
55
  ## [1.0.4] - 2026-09-02
6
56
 
7
57
  ### Changed
@@ -57,6 +57,84 @@ Here are a few things you can do that will increase the likelihood of your pull
57
57
 
58
58
  Accounts with three open pull requests may continue submitting changes, but additional submissions may be placed behind contributions from other authors in the review queue. Coding agents should disclose this possibility and obtain the filer's confirmation before opening another pull request.
59
59
 
60
+ ### Evidence gate
61
+
62
+ A contribution is evaluated on the evidence it carries, not on how plausible its reasoning sounds. The same bar applies to everyone — human and AI-assisted contributions are judged identically.
63
+
64
+ A valid, in-scope change that arrives without evidence is not rejected outright. It may be labeled [`triage-can-wait`](#triage-and-author-labels) and held behind proven work until evidence is added, at which point it can be reprioritized.
65
+
66
+ What counts as evidence:
67
+
68
+ - **A reproduction or a linked real-world report** — a failing case, a stack trace, or a link to an issue where the problem actually occurred. "This could theoretically fail" reasoning on its own does not clear the gate.
69
+ - **A regression test that fails on `main` and passes with your change** — this proves both that the problem is real and that your change fixes it.
70
+ - **Scope discipline** — one concern per pull request. Split unrelated changes into separate PRs (see the [focused-change guidance](#submitting-a-pull-request) above); sprawling batch diffs are hard to review and slow to land.
71
+ - **Disclosed AI assistance** — if any AI tooling was involved, disclose it and its extent per [AI contributions in Spec Kit](#ai-contributions-in-spec-kit).
72
+
73
+ Speculative hardening is welcome, but it sits behind proven, evidence-backed work. If you can attach a reproduction and a failing test, your change moves to the front; if you can't yet, say so, and it will be queued rather than closed.
74
+
75
+ ### Review rubric
76
+
77
+ Triaged items are weighed across seven dimensions, each scored `0`–`2` (`0` absent, `1` partial, `2` clearly demonstrated), for a maximum of 14. The score guides **prioritization** — it is not a hard pass/fail gate. The one firm rule is the [evidence gate](#evidence-gate) above: theoretical-only changes with no evidence are deprioritized.
78
+
79
+ | Dimension | What it measures |
80
+ |---|---|
81
+ | D1 — Real-world evidence | A reproduction or linked report, versus theory alone |
82
+ | D2 — Reachability / severity | Whether the issue can actually be hit, and how bad it is |
83
+ | D3 — Scope discipline | One focused concern per PR, no unrelated changes |
84
+ | D4 — Test evidence | A regression test that fails on `main` and passes with the change |
85
+ | D5 — Disclosure / understanding | AI use disclosed, and the author understands the change |
86
+ | D6 — Cost vs. benefit | Value delivered against added complexity and maintenance cost |
87
+ | D7 — Roadmap alignment | Fit with Spec Kit's goals and direction |
88
+
89
+ ### Triage and author labels
90
+
91
+ Every triaged item receives one **verdict** label recording where it stands. **Author** labels signal the specific action needed to move an item forward.
92
+
93
+ Verdict (one per item):
94
+
95
+ | Label | Meaning |
96
+ |---|---|
97
+ | `triage-must-have` | Verdict: high-value, important work for Spec Kit — do first |
98
+ | `triage-nice-to-have` | Verdict: evidence-backed fix or greenlit feature — land after review |
99
+ | `triage-can-wait` | Verdict: valid and in-scope but deprioritized; held behind the evidence gate |
100
+ | `triage-out-of-scope` | Verdict: won't land in core — invalid, duplicate, off-mission, or redirected to an extension |
101
+
102
+ Author actions:
103
+
104
+ | Label | Meaning |
105
+ |---|---|
106
+ | `author-needs-proof` | The problem isn't demonstrated yet — supply a reproduction or a test that fails on `main` and passes with the change |
107
+ | `author-needs-tests` | Real change but missing a regression test — add one that fails before / passes after |
108
+ | `author-needs-rescope` | Sprawling or batched diff — split into one focused, single-concern PR |
109
+ | `author-needs-disclosure` | AI assistance not disclosed — disclose AI use per CONTRIBUTING |
110
+ | `author-needs-info` | Missing detail needed to assess — supply requested info |
111
+ | `author-needs-rebase` | Branch conflicts with `main` — rebase and resolve before it can be merged |
112
+ | `author-over-cap` | Over the 3-open-PR cap or repetitive batch submissions — please consolidate |
113
+ | `author-awaiting` | Waiting on author response (handed off to the existing stale workflow) |
114
+
115
+ Some pull requests are closed as `triage-out-of-scope` rather than merged — most commonly
116
+ when the same change is already in `main`, when a request is better served as a community
117
+ extension, when an existing feature already covers it, or when a catalog change came in as
118
+ a direct edit instead of a submission issue. A close always comes with a comment explaining
119
+ why and, where relevant, where to go instead.
120
+
121
+ For further reading on the thinking behind this gate, see [one maintainer's perspective on AI-sourced contributions](https://blog.manorrock.com/blog/2026/09/08/spec_kit_ai_source.html). That piece is a personal viewpoint, not project policy — the policy is what's documented here.
122
+
123
+ ### Community catalog submissions
124
+
125
+ To add or update a community extension, preset, or bundle in the catalog, **open an
126
+ `[Extension]` / `[Preset]` / `[Bundle]` submission issue** — do not edit
127
+ `extensions/catalog.community.json` (or the preset/bundle catalogs) directly in a pull
128
+ request. The submission issue triggers an automated workflow that validates the release,
129
+ verifies the pinned `download_url` and digests, and generates the catalog PR for you.
130
+ A hand-edited catalog PR bypasses that validation and will be closed with a pointer back
131
+ to the issue flow.
132
+
133
+ This applies to **new entries, version updates, and repairs alike** — a version bump or a
134
+ fix to a broken entry is still an update and needs the same validation. Always pin
135
+ `download_url` to a release tag (e.g. `.../releases/download/<tag>/...` or
136
+ `.../archive/refs/tags/<tag>.zip`); never use `releases/latest/`.
137
+
60
138
  ### Branch naming
61
139
 
62
140
  We recommend naming branches as `<type>/<number>-<short-slug>`, where `<number>` is the issue or PR number (whichever comes first) and `<type>` is one of:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: specify-cli
3
- Version: 1.0.4
3
+ Version: 1.0.6
4
4
  Summary: Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD).
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -30,7 +30,7 @@ The following community-contributed extensions are available in [`catalog.commun
30
30
  | Agent Governance | Generate agent-platform repository governance files from Spec Kit metadata | `process` | Read+Write | [spec-kit-agent-governance](https://github.com/bigsmartben/spec-kit-agent-governance) |
31
31
  | AgentDocx | Full-stack multi-agent specification pipeline with VS Code extension control, automated Kanban/Jira sync, and React monitoring dashboard | `integration` | Read+Write | [extension-github-spec-kit](https://github.com/abir-ommezzine/extension-github-spec-kit) |
32
32
  | AgentDocx SpecKit V2 | AgentDocx evolved: same pipeline + far more autonomous Ticket Manager (5 CLI, per-project Kanban, bulk sync, auto-switch, Auditor) | `integration` | Read+Write | [Extension_GithubSpecKit](https://github.com/ahmed200346/Extension_GithubSpecKit) |
33
- | AgentPay x402 — Spend Controls for Spec Kit Agents | Set USDC spending caps and execute x402 payments to paid APIs during spec implementation. Zero platform fee on Base L2 | `integration` | Read+Write | [spec-kit-pay-x402](https://github.com/shawnhvac/spec-kit-pay-x402) |
33
+ | AgentPay x402 — Spend Controls for Spec Kit Agents | Set USDC spending caps, check a counterparty's credit before paying it, and pay x402-enabled APIs during spec implementation. Settles on Base or Solana. | `integration` | Read+Write | [spec-kit-pay-x402](https://github.com/shawnhvac/spec-kit-pay-x402) |
34
34
  | AI-Driven Engineering (AIDE) | A structured 7-step workflow for building new projects from scratch with AI assistants — from vision through implementation | `process` | Read+Write | [aide](https://github.com/mnriem/spec-kit-extensions/tree/main/aide) |
35
35
  | Analytics | Measure what your AI builds, and how much time it saves you | `visibility` | Read+Write | [spec-kit-analytics](https://github.com/Fyloss/spec-kit-analytics) |
36
36
  | API Evolve | Managed API contract evolution — breaking-change detection, semver enforcement, deprecation orchestration, and lifecycle gates across REST, GraphQL, and gRPC | `process` | Read+Write | [spec-kit-api-evolve](https://github.com/Quratulain-bilal/spec-kit-api-evolve) |
@@ -41,6 +41,7 @@ The following community-contributed extensions are available in [`catalog.commun
41
41
  | Archive Extension | Archive merged features into main project memory, resolving gaps and conflicts. | `docs` | Read+Write | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) |
42
42
  | ASCII Diagram Renderer | Renders hand-drawn ASCII/Unicode diagrams (state machine, architecture, flow, coverage map) of what spec/plan/tasks/analyze already say — plain text, no Mermaid renderer needed | `docs` | Read+Write | [spec-kit-ascii-diagram](https://github.com/MRZHUH/spec-kit-ascii-diagram) |
43
43
  | Atlas | Synthesize spec-kit specs into faithful, interactive architecture storybooks & doc portals. | `docs` | Read-only | [spec-kit-atlas](https://github.com/ashbrener/spec-kit-atlas) |
44
+ | Axi Extension | A Spec Kit extension that renders a feature's markdown in a local browser review surface for human annotation, then returns the queued notes to the agent to apply. | `docs` | Read+Write | [spec-kit-axi](https://github.com/d0whc3r/spec-kit-axi) |
44
45
  | Azure Cosmos DB | Best-practice Azure Cosmos DB code generation and review for any AI coding agent | `code` | Read+Write | [spec-kit-cosmosdb](https://github.com/AzureCosmosDB/spec-kit-cosmosdb) |
45
46
  | Azure DevOps Integration | Sync user stories and tasks to Azure DevOps work items using OAuth authentication | `integration` | Read+Write | [spec-kit-azure-devops](https://github.com/pragya247/spec-kit-azure-devops) |
46
47
  | BDD | Convert specs to Gherkin scenarios, scaffold step definitions, and verify acceptance test coverage | `process` | Read+Write | [spec-kit-bdd](https://github.com/RSginer/spec-kit-bdd) |
@@ -48,7 +49,7 @@ The following community-contributed extensions are available in [`catalog.commun
48
49
  | Blueprint Index — Living Architecture Map | A living architecture map for spec-driven projects, kept honest by a deterministic, low-friction, machine-first CI gate (JSON, self-healable) that blocks only when the map contradicts the specs or code. Brownfield or greenfield. | `process` | Read+Write | [spec-kit-blueprint](https://github.com/ogil109/spec-kit-blueprint) |
49
50
  | Branch Convention | Configurable branch and folder naming conventions for /specify with presets and custom patterns | `process` | Read+Write | [spec-kit-branch-convention](https://github.com/Quratulain-bilal/spec-kit-branch-convention) |
50
51
  | Brownfield Bootstrap | Bootstrap spec-kit for existing codebases — auto-discover architecture and adopt SDD incrementally | `process` | Read+Write | [spec-kit-brownfield](https://github.com/Quratulain-bilal/spec-kit-brownfield) |
51
- | BrownKit | Evidence-driven capability discovery, security and QA risk assessment for existing codebases | `process` | Read+Write | [BrownKit](https://github.com/MaksimShevtsov/BrownKit) |
52
+ | BrownKit — Brownfield Discovery for Spec-Kit | Evidence-driven capability discovery, security and QA risk assessment for existing codebases. | `process` | Read+Write | [BrownKit](https://github.com/MaksimShevtsov/BrownKit) |
52
53
  | Bugfix Workflow | Structured bugfix workflow — capture bugs, trace to spec artifacts, and patch specs surgically | `process` | Read+Write | [spec-kit-bugfix](https://github.com/Quratulain-bilal/spec-kit-bugfix) |
53
54
  | Canon | Adds canon-driven (baseline-driven) workflows: spec-first, code-first, spec-drift. Requires Canon Core preset installation. | `process` | Read+Write | [spec-kit-canon](https://github.com/maximiliamus/spec-kit-canon/tree/master/extension) |
54
55
  | Catalog CI | Automated validation for spec-kit community catalog entries — structure, URLs, diffs, and linting | `process` | Read-only | [spec-kit-catalog-ci](https://github.com/Quratulain-bilal/spec-kit-catalog-ci) |
@@ -66,8 +67,9 @@ The following community-contributed extensions are available in [`catalog.commun
66
67
  | Dotdog | Import GitHub Spec Kit artifacts into local knowledge graphs for validation, analysis, search, and MCP queries. | `docs` | Read+Write | [dotdog](https://github.com/specdog/dotdog) |
67
68
  | DUBSAR Memory | Local project memory for Spec Kit with explicit checkpoints, cross-session resume, and SHA-256 freshness for recorded specification, plan, and task references. | `visibility` | Read+Write | [dubsar-memory](https://github.com/kotnisofiane-bit/dubsar-memory) |
68
69
  | EARS Requirements Syntax | Author, lint, and convert requirements using EARS - the five industry-standard sentence patterns for unambiguous, testable requirements | `docs` | Read+Write | [spec-kit-ears](https://github.com/dhruv-15-03/spec-kit-ears) |
70
+ | Evaluator Contract | Provider-neutral evaluator contract for evidence, provenance, uncertainty, and recovery across Spec-Driven Development phases. | `process` | Read+Write | [spec-kit-evaluator](https://github.com/electrohire/spec-kit-evaluator) |
69
71
  | Extensify | Create and validate extensions and extension catalogs | `process` | Read+Write | [extensify](https://github.com/mnriem/spec-kit-extensions/tree/main/extensify) |
70
- | Figma Starter | Turns a Figma section's screens into per-screen spec.md files, an app-level user-stories.md, and a build-order.md, then hands off to /speckit.specify | `integration` | Read+Write | [spec-kit-figma-starter](https://github.com/wavemaker/spec-kit-figma-starter) |
72
+ | Figma Starter | Turns a Figma section's screens into Figma-derived specs, and an OpenAPI/Swagger document into an entity model plus per-page UI-to-API bindings, then hands off to /speckit.specify | `docs` | Read+Write | [spec-kit-figma-starter](https://github.com/OmneWave/spec-kit-figma-starter) |
71
73
  | Fix Findings | Automated analyze-fix-reanalyze loop that resolves spec findings until clean | `code` | Read+Write | [spec-kit-fix-findings](https://github.com/Quratulain-bilal/spec-kit-fix-findings) |
72
74
  | FixIt Extension | Spec-aware bug fixing — maps bugs to spec artifacts, proposes a plan, applies minimal changes | `code` | Read+Write | [spec-kit-fixit](https://github.com/speckit-community/spec-kit-fixit) |
73
75
  | Fleet Orchestrator | Orchestrate a full feature lifecycle with human-in-the-loop gates across all SpecKit phases | `process` | Read+Write | [spec-kit-fleet](https://github.com/sharathsatish/spec-kit-fleet) |
@@ -84,7 +86,7 @@ The following community-contributed extensions are available in [`catalog.commun
84
86
  | Jira Mirror | Spec Kit ↔ Jira bridge for team-managed and company-managed projects: configurable workflows & hierarchies (Scrum/SAFe), multi-project, idempotent and fail-closed. macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-jira-mirror](https://github.com/Fyloss/spec-kit-jira-mirror) |
85
87
  | Keel Discovery | Evidence-backed discovery upstream of /speckit.specify, plus round-trip drift auditing after implementation | `process` | Read+Write | [spec-kit-keel](https://github.com/keeldiscovery/spec-kit-keel) |
86
88
  | Learning Extension | Generate educational guides from implementations and enhance clarifications with mentoring context | `docs` | Read+Write | [spec-kit-learn](https://github.com/imviancagrace/spec-kit-learn) |
87
- | Linear Integration | Mirror spec-kit feature directories into Linear (filesystem Linear, reconcile-based, unidirectional). | `integration` | Read+Write | [spec-kit-linear-sync](https://github.com/ashbrener/spec-kit-linear-sync) |
89
+ | Linear Integration | Automatically mirror your spec-kit specs into Linear one issue per spec, a sub-issue per task phase, kept in sync as you work. | `integration` | Read+Write | [spec-kit-linear-sync](https://github.com/ashbrener/spec-kit-linear-sync) |
88
90
  | Linear Weave | Weave Spec Kit into Linear: pull requirements, mirror tasks.md into sub-issues, sync statuses | `integration` | Read+Write | [spec-kit-linear-weave](https://github.com/tonydwoodhouse/spec-kit-linear-weave) |
89
91
  | LLM Wiki | LLM-maintained compounding project wiki: source ingestion, cited answers, and consistency linting | `docs` | Read+Write | [spec-kit-wiki](https://github.com/formin/spec-kit-wiki) |
90
92
  | Loop Engineering | Engineer safe autonomous agent loops for spec-driven development: a maker/checker split, externalized loop state, and stay-the-engineer guardrails against comprehension debt and cognitive surrender | `process` | Read+Write | [spec-kit-loop](https://github.com/formin/spec-kit-loop) |
@@ -105,7 +107,7 @@ The following community-contributed extensions are available in [`catalog.commun
105
107
  | Multi-Repo Branch Sync | Creates the feature branch in affected sub-repositories and git submodules via plan/tasks hooks | `process` | Read+Write | [multi-repo-sync](https://github.com/fyloss/spec-kit-multi-repo-sync) |
106
108
  | Multi-Sites Spec Kit | Multi-site aware specify command with per-site spec folders, auto-increment, and Drupal support | `process` | Read+Write | [spec-kit-multi-sites](https://github.com/teeyo/spec-kit-multi-sites) |
107
109
  | .NET Framework to Modern .NET Migration | Orchestrate end-to-end .NET Framework to modern .NET migration across 7 phases, with SDD lifecycle integration | `process` | Read+Write | [spec-kit-fx-to-net](https://github.com/RogerBestMsft/spec-kit-FxToNet) |
108
- | OKF Knowledge Bundle Generator | Generates and maintains an Open Knowledge Format (OKF v0.1) knowledge bundle from a source-code repository, mining git history for significance and rationale, and resolving open questions with the user | `docs` | Read+Write | [speckit_ofk](https://github.com/alexcpn/speckit_ofk) |
110
+ | OKF Knowledge Bundle Generator | Generates and maintains an Open Knowledge Format (OKF v0.1) knowledge bundle from a source-code repository, mining git history for rationale and parking what it cannot verify as open questions | `docs` | Read+Write | [speckit_okf](https://github.com/alexcpn/speckit_okf) |
109
111
  | Onboard | Contextual onboarding and progressive growth for developers new to spec-kit projects. Explains specs, maps dependencies, validates understanding, and guides the next step | `process` | Read+Write | [spec-kit-onboard](https://github.com/dmux/spec-kit-onboard) |
110
112
  | Optimize | Audit and optimize AI governance for context efficiency — token budgets, rule health, interpretability, compression, coherence, and echo detection | `process` | Read+Write | [spec-kit-optimize](https://github.com/sakitA/spec-kit-optimize) |
111
113
  | Orchestration Task Context Management | Adds subagent work-unit orchestration to generated Spec Kit task files | `process` | Read+Write | [spec-kit-orchestration-task-context-management](https://github.com/benizzio/spec-kit-orchestration-task-context-management) |
@@ -117,6 +119,7 @@ The following community-contributed extensions are available in [`catalog.commun
117
119
  | Presetify | Create and validate presets and preset catalogs | `process` | Read+Write | [presetify](https://github.com/mnriem/spec-kit-extensions/tree/main/presetify) |
118
120
  | Product Forge | Full product-lifecycle orchestrator for Spec Kit: research → product-spec → plan → tasks → implement → verify → test → release-readiness, across express/lite/standard/v-model modes with human-in-the-loop gates. | `process` | Read+Write | [speckit-product-forge](https://github.com/VaiYav/speckit-product-forge) |
119
121
  | Product Spec Extension | Generates PRFAQ, Lean PRD, stakeholder summaries, and technical designs from engineering specs | `docs` | Read+Write | [spec-kit-product](https://github.com/d0whc3r/spec-kit-product) |
122
+ | ProductShape PRODUCT workflows | Author, refine, validate, apply, archive and recover ProductShape product meaning in a separate Spec Kit lane. | `process` | Read+Write | [productshape](https://github.com/juangcarmona/productshape) |
120
123
  | Project Health Check | Diagnose a Spec Kit project and report health issues across structure, agents, features, scripts, extensions, and git | `visibility` | Read-only | [spec-kit-doctor](https://github.com/KhawarHabibKhan/spec-kit-doctor) |
121
124
  | Project Status | Show current SDD workflow progress — active feature, artifact status, task completion, workflow phase, and extensions summary | `visibility` | Read-only | [spec-kit-status](https://github.com/KhawarHabibKhan/spec-kit-status) |
122
125
  | QA Testing Extension | Systematic QA testing with browser-driven or CLI-based validation of acceptance criteria from spec | `code` | Read-only | [spec-kit-qa](https://github.com/arunt14/spec-kit-qa) |
@@ -145,7 +148,7 @@ The following community-contributed extensions are available in [`catalog.commun
145
148
  | Spec Kit Figma | Grounds SpecKit spec/plan/tasks in Figma design context via REST or MCP, on macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-figma](https://github.com/Fyloss/spec-kit-figma) |
146
149
  | Spec Kit Memory | Recalls prior specs and decisions from configurable memory tools (e.g. memsearch) before SDLC stages, so planning and specification start from what the project already knows | `docs` | Read+Write | [spec-kit-memory](https://github.com/zaytsevand/spec-kit-memory) |
147
150
  | Spec Kit Preview | Generate evidence-backed low, mid, or high fidelity previews from Spec Kit artifacts as Markdown or self-contained HTML | `docs` | Read+Write | [spec-kit-preview](https://github.com/bigsmartben/spec-kit-preview) |
148
- | Spec Kit Schedule | Optimal multi-agent task scheduling via CP-SAT — DAG precedence, hallucination-aware caps, file-conflict avoidance, stochastic durations, replanning, and interactive HTML output | `process` | Read+Write | [spec-kit-schedule](https://github.com/jfranc38/spec-kit-schedule) |
151
+ | Spec Kit Schedule — parallel subagent rounds | Zero-config planner that turns tasks.md into optimal parallel rounds for subagents (CP-SAT, critical-path aware, file-conflict safe) and an implement command that runs them round by round with tasks.md checkboxes as the single source of progress. | `process` | Read+Write | [spec-kit-schedule](https://github.com/jfranc38/spec-kit-schedule) |
149
152
  | Spec Kit TLDR | Render a feature's spec.md / plan.md into a review-oriented TLDR (self-contained HTML dashboard + PR-native Markdown) that surfaces risks for faster PR review. | `visibility` | Read+Write | [speckit-tldr](https://github.com/qurore/speckit-tldr) |
150
153
  | Spec Orchestrator | Cross-feature orchestration — track state, select tasks, and detect conflicts across parallel specs | `process` | Read-only | [spec-kit-orchestrator](https://github.com/Quratulain-bilal/spec-kit-orchestrator) |
151
154
  | Spec Reference Loader | Reads the ## References section from the feature spec and loads only the listed docs into context | `docs` | Read-only | [spec-kit-spec-reference-loader](https://github.com/KevinBrown5280/spec-kit-spec-reference-loader) |
@@ -53,7 +53,7 @@ specify init my-project --integration copilot --preset compliance
53
53
  | `SPECKIT_INTEGRATION_DEFAULT` | Override the fallback integration used by `specify init` when `--integration` is omitted (interactive prompt default and non-interactive fallback). Set it to any registered integration key (e.g. `gemini`, `claude`). An unrecognized value is ignored with a warning and the built-in default (`copilot`) is used. An explicit `--integration <key>` always takes precedence. |
54
54
  | `SPECIFY_INIT_DIR` | Target a member project from outside its directory (e.g. a monorepo root) without `cd`, for non-interactive / CI use. Set it to the **project root** — the directory *containing* `.specify/` (relative paths resolve against the current directory). The path must exist and contain `.specify/`, otherwise the command errors and does **not** fall back to the current directory. Resolved once in the core root helper (`get_repo_root` in Bash, `Get-RepoRoot` in PowerShell), so it is honored by the core feature scripts (`/speckit.plan`, `/speckit.tasks`, …) and the Git extension's feature-branch creation, which inherit it. The `specify` CLI applies the **same** validation rules to every project-scoped subcommand (`specify integration …`, `specify extension …`, `specify workflow …`, `specify preset …`, and the rest that operate on a `.specify/` project), so those can target a member project too. When unset, Bash/PowerShell helpers keep their existing upward search; the `specify` CLI keeps its project-scoped resolver cwd-only unless a command explicitly defines broader detection (for example, bundle commands). |
55
55
  | `SPECIFY_FEATURE_DIRECTORY` | Override the active feature directory *within* the resolved project (takes precedence over `.specify/feature.json`). Relative paths resolve under the project root. Combine with `SPECIFY_INIT_DIR` to pick both the project and the feature non-interactively. |
56
- | `SPECIFY_FEATURE` | Override feature detection for non-Git repositories. Set to the feature directory name (e.g., `001-photo-albums`) to work on a specific feature when not using Git branches. Must be set in the context of the agent prior to using `/speckit.plan` or follow-up commands. |
56
+ | `SPECIFY_FEATURE` | Explicitly override the active feature **label** (e.g. `001-photo-albums`) — the identifier the core helpers report as the current feature/branch (`get_current_branch` in Bash, `Get-CurrentBranch` in PowerShell). Those helpers never inspect Git: when the variable is set they return it verbatim, and when it is unset they return an empty string. The basename fallback happens later — `get_feature_paths` / `Get-FeaturePathsEnv` substitute the resolved feature directory's basename so the reported label is still usable — so calling the named helpers directly does **not** give you that fallback. You set it yourself: the Bash and Python feature scripts only **print** a commented `export SPECIFY_FEATURE=…` / `$env:SPECIFY_FEATURE = …` hint for you to run, because a child process cannot change its parent's environment, and `/speckit.specify` persists `feature_directory` to `.specify/feature.json` instead of setting this variable. (The PowerShell feature scripts do assign `$env:SPECIFY_FEATURE`, but that only reaches you when the script runs inside your current PowerShell session.) It does **not** locate the feature directory: with only `SPECIFY_FEATURE` set, `get_feature_paths` fails with *"Feature directory not found. Set `SPECIFY_FEATURE_DIRECTORY` or run the specify command to create `.specify/feature.json`."* Use `SPECIFY_FEATURE_DIRECTORY` (above) or `.specify/feature.json` to select the directory. |
57
57
 
58
58
  > **Two resolution axes.** `SPECIFY_INIT_DIR` selects the **project** (which directory contains `.specify/`); `SPECIFY_FEATURE_DIRECTORY` / `.specify/feature.json` select the **feature** within that project. They are independent — project first, then feature.
59
59