specify-cli 0.12.13__tar.gz → 0.12.14__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 (461) hide show
  1. {specify_cli-0.12.13 → specify_cli-0.12.14}/CHANGELOG.md +16 -0
  2. {specify_cli-0.12.13 → specify_cli-0.12.14}/PKG-INFO +1 -1
  3. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/extensions.md +2 -0
  4. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/presets.md +2 -0
  5. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/catalog.community.json +88 -1
  6. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/catalog.community.json +57 -1
  7. {specify_cli-0.12.13 → specify_cli-0.12.14}/pyproject.toml +1 -1
  8. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/commands/init.py +34 -5
  9. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_helpers.py +9 -1
  10. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kiro_cli/__init__.py +7 -0
  11. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/presets/__init__.py +68 -23
  12. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/command/__init__.py +38 -2
  13. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/fan_in/__init__.py +18 -0
  14. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_cli.py +59 -1
  15. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_subcommand.py +21 -0
  16. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_registry.py +14 -0
  17. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_presets.py +180 -0
  18. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_workflows.py +50 -0
  19. {specify_cli-0.12.13 → specify_cli-0.12.14}/.devcontainer/devcontainer.json +0 -0
  20. {specify_cli-0.12.13 → specify_cli-0.12.14}/.devcontainer/post-create.sh +0 -0
  21. {specify_cli-0.12.13 → specify_cli-0.12.14}/.editorconfig +0 -0
  22. {specify_cli-0.12.13 → specify_cli-0.12.14}/.gitattributes +0 -0
  23. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/CODEOWNERS +0 -0
  24. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  25. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  27. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  29. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  30. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  31. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  32. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/aw/actions-lock.json +0 -0
  33. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/dependabot.yml +0 -0
  34. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/skills/add-community-extension/SKILL.md +0 -0
  35. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/RELEASE-PROCESS.md +0 -0
  36. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-extension.lock.yml +0 -0
  37. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-extension.md +0 -0
  38. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-preset.lock.yml +0 -0
  39. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/add-community-preset.md +0 -0
  40. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-assess.lock.yml +0 -0
  41. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-assess.md +0 -0
  42. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-fix.lock.yml +0 -0
  43. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-fix.md +0 -0
  44. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-test.lock.yml +0 -0
  45. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/bug-test.md +0 -0
  46. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/catalog-assign.yml +0 -0
  47. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/codeql.yml +0 -0
  48. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/docs.yml +0 -0
  49. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/lint.yml +0 -0
  50. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/publish-pypi.yml +0 -0
  51. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/release-trigger.yml +0 -0
  52. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/release.yml +0 -0
  53. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/stale.yml +0 -0
  54. {specify_cli-0.12.13 → specify_cli-0.12.14}/.github/workflows/test.yml +0 -0
  55. {specify_cli-0.12.13 → specify_cli-0.12.14}/.gitignore +0 -0
  56. {specify_cli-0.12.13 → specify_cli-0.12.14}/.markdownlint-cli2.jsonc +0 -0
  57. {specify_cli-0.12.13 → specify_cli-0.12.14}/.pre-commit-config.yaml +0 -0
  58. {specify_cli-0.12.13 → specify_cli-0.12.14}/.zenodo.json +0 -0
  59. {specify_cli-0.12.13 → specify_cli-0.12.14}/AGENTS.md +0 -0
  60. {specify_cli-0.12.13 → specify_cli-0.12.14}/CITATION.cff +0 -0
  61. {specify_cli-0.12.13 → specify_cli-0.12.14}/CODE_OF_CONDUCT.md +0 -0
  62. {specify_cli-0.12.13 → specify_cli-0.12.14}/CONTRIBUTING.md +0 -0
  63. {specify_cli-0.12.13 → specify_cli-0.12.14}/DEVELOPMENT.md +0 -0
  64. {specify_cli-0.12.13 → specify_cli-0.12.14}/LICENSE +0 -0
  65. {specify_cli-0.12.13 → specify_cli-0.12.14}/README.md +0 -0
  66. {specify_cli-0.12.13 → specify_cli-0.12.14}/SECURITY.md +0 -0
  67. {specify_cli-0.12.13 → specify_cli-0.12.14}/SUPPORT.md +0 -0
  68. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/.gitignore +0 -0
  69. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/README.md +0 -0
  70. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/bundles.md +0 -0
  71. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/friends.md +0 -0
  72. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/overview.md +0 -0
  73. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/community/walkthroughs.md +0 -0
  74. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/concepts/complex-features.md +0 -0
  75. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/concepts/sdd.md +0 -0
  76. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/concepts/spec-persistence.md +0 -0
  77. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/docfx.json +0 -0
  78. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/guides/evolving-specs.md +0 -0
  79. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/guides/monorepo.md +0 -0
  80. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/index.md +0 -0
  81. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/air-gapped.md +0 -0
  82. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/one-time.md +0 -0
  83. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/pipx.md +0 -0
  84. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/install/uv.md +0 -0
  85. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/installation.md +0 -0
  86. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/local-development.md +0 -0
  87. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/quickstart.md +0 -0
  88. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/authentication.md +0 -0
  89. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/bundles.md +0 -0
  90. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/core.md +0 -0
  91. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/extensions.md +0 -0
  92. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/integrations.md +0 -0
  93. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/overview.md +0 -0
  94. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/presets.md +0 -0
  95. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/reference/workflows.md +0 -0
  96. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/template/public/main.css +0 -0
  97. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/toc.yml +0 -0
  98. {specify_cli-0.12.13 → specify_cli-0.12.14}/docs/upgrade.md +0 -0
  99. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/business-analyst/README.md +0 -0
  100. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/business-analyst/bundle.yml +0 -0
  101. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/developer/README.md +0 -0
  102. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/developer/bundle.yml +0 -0
  103. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/product-manager/README.md +0 -0
  104. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/product-manager/bundle.yml +0 -0
  105. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/security-researcher/README.md +0 -0
  106. {specify_cli-0.12.13 → specify_cli-0.12.14}/examples/bundles/security-researcher/bundle.yml +0 -0
  107. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  108. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  109. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  110. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  111. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/README.md +0 -0
  112. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  113. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/README.md +0 -0
  114. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/agent-context-config.yml +0 -0
  115. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/agent-context-defaults.json +0 -0
  116. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  117. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/extension.yml +0 -0
  118. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  119. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  120. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  121. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/README.md +0 -0
  122. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  123. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  124. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/commands/speckit.bug.test.md +0 -0
  125. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/bug/extension.yml +0 -0
  126. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/catalog.json +0 -0
  127. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/README.md +0 -0
  128. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.commit.md +0 -0
  129. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.feature.md +0 -0
  130. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.initialize.md +0 -0
  131. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.remote.md +0 -0
  132. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/commands/speckit.git.validate.md +0 -0
  133. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/config-template.yml +0 -0
  134. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/extension.yml +0 -0
  135. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/git-config.yml +0 -0
  136. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  137. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  138. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/git-common.sh +0 -0
  139. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  140. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  141. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  142. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  143. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  144. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/selftest/commands/selftest.md +0 -0
  145. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/selftest/extension.yml +0 -0
  146. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/.gitignore +0 -0
  147. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/CHANGELOG.md +0 -0
  148. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/EXAMPLE-README.md +0 -0
  149. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/LICENSE +0 -0
  150. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/README.md +0 -0
  151. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/commands/example.md +0 -0
  152. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/config-template.yml +0 -0
  153. {specify_cli-0.12.13 → specify_cli-0.12.14}/extensions/template/extension.yml +0 -0
  154. {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/CONTRIBUTING.md +0 -0
  155. {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/README.md +0 -0
  156. {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/catalog.community.json +0 -0
  157. {specify_cli-0.12.13 → specify_cli-0.12.14}/integrations/catalog.json +0 -0
  158. {specify_cli-0.12.13 → specify_cli-0.12.14}/media/bootstrap-claude-code.gif +0 -0
  159. {specify_cli-0.12.13 → specify_cli-0.12.14}/media/logo_large.webp +0 -0
  160. {specify_cli-0.12.13 → specify_cli-0.12.14}/media/logo_small.webp +0 -0
  161. {specify_cli-0.12.13 → specify_cli-0.12.14}/media/spec-kit-video-header.jpg +0 -0
  162. {specify_cli-0.12.13 → specify_cli-0.12.14}/media/specify_cli.gif +0 -0
  163. {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-April.md +0 -0
  164. {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-February.md +0 -0
  165. {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-June.md +0 -0
  166. {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-March.md +0 -0
  167. {specify_cli-0.12.13 → specify_cli-0.12.14}/newsletters/2026-May.md +0 -0
  168. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/ARCHITECTURE.md +0 -0
  169. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/PUBLISHING.md +0 -0
  170. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/README.md +0 -0
  171. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/catalog.json +0 -0
  172. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/README.md +0 -0
  173. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.constitution.md +0 -0
  174. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.implement.md +0 -0
  175. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.plan.md +0 -0
  176. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.specify.md +0 -0
  177. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/commands/speckit.tasks.md +0 -0
  178. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/lean/preset.yml +0 -0
  179. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/README.md +0 -0
  180. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  181. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/commands/speckit.specify.md +0 -0
  182. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/preset.yml +0 -0
  183. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/templates/myext-template.md +0 -0
  184. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/scaffold/templates/spec-template.md +0 -0
  185. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/commands/speckit.specify.md +0 -0
  186. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  187. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/preset.yml +0 -0
  188. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/checklist-template.md +0 -0
  189. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/constitution-template.md +0 -0
  190. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/plan-template.md +0 -0
  191. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/spec-template.md +0 -0
  192. {specify_cli-0.12.13 → specify_cli-0.12.14}/presets/self-test/templates/tasks-template.md +0 -0
  193. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/check-prerequisites.sh +0 -0
  194. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/common.sh +0 -0
  195. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/create-new-feature.sh +0 -0
  196. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/setup-plan.sh +0 -0
  197. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/bash/setup-tasks.sh +0 -0
  198. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/check-prerequisites.ps1 +0 -0
  199. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/common.ps1 +0 -0
  200. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/create-new-feature.ps1 +0 -0
  201. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/setup-plan.ps1 +0 -0
  202. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/powershell/setup-tasks.ps1 +0 -0
  203. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/python/check_prerequisites.py +0 -0
  204. {specify_cli-0.12.13 → specify_cli-0.12.14}/scripts/python/common.py +0 -0
  205. {specify_cli-0.12.13 → specify_cli-0.12.14}/spec-driven.md +0 -0
  206. {specify_cli-0.12.13 → specify_cli-0.12.14}/spec-kit.code-workspace +0 -0
  207. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/__init__.py +0 -0
  208. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_agent_config.py +0 -0
  209. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_assets.py +0 -0
  210. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_console.py +0 -0
  211. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_github_http.py +0 -0
  212. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_init_options.py +0 -0
  213. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_invocation_style.py +0 -0
  214. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_project.py +0 -0
  215. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_toml_string.py +0 -0
  216. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_utils.py +0 -0
  217. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/_version.py +0 -0
  218. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/agents.py +0 -0
  219. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/__init__.py +0 -0
  220. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/azure_devops.py +0 -0
  221. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/base.py +0 -0
  222. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/config.py +0 -0
  223. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/github.py +0 -0
  224. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/authentication/http.py +0 -0
  225. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/__init__.py +0 -0
  226. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  227. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  228. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/__init__.py +0 -0
  229. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/project.py +0 -0
  230. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/versioning.py +0 -0
  231. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  232. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/__init__.py +0 -0
  233. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/catalog.py +0 -0
  234. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/manifest.py +0 -0
  235. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/models/records.py +0 -0
  236. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/__init__.py +0 -0
  237. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/adapters.py +0 -0
  238. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  239. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/conflict.py +0 -0
  240. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/installer.py +0 -0
  241. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/packager.py +0 -0
  242. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/primitives.py +0 -0
  243. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/references.py +0 -0
  244. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/resolver.py +0 -0
  245. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/bundler/services/validator.py +0 -0
  246. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/catalogs.py +0 -0
  247. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/commands/__init__.py +0 -0
  248. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/commands/bundle/__init__.py +0 -0
  249. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/extensions/__init__.py +0 -0
  250. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/extensions/_commands.py +0 -0
  251. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_runtime.py +0 -0
  252. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_scaffold.py +0 -0
  253. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_state.py +0 -0
  254. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integration_status.py +0 -0
  255. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/__init__.py +0 -0
  256. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_commands.py +0 -0
  257. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_install_commands.py +0 -0
  258. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  259. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_query_commands.py +0 -0
  260. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  261. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/agy/__init__.py +0 -0
  262. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/amp/__init__.py +0 -0
  263. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  264. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/base.py +0 -0
  265. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/bob/__init__.py +0 -0
  266. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/catalog.py +0 -0
  267. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/claude/__init__.py +0 -0
  268. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/cline/__init__.py +0 -0
  269. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  270. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/codex/__init__.py +0 -0
  271. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  272. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  273. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/devin/__init__.py +0 -0
  274. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  275. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/forge/__init__.py +0 -0
  276. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  277. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/generic/__init__.py +0 -0
  278. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/goose/__init__.py +0 -0
  279. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  280. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/junie/__init__.py +0 -0
  281. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  282. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  283. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  284. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/manifest.py +0 -0
  285. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/omp/__init__.py +0 -0
  286. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  287. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/pi/__init__.py +0 -0
  288. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  289. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  290. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  291. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/shai/__init__.py +0 -0
  292. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  293. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/trae/__init__.py +0 -0
  294. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  295. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  296. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/integrations/zed/__init__.py +0 -0
  297. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/presets/_commands.py +0 -0
  298. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/shared_infra.py +0 -0
  299. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/__init__.py +0 -0
  300. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/_commands.py +0 -0
  301. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/base.py +0 -0
  302. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/catalog.py +0 -0
  303. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/engine.py +0 -0
  304. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/expressions.py +0 -0
  305. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/__init__.py +0 -0
  306. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  307. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  308. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  309. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  310. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  311. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  312. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  313. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  314. {specify_cli-0.12.13 → specify_cli-0.12.14}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  315. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/checklist-template.md +0 -0
  316. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/analyze.md +0 -0
  317. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/checklist.md +0 -0
  318. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/clarify.md +0 -0
  319. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/constitution.md +0 -0
  320. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/converge.md +0 -0
  321. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/implement.md +0 -0
  322. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/plan.md +0 -0
  323. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/specify.md +0 -0
  324. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/tasks.md +0 -0
  325. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/commands/taskstoissues.md +0 -0
  326. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/constitution-template.md +0 -0
  327. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/plan-template.md +0 -0
  328. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/spec-template.md +0 -0
  329. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/tasks-template.md +0 -0
  330. {specify_cli-0.12.13 → specify_cli-0.12.14}/templates/vscode-settings.json +0 -0
  331. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/__init__.py +0 -0
  332. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/auth_helpers.py +0 -0
  333. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/bundler_helpers.py +0 -0
  334. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/conftest.py +0 -0
  335. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/contract/test_bundle_cli.py +0 -0
  336. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/contract/test_catalog_schema.py +0 -0
  337. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/contract/test_manifest_schema.py +0 -0
  338. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/__init__.py +0 -0
  339. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/bug/__init__.py +0 -0
  340. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/bug/test_bug_extension.py +0 -0
  341. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/git/__init__.py +0 -0
  342. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/git/test_git_extension.py +0 -0
  343. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_agent_context_cli_free.py +0 -0
  344. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_extension_agent_context.py +0 -0
  345. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  346. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  347. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/TESTING.md +0 -0
  348. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/plan.md +0 -0
  349. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/spec.md +0 -0
  350. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/hooks/tasks.md +0 -0
  351. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/http_helpers.py +0 -0
  352. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_catalog_stack.py +0 -0
  353. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_init_install.py +0 -0
  354. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_install_flow.py +0 -0
  355. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_local_install.py +0 -0
  356. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_offline.py +0 -0
  357. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integration/test_bundler_security_paths.py +0 -0
  358. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/__init__.py +0 -0
  359. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/conftest.py +0 -0
  360. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_base.py +0 -0
  361. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_extra_args.py +0 -0
  362. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_home_isolation.py +0 -0
  363. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_agy.py +0 -0
  364. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_amp.py +0 -0
  365. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_auggie.py +0 -0
  366. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_markdown.py +0 -0
  367. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_skills.py +0 -0
  368. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_toml.py +0 -0
  369. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_base_yaml.py +0 -0
  370. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_bob.py +0 -0
  371. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_catalog.py +0 -0
  372. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_claude.py +0 -0
  373. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_cline.py +0 -0
  374. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_codebuddy.py +0 -0
  375. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_codex.py +0 -0
  376. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_copilot.py +0 -0
  377. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_cursor_agent.py +0 -0
  378. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_devin.py +0 -0
  379. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_firebender.py +0 -0
  380. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_forge.py +0 -0
  381. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_gemini.py +0 -0
  382. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_generic.py +0 -0
  383. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_goose.py +0 -0
  384. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_hermes.py +0 -0
  385. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_junie.py +0 -0
  386. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_kilocode.py +0 -0
  387. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_kimi.py +0 -0
  388. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_kiro_cli.py +0 -0
  389. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_lingma.py +0 -0
  390. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_omp.py +0 -0
  391. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_opencode.py +0 -0
  392. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_pi.py +0 -0
  393. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_qodercli.py +0 -0
  394. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_qwen.py +0 -0
  395. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_rovodev.py +0 -0
  396. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_scaffold.py +0 -0
  397. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_shai.py +0 -0
  398. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_state.py +0 -0
  399. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_tabnine.py +0 -0
  400. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_trae.py +0 -0
  401. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_vibe.py +0 -0
  402. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_zcode.py +0 -0
  403. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_integration_zed.py +0 -0
  404. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_manifest.py +0 -0
  405. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  406. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/self_upgrade_helpers.py +0 -0
  407. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_agent_config_consistency.py +0 -0
  408. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_authentication.py +0 -0
  409. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_branch_numbering.py +0 -0
  410. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_check_prerequisites_paths_only.py +0 -0
  411. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_check_prerequisites_python_parity.py +0 -0
  412. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_check_tool.py +0 -0
  413. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_cli_version.py +0 -0
  414. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_command_template_py_scripts.py +0 -0
  415. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_commands_package.py +0 -0
  416. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_console_imports.py +0 -0
  417. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extension_registration.py +0 -0
  418. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extension_skills.py +0 -0
  419. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extension_update_hardening.py +0 -0
  420. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_extensions.py +0 -0
  421. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_github_http.py +0 -0
  422. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_github_workflows.py +0 -0
  423. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_init_dir.py +0 -0
  424. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_init_dir_cli.py +0 -0
  425. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_live_transient_windows.py +0 -0
  426. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_merge.py +0 -0
  427. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_post_process.py +0 -0
  428. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_ps1_encoding.py +0 -0
  429. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_registrar_path_traversal.py +0 -0
  430. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_detection.py +0 -0
  431. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_execution.py +0 -0
  432. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_guidance.py +0 -0
  433. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_self_upgrade_verification.py +0 -0
  434. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_setup_plan_feature_json.py +0 -0
  435. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_setup_plan_no_overwrite.py +0 -0
  436. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_setup_tasks.py +0 -0
  437. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_shared_infra_integrity.py +0 -0
  438. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_timestamp_branches.py +0 -0
  439. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_upgrade.py +0 -0
  440. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_utils.py +0 -0
  441. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_utils_assets_imports.py +0 -0
  442. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_version_imports.py +0 -0
  443. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/test_workflow_run_without_project.py +0 -0
  444. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_adapters.py +0 -0
  445. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_catalog_config.py +0 -0
  446. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_conflict.py +0 -0
  447. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_packager.py +0 -0
  448. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_primitives.py +0 -0
  449. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_records.py +0 -0
  450. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_references.py +0 -0
  451. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_resolver.py +0 -0
  452. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_validator.py +0 -0
  453. {specify_cli-0.12.13 → specify_cli-0.12.14}/tests/unit/test_bundler_versioning.py +0 -0
  454. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/ARCHITECTURE.md +0 -0
  455. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/PUBLISHING.md +0 -0
  456. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/README.md +0 -0
  457. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/catalog.community.json +0 -0
  458. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/catalog.json +0 -0
  459. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/speckit/workflow.yml +0 -0
  460. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/step-catalog.community.json +0 -0
  461. {specify_cli-0.12.13 → specify_cli-0.12.14}/workflows/step-catalog.json +0 -0
@@ -2,6 +2,22 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.12.14] - 2026-07-13
6
+
7
+ ### Changed
8
+
9
+ - [extension] Add Spec Kit Memory extension to community catalog (#3455)
10
+ - Add Test-First Governance preset to community catalog (#3504)
11
+ - Add Autonomous Run Governance preset to community catalog (#3501)
12
+ - fix(workflows): validate command step input/options are mappings (#3262)
13
+ - fix(presets): resolve() honors manifest-declared file: for installed presets (#3351)
14
+ - fix(init): don't block on confirmation for 'init --here' without a TTY (#3236)
15
+ - [extension] Add Quality Gates (Enforcement Layer) extension to community catalog (#3431)
16
+ - fix(integrations): exit cleanly on unbalanced quote in --integration-options (#3457) (#3466)
17
+ - fix(integrations): declare kiro-cli multi-install safe (#3471) (#3485)
18
+ - fix(workflows): fail fan-in step on non-list wait_for instead of crashing (#3482)
19
+ - chore: release 0.12.13, begin 0.12.14.dev0 development (#3498)
20
+
5
21
  ## [0.12.13] - 2026-07-13
6
22
 
7
23
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.12.13
3
+ Version: 0.12.14
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
@@ -98,6 +98,7 @@ The following community-contributed extensions are available in [`catalog.commun
98
98
  | 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) |
99
99
  | 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) |
100
100
  | 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) |
101
+ | Quality Gates (Enforcement Layer) | Deterministic quality enforcement for Spec Kit projects at three boundaries — agent hooks, git pre-commit, CI — with one policy file and provable enforcement (attestations, canaries, verified parity). | `process` | Read+Write | [spec-gates](https://github.com/schwichtgit/spec-gates) |
101
102
  | RAG Azure Builder | Spec Kit extension for onboarding and operating an Azure RAG stack with guided workflows. | `process` | Read+Write | [spec-kit-extension-rag-azure-builder](https://github.com/Sertxito/spec-kit-extension-rag-azure-builder) |
102
103
  | Ralph Loop | Autonomous implementation loop using AI agent CLI | `code` | Read+Write | [spec-kit-ralph](https://github.com/Rubiss-Projects/spec-kit-ralph) |
103
104
  | Reconcile Extension | Reconcile implementation drift by surgically updating feature artifacts. | `docs` | Read+Write | [spec-kit-reconcile](https://github.com/stn1slv/spec-kit-reconcile) |
@@ -119,6 +120,7 @@ The following community-contributed extensions are available in [`catalog.commun
119
120
  | Spec Diagram | Auto-generate Mermaid diagrams of SDD workflow state, feature progress, and task dependencies | `visibility` | Read-only | [spec-kit-diagram-](https://github.com/Quratulain-bilal/spec-kit-diagram-) |
120
121
  | Spec Kit Discovery Extension | Run technical discovery commands for feasibility, technology selection, scenario-specific technical decisions, legacy codebase assessment, implementation understanding, and proof-of-concept validation | `process` | Read+Write | [spec-kit-discovery](https://github.com/bigsmartben/spec-kit-discovery) |
121
122
  | Spec Kit Figma | Agent-agnostic SpecKit extension that grounds spec, plan & task generation in Figma design context — REST + optional MCP, single/mono/multi-repo, macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-figma](https://github.com/Fyloss/spec-kit-figma) |
123
+ | 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) |
122
124
  | 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) |
123
125
  | 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) |
124
126
  | 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) |
@@ -11,6 +11,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
11
11
  | Agent Parity Governance | Adds shared-guidance parity, audit-ready Spec-Kit run evidence, and agent-neutral model-routing guidance across a project's declared AI-agent instruction surfaces so agent guidance does not drift. | 6 templates, 3 commands | — | [spec-kit-preset-agent-parity-governance](https://github.com/hindermath/spec-kit-preset-agent-parity-governance) |
12
12
  | AIDE In-Place Migration | Adapts the AIDE extension workflow for in-place technology migrations (X → Y pattern) — adds migration objectives, verification gates, knowledge documents, and behavioral equivalence criteria | 2 templates, 8 commands | AIDE extension | [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
13
13
  | Architecture Governance | Adds secure software architecture, STRIDE+CAPEC threat modeling, arc42 security cross-cutting concepts, S-ADRs, Zero Trust applicability, OWASP SAMM governance, BSI C3A cloud autonomy, BSI C5 cloud compliance assurance, and audit-ready Spec Kit run evidence | 13 templates, 3 commands | — | [spec-kit-preset-architecture-governance](https://github.com/hindermath/spec-kit-preset-architecture-governance) |
14
+ | Autonomous Run Governance | Adds permission-bounded, evidence-first governance for autonomous Spec Kit delivery, convergence, resume, closeout, and retrospective learning. | 10 templates, 2 commands | — | [spec-kit-preset-autonomous-run-governance](https://github.com/hindermath/spec-kit-preset-autonomous-run-governance) |
14
15
  | Canon Core | Adapts original Spec Kit workflow to work together with Canon extension | 2 templates, 8 commands | — | [spec-kit-canon](https://github.com/maximiliamus/spec-kit-canon) |
15
16
  | Claude AskUserQuestion | Upgrades `/speckit.clarify` and `/speckit.checklist` on Claude Code from Markdown-table prompts to the native AskUserQuestion picker, with a recommended option and reasoning on every question | 2 commands | — | [spec-kit-preset-claude-ask-questions](https://github.com/0xrafasec/spec-kit-preset-claude-ask-questions) |
16
17
  | Command Density | Compacts the nine core Spec Kit command prompts while preserving scripts, handoffs, placeholders, hook output blocks, and rule structure | 9 commands | — | [spec-kit-preset-command-density](https://github.com/Xopoko/spec-kit-preset-command-density) |
@@ -28,6 +29,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
28
29
  | SicarioSpec Core | Baseline secure-by-default Spec Kit governance profile. | 5 templates | — | [sicario-spec](https://github.com/dfirs1car1o/sicario-spec) |
29
30
  | Spec2Cloud | Spec-driven workflow tuned for shipping to Azure: spec → plan → tasks → implement → deploy | 5 templates, 8 commands | — | [spec2cloud](https://github.com/Azure-Samples/Spec2Cloud) |
30
31
  | Table of Contents Navigation | Adds a navigable Table of Contents to generated spec.md, plan.md, and tasks.md documents | 3 templates, 3 commands | — | [spec-kit-preset-toc-navigation](https://github.com/Quratulain-bilal/spec-kit-preset-toc-navigation) |
32
+ | Test-First Governance | Governs TDD with coverage-complete BDD/ATDD Gherkin scenarios, explicit suite ownership, professional test reports, traceability, and risk-based quality gates. | 10 templates, 8 commands | — | [spec-kit-preset-test-first-governance](https://github.com/ka-zo/spec-kit-preset-test-first-governance) |
31
33
  | VS Code Ask Questions | Enhances the clarify command to use `vscode/askQuestions` for batched interactive questioning. | 1 command | — | [spec-kit-presets](https://github.com/fdcastel/spec-kit-presets) |
32
34
  | Workflow Preset | Behavior-first specification, design artifacts, and agent-native handoff orchestration — adds requirement-phase behavior drafts, formal BDD/UIF/behavior contracts, optional design artifacts, and scoped implementation handoffs with Core Agent, Vertical Planner Agent, and Worker Agent modes | 22 templates, 8 commands | — | [spec-kit-workflow-preset](https://github.com/bigsmartben/spec-kit-workflow-preset) |
33
35
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-07-10T00:00:00Z",
3
+ "updated_at": "2026-07-13T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
5
5
  "extensions": {
6
6
  "aide": {
@@ -1427,6 +1427,57 @@
1427
1427
  "created_at": "2026-05-06T00:00:00Z",
1428
1428
  "updated_at": "2026-05-06T00:00:00Z"
1429
1429
  },
1430
+ "gates": {
1431
+ "name": "Quality Gates (Enforcement Layer)",
1432
+ "id": "gates",
1433
+ "description": "Deterministic quality enforcement for Spec Kit projects at three boundaries — agent hooks, git pre-commit, CI — with one policy file and provable enforcement (attestations, canaries, verified parity).",
1434
+ "author": "schwichtgit",
1435
+ "version": "0.1.0",
1436
+ "download_url": "https://github.com/schwichtgit/spec-gates/releases/download/v0.1.0/gates-0.1.0.zip",
1437
+ "repository": "https://github.com/schwichtgit/spec-gates",
1438
+ "homepage": "https://github.com/schwichtgit/spec-gates",
1439
+ "documentation": "https://github.com/schwichtgit/spec-gates/blob/main/docs/how-it-works.md",
1440
+ "license": "MIT",
1441
+ "category": "process",
1442
+ "effect": "read-write",
1443
+ "requires": {
1444
+ "speckit_version": ">=0.12.0",
1445
+ "tools": [
1446
+ {
1447
+ "name": "jq",
1448
+ "required": true
1449
+ },
1450
+ {
1451
+ "name": "git",
1452
+ "required": true
1453
+ },
1454
+ {
1455
+ "name": "node",
1456
+ "required": false
1457
+ },
1458
+ {
1459
+ "name": "shellcheck",
1460
+ "required": false
1461
+ }
1462
+ ]
1463
+ },
1464
+ "provides": {
1465
+ "commands": 5,
1466
+ "hooks": 1
1467
+ },
1468
+ "tags": [
1469
+ "quality",
1470
+ "enforcement",
1471
+ "hooks",
1472
+ "ci",
1473
+ "governance"
1474
+ ],
1475
+ "verified": false,
1476
+ "downloads": 0,
1477
+ "stars": 0,
1478
+ "created_at": "2026-07-09T00:00:00Z",
1479
+ "updated_at": "2026-07-13T00:00:00Z"
1480
+ },
1430
1481
  "github-issues": {
1431
1482
  "name": "GitHub Issues Integration 1",
1432
1483
  "id": "github-issues",
@@ -2217,6 +2268,42 @@
2217
2268
  "created_at": "2026-05-08T00:00:00Z",
2218
2269
  "updated_at": "2026-05-08T00:00:00Z"
2219
2270
  },
2271
+ "memory": {
2272
+ "name": "Spec Kit Memory",
2273
+ "id": "memory",
2274
+ "description": "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.",
2275
+ "author": "Andrey Zaytsev",
2276
+ "version": "0.3.0",
2277
+ "download_url": "https://github.com/zaytsevand/spec-kit-memory/archive/refs/tags/v0.3.0.zip",
2278
+ "repository": "https://github.com/zaytsevand/spec-kit-memory",
2279
+ "homepage": "https://github.com/zaytsevand/spec-kit-memory",
2280
+ "documentation": "https://github.com/zaytsevand/spec-kit-memory/blob/main/README.md",
2281
+ "changelog": "",
2282
+ "license": "MIT",
2283
+ "category": "docs",
2284
+ "effect": "read-write",
2285
+ "requires": {
2286
+ "speckit_version": ">=0.2.0",
2287
+ "tools": [
2288
+ { "name": "memsearch", "required": false }
2289
+ ]
2290
+ },
2291
+ "provides": {
2292
+ "commands": 2,
2293
+ "hooks": 3
2294
+ },
2295
+ "tags": [
2296
+ "memory",
2297
+ "recall",
2298
+ "research",
2299
+ "memsearch"
2300
+ ],
2301
+ "verified": false,
2302
+ "downloads": 0,
2303
+ "stars": 0,
2304
+ "created_at": "2026-07-10T00:00:00Z",
2305
+ "updated_at": "2026-07-10T00:00:00Z"
2306
+ },
2220
2307
  "memory-loader": {
2221
2308
  "name": "Memory Loader",
2222
2309
  "id": "memory-loader",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-06-30T00:00:00Z",
3
+ "updated_at": "2026-07-13T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/presets/catalog.community.json",
5
5
  "presets": {
6
6
  "a11y-governance": {
@@ -131,6 +131,34 @@
131
131
  "created_at": "2026-04-27T00:00:00Z",
132
132
  "updated_at": "2026-06-14T00:00:00Z"
133
133
  },
134
+ "autonomous-run-governance": {
135
+ "name": "Autonomous Run Governance",
136
+ "id": "autonomous-run-governance",
137
+ "version": "0.1.1",
138
+ "description": "Adds permission-bounded, evidence-first governance for autonomous Spec Kit delivery, convergence, resume, closeout, and retrospective learning.",
139
+ "author": "Thorsten Hindermann",
140
+ "repository": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance",
141
+ "download_url": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance/archive/refs/tags/v0.1.1.zip",
142
+ "homepage": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance",
143
+ "documentation": "https://github.com/hindermath/spec-kit-preset-autonomous-run-governance/blob/main/README.md",
144
+ "license": "MIT",
145
+ "requires": {
146
+ "speckit_version": ">=0.8.3"
147
+ },
148
+ "provides": {
149
+ "templates": 10,
150
+ "commands": 2
151
+ },
152
+ "tags": [
153
+ "autonomous",
154
+ "governance",
155
+ "evidence",
156
+ "permissions",
157
+ "retrospective"
158
+ ],
159
+ "created_at": "2026-07-13T00:00:00Z",
160
+ "updated_at": "2026-07-13T00:00:00Z"
161
+ },
134
162
  "canon-core": {
135
163
  "name": "Canon Core",
136
164
  "id": "canon-core",
@@ -618,6 +646,34 @@
618
646
  "created_at": "2026-04-30T00:00:00Z",
619
647
  "updated_at": "2026-04-30T00:00:00Z"
620
648
  },
649
+ "test-first-governance": {
650
+ "name": "Test-First Governance",
651
+ "id": "test-first-governance",
652
+ "version": "1.3.0",
653
+ "description": "Governs TDD with coverage-complete BDD/ATDD Gherkin scenarios, explicit suite ownership, professional test reports, traceability, and risk-based quality gates.",
654
+ "author": "Zoltán Katona, PhD",
655
+ "repository": "https://github.com/ka-zo/spec-kit-preset-test-first-governance",
656
+ "download_url": "https://github.com/ka-zo/spec-kit-preset-test-first-governance/archive/refs/tags/1.3.0.zip",
657
+ "homepage": "https://github.com/ka-zo/spec-kit-preset-test-first-governance",
658
+ "documentation": "https://github.com/ka-zo/spec-kit-preset-test-first-governance/blob/main/README.md",
659
+ "license": "MIT",
660
+ "requires": {
661
+ "speckit_version": ">=0.12.11"
662
+ },
663
+ "provides": {
664
+ "templates": 10,
665
+ "commands": 8
666
+ },
667
+ "tags": [
668
+ "tdd",
669
+ "bdd",
670
+ "atdd",
671
+ "quality-gates",
672
+ "traceability"
673
+ ],
674
+ "created_at": "2026-07-13T00:00:00Z",
675
+ "updated_at": "2026-07-13T00:00:00Z"
676
+ },
621
677
  "toc-navigation": {
622
678
  "name": "Table of Contents Navigation",
623
679
  "id": "toc-navigation",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.12.13"
3
+ version = "0.12.14"
4
4
  description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -220,16 +220,45 @@ def register(app: typer.Typer) -> None:
220
220
  console.print(
221
221
  f"[yellow]Warning:[/yellow] Current directory is not empty ({len(existing_items)} items)"
222
222
  )
223
- console.print(
224
- "[yellow]Template files will be merged with existing content and may overwrite existing files[/yellow]"
225
- )
226
223
  if force:
224
+ # Proceeding: the merge/overwrite warning is accurate here.
225
+ console.print(
226
+ "[yellow]Template files will be merged with existing content and may overwrite existing files[/yellow]"
227
+ )
227
228
  console.print(
228
229
  "[cyan]--force supplied: skipping confirmation and proceeding with merge[/cyan]"
229
230
  )
230
231
  else:
231
- response = typer.confirm("Do you want to continue?")
232
- if not response:
232
+ # Fold the merge risk into the confirmation prompt rather than
233
+ # printing it unconditionally first: on the EOF/no-input path
234
+ # below the command exits without changing anything, so a
235
+ # standalone "will be merged" line would mislead. Interactive
236
+ # users still see the risk as part of the question.
237
+ #
238
+ # Call typer.confirm normally so piped y/n is honored — e.g.
239
+ # `echo y | specify init --here` keeps reaching the
240
+ # non-destructive preserve-merge path.
241
+ try:
242
+ proceed = typer.confirm(
243
+ "Template files will be merged with existing content "
244
+ "and may overwrite existing files. Do you want to continue?"
245
+ )
246
+ except (typer.Abort, EOFError):
247
+ # typer.confirm raises Abort for BOTH an interactive Ctrl+C
248
+ # and an EOF on closed/empty stdin. Distinguish them: a real
249
+ # TTY cancellation is a normal exit (0, "cancelled"), while a
250
+ # missing-input EOF (non-interactive) becomes an actionable
251
+ # error pointing at --force.
252
+ if _stdin_is_interactive():
253
+ console.print("[yellow]Operation cancelled[/yellow]")
254
+ raise typer.Exit(0) from None
255
+ console.print(
256
+ "[red]Error:[/red] Current directory is not empty and no "
257
+ "confirmation input is available. Re-run with "
258
+ "[bold]--force[/bold] to merge into it."
259
+ )
260
+ raise typer.Exit(1) from None
261
+ if not proceed:
233
262
  console.print("[yellow]Operation cancelled[/yellow]")
234
263
  raise typer.Exit(0)
235
264
  else:
@@ -190,7 +190,15 @@ def _parse_integration_options(integration: Any, raw_options: str) -> dict[str,
190
190
  """
191
191
  import shlex
192
192
  parsed: dict[str, Any] = {}
193
- tokens = shlex.split(raw_options)
193
+ try:
194
+ tokens = shlex.split(raw_options)
195
+ except ValueError as exc:
196
+ # An unbalanced quote (e.g. --integration-options='--commands-dir "foo')
197
+ # makes shlex raise "No closing quotation". Translate it into the same
198
+ # clean exit-1 UX as every other bad-input path below rather than
199
+ # letting a raw traceback escape.
200
+ console.print(f"[red]Error:[/red] Could not parse integration options: {exc}.")
201
+ raise typer.Exit(1)
194
202
  declared_options = list(integration.options())
195
203
  declared = {opt.name.lstrip("-"): opt for opt in declared_options}
196
204
  allowed = ", ".join(sorted(opt.name for opt in declared_options))
@@ -27,3 +27,10 @@ class KiroCliIntegration(MarkdownIntegration):
27
27
  "args": _KIRO_ARG_FALLBACK,
28
28
  "extension": ".md",
29
29
  }
30
+
31
+ # Kiro CLI keeps everything under a static, isolated agent root
32
+ # (``.kiro/`` with commands in ``.kiro/prompts``) that no other
33
+ # integration writes to, so it is safe to install alongside others
34
+ # (issue #3471). The registry's multi-install-safe contract tests
35
+ # enforce that isolation for every integration setting this flag.
36
+ multi_install_safe = True
@@ -2588,6 +2588,39 @@ class PresetResolver:
2588
2588
  self._manifest_cache[key] = None
2589
2589
  return self._manifest_cache[key]
2590
2590
 
2591
+ def _manifest_declared_template(
2592
+ self, pack_dir: Path, template_name: str, template_type: str
2593
+ ) -> tuple[dict | None, Path | None]:
2594
+ """Resolve a preset's manifest-declared template entry and usable file.
2595
+
2596
+ Returns ``(entry, candidate)``:
2597
+ - ``entry`` is the matching ``provides.templates`` mapping, or ``None`` if
2598
+ the manifest is absent or does not list this ``(name, type)``.
2599
+ - ``candidate`` is the declared ``file:`` resolved under ``pack_dir`` IFF
2600
+ it is a regular file (``is_file()``); ``None`` otherwise — a missing,
2601
+ empty, or non-file (e.g. directory) declaration yields ``(entry, None)``.
2602
+
2603
+ The manifest is authoritative: when it declares a template (``entry`` is
2604
+ not ``None``) but the file is unusable (``candidate`` is ``None``),
2605
+ callers must NOT fall back to the convention lookup — that would mask a
2606
+ typo or pick up an undeclared file. Shared by ``resolve()`` and
2607
+ ``collect_all_layers()`` so their manifest-first resolution cannot
2608
+ silently diverge again (the divergence this fix addressed).
2609
+ """
2610
+ manifest = self._get_manifest(pack_dir)
2611
+ if not manifest:
2612
+ return None, None
2613
+ for tmpl in manifest.templates:
2614
+ if tmpl.get("name") == template_name and tmpl.get("type") == template_type:
2615
+ file_path = tmpl.get("file")
2616
+ if file_path:
2617
+ manifest_candidate = pack_dir / file_path
2618
+ return tmpl, (
2619
+ manifest_candidate if manifest_candidate.is_file() else None
2620
+ )
2621
+ return tmpl, None
2622
+ return None, None
2623
+
2591
2624
  def _get_all_extensions_by_priority(self) -> list[tuple[int, str, dict | None]]:
2592
2625
  """Build unified list of registered and unregistered extensions sorted by priority.
2593
2626
 
@@ -2690,6 +2723,27 @@ class PresetResolver:
2690
2723
  registry = PresetRegistry(self.presets_dir)
2691
2724
  for pack_id, _metadata in registry.list_by_priority():
2692
2725
  pack_dir = self.presets_dir / pack_id
2726
+ # The preset manifest is authoritative: if it declares this
2727
+ # template with an explicit ``file:``, resolve to that path —
2728
+ # and do NOT fall back to convention when it's missing, to
2729
+ # avoid masking typos or picking up an undeclared file. Only
2730
+ # when the manifest is absent or doesn't list this template do
2731
+ # we use the convention-based subdir lookup. Mirrors
2732
+ # collect_all_layers()/resolve_content() so resolve() and
2733
+ # resolve_with_source() agree with them instead of returning
2734
+ # the core template (or a stray convention file).
2735
+ entry, manifest_candidate = self._manifest_declared_template(
2736
+ pack_dir, template_name, template_type
2737
+ )
2738
+ if manifest_candidate is not None:
2739
+ return manifest_candidate
2740
+ if entry is not None:
2741
+ # Manifest declares this template but the file is missing,
2742
+ # non-file (e.g. a directory), or an empty/falsey ``file``
2743
+ # value. The manifest is authoritative, so skip this pack's
2744
+ # convention fallback rather than mask a typo — mirrors
2745
+ # collect_all_layers().
2746
+ continue
2693
2747
  for subdir in subdirs:
2694
2748
  if subdir:
2695
2749
  candidate = pack_dir / subdir / f"{template_name}{ext}"
@@ -2957,31 +3011,22 @@ class PresetResolver:
2957
3011
  pack_dir = self.presets_dir / pack_id
2958
3012
  # Read strategy and manifest file path from preset manifest
2959
3013
  strategy = "replace"
2960
- manifest_file_path = None
2961
3014
  manifest_has_strategy = False
2962
- manifest_found_entry = False
2963
- manifest = self._get_manifest(pack_dir)
2964
- if manifest:
2965
- for tmpl in manifest.templates:
2966
- if (tmpl.get("name") == template_name
2967
- and tmpl.get("type") == template_type):
2968
- strategy = tmpl.get("strategy", "replace")
2969
- manifest_has_strategy = "strategy" in tmpl
2970
- manifest_file_path = tmpl.get("file")
2971
- manifest_found_entry = True
2972
- break
2973
- # Use manifest file path if specified, otherwise convention-based
2974
- # lookup — but only when the manifest doesn't exist or doesn't
2975
- # list this template, so preset.yml stays authoritative.
3015
+ entry, manifest_candidate = self._manifest_declared_template(
3016
+ pack_dir, template_name, template_type
3017
+ )
3018
+ if entry is not None:
3019
+ strategy = entry.get("strategy", "replace")
3020
+ manifest_has_strategy = "strategy" in entry
3021
+ # Use the manifest's declared file when it's a usable regular file;
3022
+ # only fall back to convention-based lookup when the manifest
3023
+ # doesn't list this template at all, so preset.yml stays
3024
+ # authoritative (a declared-but-unusable file skips convention —
3025
+ # parity with resolve()).
2976
3026
  candidate = None
2977
- if manifest_file_path:
2978
- manifest_candidate = pack_dir / manifest_file_path
2979
- if manifest_candidate.exists():
2980
- candidate = manifest_candidate
2981
- # Explicit file path that doesn't exist: skip convention
2982
- # fallback to avoid masking typos or picking up unintended files.
2983
- elif not manifest_found_entry:
2984
- # Manifest doesn't list this template — check convention paths
3027
+ if manifest_candidate is not None:
3028
+ candidate = manifest_candidate
3029
+ elif entry is None:
2985
3030
  candidate = _find_in_subdirs(pack_dir)
2986
3031
  if candidate:
2987
3032
  # Legacy fallback: if manifest doesn't explicitly declare a
@@ -31,6 +31,20 @@ class CommandStep(StepBase):
31
31
  def execute(self, config: dict[str, Any], context: StepContext) -> StepResult:
32
32
  command = config.get("command", "")
33
33
  input_data = config.get("input", {})
34
+ # validate() rejects a non-mapping input, but the engine does not
35
+ # auto-validate before execute(); a workflow that skipped validation can
36
+ # still reach here. Fail the step with the same contract error rather
37
+ # than silently coercing to {} and dispatching with empty args — that
38
+ # would change the command's meaning, hide the config error, and report
39
+ # COMPLETED, defeating the per-step FAILED / continue_on_error behavior.
40
+ if not isinstance(input_data, dict):
41
+ return StepResult(
42
+ status=StepStatus.FAILED,
43
+ error=(
44
+ f"Command step {config.get('id', '?')!r}: 'input' must be a "
45
+ f"mapping, got {type(input_data).__name__}."
46
+ ),
47
+ )
34
48
 
35
49
  # Resolve expressions in input
36
50
  resolved_input: dict[str, Any] = {}
@@ -50,8 +64,18 @@ class CommandStep(StepBase):
50
64
  # Merge options (workflow defaults ← step overrides)
51
65
  options = dict(context.default_options)
52
66
  step_options = config.get("options", {})
53
- if step_options:
54
- options.update(step_options)
67
+ # Same rationale as 'input': a malformed options fails the step rather
68
+ # than being silently ignored (which would let an invalid step run and
69
+ # apparently complete).
70
+ if not isinstance(step_options, dict):
71
+ return StepResult(
72
+ status=StepStatus.FAILED,
73
+ error=(
74
+ f"Command step {config.get('id', '?')!r}: 'options' must be a "
75
+ f"mapping, got {type(step_options).__name__}."
76
+ ),
77
+ )
78
+ options.update(step_options)
55
79
 
56
80
  # Attempt CLI dispatch
57
81
  args_str = str(resolved_input.get("args", ""))
@@ -155,4 +179,16 @@ class CommandStep(StepBase):
155
179
  errors.append(
156
180
  f"Command step {config.get('id', '?')!r} is missing 'command' field."
157
181
  )
182
+ # execute() iterates input.items() and options.update(step_options); a
183
+ # non-mapping here would raise at run time. Validate the shape like the
184
+ # sibling steps (switch 'cases', fan-out 'step') so it is reported, not
185
+ # crashed on.
186
+ if "input" in config and not isinstance(config["input"], dict):
187
+ errors.append(
188
+ f"Command step {config.get('id', '?')!r}: 'input' must be a mapping."
189
+ )
190
+ if "options" in config and not isinstance(config["options"], dict):
191
+ errors.append(
192
+ f"Command step {config.get('id', '?')!r}: 'options' must be a mapping."
193
+ )
158
194
  return errors
@@ -24,6 +24,24 @@ class FanInStep(StepBase):
24
24
  if not isinstance(output_config, dict):
25
25
  output_config = {}
26
26
 
27
+ # The engine does not auto-validate step config, so an unvalidated run
28
+ # with a non-list ``wait_for`` reaches here raw. Iterating it then
29
+ # either crashes the whole run (a scalar like an int or None raises
30
+ # TypeError) or, worse, silently iterates a string's characters and
31
+ # yields a bogus join of empty results with a COMPLETED status — the
32
+ # exact "silent empty result + COMPLETED" wiring bug the engine's
33
+ # fan-in validation guards against. Fail this step loudly instead,
34
+ # mirroring the fan-out step's non-list ``items`` handling.
35
+ if not isinstance(wait_for, list):
36
+ return StepResult(
37
+ status=StepStatus.FAILED,
38
+ error=(
39
+ f"Fan-in step {config.get('id', '?')!r}: 'wait_for' must be "
40
+ f"a list of step IDs, got {type(wait_for).__name__}."
41
+ ),
42
+ output={"results": []},
43
+ )
44
+
27
45
  # Collect results from referenced steps
28
46
  results = []
29
47
  for step_id in wait_for:
@@ -115,6 +115,63 @@ class TestInitIntegrationFlag:
115
115
  data = json.loads((project / ".specify" / "integration.json").read_text(encoding="utf-8"))
116
116
  assert data["integration"] == specify_cli.DEFAULT_INIT_INTEGRATION
117
117
 
118
+ def test_init_here_nonempty_noninteractive_errors_with_force_guidance(self, tmp_path):
119
+ """`init --here` on a non-empty directory with no confirmation input (empty
120
+ stdin) must fail fast with guidance to use --force, instead of the bare
121
+ 'Aborted.' from an EOF on typer.confirm. CliRunner with no `input=` provides
122
+ empty stdin, so typer.confirm raises Abort, which the command converts to the
123
+ actionable error."""
124
+ from typer.testing import CliRunner
125
+ from specify_cli import app
126
+
127
+ project = tmp_path / "nonempty-here"
128
+ project.mkdir()
129
+ (project / "existing.txt").write_text("keep me", encoding="utf-8")
130
+ old_cwd = os.getcwd()
131
+ try:
132
+ os.chdir(project)
133
+ result = CliRunner().invoke(app, [
134
+ "init", "--here", "--integration", "copilot", "--script", "sh", "--ignore-agent-tools",
135
+ ], catch_exceptions=False)
136
+ finally:
137
+ os.chdir(old_cwd)
138
+
139
+ assert result.exit_code == 1, result.output
140
+ assert "--force" in result.output
141
+ # Aborted before scaffolding: the pre-existing file is untouched.
142
+ assert (project / "existing.txt").read_text(encoding="utf-8") == "keep me"
143
+
144
+ def test_init_here_interactive_cancel_exits_zero(self, tmp_path, monkeypatch):
145
+ """An interactive Ctrl+C at the merge confirmation (typer.Abort on a TTY)
146
+ is a normal cancellation — exit 0, "cancelled" — NOT the missing-input
147
+ --force error, which is reserved for non-interactive EOF. Guards the
148
+ regression where Abort was caught unconditionally and every cancel became
149
+ an exit-1 --force error."""
150
+ from typer.testing import CliRunner
151
+ from specify_cli import app
152
+ import specify_cli.commands.init as init_mod
153
+
154
+ # Simulate an interactive terminal so the Abort is treated as a cancel.
155
+ monkeypatch.setattr(init_mod, "_stdin_is_interactive", lambda: True)
156
+
157
+ project = tmp_path / "cancel-here"
158
+ project.mkdir()
159
+ (project / "existing.txt").write_text("keep me", encoding="utf-8")
160
+ old_cwd = os.getcwd()
161
+ try:
162
+ os.chdir(project)
163
+ # No input → typer.confirm raises Abort (stands in for Ctrl+C).
164
+ result = CliRunner().invoke(app, [
165
+ "init", "--here", "--integration", "copilot", "--script", "sh", "--ignore-agent-tools",
166
+ ], catch_exceptions=False)
167
+ finally:
168
+ os.chdir(old_cwd)
169
+
170
+ assert result.exit_code == 0, result.output
171
+ assert "cancelled" in result.output.lower()
172
+ assert "--force" not in result.output # not the missing-input error
173
+ assert (project / "existing.txt").read_text(encoding="utf-8") == "keep me"
174
+
118
175
  def test_integration_copilot_auto_promotes(self, tmp_path):
119
176
  from typer.testing import CliRunner
120
177
  from specify_cli import app
@@ -835,7 +892,8 @@ class TestInitIntegrationFlag:
835
892
  assert (scripts_dir / "common.sh").read_text(encoding="utf-8") != custom_content
836
893
 
837
894
  def test_init_here_without_force_preserves_shared_infra(self, tmp_path):
838
- """E2E: specify init --here (no --force) preserves existing shared infra files."""
895
+ """E2E: confirming the merge with piped "y" (no --force) preserves
896
+ existing shared infra files (unlike --force, which overwrites them)."""
839
897
  from typer.testing import CliRunner
840
898
  from specify_cli import app
841
899