specify-cli 0.12.0__tar.gz → 0.12.1__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 (449) hide show
  1. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/test.yml +3 -3
  2. {specify_cli-0.12.0 → specify_cli-0.12.1}/CHANGELOG.md +15 -0
  3. {specify_cli-0.12.0 → specify_cli-0.12.1}/PKG-INFO +2 -2
  4. {specify_cli-0.12.0 → specify_cli-0.12.1}/README.md +1 -1
  5. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/integrations.md +75 -1
  6. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/scripts/bash/update-agent-context.sh +14 -7
  7. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/bash/create-new-feature-branch.sh +1 -1
  8. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/bash/initialize-repo.sh +1 -1
  9. {specify_cli-0.12.0 → specify_cli-0.12.1}/pyproject.toml +1 -1
  10. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/bash/check-prerequisites.sh +8 -2
  11. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/bash/common.sh +14 -2
  12. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/bash/create-new-feature.sh +1 -1
  13. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/powershell/check-prerequisites.ps1 +8 -2
  14. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/powershell/common.ps1 +12 -2
  15. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/powershell/setup-plan.ps1 +8 -1
  16. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_console.py +4 -0
  17. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/commands/bundle/__init__.py +4 -2
  18. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/goose/__init__.py +2 -2
  19. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/contract/test_bundle_cli.py +15 -0
  20. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/git/test_git_extension.py +4 -0
  21. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_check_prerequisites_paths_only.py +121 -0
  22. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_setup_plan_no_overwrite.py +24 -0
  23. {specify_cli-0.12.0 → specify_cli-0.12.1}/.devcontainer/devcontainer.json +0 -0
  24. {specify_cli-0.12.0 → specify_cli-0.12.1}/.devcontainer/post-create.sh +0 -0
  25. {specify_cli-0.12.0 → specify_cli-0.12.1}/.editorconfig +0 -0
  26. {specify_cli-0.12.0 → specify_cli-0.12.1}/.gitattributes +0 -0
  27. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/CODEOWNERS +0 -0
  28. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  29. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  30. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  31. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  32. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  33. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  34. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  35. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  36. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/aw/actions-lock.json +0 -0
  37. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/dependabot.yml +0 -0
  38. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/skills/add-community-extension/SKILL.md +0 -0
  39. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/RELEASE-PROCESS.md +0 -0
  40. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/add-community-extension.lock.yml +0 -0
  41. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/add-community-extension.md +0 -0
  42. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/add-community-preset.lock.yml +0 -0
  43. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/add-community-preset.md +0 -0
  44. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/bug-assess.lock.yml +0 -0
  45. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/bug-assess.md +0 -0
  46. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/catalog-assign.yml +0 -0
  47. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/codeql.yml +0 -0
  48. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/docs.yml +0 -0
  49. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/lint.yml +0 -0
  50. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/publish-pypi.yml +0 -0
  51. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/release-trigger.yml +0 -0
  52. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/release.yml +0 -0
  53. {specify_cli-0.12.0 → specify_cli-0.12.1}/.github/workflows/stale.yml +0 -0
  54. {specify_cli-0.12.0 → specify_cli-0.12.1}/.gitignore +0 -0
  55. {specify_cli-0.12.0 → specify_cli-0.12.1}/.markdownlint-cli2.jsonc +0 -0
  56. {specify_cli-0.12.0 → specify_cli-0.12.1}/.zenodo.json +0 -0
  57. {specify_cli-0.12.0 → specify_cli-0.12.1}/AGENTS.md +0 -0
  58. {specify_cli-0.12.0 → specify_cli-0.12.1}/CITATION.cff +0 -0
  59. {specify_cli-0.12.0 → specify_cli-0.12.1}/CODE_OF_CONDUCT.md +0 -0
  60. {specify_cli-0.12.0 → specify_cli-0.12.1}/CONTRIBUTING.md +0 -0
  61. {specify_cli-0.12.0 → specify_cli-0.12.1}/DEVELOPMENT.md +0 -0
  62. {specify_cli-0.12.0 → specify_cli-0.12.1}/LICENSE +0 -0
  63. {specify_cli-0.12.0 → specify_cli-0.12.1}/SECURITY.md +0 -0
  64. {specify_cli-0.12.0 → specify_cli-0.12.1}/SUPPORT.md +0 -0
  65. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/.gitignore +0 -0
  66. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/README.md +0 -0
  67. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/community/bundles.md +0 -0
  68. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/community/extensions.md +0 -0
  69. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/community/friends.md +0 -0
  70. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/community/overview.md +0 -0
  71. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/community/presets.md +0 -0
  72. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/community/walkthroughs.md +0 -0
  73. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/concepts/complex-features.md +0 -0
  74. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/concepts/sdd.md +0 -0
  75. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/concepts/spec-persistence.md +0 -0
  76. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/docfx.json +0 -0
  77. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/guides/evolving-specs.md +0 -0
  78. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/guides/monorepo.md +0 -0
  79. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/index.md +0 -0
  80. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/install/air-gapped.md +0 -0
  81. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/install/one-time.md +0 -0
  82. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/install/pipx.md +0 -0
  83. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/install/uv.md +0 -0
  84. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/installation.md +0 -0
  85. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/local-development.md +0 -0
  86. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/quickstart.md +0 -0
  87. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/authentication.md +0 -0
  88. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/bundles.md +0 -0
  89. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/core.md +0 -0
  90. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/extensions.md +0 -0
  91. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/overview.md +0 -0
  92. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/presets.md +0 -0
  93. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/reference/workflows.md +0 -0
  94. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/template/public/main.css +0 -0
  95. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/toc.yml +0 -0
  96. {specify_cli-0.12.0 → specify_cli-0.12.1}/docs/upgrade.md +0 -0
  97. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/business-analyst/README.md +0 -0
  98. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/business-analyst/bundle.yml +0 -0
  99. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/developer/README.md +0 -0
  100. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/developer/bundle.yml +0 -0
  101. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/product-manager/README.md +0 -0
  102. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/product-manager/bundle.yml +0 -0
  103. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/security-researcher/README.md +0 -0
  104. {specify_cli-0.12.0 → specify_cli-0.12.1}/examples/bundles/security-researcher/bundle.yml +0 -0
  105. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  106. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  107. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  108. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  109. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/README.md +0 -0
  110. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  111. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/README.md +0 -0
  112. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/agent-context-config.yml +0 -0
  113. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/agent-context-defaults.json +0 -0
  114. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  115. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/extension.yml +0 -0
  116. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  117. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/bug/README.md +0 -0
  118. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  119. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  120. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/bug/commands/speckit.bug.test.md +0 -0
  121. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/bug/extension.yml +0 -0
  122. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/catalog.community.json +0 -0
  123. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/catalog.json +0 -0
  124. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/README.md +0 -0
  125. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.commit.md +0 -0
  126. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.feature.md +0 -0
  127. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.initialize.md +0 -0
  128. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.remote.md +0 -0
  129. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/commands/speckit.git.validate.md +0 -0
  130. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/config-template.yml +0 -0
  131. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/extension.yml +0 -0
  132. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/git-config.yml +0 -0
  133. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  134. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/bash/git-common.sh +0 -0
  135. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  136. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  137. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  138. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  139. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/selftest/commands/selftest.md +0 -0
  140. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/selftest/extension.yml +0 -0
  141. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/.gitignore +0 -0
  142. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/CHANGELOG.md +0 -0
  143. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/EXAMPLE-README.md +0 -0
  144. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/LICENSE +0 -0
  145. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/README.md +0 -0
  146. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/commands/example.md +0 -0
  147. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/config-template.yml +0 -0
  148. {specify_cli-0.12.0 → specify_cli-0.12.1}/extensions/template/extension.yml +0 -0
  149. {specify_cli-0.12.0 → specify_cli-0.12.1}/integrations/CONTRIBUTING.md +0 -0
  150. {specify_cli-0.12.0 → specify_cli-0.12.1}/integrations/README.md +0 -0
  151. {specify_cli-0.12.0 → specify_cli-0.12.1}/integrations/catalog.community.json +0 -0
  152. {specify_cli-0.12.0 → specify_cli-0.12.1}/integrations/catalog.json +0 -0
  153. {specify_cli-0.12.0 → specify_cli-0.12.1}/media/bootstrap-claude-code.gif +0 -0
  154. {specify_cli-0.12.0 → specify_cli-0.12.1}/media/logo_large.webp +0 -0
  155. {specify_cli-0.12.0 → specify_cli-0.12.1}/media/logo_small.webp +0 -0
  156. {specify_cli-0.12.0 → specify_cli-0.12.1}/media/spec-kit-video-header.jpg +0 -0
  157. {specify_cli-0.12.0 → specify_cli-0.12.1}/media/specify_cli.gif +0 -0
  158. {specify_cli-0.12.0 → specify_cli-0.12.1}/newsletters/2026-April.md +0 -0
  159. {specify_cli-0.12.0 → specify_cli-0.12.1}/newsletters/2026-February.md +0 -0
  160. {specify_cli-0.12.0 → specify_cli-0.12.1}/newsletters/2026-March.md +0 -0
  161. {specify_cli-0.12.0 → specify_cli-0.12.1}/newsletters/2026-May.md +0 -0
  162. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/ARCHITECTURE.md +0 -0
  163. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/PUBLISHING.md +0 -0
  164. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/README.md +0 -0
  165. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/catalog.community.json +0 -0
  166. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/catalog.json +0 -0
  167. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/README.md +0 -0
  168. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/commands/speckit.constitution.md +0 -0
  169. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/commands/speckit.implement.md +0 -0
  170. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/commands/speckit.plan.md +0 -0
  171. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/commands/speckit.specify.md +0 -0
  172. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/commands/speckit.tasks.md +0 -0
  173. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/lean/preset.yml +0 -0
  174. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/scaffold/README.md +0 -0
  175. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  176. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/scaffold/commands/speckit.specify.md +0 -0
  177. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/scaffold/preset.yml +0 -0
  178. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/scaffold/templates/myext-template.md +0 -0
  179. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/scaffold/templates/spec-template.md +0 -0
  180. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/commands/speckit.specify.md +0 -0
  181. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  182. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/preset.yml +0 -0
  183. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/templates/agent-file-template.md +0 -0
  184. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/templates/checklist-template.md +0 -0
  185. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/templates/constitution-template.md +0 -0
  186. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/templates/plan-template.md +0 -0
  187. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/templates/spec-template.md +0 -0
  188. {specify_cli-0.12.0 → specify_cli-0.12.1}/presets/self-test/templates/tasks-template.md +0 -0
  189. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/bash/setup-plan.sh +0 -0
  190. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/bash/setup-tasks.sh +0 -0
  191. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/powershell/create-new-feature.ps1 +0 -0
  192. {specify_cli-0.12.0 → specify_cli-0.12.1}/scripts/powershell/setup-tasks.ps1 +0 -0
  193. {specify_cli-0.12.0 → specify_cli-0.12.1}/spec-driven.md +0 -0
  194. {specify_cli-0.12.0 → specify_cli-0.12.1}/spec-kit.code-workspace +0 -0
  195. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/__init__.py +0 -0
  196. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_agent_config.py +0 -0
  197. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_assets.py +0 -0
  198. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_github_http.py +0 -0
  199. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_init_options.py +0 -0
  200. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_invocation_style.py +0 -0
  201. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_utils.py +0 -0
  202. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/_version.py +0 -0
  203. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/agents.py +0 -0
  204. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/authentication/__init__.py +0 -0
  205. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/authentication/azure_devops.py +0 -0
  206. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/authentication/base.py +0 -0
  207. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/authentication/config.py +0 -0
  208. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/authentication/github.py +0 -0
  209. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/authentication/http.py +0 -0
  210. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/__init__.py +0 -0
  211. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  212. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  213. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/__init__.py +0 -0
  214. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/project.py +0 -0
  215. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/versioning.py +0 -0
  216. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  217. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/models/__init__.py +0 -0
  218. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/models/catalog.py +0 -0
  219. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/models/manifest.py +0 -0
  220. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/models/records.py +0 -0
  221. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/__init__.py +0 -0
  222. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/adapters.py +0 -0
  223. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  224. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/conflict.py +0 -0
  225. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/installer.py +0 -0
  226. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/packager.py +0 -0
  227. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/primitives.py +0 -0
  228. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/references.py +0 -0
  229. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/resolver.py +0 -0
  230. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/bundler/services/validator.py +0 -0
  231. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/catalogs.py +0 -0
  232. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/commands/__init__.py +0 -0
  233. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/commands/init.py +0 -0
  234. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/extensions/__init__.py +0 -0
  235. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/extensions/_commands.py +0 -0
  236. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integration_runtime.py +0 -0
  237. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integration_scaffold.py +0 -0
  238. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integration_state.py +0 -0
  239. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integration_status.py +0 -0
  240. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/__init__.py +0 -0
  241. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/_commands.py +0 -0
  242. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/_helpers.py +0 -0
  243. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/_install_commands.py +0 -0
  244. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  245. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/_query_commands.py +0 -0
  246. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  247. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/agy/__init__.py +0 -0
  248. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/amp/__init__.py +0 -0
  249. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  250. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/base.py +0 -0
  251. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/bob/__init__.py +0 -0
  252. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/catalog.py +0 -0
  253. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/claude/__init__.py +0 -0
  254. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/cline/__init__.py +0 -0
  255. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  256. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/codex/__init__.py +0 -0
  257. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  258. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  259. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/devin/__init__.py +0 -0
  260. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  261. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/forge/__init__.py +0 -0
  262. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  263. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/generic/__init__.py +0 -0
  264. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  265. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/iflow/__init__.py +0 -0
  266. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/junie/__init__.py +0 -0
  267. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  268. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  269. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  270. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  271. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/manifest.py +0 -0
  272. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/omp/__init__.py +0 -0
  273. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  274. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/pi/__init__.py +0 -0
  275. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  276. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  277. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/roo/__init__.py +0 -0
  278. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  279. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/shai/__init__.py +0 -0
  280. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  281. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/trae/__init__.py +0 -0
  282. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  283. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
  284. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  285. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/integrations/zed/__init__.py +0 -0
  286. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/presets/__init__.py +0 -0
  287. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/presets/_commands.py +0 -0
  288. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/shared_infra.py +0 -0
  289. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/__init__.py +0 -0
  290. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/base.py +0 -0
  291. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/catalog.py +0 -0
  292. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/engine.py +0 -0
  293. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/expressions.py +0 -0
  294. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/__init__.py +0 -0
  295. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  296. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  297. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  298. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  299. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  300. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  301. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  302. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  303. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  304. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  305. {specify_cli-0.12.0 → specify_cli-0.12.1}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  306. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/checklist-template.md +0 -0
  307. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/analyze.md +0 -0
  308. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/checklist.md +0 -0
  309. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/clarify.md +0 -0
  310. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/constitution.md +0 -0
  311. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/converge.md +0 -0
  312. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/implement.md +0 -0
  313. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/plan.md +0 -0
  314. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/specify.md +0 -0
  315. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/tasks.md +0 -0
  316. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/commands/taskstoissues.md +0 -0
  317. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/constitution-template.md +0 -0
  318. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/plan-template.md +0 -0
  319. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/spec-template.md +0 -0
  320. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/tasks-template.md +0 -0
  321. {specify_cli-0.12.0 → specify_cli-0.12.1}/templates/vscode-settings.json +0 -0
  322. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/__init__.py +0 -0
  323. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/auth_helpers.py +0 -0
  324. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/bundler_helpers.py +0 -0
  325. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/conftest.py +0 -0
  326. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/contract/test_catalog_schema.py +0 -0
  327. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/contract/test_manifest_schema.py +0 -0
  328. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/__init__.py +0 -0
  329. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/bug/__init__.py +0 -0
  330. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/bug/test_bug_extension.py +0 -0
  331. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/git/__init__.py +0 -0
  332. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/test_agent_context_cli_free.py +0 -0
  333. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/test_extension_agent_context.py +0 -0
  334. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  335. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/hooks/TESTING.md +0 -0
  336. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/hooks/plan.md +0 -0
  337. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/hooks/spec.md +0 -0
  338. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/hooks/tasks.md +0 -0
  339. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/http_helpers.py +0 -0
  340. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integration/test_bundler_catalog_stack.py +0 -0
  341. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integration/test_bundler_init_install.py +0 -0
  342. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integration/test_bundler_install_flow.py +0 -0
  343. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integration/test_bundler_local_install.py +0 -0
  344. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integration/test_bundler_offline.py +0 -0
  345. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integration/test_bundler_security_paths.py +0 -0
  346. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/__init__.py +0 -0
  347. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/conftest.py +0 -0
  348. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_base.py +0 -0
  349. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_cli.py +0 -0
  350. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_extra_args.py +0 -0
  351. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_agy.py +0 -0
  352. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_amp.py +0 -0
  353. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_auggie.py +0 -0
  354. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_base_markdown.py +0 -0
  355. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_base_skills.py +0 -0
  356. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_base_toml.py +0 -0
  357. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_base_yaml.py +0 -0
  358. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_bob.py +0 -0
  359. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_catalog.py +0 -0
  360. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_claude.py +0 -0
  361. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_cline.py +0 -0
  362. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_codebuddy.py +0 -0
  363. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_codex.py +0 -0
  364. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_copilot.py +0 -0
  365. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_cursor_agent.py +0 -0
  366. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_devin.py +0 -0
  367. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_firebender.py +0 -0
  368. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_forge.py +0 -0
  369. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_gemini.py +0 -0
  370. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_generic.py +0 -0
  371. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_goose.py +0 -0
  372. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_hermes.py +0 -0
  373. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_iflow.py +0 -0
  374. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_junie.py +0 -0
  375. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_kilocode.py +0 -0
  376. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_kimi.py +0 -0
  377. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_kiro_cli.py +0 -0
  378. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_lingma.py +0 -0
  379. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_omp.py +0 -0
  380. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_opencode.py +0 -0
  381. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_pi.py +0 -0
  382. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_qodercli.py +0 -0
  383. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_qwen.py +0 -0
  384. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_roo.py +0 -0
  385. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_rovodev.py +0 -0
  386. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_scaffold.py +0 -0
  387. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_shai.py +0 -0
  388. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_state.py +0 -0
  389. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_subcommand.py +0 -0
  390. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_tabnine.py +0 -0
  391. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_trae.py +0 -0
  392. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_vibe.py +0 -0
  393. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_windsurf.py +0 -0
  394. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_zcode.py +0 -0
  395. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_integration_zed.py +0 -0
  396. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_manifest.py +0 -0
  397. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/integrations/test_registry.py +0 -0
  398. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/self_upgrade_helpers.py +0 -0
  399. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_agent_config_consistency.py +0 -0
  400. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_authentication.py +0 -0
  401. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_branch_numbering.py +0 -0
  402. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_check_tool.py +0 -0
  403. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_cli_version.py +0 -0
  404. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_commands_package.py +0 -0
  405. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_console_imports.py +0 -0
  406. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_extension_registration.py +0 -0
  407. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_extension_skills.py +0 -0
  408. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_extension_update_hardening.py +0 -0
  409. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_extensions.py +0 -0
  410. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_github_http.py +0 -0
  411. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_github_workflows.py +0 -0
  412. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_init_dir.py +0 -0
  413. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_live_transient_windows.py +0 -0
  414. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_merge.py +0 -0
  415. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_presets.py +0 -0
  416. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_ps1_encoding.py +0 -0
  417. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_registrar_path_traversal.py +0 -0
  418. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_self_upgrade_detection.py +0 -0
  419. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_self_upgrade_execution.py +0 -0
  420. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_self_upgrade_guidance.py +0 -0
  421. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_self_upgrade_verification.py +0 -0
  422. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_setup_plan_feature_json.py +0 -0
  423. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_setup_tasks.py +0 -0
  424. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_shared_infra_integrity.py +0 -0
  425. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_timestamp_branches.py +0 -0
  426. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_upgrade.py +0 -0
  427. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_utils.py +0 -0
  428. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_utils_assets_imports.py +0 -0
  429. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_version_imports.py +0 -0
  430. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_workflow_run_without_project.py +0 -0
  431. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/test_workflows.py +0 -0
  432. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_adapters.py +0 -0
  433. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_catalog_config.py +0 -0
  434. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_conflict.py +0 -0
  435. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_packager.py +0 -0
  436. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_primitives.py +0 -0
  437. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_records.py +0 -0
  438. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_references.py +0 -0
  439. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_resolver.py +0 -0
  440. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_validator.py +0 -0
  441. {specify_cli-0.12.0 → specify_cli-0.12.1}/tests/unit/test_bundler_versioning.py +0 -0
  442. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/ARCHITECTURE.md +0 -0
  443. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/PUBLISHING.md +0 -0
  444. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/README.md +0 -0
  445. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/catalog.community.json +0 -0
  446. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/catalog.json +0 -0
  447. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/speckit/workflow.yml +0 -0
  448. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/step-catalog.community.json +0 -0
  449. {specify_cli-0.12.0 → specify_cli-0.12.1}/workflows/step-catalog.json +0 -0
