specify-cli 0.12.4__tar.gz → 0.12.5__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 (451) hide show
  1. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/docs.yml +1 -1
  2. {specify_cli-0.12.4 → specify_cli-0.12.5}/CHANGELOG.md +15 -0
  3. {specify_cli-0.12.4 → specify_cli-0.12.5}/PKG-INFO +1 -1
  4. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/integrations.md +2 -2
  5. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/README.md +15 -1
  6. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.feature.md +16 -2
  7. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.validate.md +6 -6
  8. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/config-template.yml +10 -0
  9. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/extension.yml +4 -2
  10. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/git-config.yml +10 -0
  11. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/create-new-feature-branch.sh +192 -32
  12. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/git-common.sh +7 -5
  13. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +185 -33
  14. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/git-common.ps1 +7 -6
  15. {specify_cli-0.12.4 → specify_cli-0.12.5}/pyproject.toml +1 -1
  16. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/adapters.py +5 -1
  17. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/catalog_stack.py +14 -6
  18. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/cursor_agent/__init__.py +9 -1
  19. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/expressions.py +91 -14
  20. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/gate/__init__.py +8 -1
  21. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/git/test_git_extension.py +416 -3
  22. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_catalog_stack.py +41 -0
  23. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_cursor_agent.py +49 -0
  24. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_workflows.py +125 -0
  25. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_adapters.py +27 -0
  26. {specify_cli-0.12.4 → specify_cli-0.12.5}/.devcontainer/devcontainer.json +0 -0
  27. {specify_cli-0.12.4 → specify_cli-0.12.5}/.devcontainer/post-create.sh +0 -0
  28. {specify_cli-0.12.4 → specify_cli-0.12.5}/.editorconfig +0 -0
  29. {specify_cli-0.12.4 → specify_cli-0.12.5}/.gitattributes +0 -0
  30. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/CODEOWNERS +0 -0
  31. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  32. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  33. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  34. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  35. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  36. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  37. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  38. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  39. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/aw/actions-lock.json +0 -0
  40. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/dependabot.yml +0 -0
  41. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/skills/add-community-extension/SKILL.md +0 -0
  42. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/RELEASE-PROCESS.md +0 -0
  43. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-extension.lock.yml +0 -0
  44. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-extension.md +0 -0
  45. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-preset.lock.yml +0 -0
  46. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/add-community-preset.md +0 -0
  47. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-assess.lock.yml +0 -0
  48. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-assess.md +0 -0
  49. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-fix.lock.yml +0 -0
  50. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-fix.md +0 -0
  51. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-test.lock.yml +0 -0
  52. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/bug-test.md +0 -0
  53. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/catalog-assign.yml +0 -0
  54. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/codeql.yml +0 -0
  55. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/lint.yml +0 -0
  56. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/publish-pypi.yml +0 -0
  57. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/release-trigger.yml +0 -0
  58. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/release.yml +0 -0
  59. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/stale.yml +0 -0
  60. {specify_cli-0.12.4 → specify_cli-0.12.5}/.github/workflows/test.yml +0 -0
  61. {specify_cli-0.12.4 → specify_cli-0.12.5}/.gitignore +0 -0
  62. {specify_cli-0.12.4 → specify_cli-0.12.5}/.markdownlint-cli2.jsonc +0 -0
  63. {specify_cli-0.12.4 → specify_cli-0.12.5}/.zenodo.json +0 -0
  64. {specify_cli-0.12.4 → specify_cli-0.12.5}/AGENTS.md +0 -0
  65. {specify_cli-0.12.4 → specify_cli-0.12.5}/CITATION.cff +0 -0
  66. {specify_cli-0.12.4 → specify_cli-0.12.5}/CODE_OF_CONDUCT.md +0 -0
  67. {specify_cli-0.12.4 → specify_cli-0.12.5}/CONTRIBUTING.md +0 -0
  68. {specify_cli-0.12.4 → specify_cli-0.12.5}/DEVELOPMENT.md +0 -0
  69. {specify_cli-0.12.4 → specify_cli-0.12.5}/LICENSE +0 -0
  70. {specify_cli-0.12.4 → specify_cli-0.12.5}/README.md +0 -0
  71. {specify_cli-0.12.4 → specify_cli-0.12.5}/SECURITY.md +0 -0
  72. {specify_cli-0.12.4 → specify_cli-0.12.5}/SUPPORT.md +0 -0
  73. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/.gitignore +0 -0
  74. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/README.md +0 -0
  75. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/bundles.md +0 -0
  76. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/extensions.md +0 -0
  77. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/friends.md +0 -0
  78. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/overview.md +0 -0
  79. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/presets.md +0 -0
  80. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/community/walkthroughs.md +0 -0
  81. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/concepts/complex-features.md +0 -0
  82. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/concepts/sdd.md +0 -0
  83. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/concepts/spec-persistence.md +0 -0
  84. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/docfx.json +0 -0
  85. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/guides/evolving-specs.md +0 -0
  86. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/guides/monorepo.md +0 -0
  87. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/index.md +0 -0
  88. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/air-gapped.md +0 -0
  89. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/one-time.md +0 -0
  90. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/pipx.md +0 -0
  91. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/install/uv.md +0 -0
  92. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/installation.md +0 -0
  93. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/local-development.md +0 -0
  94. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/quickstart.md +0 -0
  95. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/authentication.md +0 -0
  96. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/bundles.md +0 -0
  97. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/core.md +0 -0
  98. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/extensions.md +0 -0
  99. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/overview.md +0 -0
  100. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/presets.md +0 -0
  101. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/reference/workflows.md +0 -0
  102. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/template/public/main.css +0 -0
  103. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/toc.yml +0 -0
  104. {specify_cli-0.12.4 → specify_cli-0.12.5}/docs/upgrade.md +0 -0
  105. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/business-analyst/README.md +0 -0
  106. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/business-analyst/bundle.yml +0 -0
  107. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/developer/README.md +0 -0
  108. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/developer/bundle.yml +0 -0
  109. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/product-manager/README.md +0 -0
  110. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/product-manager/bundle.yml +0 -0
  111. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/security-researcher/README.md +0 -0
  112. {specify_cli-0.12.4 → specify_cli-0.12.5}/examples/bundles/security-researcher/bundle.yml +0 -0
  113. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  114. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  115. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  116. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  117. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/README.md +0 -0
  118. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  119. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/README.md +0 -0
  120. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/agent-context-config.yml +0 -0
  121. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/agent-context-defaults.json +0 -0
  122. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  123. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/extension.yml +0 -0
  124. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  125. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  126. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/README.md +0 -0
  127. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  128. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  129. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/commands/speckit.bug.test.md +0 -0
  130. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/bug/extension.yml +0 -0
  131. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/catalog.community.json +0 -0
  132. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/catalog.json +0 -0
  133. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.commit.md +0 -0
  134. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.initialize.md +0 -0
  135. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/commands/speckit.git.remote.md +0 -0
  136. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  137. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  138. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  139. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  140. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/selftest/commands/selftest.md +0 -0
  141. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/selftest/extension.yml +0 -0
  142. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/.gitignore +0 -0
  143. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/CHANGELOG.md +0 -0
  144. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/EXAMPLE-README.md +0 -0
  145. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/LICENSE +0 -0
  146. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/README.md +0 -0
  147. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/commands/example.md +0 -0
  148. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/config-template.yml +0 -0
  149. {specify_cli-0.12.4 → specify_cli-0.12.5}/extensions/template/extension.yml +0 -0
  150. {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/CONTRIBUTING.md +0 -0
  151. {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/README.md +0 -0
  152. {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/catalog.community.json +0 -0
  153. {specify_cli-0.12.4 → specify_cli-0.12.5}/integrations/catalog.json +0 -0
  154. {specify_cli-0.12.4 → specify_cli-0.12.5}/media/bootstrap-claude-code.gif +0 -0
  155. {specify_cli-0.12.4 → specify_cli-0.12.5}/media/logo_large.webp +0 -0
  156. {specify_cli-0.12.4 → specify_cli-0.12.5}/media/logo_small.webp +0 -0
  157. {specify_cli-0.12.4 → specify_cli-0.12.5}/media/spec-kit-video-header.jpg +0 -0
  158. {specify_cli-0.12.4 → specify_cli-0.12.5}/media/specify_cli.gif +0 -0
  159. {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-April.md +0 -0
  160. {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-February.md +0 -0
  161. {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-June.md +0 -0
  162. {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-March.md +0 -0
  163. {specify_cli-0.12.4 → specify_cli-0.12.5}/newsletters/2026-May.md +0 -0
  164. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/ARCHITECTURE.md +0 -0
  165. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/PUBLISHING.md +0 -0
  166. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/README.md +0 -0
  167. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/catalog.community.json +0 -0
  168. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/catalog.json +0 -0
  169. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/README.md +0 -0
  170. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.constitution.md +0 -0
  171. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.implement.md +0 -0
  172. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.plan.md +0 -0
  173. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.specify.md +0 -0
  174. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/commands/speckit.tasks.md +0 -0
  175. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/lean/preset.yml +0 -0
  176. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/README.md +0 -0
  177. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  178. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/commands/speckit.specify.md +0 -0
  179. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/preset.yml +0 -0
  180. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/templates/myext-template.md +0 -0
  181. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/scaffold/templates/spec-template.md +0 -0
  182. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/commands/speckit.specify.md +0 -0
  183. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  184. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/preset.yml +0 -0
  185. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/agent-file-template.md +0 -0
  186. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/checklist-template.md +0 -0
  187. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/constitution-template.md +0 -0
  188. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/plan-template.md +0 -0
  189. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/spec-template.md +0 -0
  190. {specify_cli-0.12.4 → specify_cli-0.12.5}/presets/self-test/templates/tasks-template.md +0 -0
  191. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/check-prerequisites.sh +0 -0
  192. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/common.sh +0 -0
  193. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/create-new-feature.sh +0 -0
  194. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/setup-plan.sh +0 -0
  195. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/bash/setup-tasks.sh +0 -0
  196. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/check-prerequisites.ps1 +0 -0
  197. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/common.ps1 +0 -0
  198. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/create-new-feature.ps1 +0 -0
  199. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/setup-plan.ps1 +0 -0
  200. {specify_cli-0.12.4 → specify_cli-0.12.5}/scripts/powershell/setup-tasks.ps1 +0 -0
  201. {specify_cli-0.12.4 → specify_cli-0.12.5}/spec-driven.md +0 -0
  202. {specify_cli-0.12.4 → specify_cli-0.12.5}/spec-kit.code-workspace +0 -0
  203. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/__init__.py +0 -0
  204. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_agent_config.py +0 -0
  205. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_assets.py +0 -0
  206. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_console.py +0 -0
  207. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_github_http.py +0 -0
  208. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_init_options.py +0 -0
  209. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_invocation_style.py +0 -0
  210. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_project.py +0 -0
  211. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_utils.py +0 -0
  212. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/_version.py +0 -0
  213. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/agents.py +0 -0
  214. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/__init__.py +0 -0
  215. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/azure_devops.py +0 -0
  216. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/base.py +0 -0
  217. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/config.py +0 -0
  218. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/github.py +0 -0
  219. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/authentication/http.py +0 -0
  220. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/__init__.py +0 -0
  221. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  222. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  223. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/__init__.py +0 -0
  224. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/project.py +0 -0
  225. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/versioning.py +0 -0
  226. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  227. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/__init__.py +0 -0
  228. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/catalog.py +0 -0
  229. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/manifest.py +0 -0
  230. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/models/records.py +0 -0
  231. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/__init__.py +0 -0
  232. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/conflict.py +0 -0
  233. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/installer.py +0 -0
  234. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/packager.py +0 -0
  235. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/primitives.py +0 -0
  236. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/references.py +0 -0
  237. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/resolver.py +0 -0
  238. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/bundler/services/validator.py +0 -0
  239. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/catalogs.py +0 -0
  240. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/commands/__init__.py +0 -0
  241. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/commands/bundle/__init__.py +0 -0
  242. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/commands/init.py +0 -0
  243. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/extensions/__init__.py +0 -0
  244. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/extensions/_commands.py +0 -0
  245. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_runtime.py +0 -0
  246. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_scaffold.py +0 -0
  247. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_state.py +0 -0
  248. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integration_status.py +0 -0
  249. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/__init__.py +0 -0
  250. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_commands.py +0 -0
  251. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_helpers.py +0 -0
  252. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_install_commands.py +0 -0
  253. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  254. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_query_commands.py +0 -0
  255. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  256. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/agy/__init__.py +0 -0
  257. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/amp/__init__.py +0 -0
  258. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  259. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/base.py +0 -0
  260. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/bob/__init__.py +0 -0
  261. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/catalog.py +0 -0
  262. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/claude/__init__.py +0 -0
  263. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/cline/__init__.py +0 -0
  264. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  265. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/codex/__init__.py +0 -0
  266. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  267. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/devin/__init__.py +0 -0
  268. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  269. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/forge/__init__.py +0 -0
  270. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  271. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/generic/__init__.py +0 -0
  272. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/goose/__init__.py +0 -0
  273. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  274. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/junie/__init__.py +0 -0
  275. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  276. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  277. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  278. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  279. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/manifest.py +0 -0
  280. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/omp/__init__.py +0 -0
  281. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  282. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/pi/__init__.py +0 -0
  283. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  284. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  285. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  286. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/shai/__init__.py +0 -0
  287. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  288. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/trae/__init__.py +0 -0
  289. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  290. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  291. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/integrations/zed/__init__.py +0 -0
  292. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/presets/__init__.py +0 -0
  293. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/presets/_commands.py +0 -0
  294. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/shared_infra.py +0 -0
  295. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/__init__.py +0 -0
  296. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/_commands.py +0 -0
  297. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/base.py +0 -0
  298. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/catalog.py +0 -0
  299. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/engine.py +0 -0
  300. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/__init__.py +0 -0
  301. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  302. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  303. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  304. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  305. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  306. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  307. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  308. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  309. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  310. {specify_cli-0.12.4 → specify_cli-0.12.5}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  311. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/checklist-template.md +0 -0
  312. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/analyze.md +0 -0
  313. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/checklist.md +0 -0
  314. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/clarify.md +0 -0
  315. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/constitution.md +0 -0
  316. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/converge.md +0 -0
  317. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/implement.md +0 -0
  318. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/plan.md +0 -0
  319. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/specify.md +0 -0
  320. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/tasks.md +0 -0
  321. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/commands/taskstoissues.md +0 -0
  322. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/constitution-template.md +0 -0
  323. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/plan-template.md +0 -0
  324. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/spec-template.md +0 -0
  325. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/tasks-template.md +0 -0
  326. {specify_cli-0.12.4 → specify_cli-0.12.5}/templates/vscode-settings.json +0 -0
  327. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/__init__.py +0 -0
  328. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/auth_helpers.py +0 -0
  329. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/bundler_helpers.py +0 -0
  330. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/conftest.py +0 -0
  331. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/contract/test_bundle_cli.py +0 -0
  332. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/contract/test_catalog_schema.py +0 -0
  333. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/contract/test_manifest_schema.py +0 -0
  334. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/__init__.py +0 -0
  335. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/bug/__init__.py +0 -0
  336. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/bug/test_bug_extension.py +0 -0
  337. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/git/__init__.py +0 -0
  338. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/test_agent_context_cli_free.py +0 -0
  339. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/test_extension_agent_context.py +0 -0
  340. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  341. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/TESTING.md +0 -0
  342. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/plan.md +0 -0
  343. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/spec.md +0 -0
  344. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/hooks/tasks.md +0 -0
  345. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/http_helpers.py +0 -0
  346. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_init_install.py +0 -0
  347. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_install_flow.py +0 -0
  348. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_local_install.py +0 -0
  349. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_offline.py +0 -0
  350. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integration/test_bundler_security_paths.py +0 -0
  351. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/__init__.py +0 -0
  352. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/conftest.py +0 -0
  353. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_base.py +0 -0
  354. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_cli.py +0 -0
  355. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_extra_args.py +0 -0
  356. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_agy.py +0 -0
  357. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_amp.py +0 -0
  358. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_auggie.py +0 -0
  359. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_markdown.py +0 -0
  360. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_skills.py +0 -0
  361. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_toml.py +0 -0
  362. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_base_yaml.py +0 -0
  363. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_bob.py +0 -0
  364. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_catalog.py +0 -0
  365. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_claude.py +0 -0
  366. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_cline.py +0 -0
  367. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_codebuddy.py +0 -0
  368. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_codex.py +0 -0
  369. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_copilot.py +0 -0
  370. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_devin.py +0 -0
  371. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_firebender.py +0 -0
  372. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_forge.py +0 -0
  373. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_gemini.py +0 -0
  374. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_generic.py +0 -0
  375. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_goose.py +0 -0
  376. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_hermes.py +0 -0
  377. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_junie.py +0 -0
  378. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_kilocode.py +0 -0
  379. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_kimi.py +0 -0
  380. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_kiro_cli.py +0 -0
  381. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_lingma.py +0 -0
  382. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_omp.py +0 -0
  383. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_opencode.py +0 -0
  384. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_pi.py +0 -0
  385. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_qodercli.py +0 -0
  386. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_qwen.py +0 -0
  387. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_rovodev.py +0 -0
  388. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_scaffold.py +0 -0
  389. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_shai.py +0 -0
  390. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_state.py +0 -0
  391. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_subcommand.py +0 -0
  392. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_tabnine.py +0 -0
  393. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_trae.py +0 -0
  394. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_vibe.py +0 -0
  395. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_zcode.py +0 -0
  396. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_integration_zed.py +0 -0
  397. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_manifest.py +0 -0
  398. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/integrations/test_registry.py +0 -0
  399. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/self_upgrade_helpers.py +0 -0
  400. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_agent_config_consistency.py +0 -0
  401. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_authentication.py +0 -0
  402. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_branch_numbering.py +0 -0
  403. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_check_prerequisites_paths_only.py +0 -0
  404. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_check_tool.py +0 -0
  405. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_cli_version.py +0 -0
  406. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_commands_package.py +0 -0
  407. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_console_imports.py +0 -0
  408. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extension_registration.py +0 -0
  409. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extension_skills.py +0 -0
  410. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extension_update_hardening.py +0 -0
  411. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_extensions.py +0 -0
  412. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_github_http.py +0 -0
  413. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_github_workflows.py +0 -0
  414. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_init_dir.py +0 -0
  415. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_init_dir_cli.py +0 -0
  416. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_live_transient_windows.py +0 -0
  417. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_merge.py +0 -0
  418. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_presets.py +0 -0
  419. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_ps1_encoding.py +0 -0
  420. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_registrar_path_traversal.py +0 -0
  421. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_detection.py +0 -0
  422. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_execution.py +0 -0
  423. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_guidance.py +0 -0
  424. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_self_upgrade_verification.py +0 -0
  425. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_setup_plan_feature_json.py +0 -0
  426. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_setup_plan_no_overwrite.py +0 -0
  427. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_setup_tasks.py +0 -0
  428. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_shared_infra_integrity.py +0 -0
  429. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_timestamp_branches.py +0 -0
  430. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_upgrade.py +0 -0
  431. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_utils.py +0 -0
  432. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_utils_assets_imports.py +0 -0
  433. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_version_imports.py +0 -0
  434. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/test_workflow_run_without_project.py +0 -0
  435. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_catalog_config.py +0 -0
  436. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_conflict.py +0 -0
  437. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_packager.py +0 -0
  438. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_primitives.py +0 -0
  439. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_records.py +0 -0
  440. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_references.py +0 -0
  441. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_resolver.py +0 -0
  442. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_validator.py +0 -0
  443. {specify_cli-0.12.4 → specify_cli-0.12.5}/tests/unit/test_bundler_versioning.py +0 -0
  444. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/ARCHITECTURE.md +0 -0
  445. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/PUBLISHING.md +0 -0
  446. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/README.md +0 -0
  447. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/catalog.community.json +0 -0
  448. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/catalog.json +0 -0
  449. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/speckit/workflow.yml +0 -0
  450. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/step-catalog.community.json +0 -0
  451. {specify_cli-0.12.4 → specify_cli-0.12.5}/workflows/step-catalog.json +0 -0
@@ -35,7 +35,7 @@ jobs:
35
35
  fetch-depth: 0 # Fetch all history for git info
36
36
 
37
37
  - name: Setup .NET
38
- uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5.3.0
38
+ uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
39
39
  with:
40
40
  dotnet-version: '8.x'
41
41
 
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.12.5] - 2026-07-06
6
+
7
+ ### Changed
8
+
9
+ - fix(workflows): match gate reject option case-insensitively (#3335)
10
+ - fix(bundler): reject host-less catalog URLs in adapters (use hostname, not netloc) (#3333)
11
+ - fix(bundler): resolve catalog search at highest-precedence source before filtering (#3331)
12
+ - fix(workflows): compare non-numeric strings lexicographically instead of returning False (#3323)
13
+ - fix(workflows): quote-aware interpolation so a literal }} in a filter arg doesn't break multi-expression templates (#3307)
14
+ - Support namespaced git feature branch templates (#3293)
15
+ - chore(deps): bump actions/setup-dotnet from 5.3.0 to 5.4.0 (#3315)
16
+ - fix(integrations): cursor-agent honors executable/extra-args env overrides (#3265)
17
+ - docs: drop stale kimi KIMI.md->AGENTS.md migration note (#3291)
18
+ - chore: release 0.12.4, begin 0.12.5.dev0 development (#3305)
19
+
5
20
  ## [0.12.4] - 2026-07-02
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.12.4
3
+ Version: 0.12.5
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
@@ -24,7 +24,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
24
24
  | [IBM Bob](https://www.ibm.com/products/bob) | `bob` | IDE-based agent |
25
25
  | [Junie](https://junie.jetbrains.com/) | `junie` | |
26
26
  | [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | |
27
- | [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths, and (when the `agent-context` extension is enabled) migrates `KIMI.md` context into `AGENTS.md` |
27
+ | [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths |
28
28
  | [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
29
29
  | [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
30
30
  | [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
@@ -218,7 +218,7 @@ Some integrations accept additional options via `--integration-options`:
218
218
  | Integration | Option | Description |
219
219
  | ----------- | ------------------- | -------------------------------------------------------------- |
220
220
  | `generic` | `--commands-dir` | Required. Directory for command files |
221
- | `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated directory names); when the `agent-context` extension is enabled, also migrates `KIMI.md` to `AGENTS.md` |
221
+ | `kimi` | `--migrate-legacy` | Migrate legacy `.kimi/skills/` installs to `.kimi-code/skills/` (including dotted→hyphenated skill naming, e.g. `speckit.xxx` `speckit-xxx`) |
222
222
 
223
223
  Example:
224
224
 
@@ -7,7 +7,7 @@ Git repository initialization, feature branch creation, numbering (sequential/ti
7
7
  This extension provides Git operations as an optional, self-contained module. It manages:
8
8
 
9
9
  - **Repository initialization** with configurable commit messages
10
- - **Feature branch creation** with sequential (`001-feature-name`) or timestamp (`20260319-143022-feature-name`) numbering
10
+ - **Feature branch creation** with sequential (`001-feature-name`) or timestamp (`20260319-143022-feature-name`) numbering and optional templates for branch namespaces
11
11
  - **Branch validation** to ensure branches follow naming conventions
12
12
  - **Git remote detection** for GitHub integration (e.g., issue creation)
13
13
  - **Auto-commit** after core commands (configurable per-command with custom messages)
@@ -53,6 +53,16 @@ Configuration is stored in `.specify/extensions/git/git-config.yml`:
53
53
  # Branch numbering strategy: "sequential" or "timestamp"
54
54
  branch_numbering: sequential
55
55
 
56
+ # Optional branch name template. Leave empty for the default "{number}-{slug}".
57
+ # Supported tokens: {author}, {app}, {number}, {slug}; {slug} must not appear
58
+ # before {number}, and the final path segment must start with {number}-.
59
+ # Example for monorepos: "{author}/{app}/{number}-{slug}"
60
+ branch_template: ""
61
+
62
+ # Optional shorthand namespace. Leave empty to use branch_template/default behavior.
63
+ # Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
64
+ branch_prefix: ""
65
+
56
66
  # Custom commit message for git init
57
67
  init_commit_message: "[Spec Kit] Initial commit"
58
68
 
@@ -65,6 +75,10 @@ auto_commit:
65
75
  message: "[Spec Kit] Add specification"
66
76
  ```
67
77
 
78
+ `{author}` is derived from Git config and sanitized for branch names. `{app}` is derived from the Spec Kit init directory name. Custom templates must not put `{slug}` before `{number}`, and must put `{number}-` at the start of the final path segment so generated names remain valid feature branches. For a monorepo project at `apps/web/.specify/`, a template such as `{author}/{app}/{number}-{slug}` produces branches like `jdoe/web/008-guided-tour`.
79
+
80
+ For simple namespace-only customization, `branch_prefix` is also accepted as a shorthand and expands to `<branch_prefix>/{number}-{slug}`.
81
+
68
82
  ## Installation
69
83
 
70
84
  ```bash
@@ -19,7 +19,7 @@ You **MUST** consider the user input before proceeding (if not empty).
19
19
  If the user explicitly provided `GIT_BRANCH_NAME` (e.g., via environment variable, argument, or in their request), pass it through to the script by setting the `GIT_BRANCH_NAME` environment variable before invoking the script. When `GIT_BRANCH_NAME` is set:
20
20
  - The script uses the exact value as the branch name, bypassing all prefix/suffix generation
21
21
  - `--short-name`, `--number`, and `--timestamp` flags are ignored
22
- - `FEATURE_NUM` is extracted from the name if it starts with a numeric prefix, otherwise set to the full branch name
22
+ - `FEATURE_NUM` is extracted when the final path segment starts with a numeric or timestamp feature marker (for example `042-name`, `feat/042-name`, or `jdoe/app/042-name`), otherwise set to the full branch name
23
23
 
24
24
  ## Prerequisites
25
25
 
@@ -35,6 +35,19 @@ Determine the branch numbering strategy by checking configuration in this order:
35
35
  3. Check `.specify/init-options.json` for `branch_numbering` value (deprecated, backward compatibility — will be removed in a future release)
36
36
  4. Default to `sequential` if none of the above exist
37
37
 
38
+ ## Branch Name Template
39
+
40
+ Check `.specify/extensions/git/git-config.yml` for an optional `branch_template` value. If it is empty or missing, use the default branch shape `{number}-{slug}`. If it is set, `{slug}` must not appear before `{number}`, its final path segment must start with `{number}-`, and the script expands these tokens:
41
+
42
+ - `{author}`: sanitized Git config author (`user.name`, falling back to the email local part)
43
+ - `{app}`: sanitized Spec Kit init directory name
44
+ - `{number}`: sequential number or timestamp
45
+ - `{slug}`: generated short branch slug
46
+
47
+ For monorepos, a template such as `{author}/{app}/{number}-{slug}` creates names like `jdoe/web/008-guided-tour` while preserving per-project feature numbering.
48
+
49
+ The script also accepts `branch_prefix` as a shorthand for simple namespaces; it expands to `<branch_prefix>/{number}-{slug}`.
50
+
38
51
  ## Execution
39
52
 
40
53
  Generate a concise short name (2-4 words) for the branch:
@@ -54,6 +67,7 @@ Run the appropriate script based on your platform:
54
67
  - Always include the JSON flag (`--json` for Bash, `-Json` for PowerShell) so the output can be parsed reliably
55
68
  - You must only ever run this script once per feature
56
69
  - The JSON output will contain `BRANCH_NAME` and `FEATURE_NUM`
70
+ - Do not manually expand `branch_template`; the script reads the git extension config and applies it consistently
57
71
 
58
72
  ## Graceful Degradation
59
73
 
@@ -64,5 +78,5 @@ If Git is not installed or the current directory is not a Git repository:
64
78
  ## Output
65
79
 
66
80
  The script outputs JSON with:
67
- - `BRANCH_NAME`: The branch name (e.g., `003-user-auth` or `20260319-143022-user-auth`)
81
+ - `BRANCH_NAME`: The branch name (e.g., `003-user-auth`, `20260319-143022-user-auth`, or `jdoe/web/003-user-auth`)
68
82
  - `FEATURE_NUM`: The numeric or timestamp prefix used
@@ -22,24 +22,24 @@ Get the current branch name:
22
22
  git rev-parse --abbrev-ref HEAD
23
23
  ```
24
24
 
25
- The branch name must match one of these patterns:
25
+ The branch name's final path segment must start with one of these feature markers:
26
26
 
27
- 1. **Sequential**: `^[0-9]{3,}-` (e.g., `001-feature-name`, `042-fix-bug`, `1000-big-feature`)
28
- 2. **Timestamp**: `^[0-9]{8}-[0-9]{6}-` (e.g., `20260319-143022-feature-name`)
27
+ 1. **Sequential**: `[0-9]{3,}-` (e.g., `001-feature-name`, `042-fix-bug`, `1000-big-feature`, `jdoe/web/008-guided-tour`)
28
+ 2. **Timestamp**: `[0-9]{8}-[0-9]{6}-` (e.g., `20260319-143022-feature-name`, `jdoe/web/20260319-143022-feature-name`)
29
29
 
30
30
  ## Execution
31
31
 
32
32
  If on a feature branch (matches either pattern):
33
33
  - Output: `✓ On feature branch: <branch-name>`
34
34
  - Check if the corresponding spec directory exists under `specs/`:
35
- - For sequential branches, look for `specs/<prefix>-*` where prefix matches the numeric portion
36
- - For timestamp branches, look for `specs/<prefix>-*` where prefix matches the `YYYYMMDD-HHMMSS` portion
35
+ - For sequential branches, look for `specs/<prefix>-*` where prefix matches the numeric portion, regardless of branch namespace prefixes
36
+ - For timestamp branches, look for `specs/<prefix>-*` where prefix matches the `YYYYMMDD-HHMMSS` portion, regardless of branch namespace prefixes
37
37
  - If spec directory exists: `✓ Spec directory found: <path>`
38
38
  - If spec directory missing: `⚠ No spec directory found for prefix <prefix>`
39
39
 
40
40
  If NOT on a feature branch:
41
41
  - Output: `✗ Not on a feature branch. Current branch: <branch-name>`
42
- - Output: `Feature branches should be named like: 001-feature-name or 20260319-143022-feature-name`
42
+ - Output: `Feature branches should be named like: 001-feature-name, 20260319-143022-feature-name, or <namespace>/001-feature-name`
43
43
 
44
44
  ## Graceful Degradation
45
45
 
@@ -4,6 +4,16 @@
4
4
  # Branch numbering strategy: "sequential" (001, 002, ...) or "timestamp" (YYYYMMDD-HHMMSS)
5
5
  branch_numbering: sequential
6
6
 
7
+ # Optional branch name template. Leave empty for the default "{number}-{slug}".
8
+ # Supported tokens: {author}, {app}, {number}, {slug}
9
+ # {slug} must not appear before {number}; final path segment must start with {number}-.
10
+ # Example for monorepos: "{author}/{app}/{number}-{slug}"
11
+ branch_template: ""
12
+
13
+ # Optional shorthand namespace. Leave empty to use branch_template/default behavior.
14
+ # Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
15
+ branch_prefix: ""
16
+
7
17
  # Commit message used by `git commit` during repository initialization
8
18
  init_commit_message: "[Spec Kit] Initial commit"
9
19
 
@@ -4,7 +4,7 @@ extension:
4
4
  id: git
5
5
  name: "Git Branching Workflow"
6
6
  version: "1.0.0"
7
- description: "Feature branch creation, numbering (sequential/timestamp), validation, and Git remote detection"
7
+ description: "Feature branch creation, numbering (sequential/timestamp), templating, validation, and Git remote detection"
8
8
  author: spec-kit-core
9
9
  repository: https://github.com/github/spec-kit
10
10
  license: MIT
@@ -19,7 +19,7 @@ provides:
19
19
  commands:
20
20
  - name: speckit.git.feature
21
21
  file: commands/speckit.git.feature.md
22
- description: "Create a feature branch with sequential or timestamp numbering"
22
+ description: "Create a feature branch with sequential or timestamp numbering and optional templates"
23
23
  - name: speckit.git.validate
24
24
  file: commands/speckit.git.validate.md
25
25
  description: "Validate current branch follows feature branch naming conventions"
@@ -137,4 +137,6 @@ tags:
137
137
  config:
138
138
  defaults:
139
139
  branch_numbering: sequential
140
+ branch_template: ""
141
+ branch_prefix: ""
140
142
  init_commit_message: "[Spec Kit] Initial commit"
@@ -4,6 +4,16 @@
4
4
  # Branch numbering strategy: "sequential" (001, 002, ...) or "timestamp" (YYYYMMDD-HHMMSS)
5
5
  branch_numbering: sequential
6
6
 
7
+ # Optional branch name template. Leave empty for the default "{number}-{slug}".
8
+ # Supported tokens: {author}, {app}, {number}, {slug}
9
+ # {slug} must not appear before {number}; final path segment must start with {number}-.
10
+ # Example for monorepos: "{author}/{app}/{number}-{slug}"
11
+ branch_template: ""
12
+
13
+ # Optional shorthand namespace. Leave empty to use branch_template/default behavior.
14
+ # Example: "features/{app}" expands to "features/{app}/{number}-{slug}"
15
+ branch_prefix: ""
16
+
7
17
  # Commit message used by `git commit` during repository initialization
8
18
  init_commit_message: "[Spec Kit] Initial commit"
9
19
 
@@ -75,6 +75,10 @@ while [ $i -le $# ]; do
75
75
  echo "Environment variables:"
76
76
  echo " GIT_BRANCH_NAME Use this exact branch name, bypassing all prefix/suffix generation"
77
77
  echo ""
78
+ echo "Configuration:"
79
+ echo " branch_template Optional git-config.yml template with {author}, {app}, {number}, {slug}"
80
+ echo " branch_prefix Optional shorthand namespace expanded before {number}-{slug}"
81
+ echo ""
78
82
  echo "Examples:"
79
83
  echo " $0 'Add user authentication system' --short-name 'user-auth'"
80
84
  echo " $0 'Implement OAuth2 integration for API' --number 5"
@@ -127,16 +131,28 @@ get_highest_from_specs() {
127
131
 
128
132
  # Function to get highest number from git branches
129
133
  get_highest_from_branches() {
130
- git branch -a 2>/dev/null | sed -E 's/^[+*][[:space:]]+//; s/^[[:space:]]+//; s|^remotes/[^/]*/||' | _extract_highest_number
134
+ local scope_prefix="${1:-}"
135
+ git branch -a 2>/dev/null | sed -E 's/^[+*][[:space:]]+//; s/^[[:space:]]+//; s|^remotes/[^/]*/||' | _extract_highest_number "$scope_prefix"
131
136
  }
132
137
 
133
138
  # Extract the highest sequential feature number from a list of ref names (one per line).
134
139
  _extract_highest_number() {
140
+ local scope_prefix="${1:-}"
135
141
  local highest=0
136
142
  while IFS= read -r name; do
137
143
  [ -z "$name" ] && continue
138
- if echo "$name" | grep -Eq '^[0-9]{3,}-' && ! echo "$name" | grep -Eq '^[0-9]{8}-[0-9]{6}-'; then
139
- number=$(echo "$name" | grep -Eo '^[0-9]+' || echo "0")
144
+ if [ -n "$scope_prefix" ]; then
145
+ case "$name" in
146
+ "$scope_prefix"*) name="${name#"$scope_prefix"}" ;;
147
+ *) continue ;;
148
+ esac
149
+ fi
150
+ name="${name##*/}"
151
+ if echo "$name" | grep -Eq '^[0-9]{3,}-' \
152
+ && ! echo "$name" | grep -Eq '^[0-9]{8}-[0-9]{6}-' \
153
+ && ! echo "$name" | grep -Eq '^[0-9]{7}-[0-9]{6}-' \
154
+ && ! echo "$name" | grep -Eq '^[0-9]{7,8}-[0-9]{6}$'; then
155
+ number=$(echo "$name" | grep -Eo '^[0-9]{3,}-' | sed -E 's/-$//' || echo "0")
140
156
  number=$((10#$number))
141
157
  if [ "$number" -gt "$highest" ]; then
142
158
  highest=$number
@@ -148,11 +164,12 @@ _extract_highest_number() {
148
164
 
149
165
  # Function to get highest number from remote branches without fetching (side-effect-free)
150
166
  get_highest_from_remote_refs() {
167
+ local scope_prefix="${1:-}"
151
168
  local highest=0
152
169
 
153
170
  for remote in $(git remote 2>/dev/null); do
154
171
  local remote_highest
155
- remote_highest=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads "$remote" 2>/dev/null | sed 's|.*refs/heads/||' | _extract_highest_number)
172
+ remote_highest=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads "$remote" 2>/dev/null | sed 's|.*refs/heads/||' | _extract_highest_number "$scope_prefix")
156
173
  if [ "$remote_highest" -gt "$highest" ]; then
157
174
  highest=$remote_highest
158
175
  fi
@@ -165,16 +182,17 @@ get_highest_from_remote_refs() {
165
182
  check_existing_branches() {
166
183
  local specs_dir="$1"
167
184
  local skip_fetch="${2:-false}"
185
+ local scope_prefix="${3:-}"
168
186
 
169
187
  if [ "$skip_fetch" = true ]; then
170
- local highest_remote=$(get_highest_from_remote_refs)
171
- local highest_branch=$(get_highest_from_branches)
188
+ local highest_remote=$(get_highest_from_remote_refs "$scope_prefix")
189
+ local highest_branch=$(get_highest_from_branches "$scope_prefix")
172
190
  if [ "$highest_remote" -gt "$highest_branch" ]; then
173
191
  highest_branch=$highest_remote
174
192
  fi
175
193
  else
176
194
  git fetch --all --prune >/dev/null 2>&1 || true
177
- local highest_branch=$(get_highest_from_branches)
195
+ local highest_branch=$(get_highest_from_branches "$scope_prefix")
178
196
  fi
179
197
 
180
198
  local highest_spec=$(get_highest_from_specs "$specs_dir")
@@ -273,6 +291,152 @@ fi
273
291
  cd "$REPO_ROOT"
274
292
 
275
293
  SPECS_DIR="$REPO_ROOT/specs"
294
+ CONFIG_FILE="$REPO_ROOT/.specify/extensions/git/git-config.yml"
295
+
296
+ read_git_config_value() {
297
+ local key="$1"
298
+ [ -f "$CONFIG_FILE" ] || return 0
299
+ grep -E "^[[:space:]]*${key}:" "$CONFIG_FILE" 2>/dev/null \
300
+ | head -n 1 \
301
+ | sed -E "s/^[[:space:]]*${key}:[[:space:]]*//" \
302
+ | sed -E 's/[[:space:]]+#.*$//' \
303
+ | sed -E 's/^[[:space:]]+|[[:space:]]+$//g' \
304
+ | sed -E 's/^"//; s/"$//' \
305
+ | sed -E "s/^'//; s/'$//"
306
+ }
307
+
308
+ branch_token() {
309
+ local value="$1"
310
+ local fallback="$2"
311
+ local cleaned
312
+ cleaned=$(clean_branch_name "$value")
313
+ if [ -n "$cleaned" ]; then
314
+ printf '%s\n' "$cleaned"
315
+ else
316
+ printf '%s\n' "$fallback"
317
+ fi
318
+ }
319
+
320
+ get_author_token() {
321
+ local author=""
322
+ if command -v git >/dev/null 2>&1; then
323
+ author=$(git config user.name 2>/dev/null || true)
324
+ if [ -z "$author" ]; then
325
+ author=$(git config user.email 2>/dev/null | sed 's/@.*$//' || true)
326
+ fi
327
+ fi
328
+ if [ -z "$author" ]; then
329
+ author="${USER:-unknown}"
330
+ fi
331
+ branch_token "$author" "unknown"
332
+ }
333
+
334
+ get_app_token() {
335
+ branch_token "$(basename "$REPO_ROOT")" "app"
336
+ }
337
+
338
+ resolve_branch_template() {
339
+ local template
340
+ local prefix
341
+ template=$(read_git_config_value "branch_template")
342
+ if [ -n "$template" ]; then
343
+ printf '%s\n' "$template"
344
+ return
345
+ fi
346
+
347
+ prefix=$(read_git_config_value "branch_prefix")
348
+ if [ -z "$prefix" ]; then
349
+ printf '%s\n' ""
350
+ return
351
+ fi
352
+ case "$prefix" in
353
+ */) printf '%s%s\n' "$prefix" "{number}-{slug}" ;;
354
+ *) printf '%s/%s\n' "$prefix" "{number}-{slug}" ;;
355
+ esac
356
+ }
357
+
358
+ render_branch_template() {
359
+ local template="$1"
360
+ local feature_num="$2"
361
+ local branch_suffix="$3"
362
+ local rendered="$template"
363
+ rendered=${rendered//\{author\}/$AUTHOR_TOKEN}
364
+ rendered=${rendered//\{app\}/$APP_TOKEN}
365
+ rendered=${rendered//\{number\}/$feature_num}
366
+ rendered=${rendered//\{slug\}/$branch_suffix}
367
+ printf '%s\n' "$rendered"
368
+ }
369
+
370
+ validate_branch_template() {
371
+ local template="$1"
372
+ [ -n "$template" ] || return 0
373
+ local feature_segment
374
+ feature_segment="${template##*/}"
375
+ case "$template" in
376
+ *"{number}"*) ;;
377
+ *)
378
+ >&2 echo "Error: branch_template must include the {number} token so generated branches remain valid feature branches."
379
+ exit 1
380
+ ;;
381
+ esac
382
+ case "$template" in
383
+ *"{slug}"*"{number}"*)
384
+ >&2 echo "Error: branch_template must not place {slug} before {number}; use {slug} only in the final feature segment."
385
+ exit 1
386
+ ;;
387
+ esac
388
+ case "$feature_segment" in
389
+ "{number}-"*) ;;
390
+ *)
391
+ >&2 echo "Error: branch_template must put {number}- at the start of the final path segment so generated branches remain valid feature branches."
392
+ exit 1
393
+ ;;
394
+ esac
395
+ }
396
+
397
+ build_branch_name() {
398
+ local feature_num="$1"
399
+ local branch_suffix="$2"
400
+ if [ -n "$BRANCH_TEMPLATE" ]; then
401
+ render_branch_template "$BRANCH_TEMPLATE" "$feature_num" "$branch_suffix"
402
+ else
403
+ printf '%s-%s\n' "$feature_num" "$branch_suffix"
404
+ fi
405
+ }
406
+
407
+ branch_scope_prefix() {
408
+ local template="$1"
409
+ local prefix="$template"
410
+ [ -n "$prefix" ] || return 0
411
+ case "$prefix" in
412
+ *"{number}"*) prefix="${prefix%%\{number\}*}" ;;
413
+ *"{slug}"*) prefix="${prefix%%\{slug\}*}" ;;
414
+ *) return 0 ;;
415
+ esac
416
+ render_branch_template "$prefix" "" "$BRANCH_SUFFIX"
417
+ }
418
+
419
+ extract_feature_num_from_branch() {
420
+ local branch_name="$1"
421
+ local feature_segment="${branch_name##*/}"
422
+ local match
423
+ match=$(printf '%s\n' "$feature_segment" | grep -Eo '^[0-9]{8}-[0-9]{6}-' | head -n 1 || true)
424
+ if [ -n "$match" ]; then
425
+ printf '%s\n' "$match" | sed -E 's/-$//'
426
+ return
427
+ fi
428
+ match=$(printf '%s\n' "$feature_segment" | grep -Eo '^[0-9]+-' | head -n 1 || true)
429
+ if [ -n "$match" ]; then
430
+ printf '%s\n' "$match" | sed -E 's/-$//'
431
+ return
432
+ fi
433
+ printf '%s\n' "$branch_name"
434
+ }
435
+
436
+ AUTHOR_TOKEN=$(get_author_token)
437
+ APP_TOKEN=$(get_app_token)
438
+ BRANCH_TEMPLATE=$(resolve_branch_template)
439
+ validate_branch_template "$BRANCH_TEMPLATE"
276
440
 
277
441
  # Function to generate branch name with stop word filtering
278
442
  generate_branch_name() {
@@ -318,18 +482,8 @@ generate_branch_name() {
318
482
  # Check for GIT_BRANCH_NAME env var override (exact branch name, no prefix/suffix)
319
483
  if [ -n "${GIT_BRANCH_NAME:-}" ]; then
320
484
  BRANCH_NAME="$GIT_BRANCH_NAME"
321
- # Extract FEATURE_NUM from the branch name if it starts with a numeric prefix
322
- # Check timestamp pattern first (YYYYMMDD-HHMMSS-) since it also matches the simpler ^[0-9]+ pattern
323
- if echo "$BRANCH_NAME" | grep -Eq '^[0-9]{8}-[0-9]{6}-'; then
324
- FEATURE_NUM=$(echo "$BRANCH_NAME" | grep -Eo '^[0-9]{8}-[0-9]{6}')
325
- BRANCH_SUFFIX="${BRANCH_NAME#${FEATURE_NUM}-}"
326
- elif echo "$BRANCH_NAME" | grep -Eq '^[0-9]+-'; then
327
- FEATURE_NUM=$(echo "$BRANCH_NAME" | grep -Eo '^[0-9]+')
328
- BRANCH_SUFFIX="${BRANCH_NAME#${FEATURE_NUM}-}"
329
- else
330
- FEATURE_NUM="$BRANCH_NAME"
331
- BRANCH_SUFFIX="$BRANCH_NAME"
332
- fi
485
+ FEATURE_NUM=$(extract_feature_num_from_branch "$BRANCH_NAME")
486
+ BRANCH_SUFFIX="$BRANCH_NAME"
333
487
  else
334
488
  # Generate branch name
335
489
  if [ -n "$SHORT_NAME" ]; then
@@ -347,16 +501,17 @@ else
347
501
  # Determine branch prefix
348
502
  if [ "$USE_TIMESTAMP" = true ]; then
349
503
  FEATURE_NUM=$(date +%Y%m%d-%H%M%S)
350
- BRANCH_NAME="${FEATURE_NUM}-${BRANCH_SUFFIX}"
504
+ BRANCH_NAME=$(build_branch_name "$FEATURE_NUM" "$BRANCH_SUFFIX")
351
505
  else
506
+ BRANCH_SCOPE_PREFIX=$(branch_scope_prefix "$BRANCH_TEMPLATE")
352
507
  if [ -z "$BRANCH_NUMBER" ]; then
353
508
  if [ "$DRY_RUN" = true ] && [ "$HAS_GIT" = true ]; then
354
- BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR" true)
509
+ BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR" true "$BRANCH_SCOPE_PREFIX")
355
510
  elif [ "$DRY_RUN" = true ]; then
356
511
  HIGHEST=$(get_highest_from_specs "$SPECS_DIR")
357
512
  BRANCH_NUMBER=$((HIGHEST + 1))
358
513
  elif [ "$HAS_GIT" = true ]; then
359
- BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR")
514
+ BRANCH_NUMBER=$(check_existing_branches "$SPECS_DIR" false "$BRANCH_SCOPE_PREFIX")
360
515
  else
361
516
  HIGHEST=$(get_highest_from_specs "$SPECS_DIR")
362
517
  BRANCH_NUMBER=$((HIGHEST + 1))
@@ -364,7 +519,7 @@ else
364
519
  fi
365
520
 
366
521
  FEATURE_NUM=$(printf "%03d" "$((10#$BRANCH_NUMBER))")
367
- BRANCH_NAME="${FEATURE_NUM}-${BRANCH_SUFFIX}"
522
+ BRANCH_NAME=$(build_branch_name "$FEATURE_NUM" "$BRANCH_SUFFIX")
368
523
  fi
369
524
  fi
370
525
 
@@ -376,18 +531,23 @@ if [ -n "${GIT_BRANCH_NAME:-}" ] && [ "$BRANCH_BYTE_LEN" -gt $MAX_BRANCH_LENGTH
376
531
  >&2 echo "Error: GIT_BRANCH_NAME must be 244 bytes or fewer in UTF-8. Provided value is ${BRANCH_BYTE_LEN} bytes."
377
532
  exit 1
378
533
  elif [ "$BRANCH_BYTE_LEN" -gt $MAX_BRANCH_LENGTH ]; then
379
- PREFIX_LENGTH=$(( ${#FEATURE_NUM} + 1 ))
380
- MAX_SUFFIX_LENGTH=$((MAX_BRANCH_LENGTH - PREFIX_LENGTH))
381
-
382
- TRUNCATED_SUFFIX=$(echo "$BRANCH_SUFFIX" | cut -c1-$MAX_SUFFIX_LENGTH)
383
- TRUNCATED_SUFFIX=$(echo "$TRUNCATED_SUFFIX" | sed 's/-$//')
384
-
385
534
  ORIGINAL_BRANCH_NAME="$BRANCH_NAME"
386
- BRANCH_NAME="${FEATURE_NUM}-${TRUNCATED_SUFFIX}"
535
+ TRUNCATED_SUFFIX="$BRANCH_SUFFIX"
536
+ while [ "$(_byte_length "$BRANCH_NAME")" -gt "$MAX_BRANCH_LENGTH" ] && [ -n "$TRUNCATED_SUFFIX" ]; do
537
+ TRUNCATED_SUFFIX="${TRUNCATED_SUFFIX%?}"
538
+ TRUNCATED_SUFFIX="${TRUNCATED_SUFFIX%-}"
539
+ BRANCH_NAME=$(build_branch_name "$FEATURE_NUM" "$TRUNCATED_SUFFIX")
540
+ done
541
+ if [ "$(_byte_length "$BRANCH_NAME")" -gt "$MAX_BRANCH_LENGTH" ]; then
542
+ >&2 echo "Error: Branch template prefix exceeds GitHub's 244-byte branch name limit."
543
+ exit 1
544
+ fi
387
545
 
388
546
  >&2 echo "[specify] Warning: Branch name exceeded GitHub's 244-byte limit"
389
- >&2 echo "[specify] Original: $ORIGINAL_BRANCH_NAME (${#ORIGINAL_BRANCH_NAME} bytes)"
390
- >&2 echo "[specify] Truncated to: $BRANCH_NAME (${#BRANCH_NAME} bytes)"
547
+ ORIGINAL_BRANCH_BYTE_LEN=$(_byte_length "$ORIGINAL_BRANCH_NAME")
548
+ TRUNCATED_BRANCH_BYTE_LEN=$(_byte_length "$BRANCH_NAME")
549
+ >&2 echo "[specify] Original: $ORIGINAL_BRANCH_NAME (${ORIGINAL_BRANCH_BYTE_LEN} bytes)"
550
+ >&2 echo "[specify] Truncated to: $BRANCH_NAME (${TRUNCATED_BRANCH_BYTE_LEN} bytes)"
391
551
  fi
392
552
 
393
553
  if [ "$DRY_RUN" != true ]; then
@@ -23,8 +23,9 @@ spec_kit_effective_branch_name() {
23
23
  }
24
24
 
25
25
  # Validate that a branch name matches the expected feature branch pattern.
26
- # Accepts sequential (###-* with >=3 digits) or timestamp (YYYYMMDD-HHMMSS-*) formats.
27
- # Logic aligned with scripts/bash/common.sh check_feature_branch after effective-name normalization.
26
+ # Accepts sequential (###-* with >=3 digits) or timestamp (YYYYMMDD-HHMMSS-*) formats,
27
+ # either at the start of the branch or after path-style namespace prefixes.
28
+ # Logic aligned with the git extension's PowerShell Test-FeatureBranch twin.
28
29
  check_feature_branch() {
29
30
  local raw="$1"
30
31
  local has_git_repo="$2"
@@ -37,16 +38,17 @@ check_feature_branch() {
37
38
 
38
39
  local branch
39
40
  branch=$(spec_kit_effective_branch_name "$raw")
41
+ local feature_segment="${branch##*/}"
40
42
 
41
43
  # Accept sequential prefix (3+ digits) but exclude malformed timestamps
42
44
  # Malformed: 7-or-8 digit date + 6-digit time with no trailing slug (e.g. "2026031-143022" or "20260319-143022")
43
45
  local is_sequential=false
44
- if [[ "$branch" =~ ^[0-9]{3,}- ]] && [[ ! "$branch" =~ ^[0-9]{7}-[0-9]{6}- ]] && [[ ! "$branch" =~ ^[0-9]{7,8}-[0-9]{6}$ ]]; then
46
+ if [[ "$feature_segment" =~ ^[0-9]{3,}- ]] && [[ ! "$feature_segment" =~ ^[0-9]{7}-[0-9]{6}- ]] && [[ ! "$feature_segment" =~ ^[0-9]{7,8}-[0-9]{6}$ ]]; then
45
47
  is_sequential=true
46
48
  fi
47
- if [[ "$is_sequential" != "true" ]] && [[ ! "$branch" =~ ^[0-9]{8}-[0-9]{6}- ]]; then
49
+ if [[ "$is_sequential" != "true" ]] && [[ ! "$feature_segment" =~ ^[0-9]{8}-[0-9]{6}- ]]; then
48
50
  echo "ERROR: Not on a feature branch. Current branch: $raw" >&2
49
- echo "Feature branches should be named like: 001-feature-name, 1234-feature-name, or 20260319-143022-feature-name" >&2
51
+ echo "Feature branches should be named like: 001-feature-name, 1234-feature-name, 20260319-143022-feature-name, or <prefix>/001-feature-name" >&2
50
52
  return 1
51
53
  fi
52
54