specify-cli 0.13.0__tar.gz → 0.13.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 (481) hide show
  1. {specify_cli-0.13.0 → specify_cli-0.13.1}/CHANGELOG.md +15 -0
  2. {specify_cli-0.13.0 → specify_cli-0.13.1}/PKG-INFO +1 -1
  3. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/integrations.md +5 -1
  4. {specify_cli-0.13.0 → specify_cli-0.13.1}/pyproject.toml +1 -1
  5. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/catalogs.py +4 -1
  6. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/catalog.py +4 -2
  7. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/forge/__init__.py +12 -0
  8. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/presets/__init__.py +4 -1
  9. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/_commands.py +6 -2
  10. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/catalog.py +33 -8
  11. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/fan_in/__init__.py +22 -0
  12. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/fan_out/__init__.py +34 -2
  13. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/prompt/__init__.py +12 -0
  14. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_base.py +18 -0
  15. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_catalog.py +51 -0
  16. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extensions.py +30 -0
  17. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_presets.py +18 -0
  18. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_workflows.py +233 -6
  19. {specify_cli-0.13.0 → specify_cli-0.13.1}/.devcontainer/devcontainer.json +0 -0
  20. {specify_cli-0.13.0 → specify_cli-0.13.1}/.devcontainer/post-create.sh +0 -0
  21. {specify_cli-0.13.0 → specify_cli-0.13.1}/.editorconfig +0 -0
  22. {specify_cli-0.13.0 → specify_cli-0.13.1}/.gitattributes +0 -0
  23. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/CODEOWNERS +0 -0
  24. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  25. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  27. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  29. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  30. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  31. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  32. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/aw/actions-lock.json +0 -0
  33. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/dependabot.yml +0 -0
  34. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/skills/add-community-extension/SKILL.md +0 -0
  35. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/RELEASE-PROCESS.md +0 -0
  36. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-extension.lock.yml +0 -0
  37. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-extension.md +0 -0
  38. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-preset.lock.yml +0 -0
  39. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/add-community-preset.md +0 -0
  40. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-assess.lock.yml +0 -0
  41. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-assess.md +0 -0
  42. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-fix.lock.yml +0 -0
  43. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-fix.md +0 -0
  44. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-test.lock.yml +0 -0
  45. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/bug-test.md +0 -0
  46. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/catalog-assign.yml +0 -0
  47. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/codeql.yml +0 -0
  48. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/docs.yml +0 -0
  49. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/lint.yml +0 -0
  50. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/publish-pypi.yml +0 -0
  51. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/release-trigger.yml +0 -0
  52. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/release.yml +0 -0
  53. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/stale.yml +0 -0
  54. {specify_cli-0.13.0 → specify_cli-0.13.1}/.github/workflows/test.yml +0 -0
  55. {specify_cli-0.13.0 → specify_cli-0.13.1}/.gitignore +0 -0
  56. {specify_cli-0.13.0 → specify_cli-0.13.1}/.markdownlint-cli2.jsonc +0 -0
  57. {specify_cli-0.13.0 → specify_cli-0.13.1}/.pre-commit-config.yaml +0 -0
  58. {specify_cli-0.13.0 → specify_cli-0.13.1}/.zenodo.json +0 -0
  59. {specify_cli-0.13.0 → specify_cli-0.13.1}/AGENTS.md +0 -0
  60. {specify_cli-0.13.0 → specify_cli-0.13.1}/CITATION.cff +0 -0
  61. {specify_cli-0.13.0 → specify_cli-0.13.1}/CODE_OF_CONDUCT.md +0 -0
  62. {specify_cli-0.13.0 → specify_cli-0.13.1}/CONTRIBUTING.md +0 -0
  63. {specify_cli-0.13.0 → specify_cli-0.13.1}/DEVELOPMENT.md +0 -0
  64. {specify_cli-0.13.0 → specify_cli-0.13.1}/LICENSE +0 -0
  65. {specify_cli-0.13.0 → specify_cli-0.13.1}/README.md +0 -0
  66. {specify_cli-0.13.0 → specify_cli-0.13.1}/SECURITY.md +0 -0
  67. {specify_cli-0.13.0 → specify_cli-0.13.1}/SUPPORT.md +0 -0
  68. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/.gitignore +0 -0
  69. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/README.md +0 -0
  70. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/bundles.md +0 -0
  71. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/extensions.md +0 -0
  72. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/friends.md +0 -0
  73. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/overview.md +0 -0
  74. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/presets.md +0 -0
  75. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/community/walkthroughs.md +0 -0
  76. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/concepts/complex-features.md +0 -0
  77. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/concepts/sdd.md +0 -0
  78. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/concepts/spec-persistence.md +0 -0
  79. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/docfx.json +0 -0
  80. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/guides/evolving-specs.md +0 -0
  81. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/guides/monorepo.md +0 -0
  82. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/index.md +0 -0
  83. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/air-gapped.md +0 -0
  84. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/one-time.md +0 -0
  85. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/pipx.md +0 -0
  86. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/pypi.md +0 -0
  87. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/install/uv.md +0 -0
  88. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/installation.md +0 -0
  89. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/local-development.md +0 -0
  90. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/quickstart.md +0 -0
  91. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/agentic-bugfix.md +0 -0
  92. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/agentic-sdd.md +0 -0
  93. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/authentication.md +0 -0
  94. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/bundles.md +0 -0
  95. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/core.md +0 -0
  96. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/extensions.md +0 -0
  97. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/overview.md +0 -0
  98. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/presets.md +0 -0
  99. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/reference/workflows.md +0 -0
  100. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/template/public/main.css +0 -0
  101. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/toc.yml +0 -0
  102. {specify_cli-0.13.0 → specify_cli-0.13.1}/docs/upgrade.md +0 -0
  103. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/business-analyst/README.md +0 -0
  104. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/business-analyst/bundle.yml +0 -0
  105. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/developer/README.md +0 -0
  106. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/developer/bundle.yml +0 -0
  107. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/product-manager/README.md +0 -0
  108. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/product-manager/bundle.yml +0 -0
  109. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/security-researcher/README.md +0 -0
  110. {specify_cli-0.13.0 → specify_cli-0.13.1}/examples/bundles/security-researcher/bundle.yml +0 -0
  111. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  112. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  113. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  114. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  115. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/README.md +0 -0
  116. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  117. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/README.md +0 -0
  118. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/agent-context-config.yml +0 -0
  119. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/agent-context-defaults.json +0 -0
  120. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  121. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/extension.yml +0 -0
  122. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  123. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  124. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  125. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/README.md +0 -0
  126. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.decide.md +0 -0
  127. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.define.md +0 -0
  128. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.intake.md +0 -0
  129. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.research.md +0 -0
  130. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/commands/speckit.assess.shape.md +0 -0
  131. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/assess/extension.yml +0 -0
  132. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/README.md +0 -0
  133. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  134. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  135. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/commands/speckit.bug.test.md +0 -0
  136. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/bug/extension.yml +0 -0
  137. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/catalog.community.json +0 -0
  138. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/catalog.json +0 -0
  139. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/README.md +0 -0
  140. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.commit.md +0 -0
  141. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.feature.md +0 -0
  142. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.initialize.md +0 -0
  143. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.remote.md +0 -0
  144. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/commands/speckit.git.validate.md +0 -0
  145. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/config-template.yml +0 -0
  146. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/extension.yml +0 -0
  147. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/git-config.yml +0 -0
  148. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  149. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  150. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/git-common.sh +0 -0
  151. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  152. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  153. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  154. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  155. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  156. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/auto_commit.py +0 -0
  157. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
  158. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/git_common.py +0 -0
  159. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/git/scripts/python/initialize_repo.py +0 -0
  160. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/selftest/commands/selftest.md +0 -0
  161. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/selftest/extension.yml +0 -0
  162. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/.gitignore +0 -0
  163. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/CHANGELOG.md +0 -0
  164. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/EXAMPLE-README.md +0 -0
  165. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/LICENSE +0 -0
  166. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/README.md +0 -0
  167. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/commands/example.md +0 -0
  168. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/config-template.yml +0 -0
  169. {specify_cli-0.13.0 → specify_cli-0.13.1}/extensions/template/extension.yml +0 -0
  170. {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/CONTRIBUTING.md +0 -0
  171. {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/README.md +0 -0
  172. {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/catalog.community.json +0 -0
  173. {specify_cli-0.13.0 → specify_cli-0.13.1}/integrations/catalog.json +0 -0
  174. {specify_cli-0.13.0 → specify_cli-0.13.1}/media/bootstrap-claude-code.gif +0 -0
  175. {specify_cli-0.13.0 → specify_cli-0.13.1}/media/logo_large.webp +0 -0
  176. {specify_cli-0.13.0 → specify_cli-0.13.1}/media/logo_small.webp +0 -0
  177. {specify_cli-0.13.0 → specify_cli-0.13.1}/media/spec-kit-video-header.jpg +0 -0
  178. {specify_cli-0.13.0 → specify_cli-0.13.1}/media/specify_cli.gif +0 -0
  179. {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-April.md +0 -0
  180. {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-February.md +0 -0
  181. {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-June.md +0 -0
  182. {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-March.md +0 -0
  183. {specify_cli-0.13.0 → specify_cli-0.13.1}/newsletters/2026-May.md +0 -0
  184. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/ARCHITECTURE.md +0 -0
  185. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/PUBLISHING.md +0 -0
  186. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/README.md +0 -0
  187. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/catalog.community.json +0 -0
  188. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/catalog.json +0 -0
  189. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/README.md +0 -0
  190. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.constitution.md +0 -0
  191. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.implement.md +0 -0
  192. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.plan.md +0 -0
  193. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.specify.md +0 -0
  194. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/commands/speckit.tasks.md +0 -0
  195. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/lean/preset.yml +0 -0
  196. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/README.md +0 -0
  197. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  198. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/commands/speckit.specify.md +0 -0
  199. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/preset.yml +0 -0
  200. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/templates/myext-template.md +0 -0
  201. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/scaffold/templates/spec-template.md +0 -0
  202. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/commands/speckit.specify.md +0 -0
  203. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  204. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/preset.yml +0 -0
  205. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/checklist-template.md +0 -0
  206. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/constitution-template.md +0 -0
  207. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/plan-template.md +0 -0
  208. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/spec-template.md +0 -0
  209. {specify_cli-0.13.0 → specify_cli-0.13.1}/presets/self-test/templates/tasks-template.md +0 -0
  210. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/check-prerequisites.sh +0 -0
  211. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/common.sh +0 -0
  212. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/create-new-feature.sh +0 -0
  213. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/setup-plan.sh +0 -0
  214. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/bash/setup-tasks.sh +0 -0
  215. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/check-prerequisites.ps1 +0 -0
  216. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/common.ps1 +0 -0
  217. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/create-new-feature.ps1 +0 -0
  218. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/setup-plan.ps1 +0 -0
  219. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/powershell/setup-tasks.ps1 +0 -0
  220. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/python/check_prerequisites.py +0 -0
  221. {specify_cli-0.13.0 → specify_cli-0.13.1}/scripts/python/common.py +0 -0
  222. {specify_cli-0.13.0 → specify_cli-0.13.1}/spec-driven.md +0 -0
  223. {specify_cli-0.13.0 → specify_cli-0.13.1}/spec-kit.code-workspace +0 -0
  224. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/__init__.py +0 -0
  225. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_agent_config.py +0 -0
  226. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_assets.py +0 -0
  227. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_console.py +0 -0
  228. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_github_http.py +0 -0
  229. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_init_options.py +0 -0
  230. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_invocation_style.py +0 -0
  231. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_project.py +0 -0
  232. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_toml_string.py +0 -0
  233. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_utils.py +0 -0
  234. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/_version.py +0 -0
  235. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/agents.py +0 -0
  236. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/__init__.py +0 -0
  237. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/azure_devops.py +0 -0
  238. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/base.py +0 -0
  239. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/config.py +0 -0
  240. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/github.py +0 -0
  241. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/authentication/http.py +0 -0
  242. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/__init__.py +0 -0
  243. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  244. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  245. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/__init__.py +0 -0
  246. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/project.py +0 -0
  247. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/versioning.py +0 -0
  248. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  249. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/__init__.py +0 -0
  250. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/catalog.py +0 -0
  251. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/manifest.py +0 -0
  252. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/models/records.py +0 -0
  253. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/__init__.py +0 -0
  254. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/adapters.py +0 -0
  255. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  256. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/conflict.py +0 -0
  257. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/installer.py +0 -0
  258. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/packager.py +0 -0
  259. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/primitives.py +0 -0
  260. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/references.py +0 -0
  261. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/resolver.py +0 -0
  262. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/bundler/services/validator.py +0 -0
  263. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/commands/__init__.py +0 -0
  264. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/commands/bundle/__init__.py +0 -0
  265. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/commands/init.py +0 -0
  266. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/extensions/__init__.py +0 -0
  267. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/extensions/_commands.py +0 -0
  268. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_runtime.py +0 -0
  269. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_scaffold.py +0 -0
  270. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_state.py +0 -0
  271. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integration_status.py +0 -0
  272. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/__init__.py +0 -0
  273. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_commands.py +0 -0
  274. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_helpers.py +0 -0
  275. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_install_commands.py +0 -0
  276. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  277. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_query_commands.py +0 -0
  278. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  279. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/agy/__init__.py +0 -0
  280. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/amp/__init__.py +0 -0
  281. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  282. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/base.py +0 -0
  283. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/bob/__init__.py +0 -0
  284. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/claude/__init__.py +0 -0
  285. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/cline/__init__.py +0 -0
  286. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  287. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/codex/__init__.py +0 -0
  288. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  289. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  290. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/devin/__init__.py +0 -0
  291. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  292. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  293. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/generic/__init__.py +0 -0
  294. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/goose/__init__.py +0 -0
  295. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/grok/__init__.py +0 -0
  296. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  297. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/junie/__init__.py +0 -0
  298. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  299. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  300. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  301. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  302. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/manifest.py +0 -0
  303. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/omp/__init__.py +0 -0
  304. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  305. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/pi/__init__.py +0 -0
  306. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  307. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  308. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  309. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/shai/__init__.py +0 -0
  310. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  311. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/trae/__init__.py +0 -0
  312. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  313. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  314. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/integrations/zed/__init__.py +0 -0
  315. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/presets/_commands.py +0 -0
  316. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/shared_infra.py +0 -0
  317. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/__init__.py +0 -0
  318. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/base.py +0 -0
  319. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/engine.py +0 -0
  320. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/expressions.py +0 -0
  321. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/__init__.py +0 -0
  322. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  323. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  324. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  325. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  326. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  327. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  328. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  329. {specify_cli-0.13.0 → specify_cli-0.13.1}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  330. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/checklist-template.md +0 -0
  331. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/analyze.md +0 -0
  332. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/checklist.md +0 -0
  333. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/clarify.md +0 -0
  334. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/constitution.md +0 -0
  335. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/converge.md +0 -0
  336. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/implement.md +0 -0
  337. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/plan.md +0 -0
  338. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/specify.md +0 -0
  339. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/tasks.md +0 -0
  340. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/commands/taskstoissues.md +0 -0
  341. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/constitution-template.md +0 -0
  342. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/plan-template.md +0 -0
  343. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/spec-template.md +0 -0
  344. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/tasks-template.md +0 -0
  345. {specify_cli-0.13.0 → specify_cli-0.13.1}/templates/vscode-settings.json +0 -0
  346. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/__init__.py +0 -0
  347. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/auth_helpers.py +0 -0
  348. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/bundler_helpers.py +0 -0
  349. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/conftest.py +0 -0
  350. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/contract/test_bundle_cli.py +0 -0
  351. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/contract/test_catalog_schema.py +0 -0
  352. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/contract/test_manifest_schema.py +0 -0
  353. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/__init__.py +0 -0
  354. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/assess/__init__.py +0 -0
  355. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/assess/test_assess_extension.py +0 -0
  356. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/bug/__init__.py +0 -0
  357. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/bug/test_bug_extension.py +0 -0
  358. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/git/__init__.py +0 -0
  359. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/git/test_git_extension.py +0 -0
  360. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
  361. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_agent_context_cli_free.py +0 -0
  362. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_extension_agent_context.py +0 -0
  363. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  364. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  365. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/TESTING.md +0 -0
  366. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/plan.md +0 -0
  367. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/spec.md +0 -0
  368. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/hooks/tasks.md +0 -0
  369. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/http_helpers.py +0 -0
  370. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_catalog_stack.py +0 -0
  371. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_init_install.py +0 -0
  372. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_install_flow.py +0 -0
  373. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_local_install.py +0 -0
  374. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_offline.py +0 -0
  375. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integration/test_bundler_security_paths.py +0 -0
  376. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/__init__.py +0 -0
  377. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/conftest.py +0 -0
  378. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_cli.py +0 -0
  379. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_extra_args.py +0 -0
  380. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_home_isolation.py +0 -0
  381. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_agy.py +0 -0
  382. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_amp.py +0 -0
  383. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_auggie.py +0 -0
  384. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_markdown.py +0 -0
  385. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_skills.py +0 -0
  386. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_toml.py +0 -0
  387. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_base_yaml.py +0 -0
  388. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_bob.py +0 -0
  389. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_claude.py +0 -0
  390. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_cline.py +0 -0
  391. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_codebuddy.py +0 -0
  392. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_codex.py +0 -0
  393. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_copilot.py +0 -0
  394. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_cursor_agent.py +0 -0
  395. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_devin.py +0 -0
  396. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_firebender.py +0 -0
  397. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_forge.py +0 -0
  398. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_gemini.py +0 -0
  399. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_generic.py +0 -0
  400. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_goose.py +0 -0
  401. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_grok.py +0 -0
  402. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_hermes.py +0 -0
  403. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_junie.py +0 -0
  404. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_kilocode.py +0 -0
  405. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_kimi.py +0 -0
  406. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_kiro_cli.py +0 -0
  407. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_lingma.py +0 -0
  408. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_omp.py +0 -0
  409. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_opencode.py +0 -0
  410. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_pi.py +0 -0
  411. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_qodercli.py +0 -0
  412. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_qwen.py +0 -0
  413. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_rovodev.py +0 -0
  414. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_scaffold.py +0 -0
  415. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_shai.py +0 -0
  416. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_state.py +0 -0
  417. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_subcommand.py +0 -0
  418. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_tabnine.py +0 -0
  419. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_trae.py +0 -0
  420. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_vibe.py +0 -0
  421. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_zcode.py +0 -0
  422. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_integration_zed.py +0 -0
  423. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_manifest.py +0 -0
  424. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_registry.py +0 -0
  425. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  426. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/self_upgrade_helpers.py +0 -0
  427. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_agent_config_consistency.py +0 -0
  428. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_authentication.py +0 -0
  429. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_branch_numbering.py +0 -0
  430. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_check_prerequisites_paths_only.py +0 -0
  431. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_check_prerequisites_python_parity.py +0 -0
  432. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_check_tool.py +0 -0
  433. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_cli_version.py +0 -0
  434. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_command_template_py_scripts.py +0 -0
  435. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_commands_package.py +0 -0
  436. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_console_imports.py +0 -0
  437. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extension_registration.py +0 -0
  438. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extension_skills.py +0 -0
  439. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_extension_update_hardening.py +0 -0
  440. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_github_http.py +0 -0
  441. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_github_workflows.py +0 -0
  442. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_init_dir.py +0 -0
  443. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_init_dir_cli.py +0 -0
  444. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_live_transient_windows.py +0 -0
  445. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_merge.py +0 -0
  446. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_post_process.py +0 -0
  447. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_ps1_encoding.py +0 -0
  448. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_registrar_path_traversal.py +0 -0
  449. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_detection.py +0 -0
  450. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_execution.py +0 -0
  451. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_guidance.py +0 -0
  452. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_self_upgrade_verification.py +0 -0
  453. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_setup_plan_feature_json.py +0 -0
  454. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_setup_plan_no_overwrite.py +0 -0
  455. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_setup_tasks.py +0 -0
  456. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_shared_infra_integrity.py +0 -0
  457. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_timestamp_branches.py +0 -0
  458. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_upgrade.py +0 -0
  459. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_utils.py +0 -0
  460. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_utils_assets_imports.py +0 -0
  461. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_version_imports.py +0 -0
  462. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/test_workflow_run_without_project.py +0 -0
  463. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundle_download_url.py +0 -0
  464. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_adapters.py +0 -0
  465. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_catalog_config.py +0 -0
  466. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_conflict.py +0 -0
  467. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_packager.py +0 -0
  468. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_primitives.py +0 -0
  469. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_records.py +0 -0
  470. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_references.py +0 -0
  471. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_resolver.py +0 -0
  472. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_validator.py +0 -0
  473. {specify_cli-0.13.0 → specify_cli-0.13.1}/tests/unit/test_bundler_versioning.py +0 -0
  474. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/ARCHITECTURE.md +0 -0
  475. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/PUBLISHING.md +0 -0
  476. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/README.md +0 -0
  477. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/catalog.community.json +0 -0
  478. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/catalog.json +0 -0
  479. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/speckit/workflow.yml +0 -0
  480. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/step-catalog.community.json +0 -0
  481. {specify_cli-0.13.0 → specify_cli-0.13.1}/workflows/step-catalog.json +0 -0
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.13.1] - 2026-07-21
6
+
7
+ ### Changed
8
+
9
+ - fix(integrations): catch OverflowError on a `priority: .inf` in add/remove (#3589)
10
+ - fix(workflows): reject bool / .inf catalog priority in workflow & step catalog loaders (#3526)
11
+ - fix(catalogs): 'priority: .inf' yields a clean validation error instead of crashing (#3525)
12
+ - docs(integrations): document the 'integration list --catalog' flag (#3530)
13
+ - fix(workflows): fail fan-in loudly on a non-string wait_for entry (#3579)
14
+ - fix(workflows): fail fan-out loudly on a truthy non-mapping step template (#3537)
15
+ - fix(workflows): reject a non-string prompt in prompt-step validate() (#3582)
16
+ - fix(workflows): route 'workflow status --json' errors to stderr (#3520)
17
+ - fix(integrations): Forge dispatches hyphenated /speckit-<cmd> invocations (#3529)
18
+ - chore: release 0.13.0, begin 0.13.1.dev0 development (#3588)
19
+
5
20
  ## [0.13.0] - 2026-07-17
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.13.0
3
+ Version: 0.13.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
@@ -48,7 +48,11 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
48
48
  specify integration list
49
49
  ```
50
50
 
51
- Shows all available integrations, which one is currently installed, and whether each requires a CLI tool or is IDE-based.
51
+ | Option | Description |
52
+ | ----------- | ----------------------------------------------------------------------------------------------------------------------- |
53
+ | `--catalog` | Also browse the catalog (built-in **and** community). Community integrations that are not built in are only shown here. |
54
+
55
+ Shows the built-in integrations, which one is currently installed, and whether each requires a CLI tool or is IDE-based.
52
56
  When multiple integrations are installed, the list marks the default integration separately from the other installed integrations.
53
57
  The list also shows whether each built-in integration is declared multi-install safe.
54
58
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.13.0"
3
+ version = "0.13.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"
@@ -149,7 +149,10 @@ class CatalogStackBase:
149
149
  )
150
150
  try:
151
151
  priority = int(raw_priority)
152
- except (TypeError, ValueError):
152
+ except (TypeError, ValueError, OverflowError):
153
+ # OverflowError: int(float("inf")) — a YAML ``priority: .inf``
154
+ # would otherwise escape as an uncaught traceback instead of the
155
+ # clean validation error.
153
156
  raise self._validation_error(
154
157
  f"Invalid catalog config {config_path}: "
155
158
  f"Invalid priority for catalog '{item.get('name', idx + 1)}': "
@@ -429,7 +429,8 @@ class IntegrationCatalog(CatalogStackBase):
429
429
  )
430
430
  try:
431
431
  normalized_priority = int(raw_priority)
432
- except (TypeError, ValueError):
432
+ except (TypeError, ValueError, OverflowError):
433
+ # OverflowError: int(float("inf")) — a ``priority: .inf``.
433
434
  raise IntegrationValidationError(
434
435
  f"Invalid catalog entry at index {idx} in {config_path}: "
435
436
  f"'priority' must be an integer, got "
@@ -537,7 +538,8 @@ class IntegrationCatalog(CatalogStackBase):
537
538
  else:
538
539
  try:
539
540
  priority = int(raw_priority)
540
- except (TypeError, ValueError):
541
+ except (TypeError, ValueError, OverflowError):
542
+ # OverflowError: int(float("inf")) — a ``priority: .inf``.
541
543
  priority = yaml_idx + 1
542
544
  priority_pairs.append((priority, yaml_idx))
543
545
  if not priority_pairs:
@@ -91,6 +91,18 @@ class ForgeIntegration(MarkdownIntegration):
91
91
  }
92
92
  invoke_separator = "-"
93
93
 
94
+ def build_command_invocation(self, command_name: str, args: str = "") -> str:
95
+ """Forge installs hyphenated slash-commands (``/speckit-<name>``), so the
96
+ dispatch invocation must match. The inherited MarkdownIntegration default
97
+ builds the dotted ``/speckit.<name>``, which references a command Forge
98
+ never registered. Reuse the same hyphenation as the installed frontmatter
99
+ ``name`` (see ``format_forge_command_name``), mirroring the skills agents.
100
+ """
101
+ invocation = "/" + format_forge_command_name(command_name)
102
+ if args:
103
+ invocation = f"{invocation} {args}"
104
+ return invocation
105
+
94
106
  def setup(
95
107
  self,
96
108
  project_root: Path,
@@ -2235,7 +2235,10 @@ class PresetCatalog:
2235
2235
  )
2236
2236
  try:
2237
2237
  priority = int(raw_priority)
2238
- except (TypeError, ValueError):
2238
+ except (TypeError, ValueError, OverflowError):
2239
+ # OverflowError: int(float("inf")) — a YAML ``priority: .inf``
2240
+ # would otherwise escape as an uncaught traceback instead of the
2241
+ # clean validation error (mirrors catalogs.py).
2239
2242
  raise PresetValidationError(
2240
2243
  f"Invalid priority for catalog '{item.get('name', idx + 1)}': "
2241
2244
  f"expected integer, got {raw_priority!r}"
@@ -1262,14 +1262,18 @@ def workflow_status(
1262
1262
  engine = WorkflowEngine(project_root)
1263
1263
 
1264
1264
  if run_id:
1265
+ # Route errors to stderr under --json so the stdout JSON stream stays
1266
+ # parseable (mirrors `workflow run`/`workflow resume`); both handlers
1267
+ # fire before the json_output branch below.
1268
+ err = _error_console(json_output)
1265
1269
  try:
1266
1270
  from .engine import RunState
1267
1271
  state = RunState.load(run_id, project_root)
1268
1272
  except FileNotFoundError:
1269
- console.print(f"[red]Error:[/red] Run not found: {run_id}")
1273
+ err.print(f"[red]Error:[/red] Run not found: {run_id}")
1270
1274
  raise typer.Exit(1)
1271
1275
  except ValueError as exc:
1272
- console.print(f"[red]Error:[/red] {_escape_markup(str(exc))}")
1276
+ err.print(f"[red]Error:[/red] {_escape_markup(str(exc))}")
1273
1277
  raise typer.Exit(1)
1274
1278
 
1275
1279
  if json_output:
@@ -364,13 +364,24 @@ class WorkflowCatalog:
364
364
  if not url:
365
365
  continue
366
366
  self._validate_catalog_url(url)
367
+ raw_priority = item.get("priority", idx + 1)
368
+ # bool is an int subclass: int(True) == 1 would silently accept a
369
+ # ``priority: true`` as priority 1. Reject it explicitly, mirroring
370
+ # the base CatalogStackBase loader.
371
+ if isinstance(raw_priority, bool):
372
+ raise WorkflowValidationError(
373
+ f"Invalid priority for catalog "
374
+ f"'{item.get('name', idx + 1)}': "
375
+ f"expected integer, got {raw_priority!r}"
376
+ )
367
377
  try:
368
- priority = int(item.get("priority", idx + 1))
369
- except (TypeError, ValueError):
378
+ priority = int(raw_priority)
379
+ except (TypeError, ValueError, OverflowError):
380
+ # OverflowError: int(float("inf")) — a ``priority: .inf``.
370
381
  raise WorkflowValidationError(
371
382
  f"Invalid priority for catalog "
372
383
  f"'{item.get('name', idx + 1)}': "
373
- f"expected integer, got {item.get('priority')!r}"
384
+ f"expected integer, got {raw_priority!r}"
374
385
  )
375
386
  raw_install = item.get("install_allowed", False)
376
387
  if isinstance(raw_install, str):
@@ -685,7 +696,9 @@ class WorkflowCatalog:
685
696
  def _coerce_priority(value: Any) -> int:
686
697
  try:
687
698
  return int(value)
688
- except (TypeError, ValueError):
699
+ except (TypeError, ValueError, OverflowError):
700
+ # OverflowError: int(float("inf")) — treat an uncoercible
701
+ # existing priority as 0 rather than crashing 'catalog add'.
689
702
  return 0
690
703
 
691
704
  max_priority = max(
@@ -1007,13 +1020,23 @@ class StepCatalog:
1007
1020
  if not url:
1008
1021
  continue
1009
1022
  self._validate_catalog_url(url)
1023
+ raw_priority = item.get("priority", idx + 1)
1024
+ # bool is an int subclass: reject ``priority: true`` explicitly rather
1025
+ # than silently coercing it to 1 (mirrors CatalogStackBase).
1026
+ if isinstance(raw_priority, bool):
1027
+ raise StepValidationError(
1028
+ f"Invalid priority for catalog "
1029
+ f"'{item.get('name', idx + 1)}': "
1030
+ f"expected integer, got {raw_priority!r}"
1031
+ )
1010
1032
  try:
1011
- priority = int(item.get("priority", idx + 1))
1012
- except (TypeError, ValueError):
1033
+ priority = int(raw_priority)
1034
+ except (TypeError, ValueError, OverflowError):
1035
+ # OverflowError: int(float("inf")) — a ``priority: .inf``.
1013
1036
  raise StepValidationError(
1014
1037
  f"Invalid priority for catalog "
1015
1038
  f"'{item.get('name', idx + 1)}': "
1016
- f"expected integer, got {item.get('priority')!r}"
1039
+ f"expected integer, got {raw_priority!r}"
1017
1040
  )
1018
1041
  raw_install = item.get("install_allowed", False)
1019
1042
  if isinstance(raw_install, str):
@@ -1314,7 +1337,9 @@ class StepCatalog:
1314
1337
  def _coerce_priority(value: Any) -> int:
1315
1338
  try:
1316
1339
  return int(value)
1317
- except (TypeError, ValueError):
1340
+ except (TypeError, ValueError, OverflowError):
1341
+ # OverflowError: int(float("inf")) — treat an uncoercible
1342
+ # existing priority as 0 rather than crashing 'catalog add'.
1318
1343
  return 0
1319
1344
 
1320
1345
  max_priority = max(
@@ -42,6 +42,28 @@ class FanInStep(StepBase):
42
42
  output={"results": []},
43
43
  )
44
44
 
45
+ # A non-string entry can never match a real step id. An unhashable one
46
+ # (a list/dict from a YAML indentation slip like ``wait_for: [[a, b]]``)
47
+ # crashes the whole run at ``context.steps.get(step_id, ...)`` below with
48
+ # a raw TypeError; a hashable-but-non-string one (``wait_for: [123]``)
49
+ # silently joins an empty ``{}`` and still reports COMPLETED — the exact
50
+ # "silent empty result + COMPLETED" wiring bug the whole-list guard above
51
+ # and the engine's fan-in validation (engine.py) both reject. The engine
52
+ # does not auto-validate step config, so fail this step loudly on an
53
+ # unvalidated run too, using the engine's phrasing.
54
+ bad_entries = [w for w in wait_for if not isinstance(w, str)]
55
+ if bad_entries:
56
+ first = bad_entries[0]
57
+ return StepResult(
58
+ status=StepStatus.FAILED,
59
+ error=(
60
+ f"Fan-in step {config.get('id', '?')!r}: 'wait_for' entries "
61
+ f"must be step-id strings, got {type(first).__name__} "
62
+ f"({first!r})."
63
+ ),
64
+ output={"results": []},
65
+ )
66
+
45
67
  # Collect results from referenced steps
46
68
  results = []
47
69
  for step_id in wait_for:
@@ -25,6 +25,33 @@ class FanOutStep(StepBase):
25
25
  max_concurrency = config.get("max_concurrency", 1)
26
26
  step_template = config.get("step", {})
27
27
 
28
+ # The engine does not auto-validate step config (see
29
+ # ``WorkflowEngine.load_workflow``). On a COMPLETED fan-out it reads the
30
+ # ``step_template`` back out and, when it is truthy, calls
31
+ # ``template.get("id", ...)`` in ``_run_fan_out``. A truthy non-mapping
32
+ # ``step`` (a scalar or list authoring mistake) would crash the whole
33
+ # run with AttributeError there — the engine invokes ``execute`` and
34
+ # ``_run_fan_out`` with no surrounding try/except. ``validate`` already
35
+ # rejects a non-mapping ``step``; fail this step loudly on an
36
+ # unvalidated run instead, mirroring the ``items`` guard below. An empty
37
+ # or absent ``step`` defaults to ``{}`` (falsy) and the engine's
38
+ # ``if template and items`` skips fan-out, so it stays valid here.
39
+ if not isinstance(step_template, dict):
40
+ return StepResult(
41
+ status=StepStatus.FAILED,
42
+ error=(
43
+ f"Fan-out step {config.get('id', '?')!r}: 'step' must be a "
44
+ f"mapping (nested step template), got "
45
+ f"{type(step_template).__name__}."
46
+ ),
47
+ output={
48
+ "items": [],
49
+ "max_concurrency": max_concurrency,
50
+ "step_template": {},
51
+ "item_count": 0,
52
+ },
53
+ )
54
+
28
55
  if not isinstance(items, list):
29
56
  # A non-list here is a wiring error (the expression did not
30
57
  # resolve to a collection); silently fanning out over zero
@@ -66,8 +93,13 @@ class FanOutStep(StepBase):
66
93
  f"Fan-out step {config.get('id', '?')!r} is missing "
67
94
  f"'step' field (nested step template)."
68
95
  )
69
- step = config.get("step")
70
- if step is not None and not isinstance(step, dict):
96
+ elif not isinstance(config["step"], dict):
97
+ # A present-but-non-mapping ``step`` (including an explicit
98
+ # ``step: null``) is an authoring mistake. ``config.get("step", {})``
99
+ # in ``execute`` only substitutes the ``{}`` default for an *absent*
100
+ # key, so an explicit ``None`` reaches the runtime guard and FAILS
101
+ # the step. Reject it here too so a workflow cannot pass validation
102
+ # and then fail during execution.
71
103
  errors.append(
72
104
  f"Fan-out step {config.get('id', '?')!r}: 'step' must be a mapping."
73
105
  )
@@ -160,4 +160,16 @@ class PromptStep(StepBase):
160
160
  errors.append(
161
161
  f"Prompt step {config.get('id', '?')!r} is missing 'prompt' field."
162
162
  )
163
+ elif not isinstance(config["prompt"], str):
164
+ # execute() str()-coerces prompt and dispatches it to the
165
+ # integration CLI, so a null or list 'prompt' would send the Python
166
+ # repr ('None', "['review', 'this']") to the model as instructions —
167
+ # silently wrong, with no error. Reject non-strings at validation,
168
+ # mirroring the shell-step 'run' and command-step input/options type
169
+ # checks. An expression like "{{ ... }}" is still a str, so it stays
170
+ # valid.
171
+ errors.append(
172
+ f"Prompt step {config.get('id', '?')!r}: 'prompt' must be a "
173
+ f"string, got {type(config['prompt']).__name__}."
174
+ )
163
175
  return errors
@@ -216,6 +216,24 @@ class TestBuildCommandInvocation:
216
216
  i = get_integration("codex")
217
217
  assert i.build_command_invocation("speckit.git.commit", "fix typo") == "/speckit-git-commit fix typo"
218
218
 
219
+ def test_forge_core_command_hyphenated(self):
220
+ """Forge installs hyphenated slash-commands (/speckit-<name>), so the
221
+ dispatch invocation must be hyphenated too — not the dotted default it
222
+ would inherit from MarkdownIntegration."""
223
+ from specify_cli.integrations import get_integration
224
+ i = get_integration("forge")
225
+ assert i.build_command_invocation("speckit.plan") == "/speckit-plan"
226
+ assert i.build_command_invocation("plan") == "/speckit-plan"
227
+
228
+ def test_forge_extension_command_hyphenated(self):
229
+ from specify_cli.integrations import get_integration
230
+ i = get_integration("forge")
231
+ assert i.build_command_invocation("speckit.git.commit") == "/speckit-git-commit"
232
+ assert (
233
+ i.build_command_invocation("speckit.git.commit", "fix typo")
234
+ == "/speckit-git-commit fix typo"
235
+ )
236
+
219
237
 
220
238
  class TestResolveCommandRefs:
221
239
  """Tests for __SPECKIT_COMMAND_<NAME>__ placeholder resolution."""
@@ -922,6 +922,57 @@ class TestCatalogSourceManagement:
922
922
  assert str(cfg_path) in message
923
923
  assert "expected a mapping" in message
924
924
 
925
+ def test_add_catalog_rejects_inf_priority_in_existing_entry(
926
+ self, tmp_path, monkeypatch
927
+ ):
928
+ # ``priority: .inf`` loads as float('inf'); int() on it raises
929
+ # OverflowError, which used to escape the IntegrationValidationError
930
+ # contract as a raw traceback (github/spec-kit#3526 fixed the sibling
931
+ # workflow/step loaders the same way).
932
+ self._isolate(tmp_path, monkeypatch)
933
+ cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
934
+ cfg_path.write_text(
935
+ yaml.dump(
936
+ {
937
+ "catalogs": [
938
+ {
939
+ "url": "https://a.example.com/catalog.json",
940
+ "priority": float("inf"),
941
+ }
942
+ ]
943
+ }
944
+ ),
945
+ encoding="utf-8",
946
+ )
947
+ cat = IntegrationCatalog(tmp_path)
948
+ with pytest.raises(
949
+ IntegrationValidationError, match="must be an integer"
950
+ ):
951
+ cat.add_catalog("https://new.example.com/catalog.json")
952
+
953
+ def test_remove_catalog_tolerates_inf_priority(self, tmp_path, monkeypatch):
954
+ # Building the remove display order must not crash on a ``priority:
955
+ # .inf`` entry; it falls back to positional order like the other
956
+ # non-integer priorities do.
957
+ self._isolate(tmp_path, monkeypatch)
958
+ cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
959
+ cfg_path.write_text(
960
+ yaml.dump(
961
+ {
962
+ "catalogs": [
963
+ {
964
+ "url": "https://a.example.com/catalog.json",
965
+ "priority": float("inf"),
966
+ },
967
+ {"url": "https://b.example.com/catalog.json", "priority": 2},
968
+ ]
969
+ }
970
+ ),
971
+ encoding="utf-8",
972
+ )
973
+ cat = IntegrationCatalog(tmp_path)
974
+ cat.remove_catalog(0) # must not raise OverflowError
975
+
925
976
  def test_add_catalog_skips_blank_url_entries(self, tmp_path, monkeypatch):
926
977
  self._isolate(tmp_path, monkeypatch)
927
978
  cfg_path = tmp_path / ".specify" / "integration-catalogs.yml"
@@ -4542,6 +4542,36 @@ class TestCatalogStack:
4542
4542
  catalog.get_active_catalogs()
4543
4543
  assert str(config_path) in str(exc_info.value)
4544
4544
 
4545
+ def test_load_catalog_config_rejects_infinite_priority(self, temp_dir):
4546
+ """A ``priority: .inf`` yields a clean validation error, not an uncaught
4547
+ OverflowError from int(float('inf'))."""
4548
+ import yaml as yaml_module
4549
+
4550
+ project_dir = self._make_project(temp_dir)
4551
+ config_path = project_dir / ".specify" / "extension-catalogs.yml"
4552
+ config_path.write_text(
4553
+ yaml_module.dump(
4554
+ {
4555
+ "catalogs": [
4556
+ {
4557
+ "name": "inf-priority",
4558
+ "url": "https://example.com/catalog.json",
4559
+ "priority": float("inf"),
4560
+ }
4561
+ ]
4562
+ }
4563
+ ),
4564
+ encoding="utf-8",
4565
+ )
4566
+
4567
+ catalog = ExtensionCatalog(project_dir)
4568
+
4569
+ with pytest.raises(
4570
+ ValidationError, match="Invalid priority|expected integer"
4571
+ ) as exc_info:
4572
+ catalog.get_active_catalogs()
4573
+ assert str(config_path) in str(exc_info.value)
4574
+
4545
4575
  def test_load_catalog_config_defaults_blank_names(self, temp_dir):
4546
4576
  """Blank and null names normalize by valid catalog order."""
4547
4577
  import yaml as yaml_module
@@ -2671,6 +2671,24 @@ class TestPresetCatalogMultiCatalog:
2671
2671
  with pytest.raises(PresetValidationError, match="Invalid priority|expected integer"):
2672
2672
  catalog._load_catalog_config(config_path)
2673
2673
 
2674
+ def test_load_catalog_config_rejects_infinite_priority(self, project_dir):
2675
+ """A ``priority: .inf`` yields a clean validation error, not an uncaught
2676
+ OverflowError from int(float('inf'))."""
2677
+ config_path = project_dir / ".specify" / "preset-catalogs.yml"
2678
+ config_path.write_text(yaml.dump({
2679
+ "catalogs": [
2680
+ {
2681
+ "name": "inf-priority",
2682
+ "url": "https://example.com/catalog.json",
2683
+ "priority": float("inf"),
2684
+ }
2685
+ ]
2686
+ }))
2687
+
2688
+ catalog = PresetCatalog(project_dir)
2689
+ with pytest.raises(PresetValidationError, match="Invalid priority|expected integer"):
2690
+ catalog._load_catalog_config(config_path)
2691
+
2674
2692
  def test_load_catalog_config_install_allowed_string(self, project_dir):
2675
2693
  """Test that install_allowed accepts string values."""
2676
2694
  config_path = project_dir / ".specify" / "preset-catalogs.yml"