@@ -21,7 +21,7 @@ jobs:
21
21
  - name: Set up Python
22
22
  uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
23
23
  with:
24
- python-version: "3.13"
24
+ python-version: "3.14"
25
25
 
26
26
  - name: Run ruff check
27
27
  run: uvx ruff check src/
@@ -30,8 +30,8 @@ jobs:
30
30
  runs-on: ${{ matrix.os }}
31
31
  strategy:
32
32
  matrix:
33
- os: [ubuntu-latest, windows-latest]
34
- python-version: ["3.11", "3.12", "3.13"]
33
+ os: [ubuntu-latest, windows-latest, macos-latest]
34
+ python-version: ["3.13", "3.14"]
35
35
  steps:
36
36
  - name: Checkout
37
37
  uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.12.1] - 2026-06-30
6
+
7
+ ### Changed
8
+
9
+ - chore: align CI Python matrix with devguide lifecycle + fix bash 3.2 portability (#3244)
10
+ - fix: stop check-prerequisites --paths-only from writing feature.json (#3025) (#3190)
11
+ - docs: document integration catalog subcommands (#3206)
12
+ - fix(scripts): use ASCII [OK] marker in initialize-repo.sh (parity with PowerShell twin) (#3231)
13
+ - docs: document integration `search`/`info`/`scaffold` subcommands (#3174) (#3194)
14
+ - docs: remove Cursor from `specify check` agent list (#3178) (#3193)
15
+ - fix(goose): repoint install_url and docs to goose-docs.ai (#3171) (#3215)
16
+ - fix(scripts): route 'Plan template not found' per --json in setup-plan.ps1 (parity with bash) (#3241)
17
+ - fix(bundle): send command errors to stderr so --json stdout stays parseable (#3235)
18
+ - chore: release 0.12.0, begin 0.12.1.dev0 development (#3243)
19
+
5
20
  ## [0.12.0] - 2026-06-29
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.12.0
3
+ Version: 0.12.1
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
@@ -426,7 +426,7 @@ specify init . --force --integration copilot
426
426
  specify init --here --force --integration copilot
427
427
  ```
428
428
 
429
- The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
429
+ The CLI will check that your selected agent's CLI tool is installed (for integrations that require a CLI), such as Claude Code, Gemini CLI, Qwen Code, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi Coding Agent, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode. If you don't have the required tool installed, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
430
430
 
431
431
  ```bash
432
432
  specify init <project_name> --integration copilot --ignore-agent-tools
@@ -406,7 +406,7 @@ specify init . --force --integration copilot
406
406
  specify init --here --force --integration copilot
407
407
  ```
408
408
 
409
- The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
409
+ The CLI will check that your selected agent's CLI tool is installed (for integrations that require a CLI), such as Claude Code, Gemini CLI, Qwen Code, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi Coding Agent, Oh My Pi, Forge, Goose, Mistral Vibe, or ZCode. If you don't have the required tool installed, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
410
410
 
411
411
  ```bash
412
412
  specify init <project_name> --integration copilot --ignore-agent-tools
@@ -19,7 +19,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
19
19
  | [Forge](https://forgecode.dev/) | `forge` | |
20
20
  | [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `gemini` | |
21
21
  | [GitHub Copilot](https://code.visualstudio.com/) | `copilot` | |
22
- | [Goose](https://block.github.io/goose/) | `goose` | Uses YAML recipe format in `.goose/recipes/` |
22
+ | [Goose](https://goose-docs.ai/) | `goose` | Uses YAML recipe format in `.goose/recipes/` |
23
23
  | [Hermes](https://github.com/NousResearch/hermes-agent) | `hermes` | Skills-based integration; installs skills globally into `~/.hermes/skills/` |
24
24
  | [IBM Bob](https://www.ibm.com/products/bob) | `bob` | IDE-based agent |
25
25
  | [iFlow CLI](https://docs.iflow.cn/en/cli/quickstart) | `iflow` | |
@@ -54,6 +54,27 @@ Shows all available integrations, which one is currently installed, and whether
54
54
  When multiple integrations are installed, the list marks the default integration separately from the other installed integrations.
55
55
  The list also shows whether each built-in integration is declared multi-install safe.
56
56
 
57
+ ## Search Available Integrations
58
+
59
+ ```bash
60
+ specify integration search [query]
61
+ ```
62
+
63
+ | Option | Description |
64
+ | ---------- | ------------------ |
65
+ | `--tag` | Filter by tag |
66
+ | `--author` | Filter by author |
67
+
68
+ Searches the active catalog stack for integrations matching the query. Without a query, lists all available integrations. Must be run inside a Spec Kit project.
69
+
70
+ ## Integration Info
71
+
72
+ ```bash
73
+ specify integration info <integration_id>
74
+ ```
75
+
76
+ Shows catalog details for a single integration, including its description, author, license, tags, source catalog, repository (when available), and whether it is currently active. Must be run inside a Spec Kit project.
77
+
57
78
  ## Install an Integration
58
79
 
59
80
  ```bash
@@ -152,6 +173,47 @@ is `null` when no installed integration set can be evaluated, such as when the
152
173
  integration state is missing, unreadable, lacks a valid recorded integration
153
174
  list, or records no installed integrations.
154
175
 
176
+ ## Catalog Management
177
+
178
+ Integration catalogs control where the discovery commands (`search` and `info`) look for integrations. Catalogs are checked in priority order.
179
+
180
+ ### List Catalogs
181
+
182
+ ```bash
183
+ specify integration catalog list
184
+ ```
185
+
186
+ Shows the active catalog sources. Project-level sources (when configured) are removable by index; otherwise the active sources are shown as non-removable.
187
+
188
+ ### Add a Catalog
189
+
190
+ ```bash
191
+ specify integration catalog add <url>
192
+ ```
193
+
194
+ | Option | Description |
195
+ | --------------- | ----------------------------- |
196
+ | `--name <name>` | Optional name for the catalog |
197
+
198
+ Adds a custom catalog URL to the project's `.specify/integration-catalogs.yml`. The URL must use HTTPS (except `http://localhost`, `http://127.0.0.1`, or `http://[::1]` for local testing).
199
+
200
+ ### Remove a Catalog
201
+
202
+ ```bash
203
+ specify integration catalog remove <index>
204
+ ```
205
+
206
+ Removes a project catalog source by its 0-based index in `catalog list`.
207
+
208
+ ### Catalog Resolution Order
209
+
210
+ Catalogs are resolved in this order (first match wins):
211
+
212
+ 1. **Environment variable** — `SPECKIT_INTEGRATION_CATALOG_URL` overrides all catalogs
213
+ 2. **Project config** — `.specify/integration-catalogs.yml`
214
+ 3. **User config** — `~/.specify/integration-catalogs.yml`
215
+ 4. **Built-in defaults** — official catalog + community catalog
216
+
155
217
  ## Integration-Specific Options
156
218
 
157
219
  Some integrations accept additional options via `--integration-options`:
@@ -167,6 +229,18 @@ Example:
167
229
  specify integration install generic --integration-options="--commands-dir .myagent/cmds"
168
230
  ```
169
231
 
232
+ ## Scaffold a New Integration
233
+
234
+ ```bash
235
+ specify integration scaffold <key>
236
+ ```
237
+
238
+ Creates a minimal built-in integration package and a matching test skeleton in the Spec Kit repository, then prints the next steps for wiring it up. Run this command from the Spec Kit repository root. The `<key>` must be lowercase kebab-case (for example, `my-agent`).
239
+
240
+ | Option | Description |
241
+ | -------- | ---------------------------------------------------------------- |
242
+ | `--type` | Scaffold template to use: `markdown` (default), `skills`, `toml`, or `yaml` |
243
+
170
244
  ## FAQ
171
245
 
172
246
  ### Can I install multiple integrations in the same project?
@@ -59,6 +59,13 @@ case "$(uname -s 2>/dev/null || true)" in
59
59
  esac
60
60
 
61
61
  # Parse extension config once; emit context files as JSON, followed by marker strings.
62
+ #
63
+ # NOTE (bash 3.2 / macOS portability): the embedded Python heredocs below run
64
+ # inside $(...) command substitution. bash 3.2 (the system /bin/bash on macOS)
65
+ # mis-parses a single-quote/apostrophe in a heredoc body nested in $(...),
66
+ # failing with "unexpected EOF while looking for matching `''". Keep these
67
+ # $(...)-nested heredoc bodies free of apostrophes (use double quotes in Python
68
+ # string literals and avoid contractions in comments).
62
69
  if ! _raw_opts="$("$_python" - "$EXT_CONFIG" "$_case_insensitive_context_files" "$PROJECT_ROOT" <<'PY'
63
70
  import json
64
71
  import sys
@@ -113,11 +120,11 @@ if isinstance(raw_files, list):
113
120
  if not context_files:
114
121
  add_context_file(get_str(data, "context_file"))
115
122
  if not context_files:
116
- # Self-seed: the agent-context extension owns its lifecycle, so when its
117
- # own config declares no target it derives one from the active integration
118
- # recorded in init-options.json, using the extension's OWN bundled mapping
119
- # (agent-context-defaults.json). This is independent of the Specify CLI by
120
- # design nothing here imports specify_cli.
123
+ # Self-seed: the agent-context extension manages its own lifecycle, so when
124
+ # its config declares no target, it derives one from the active integration
125
+ # recorded in init-options.json, mapped through the bundled
126
+ # agent-context-defaults.json file. This is independent of the Specify CLI
127
+ # by design; nothing here imports specify_cli.
121
128
  project_root = sys.argv[3] if len(sys.argv) > 3 else "."
122
129
  integration_key = ""
123
130
  try:
@@ -144,7 +151,7 @@ if not context_files:
144
151
  except Exception:
145
152
  print(
146
153
  "agent-context: unable to read %s; cannot self-seed the context "
147
- "file. Set 'context_file' in the extension config." % defaults_path,
154
+ "file. Set context_file in the extension config." % defaults_path,
148
155
  file=sys.stderr,
149
156
  )
150
157
  mapping = {}
@@ -152,7 +159,7 @@ if not context_files:
152
159
  if not context_files:
153
160
  print(
154
161
  "agent-context: no default context file is known for integration "
155
- "'%s'. Set 'context_file' in the extension config to choose one."
162
+ "%s. Set context_file in the extension config to choose one."
156
163
  % integration_key,
157
164
  file=sys.stderr,
158
165
  )
@@ -288,7 +288,7 @@ generate_branch_name() {
288
288
  if ! echo "$word" | grep -qiE "$stop_words"; then
289
289
  if [ ${#word} -ge 3 ]; then
290
290
  meaningful_words+=("$word")
291
- elif echo "$description" | grep -qw -- "${word^^}"; then
291
+ elif printf '%s' "$description" | grep -qw -- "$(printf '%s' "$word" | tr '[:lower:]' '[:upper:]')"; then
292
292
  meaningful_words+=("$word")
293
293
  fi
294
294
  fi
@@ -51,4 +51,4 @@ _git_out=$(git init -q 2>&1) || { echo "[specify] Error: git init failed: $_git_
51
51
  _git_out=$(git add . 2>&1) || { echo "[specify] Error: git add failed: $_git_out" >&2; exit 1; }
52
52
  _git_out=$(git commit --allow-empty -q -m "$COMMIT_MSG" 2>&1) || { echo "[specify] Error: git commit failed: $_git_out" >&2; exit 1; }
53
53
 
54
- echo " Git repository initialized" >&2
54
+ echo "[OK] Git repository initialized" >&2
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.12.0"
3
+ version = "0.12.1"
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"
@@ -78,8 +78,14 @@ done
78
78
  SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
79
79
  source "$SCRIPT_DIR/common.sh"
80
80
 
81
- # Get feature paths
82
- _paths_output=$(get_feature_paths) || { echo "ERROR: Failed to resolve feature paths" >&2; exit 1; }
81
+ # Get feature paths.
82
+ # In --paths-only mode this is pure resolution, so pass --no-persist to opt out
83
+ # of the feature.json write side effect (issue #3025).
84
+ if $PATHS_ONLY; then
85
+ _paths_output=$(get_feature_paths --no-persist) || { echo "ERROR: Failed to resolve feature paths" >&2; exit 1; }
86
+ else
87
+ _paths_output=$(get_feature_paths) || { echo "ERROR: Failed to resolve feature paths" >&2; exit 1; }
88
+ fi
83
89
  eval "$_paths_output"
84
90
  unset _paths_output
85
91
 
@@ -152,6 +152,15 @@ _persist_feature_json() {
152
152
  }
153
153
 
154
154
  get_feature_paths() {
155
+ # Read-only callers (e.g. check-prerequisites.sh --paths-only) pass
156
+ # --no-persist so pure path resolution never writes .specify/feature.json,
157
+ # which would dirty the working tree or overwrite a pinned value (issue #3025).
158
+ local no_persist=false
159
+ if [[ "${1:-}" == "--no-persist" ]]; then
160
+ no_persist=true
161
+ shift
162
+ fi
163
+
155
164
  # Split decl/assignment so a SPECIFY_INIT_DIR validation failure in
156
165
  # get_repo_root propagates as a hard error instead of being masked by `local`.
157
166
  local repo_root
@@ -168,8 +177,11 @@ get_feature_paths() {
168
177
  feature_dir="$SPECIFY_FEATURE_DIRECTORY"
169
178
  # Normalize relative paths to absolute under repo root
170
179
  [[ "$feature_dir" != /* ]] && feature_dir="$repo_root/$feature_dir"
171
- # Persist to feature.json so future sessions without the env var still work
172
- _persist_feature_json "$repo_root" "$SPECIFY_FEATURE_DIRECTORY"
180
+ # Persist to feature.json so future sessions without the env var still
181
+ # work — unless the caller opted out for read-only resolution (#3025).
182
+ if [[ "$no_persist" != true ]]; then
183
+ _persist_feature_json "$repo_root" "$SPECIFY_FEATURE_DIRECTORY"
184
+ fi
173
185
  elif [[ -f "$repo_root/.specify/feature.json" ]]; then
174
186
  local _fd
175
187
  _fd=$(read_feature_json_feature_directory "$repo_root")
@@ -152,7 +152,7 @@ generate_branch_name() {
152
152
  if ! echo "$word" | grep -qiE "$stop_words"; then
153
153
  if [ ${#word} -ge 3 ]; then
154
154
  meaningful_words+=("$word")
155
- elif echo "$description" | grep -q "\b${word^^}\b"; then
155
+ elif printf '%s' "$description" | grep -qw -- "$(printf '%s' "$word" | tr '[:lower:]' '[:upper:]')"; then
156
156
  # Keep short words if they appear as uppercase in original (likely acronyms)
157
157
  meaningful_words+=("$word")
158
158
  fi
@@ -56,8 +56,14 @@ EXAMPLES:
56
56
  # Source common functions
57
57
  . "$PSScriptRoot/common.ps1"
58
58
 
59
- # Get feature paths
60
- $paths = Get-FeaturePathsEnv
59
+ # Get feature paths.
60
+ # In -PathsOnly mode this is pure resolution, so pass -NoPersist to opt out of
61
+ # the feature.json write side effect (issue #3025).
62
+ if ($PathsOnly) {
63
+ $paths = Get-FeaturePathsEnv -NoPersist
64
+ } else {
65
+ $paths = Get-FeaturePathsEnv
66
+ }
61
67
 
62
68
  # If paths-only mode, output paths and exit (no validation)
63
69
  if ($PathsOnly) {
@@ -143,6 +143,13 @@ function Save-FeatureJson {
143
143
  }
144
144
 
145
145
  function Get-FeaturePathsEnv {
146
+ # Read-only callers (e.g. check-prerequisites.ps1 -PathsOnly) pass -NoPersist
147
+ # so pure path resolution never writes .specify/feature.json, which would
148
+ # dirty the working tree or overwrite a pinned value (issue #3025).
149
+ param(
150
+ [switch]$NoPersist
151
+ )
152
+
146
153
  $repoRoot = Get-RepoRoot
147
154
  $currentBranch = Get-CurrentBranch
148
155
 
@@ -157,8 +164,11 @@ function Get-FeaturePathsEnv {
157
164
  if (-not [System.IO.Path]::IsPathRooted($featureDir)) {
158
165
  $featureDir = Join-Path $repoRoot $featureDir
159
166
  }
160
- # Persist to feature.json so future sessions without the env var still work
161
- Save-FeatureJson -RepoRoot $repoRoot -FeatureDirectory $env:SPECIFY_FEATURE_DIRECTORY
167
+ # Persist to feature.json so future sessions without the env var still
168
+ # work - unless the caller opted out for read-only resolution (#3025).
169
+ if (-not $NoPersist) {
170
+ Save-FeatureJson -RepoRoot $repoRoot -FeatureDirectory $env:SPECIFY_FEATURE_DIRECTORY
171
+ }
162
172
  } elseif (Test-Path $featureJson) {
163
173
  $featureJsonRaw = Get-Content -LiteralPath $featureJson -Raw
164
174
  try {
@@ -48,7 +48,14 @@ if (Test-Path $paths.IMPL_PLAN -PathType Leaf) {
48
48
  Write-Output "Copied plan template to $($paths.IMPL_PLAN)"
49
49
  }
50
50
  } else {
51
- Write-Warning "Plan template not found"
51
+ # Match the bash twin's wording and stream routing (stderr in -Json so
52
+ # stdout stays pure JSON, stdout otherwise), consistent with the sibling
53
+ # "Copied plan template" message above.
54
+ if ($Json) {
55
+ [Console]::Error.WriteLine("Warning: Plan template not found")
56
+ } else {
57
+ Write-Output "Warning: Plan template not found"
58
+ }
52
59
  # Create a basic plan file if template doesn't exist
53
60
  New-Item -ItemType File -Path $paths.IMPL_PLAN -Force | Out-Null
54
61
  }
@@ -34,6 +34,10 @@ TAGLINE = "GitHub Spec Kit - Spec-Driven Development Toolkit"
34
34
 
35
35
  console = Console(highlight=False)
36
36
 
37
+ # Stderr-bound console for error/diagnostic output, so human-facing messages
38
+ # never contaminate stdout (which carries machine-readable ``--json`` payloads).
39
+ err_console = Console(stderr=True, highlight=False)
40
+
37
41
  class StepTracker:
38
42
  """Track and render hierarchical steps without emojis, similar to Claude Code tree output.
39
43
  Supports live auto-refresh via an attached refresh callback.
@@ -13,7 +13,7 @@ from pathlib import Path
13
13
 
14
14
  import typer
15
15
 
16
- from ..._console import console
16
+ from ..._console import console, err_console
17
17
  from ...bundler import BundlerError
18
18
  from ...bundler.lib.project import (
19
19
  active_integration,
@@ -41,7 +41,9 @@ bundle_app.add_typer(bundle_catalog_app, name="catalog")
41
41
 
42
42
  def _fail(message: str) -> None:
43
43
  """Print an actionable error to stderr and exit non-zero."""
44
- console.print(f"[red]Error:[/red] {message}", style=None)
44
+ # Use the stderr console so the error never lands on stdout, which under
45
+ # ``--json`` carries the machine-readable payload and must stay parseable.
46
+ err_console.print(f"[red]Error:[/red] {message}", style=None)
45
47
  raise typer.Exit(code=1)
46
48
 
47
49
 
@@ -1,4 +1,4 @@
1
- """Goose integration — Block's open source AI agent."""
1
+ """Goose integration — open source AI agent (Agentic AI Foundation)."""
2
2
 
3
3
  from ..base import YamlIntegration
4
4
 
@@ -9,7 +9,7 @@ class GooseIntegration(YamlIntegration):
9
9
  "name": "Goose",
10
10
  "folder": ".goose/",
11
11
  "commands_subdir": "recipes",
12
- "install_url": "https://block.github.io/goose/docs/getting-started/installation",
12
+ "install_url": "https://goose-docs.ai/docs/getting-started/installation",
13
13
  "requires_cli": True,
14
14
  }
15
15
  registrar_config = {
@@ -62,6 +62,21 @@ def test_commands_outside_project_fail_with_guidance(tmp_path: Path, monkeypatch
62
62
  assert "Spec Kit project" in result.output
63
63
 
64
64
 
65
+ def test_fail_writes_error_to_stderr_not_stdout(capsys):
66
+ """_fail must write to stderr, not stdout: every bundle command routes errors
67
+ through it, and under --json the error would otherwise corrupt the JSON payload
68
+ that consumers read from stdout."""
69
+ import typer
70
+
71
+ from specify_cli.commands.bundle import _fail
72
+
73
+ with pytest.raises(typer.Exit):
74
+ _fail("something broke")
75
+ captured = capsys.readouterr()
76
+ assert "something broke" in captured.err
77
+ assert "something broke" not in captured.out
78
+
79
+
65
80
  def test_search_works_without_a_project(tmp_path: Path, monkeypatch):
66
81
  # Discovery commands fall back to the built-in/user catalog stack and must
67
82
  # not require a Spec Kit project (matches README/quickstart examples).
@@ -233,6 +233,10 @@ class TestInitializeRepoBash:
233
233
  result = _run_bash("initialize-repo.sh", project)
234
234
  assert result.returncode == 0, result.stderr
235
235
 
236
+ # Success marker is the full ASCII "[OK] ..." line (matching the PowerShell
237
+ # twin and the sibling auto-commit scripts), not a Unicode checkmark.
238
+ assert "[OK] Git repository initialized" in result.stderr, result.stderr
239
+
236
240
  # Verify git repo exists
237
241
  assert (project / ".git").exists()
238
242
 
@@ -163,6 +163,66 @@ def test_normal_mode_still_validates_branch(prereq_repo: Path) -> None:
163
163
  assert result.stdout.strip() == ""
164
164
 
165
165
 
166
+ @requires_bash
167
+ def test_paths_only_does_not_persist_feature_json(prereq_repo: Path) -> None:
168
+ """--paths-only must not rewrite feature.json even when the env override
169
+ differs from the pinned value (#3025).
170
+
171
+ Path resolution is read-only, so it must never dirty the working tree or
172
+ overwrite the persisted feature directory.
173
+ """
174
+ pinned = "specs/001-my-feature"
175
+ (prereq_repo / "specs" / "001-my-feature").mkdir(parents=True, exist_ok=True)
176
+ (prereq_repo / "specs" / "002-other").mkdir(parents=True, exist_ok=True)
177
+ _write_feature_json(prereq_repo, pinned)
178
+ fj = prereq_repo / ".specify" / "feature.json"
179
+ before = fj.read_text(encoding="utf-8")
180
+
181
+ script = prereq_repo / ".specify" / "scripts" / "bash" / "check-prerequisites.sh"
182
+ env = _clean_env()
183
+ env["SPECIFY_FEATURE_DIRECTORY"] = "specs/002-other"
184
+ result = subprocess.run(
185
+ ["bash", str(script), "--json", "--paths-only"],
186
+ cwd=prereq_repo,
187
+ capture_output=True,
188
+ text=True,
189
+ check=False,
190
+ env=env,
191
+ )
192
+ assert result.returncode == 0, result.stderr
193
+ # The override is honored in the output...
194
+ data = json.loads(result.stdout)
195
+ assert "002-other" in data["FEATURE_DIR"]
196
+ # ...but the pinned file on disk is untouched.
197
+ assert fj.read_text(encoding="utf-8") == before
198
+
199
+
200
+ @requires_bash
201
+ def test_normal_mode_still_persists_feature_json(prereq_repo: Path) -> None:
202
+ """Without --paths-only, the env override is still persisted to feature.json,
203
+ so the --no-persist opt-out does not regress normal write behavior (#3025)."""
204
+ (prereq_repo / "specs" / "001-my-feature").mkdir(parents=True, exist_ok=True)
205
+ feat = prereq_repo / "specs" / "002-other"
206
+ feat.mkdir(parents=True, exist_ok=True)
207
+ (feat / "plan.md").write_text("# plan\n", encoding="utf-8")
208
+ _write_feature_json(prereq_repo, "specs/001-my-feature")
209
+ fj = prereq_repo / ".specify" / "feature.json"
210
+
211
+ script = prereq_repo / ".specify" / "scripts" / "bash" / "check-prerequisites.sh"
212
+ env = _clean_env()
213
+ env["SPECIFY_FEATURE_DIRECTORY"] = "specs/002-other"
214
+ result = subprocess.run(
215
+ ["bash", str(script), "--json"],
216
+ cwd=prereq_repo,
217
+ capture_output=True,
218
+ text=True,
219
+ check=False,
220
+ env=env,
221
+ )
222
+ assert result.returncode == 0, result.stderr
223
+ assert json.loads(fj.read_text(encoding="utf-8"))["feature_directory"] == "specs/002-other"
224
+
225
+
166
226
  # ── PowerShell tests ──────────────────────────────────────────────────────
167
227
 
168
228
 
@@ -283,3 +343,64 @@ def test_ps_missing_tasks_error_goes_to_stderr(prereq_repo: Path) -> None:
283
343
  assert "tasks.md not found" in result.stderr
284
344
  assert "tasks.md not found" not in result.stdout
285
345
  assert result.stdout.strip() == ""
346
+
347
+
348
+ @pytest.mark.skipif(not (HAS_PWSH or _WINDOWS_POWERSHELL), reason="no PowerShell available")
349
+ def test_ps_paths_only_does_not_persist_feature_json(prereq_repo: Path) -> None:
350
+ """-PathsOnly must not rewrite feature.json even when the env override
351
+ differs from the pinned value (#3025)."""
352
+ pinned = "specs/001-my-feature"
353
+ (prereq_repo / "specs" / "001-my-feature").mkdir(parents=True, exist_ok=True)
354
+ (prereq_repo / "specs" / "002-other").mkdir(parents=True, exist_ok=True)
355
+ _write_feature_json(prereq_repo, pinned)
356
+ fj = prereq_repo / ".specify" / "feature.json"
357
+ before = fj.read_text(encoding="utf-8")
358
+
359
+ script = prereq_repo / ".specify" / "scripts" / "powershell" / "check-prerequisites.ps1"
360
+ exe = "pwsh" if HAS_PWSH else _WINDOWS_POWERSHELL
361
+ env = _clean_env()
362
+ env["SPECIFY_FEATURE_DIRECTORY"] = "specs/002-other"
363
+ result = subprocess.run(
364
+ [exe, "-NoProfile", "-File", str(script), "-Json", "-PathsOnly"],
365
+ cwd=prereq_repo,
366
+ capture_output=True,
367
+ text=True,
368
+ check=False,
369
+ env=env,
370
+ )
371
+ assert result.returncode == 0, result.stderr
372
+ data = json.loads(result.stdout)
373
+ assert "002-other" in data["FEATURE_DIR"]
374
+ assert fj.read_text(encoding="utf-8") == before
375
+
376
+
377
+ @pytest.mark.skipif(not (HAS_PWSH or _WINDOWS_POWERSHELL), reason="no PowerShell available")
378
+ def test_ps_normal_mode_still_persists_feature_json(prereq_repo: Path) -> None:
379
+ """Without -PathsOnly, the env override is still persisted to feature.json,
380
+ so the -NoPersist opt-out does not regress normal write behavior (#3025).
381
+
382
+ Symmetric to the bash test_normal_mode_still_persists_feature_json guard:
383
+ asserts the default path still persists and that -NoPersist is not passed
384
+ unconditionally.
385
+ """
386
+ (prereq_repo / "specs" / "001-my-feature").mkdir(parents=True, exist_ok=True)
387
+ feat = prereq_repo / "specs" / "002-other"
388
+ feat.mkdir(parents=True, exist_ok=True)
389
+ (feat / "plan.md").write_text("# plan\n", encoding="utf-8")
390
+ _write_feature_json(prereq_repo, "specs/001-my-feature")
391
+ fj = prereq_repo / ".specify" / "feature.json"
392
+
393
+ script = prereq_repo / ".specify" / "scripts" / "powershell" / "check-prerequisites.ps1"
394
+ exe = "pwsh" if HAS_PWSH else _WINDOWS_POWERSHELL
395
+ env = _clean_env()
396
+ env["SPECIFY_FEATURE_DIRECTORY"] = "specs/002-other"
397
+ result = subprocess.run(
398
+ [exe, "-NoProfile", "-File", str(script), "-Json"],
399
+ cwd=prereq_repo,
400
+ capture_output=True,
401
+ text=True,
402
+ check=False,
403
+ env=env,
404
+ )
405
+ assert result.returncode == 0, result.stderr
406
+ assert json.loads(fj.read_text(encoding="utf-8"))["feature_directory"] == "specs/002-other"
@@ -246,3 +246,27 @@ def test_ps_setup_plan_copied_message_on_stderr_in_json_mode(plan_repo: Path) ->
246
246
  data = json.loads(result.stdout)
247
247
  assert "IMPL_PLAN" in data
248
248
  assert "Copied plan template" in result.stderr
249
+
250
+
251
+ @pytest.mark.skipif(not (HAS_PWSH or _WINDOWS_POWERSHELL), reason="no PowerShell available")
252
+ def test_ps_setup_plan_template_not_found_warning_matches_bash(plan_repo: Path) -> None:
253
+ """When no plan template resolves, -Json mode must emit 'Warning: Plan template
254
+ not found' on stderr (matching the bash twin's wording and stream routing) while
255
+ keeping stdout pure JSON. Before the fix the PowerShell script used Write-Warning,
256
+ producing a different 'WARNING:' prefix on the warning stream instead."""
257
+ # Remove the template the fixture installs so resolution finds nothing.
258
+ (plan_repo / ".specify" / "templates" / "plan-template.md").unlink()
259
+ script = plan_repo / ".specify" / "scripts" / "powershell" / "setup-plan.ps1"
260
+ exe = "pwsh" if HAS_PWSH else _WINDOWS_POWERSHELL
261
+ result = subprocess.run(
262
+ [exe, "-NoProfile", "-File", str(script), "-Json"],
263
+ cwd=plan_repo,
264
+ capture_output=True,
265
+ text=True,
266
+ check=False,
267
+ env=_clean_env(),
268
+ )
269
+ assert result.returncode == 0, result.stderr
270
+ data = json.loads(result.stdout)
271
+ assert "IMPL_PLAN" in data
272
+ assert "Warning: Plan template not found" in result.stderr
File without changes