specify-cli 0.12.15__tar.gz → 0.12.16__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 (467) hide show
  1. {specify_cli-0.12.15 → specify_cli-0.12.16}/CHANGELOG.md +15 -0
  2. {specify_cli-0.12.15 → specify_cli-0.12.16}/PKG-INFO +7 -1
  3. {specify_cli-0.12.15 → specify_cli-0.12.16}/README.md +6 -0
  4. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/extensions.md +1 -0
  5. specify_cli-0.12.16/docs/install/pypi.md +83 -0
  6. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/installation.md +27 -4
  7. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/workflows.md +10 -0
  8. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/toc.yml +2 -0
  9. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/catalog.community.json +44 -4
  10. specify_cli-0.12.16/extensions/git/scripts/python/auto_commit.py +187 -0
  11. specify_cli-0.12.16/extensions/git/scripts/python/create_new_feature_branch.py +634 -0
  12. specify_cli-0.12.16/extensions/git/scripts/python/git_common.py +81 -0
  13. specify_cli-0.12.16/extensions/git/scripts/python/initialize_repo.py +89 -0
  14. {specify_cli-0.12.15 → specify_cli-0.12.16}/pyproject.toml +1 -1
  15. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/commands/init.py +27 -15
  16. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/presets/__init__.py +212 -1
  17. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/presets/_commands.py +9 -0
  18. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/base.py +3 -0
  19. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/engine.py +17 -4
  20. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/expressions.py +46 -5
  21. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/do_while/__init__.py +24 -0
  22. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/shell/__init__.py +9 -0
  23. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/while_loop/__init__.py +26 -0
  24. specify_cli-0.12.16/tests/extensions/git/test_git_extension_python_parity.py +647 -0
  25. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_cli.py +12 -0
  26. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_markdown.py +1 -0
  27. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_skills.py +1 -0
  28. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_toml.py +1 -0
  29. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_base_yaml.py +1 -0
  30. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_cline.py +1 -0
  31. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_copilot.py +3 -0
  32. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_generic.py +2 -0
  33. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_presets.py +685 -0
  34. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_workflows.py +396 -1
  35. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/README.md +7 -0
  36. {specify_cli-0.12.15 → specify_cli-0.12.16}/.devcontainer/devcontainer.json +0 -0
  37. {specify_cli-0.12.15 → specify_cli-0.12.16}/.devcontainer/post-create.sh +0 -0
  38. {specify_cli-0.12.15 → specify_cli-0.12.16}/.editorconfig +0 -0
  39. {specify_cli-0.12.15 → specify_cli-0.12.16}/.gitattributes +0 -0
  40. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/CODEOWNERS +0 -0
  41. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  42. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  43. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  44. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  45. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  46. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  47. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  48. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  49. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/aw/actions-lock.json +0 -0
  50. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/dependabot.yml +0 -0
  51. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/skills/add-community-extension/SKILL.md +0 -0
  52. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/RELEASE-PROCESS.md +0 -0
  53. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-extension.lock.yml +0 -0
  54. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-extension.md +0 -0
  55. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-preset.lock.yml +0 -0
  56. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/add-community-preset.md +0 -0
  57. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-assess.lock.yml +0 -0
  58. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-assess.md +0 -0
  59. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-fix.lock.yml +0 -0
  60. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-fix.md +0 -0
  61. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-test.lock.yml +0 -0
  62. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/bug-test.md +0 -0
  63. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/catalog-assign.yml +0 -0
  64. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/codeql.yml +0 -0
  65. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/docs.yml +0 -0
  66. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/lint.yml +0 -0
  67. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/publish-pypi.yml +0 -0
  68. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/release-trigger.yml +0 -0
  69. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/release.yml +0 -0
  70. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/stale.yml +0 -0
  71. {specify_cli-0.12.15 → specify_cli-0.12.16}/.github/workflows/test.yml +0 -0
  72. {specify_cli-0.12.15 → specify_cli-0.12.16}/.gitignore +0 -0
  73. {specify_cli-0.12.15 → specify_cli-0.12.16}/.markdownlint-cli2.jsonc +0 -0
  74. {specify_cli-0.12.15 → specify_cli-0.12.16}/.pre-commit-config.yaml +0 -0
  75. {specify_cli-0.12.15 → specify_cli-0.12.16}/.zenodo.json +0 -0
  76. {specify_cli-0.12.15 → specify_cli-0.12.16}/AGENTS.md +0 -0
  77. {specify_cli-0.12.15 → specify_cli-0.12.16}/CITATION.cff +0 -0
  78. {specify_cli-0.12.15 → specify_cli-0.12.16}/CODE_OF_CONDUCT.md +0 -0
  79. {specify_cli-0.12.15 → specify_cli-0.12.16}/CONTRIBUTING.md +0 -0
  80. {specify_cli-0.12.15 → specify_cli-0.12.16}/DEVELOPMENT.md +0 -0
  81. {specify_cli-0.12.15 → specify_cli-0.12.16}/LICENSE +0 -0
  82. {specify_cli-0.12.15 → specify_cli-0.12.16}/SECURITY.md +0 -0
  83. {specify_cli-0.12.15 → specify_cli-0.12.16}/SUPPORT.md +0 -0
  84. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/.gitignore +0 -0
  85. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/README.md +0 -0
  86. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/bundles.md +0 -0
  87. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/friends.md +0 -0
  88. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/overview.md +0 -0
  89. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/presets.md +0 -0
  90. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/community/walkthroughs.md +0 -0
  91. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/concepts/complex-features.md +0 -0
  92. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/concepts/sdd.md +0 -0
  93. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/concepts/spec-persistence.md +0 -0
  94. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/docfx.json +0 -0
  95. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/guides/evolving-specs.md +0 -0
  96. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/guides/monorepo.md +0 -0
  97. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/index.md +0 -0
  98. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/air-gapped.md +0 -0
  99. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/one-time.md +0 -0
  100. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/pipx.md +0 -0
  101. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/install/uv.md +0 -0
  102. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/local-development.md +0 -0
  103. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/quickstart.md +0 -0
  104. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/authentication.md +0 -0
  105. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/bundles.md +0 -0
  106. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/core.md +0 -0
  107. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/extensions.md +0 -0
  108. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/integrations.md +0 -0
  109. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/overview.md +0 -0
  110. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/reference/presets.md +0 -0
  111. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/template/public/main.css +0 -0
  112. {specify_cli-0.12.15 → specify_cli-0.12.16}/docs/upgrade.md +0 -0
  113. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/business-analyst/README.md +0 -0
  114. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/business-analyst/bundle.yml +0 -0
  115. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/developer/README.md +0 -0
  116. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/developer/bundle.yml +0 -0
  117. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/product-manager/README.md +0 -0
  118. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/product-manager/bundle.yml +0 -0
  119. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/security-researcher/README.md +0 -0
  120. {specify_cli-0.12.15 → specify_cli-0.12.16}/examples/bundles/security-researcher/bundle.yml +0 -0
  121. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  122. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  123. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  124. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  125. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/README.md +0 -0
  126. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  127. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/README.md +0 -0
  128. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/agent-context-config.yml +0 -0
  129. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/agent-context-defaults.json +0 -0
  130. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  131. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/extension.yml +0 -0
  132. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  133. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  134. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  135. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/README.md +0 -0
  136. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  137. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  138. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/commands/speckit.bug.test.md +0 -0
  139. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/bug/extension.yml +0 -0
  140. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/catalog.json +0 -0
  141. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/README.md +0 -0
  142. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.commit.md +0 -0
  143. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.feature.md +0 -0
  144. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.initialize.md +0 -0
  145. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.remote.md +0 -0
  146. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/commands/speckit.git.validate.md +0 -0
  147. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/config-template.yml +0 -0
  148. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/extension.yml +0 -0
  149. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/git-config.yml +0 -0
  150. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  151. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  152. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/git-common.sh +0 -0
  153. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  154. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  155. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  156. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  157. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  158. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/selftest/commands/selftest.md +0 -0
  159. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/selftest/extension.yml +0 -0
  160. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/.gitignore +0 -0
  161. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/CHANGELOG.md +0 -0
  162. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/EXAMPLE-README.md +0 -0
  163. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/LICENSE +0 -0
  164. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/README.md +0 -0
  165. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/commands/example.md +0 -0
  166. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/config-template.yml +0 -0
  167. {specify_cli-0.12.15 → specify_cli-0.12.16}/extensions/template/extension.yml +0 -0
  168. {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/CONTRIBUTING.md +0 -0
  169. {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/README.md +0 -0
  170. {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/catalog.community.json +0 -0
  171. {specify_cli-0.12.15 → specify_cli-0.12.16}/integrations/catalog.json +0 -0
  172. {specify_cli-0.12.15 → specify_cli-0.12.16}/media/bootstrap-claude-code.gif +0 -0
  173. {specify_cli-0.12.15 → specify_cli-0.12.16}/media/logo_large.webp +0 -0
  174. {specify_cli-0.12.15 → specify_cli-0.12.16}/media/logo_small.webp +0 -0
  175. {specify_cli-0.12.15 → specify_cli-0.12.16}/media/spec-kit-video-header.jpg +0 -0
  176. {specify_cli-0.12.15 → specify_cli-0.12.16}/media/specify_cli.gif +0 -0
  177. {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-April.md +0 -0
  178. {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-February.md +0 -0
  179. {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-June.md +0 -0
  180. {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-March.md +0 -0
  181. {specify_cli-0.12.15 → specify_cli-0.12.16}/newsletters/2026-May.md +0 -0
  182. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/ARCHITECTURE.md +0 -0
  183. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/PUBLISHING.md +0 -0
  184. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/README.md +0 -0
  185. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/catalog.community.json +0 -0
  186. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/catalog.json +0 -0
  187. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/README.md +0 -0
  188. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.constitution.md +0 -0
  189. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.implement.md +0 -0
  190. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.plan.md +0 -0
  191. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.specify.md +0 -0
  192. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/commands/speckit.tasks.md +0 -0
  193. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/lean/preset.yml +0 -0
  194. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/README.md +0 -0
  195. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  196. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/commands/speckit.specify.md +0 -0
  197. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/preset.yml +0 -0
  198. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/templates/myext-template.md +0 -0
  199. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/scaffold/templates/spec-template.md +0 -0
  200. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/commands/speckit.specify.md +0 -0
  201. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  202. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/preset.yml +0 -0
  203. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/checklist-template.md +0 -0
  204. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/constitution-template.md +0 -0
  205. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/plan-template.md +0 -0
  206. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/spec-template.md +0 -0
  207. {specify_cli-0.12.15 → specify_cli-0.12.16}/presets/self-test/templates/tasks-template.md +0 -0
  208. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/check-prerequisites.sh +0 -0
  209. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/common.sh +0 -0
  210. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/create-new-feature.sh +0 -0
  211. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/setup-plan.sh +0 -0
  212. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/bash/setup-tasks.sh +0 -0
  213. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/check-prerequisites.ps1 +0 -0
  214. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/common.ps1 +0 -0
  215. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/create-new-feature.ps1 +0 -0
  216. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/setup-plan.ps1 +0 -0
  217. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/powershell/setup-tasks.ps1 +0 -0
  218. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/python/check_prerequisites.py +0 -0
  219. {specify_cli-0.12.15 → specify_cli-0.12.16}/scripts/python/common.py +0 -0
  220. {specify_cli-0.12.15 → specify_cli-0.12.16}/spec-driven.md +0 -0
  221. {specify_cli-0.12.15 → specify_cli-0.12.16}/spec-kit.code-workspace +0 -0
  222. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/__init__.py +0 -0
  223. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_agent_config.py +0 -0
  224. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_assets.py +0 -0
  225. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_console.py +0 -0
  226. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_github_http.py +0 -0
  227. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_init_options.py +0 -0
  228. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_invocation_style.py +0 -0
  229. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_project.py +0 -0
  230. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_toml_string.py +0 -0
  231. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_utils.py +0 -0
  232. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/_version.py +0 -0
  233. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/agents.py +0 -0
  234. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/__init__.py +0 -0
  235. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/azure_devops.py +0 -0
  236. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/base.py +0 -0
  237. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/config.py +0 -0
  238. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/github.py +0 -0
  239. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/authentication/http.py +0 -0
  240. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/__init__.py +0 -0
  241. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  242. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  243. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/__init__.py +0 -0
  244. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/project.py +0 -0
  245. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/versioning.py +0 -0
  246. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  247. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/__init__.py +0 -0
  248. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/catalog.py +0 -0
  249. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/manifest.py +0 -0
  250. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/models/records.py +0 -0
  251. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/__init__.py +0 -0
  252. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/adapters.py +0 -0
  253. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  254. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/conflict.py +0 -0
  255. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/installer.py +0 -0
  256. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/packager.py +0 -0
  257. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/primitives.py +0 -0
  258. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/references.py +0 -0
  259. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/resolver.py +0 -0
  260. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/bundler/services/validator.py +0 -0
  261. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/catalogs.py +0 -0
  262. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/commands/__init__.py +0 -0
  263. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/commands/bundle/__init__.py +0 -0
  264. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/extensions/__init__.py +0 -0
  265. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/extensions/_commands.py +0 -0
  266. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_runtime.py +0 -0
  267. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_scaffold.py +0 -0
  268. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_state.py +0 -0
  269. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integration_status.py +0 -0
  270. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/__init__.py +0 -0
  271. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_commands.py +0 -0
  272. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_helpers.py +0 -0
  273. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_install_commands.py +0 -0
  274. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  275. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_query_commands.py +0 -0
  276. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  277. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/agy/__init__.py +0 -0
  278. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/amp/__init__.py +0 -0
  279. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  280. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/base.py +0 -0
  281. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/bob/__init__.py +0 -0
  282. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/catalog.py +0 -0
  283. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/claude/__init__.py +0 -0
  284. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/cline/__init__.py +0 -0
  285. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  286. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/codex/__init__.py +0 -0
  287. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  288. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  289. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/devin/__init__.py +0 -0
  290. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  291. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/forge/__init__.py +0 -0
  292. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  293. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/generic/__init__.py +0 -0
  294. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/goose/__init__.py +0 -0
  295. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  296. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/junie/__init__.py +0 -0
  297. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  298. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  299. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  300. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  301. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/manifest.py +0 -0
  302. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/omp/__init__.py +0 -0
  303. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  304. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/pi/__init__.py +0 -0
  305. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  306. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  307. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  308. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/shai/__init__.py +0 -0
  309. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  310. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/trae/__init__.py +0 -0
  311. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  312. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  313. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/integrations/zed/__init__.py +0 -0
  314. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/shared_infra.py +0 -0
  315. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/__init__.py +0 -0
  316. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/_commands.py +0 -0
  317. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/catalog.py +0 -0
  318. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/__init__.py +0 -0
  319. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  320. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  321. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  322. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  323. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  324. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  325. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  326. {specify_cli-0.12.15 → specify_cli-0.12.16}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  327. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/checklist-template.md +0 -0
  328. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/analyze.md +0 -0
  329. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/checklist.md +0 -0
  330. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/clarify.md +0 -0
  331. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/constitution.md +0 -0
  332. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/converge.md +0 -0
  333. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/implement.md +0 -0
  334. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/plan.md +0 -0
  335. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/specify.md +0 -0
  336. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/tasks.md +0 -0
  337. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/commands/taskstoissues.md +0 -0
  338. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/constitution-template.md +0 -0
  339. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/plan-template.md +0 -0
  340. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/spec-template.md +0 -0
  341. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/tasks-template.md +0 -0
  342. {specify_cli-0.12.15 → specify_cli-0.12.16}/templates/vscode-settings.json +0 -0
  343. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/__init__.py +0 -0
  344. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/auth_helpers.py +0 -0
  345. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/bundler_helpers.py +0 -0
  346. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/conftest.py +0 -0
  347. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/contract/test_bundle_cli.py +0 -0
  348. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/contract/test_catalog_schema.py +0 -0
  349. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/contract/test_manifest_schema.py +0 -0
  350. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/__init__.py +0 -0
  351. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/bug/__init__.py +0 -0
  352. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/bug/test_bug_extension.py +0 -0
  353. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/git/__init__.py +0 -0
  354. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/git/test_git_extension.py +0 -0
  355. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_agent_context_cli_free.py +0 -0
  356. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_extension_agent_context.py +0 -0
  357. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  358. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  359. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/TESTING.md +0 -0
  360. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/plan.md +0 -0
  361. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/spec.md +0 -0
  362. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/hooks/tasks.md +0 -0
  363. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/http_helpers.py +0 -0
  364. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_catalog_stack.py +0 -0
  365. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_init_install.py +0 -0
  366. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_install_flow.py +0 -0
  367. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_local_install.py +0 -0
  368. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_offline.py +0 -0
  369. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integration/test_bundler_security_paths.py +0 -0
  370. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/__init__.py +0 -0
  371. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/conftest.py +0 -0
  372. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_base.py +0 -0
  373. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_extra_args.py +0 -0
  374. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_home_isolation.py +0 -0
  375. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_agy.py +0 -0
  376. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_amp.py +0 -0
  377. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_auggie.py +0 -0
  378. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_bob.py +0 -0
  379. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_catalog.py +0 -0
  380. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_claude.py +0 -0
  381. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_codebuddy.py +0 -0
  382. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_codex.py +0 -0
  383. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_cursor_agent.py +0 -0
  384. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_devin.py +0 -0
  385. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_firebender.py +0 -0
  386. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_forge.py +0 -0
  387. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_gemini.py +0 -0
  388. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_goose.py +0 -0
  389. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_hermes.py +0 -0
  390. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_junie.py +0 -0
  391. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_kilocode.py +0 -0
  392. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_kimi.py +0 -0
  393. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_kiro_cli.py +0 -0
  394. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_lingma.py +0 -0
  395. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_omp.py +0 -0
  396. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_opencode.py +0 -0
  397. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_pi.py +0 -0
  398. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_qodercli.py +0 -0
  399. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_qwen.py +0 -0
  400. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_rovodev.py +0 -0
  401. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_scaffold.py +0 -0
  402. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_shai.py +0 -0
  403. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_state.py +0 -0
  404. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_subcommand.py +0 -0
  405. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_tabnine.py +0 -0
  406. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_trae.py +0 -0
  407. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_vibe.py +0 -0
  408. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_zcode.py +0 -0
  409. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_integration_zed.py +0 -0
  410. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_manifest.py +0 -0
  411. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_registry.py +0 -0
  412. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  413. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/self_upgrade_helpers.py +0 -0
  414. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_agent_config_consistency.py +0 -0
  415. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_authentication.py +0 -0
  416. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_branch_numbering.py +0 -0
  417. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_check_prerequisites_paths_only.py +0 -0
  418. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_check_prerequisites_python_parity.py +0 -0
  419. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_check_tool.py +0 -0
  420. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_cli_version.py +0 -0
  421. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_command_template_py_scripts.py +0 -0
  422. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_commands_package.py +0 -0
  423. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_console_imports.py +0 -0
  424. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extension_registration.py +0 -0
  425. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extension_skills.py +0 -0
  426. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extension_update_hardening.py +0 -0
  427. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_extensions.py +0 -0
  428. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_github_http.py +0 -0
  429. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_github_workflows.py +0 -0
  430. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_init_dir.py +0 -0
  431. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_init_dir_cli.py +0 -0
  432. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_live_transient_windows.py +0 -0
  433. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_merge.py +0 -0
  434. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_post_process.py +0 -0
  435. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_ps1_encoding.py +0 -0
  436. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_registrar_path_traversal.py +0 -0
  437. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_detection.py +0 -0
  438. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_execution.py +0 -0
  439. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_guidance.py +0 -0
  440. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_self_upgrade_verification.py +0 -0
  441. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_setup_plan_feature_json.py +0 -0
  442. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_setup_plan_no_overwrite.py +0 -0
  443. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_setup_tasks.py +0 -0
  444. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_shared_infra_integrity.py +0 -0
  445. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_timestamp_branches.py +0 -0
  446. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_upgrade.py +0 -0
  447. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_utils.py +0 -0
  448. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_utils_assets_imports.py +0 -0
  449. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_version_imports.py +0 -0
  450. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/test_workflow_run_without_project.py +0 -0
  451. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_adapters.py +0 -0
  452. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_catalog_config.py +0 -0
  453. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_conflict.py +0 -0
  454. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_packager.py +0 -0
  455. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_primitives.py +0 -0
  456. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_records.py +0 -0
  457. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_references.py +0 -0
  458. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_resolver.py +0 -0
  459. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_validator.py +0 -0
  460. {specify_cli-0.12.15 → specify_cli-0.12.16}/tests/unit/test_bundler_versioning.py +0 -0
  461. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/ARCHITECTURE.md +0 -0
  462. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/PUBLISHING.md +0 -0
  463. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/catalog.community.json +0 -0
  464. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/catalog.json +0 -0
  465. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/speckit/workflow.yml +0 -0
  466. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/step-catalog.community.json +0 -0
  467. {specify_cli-0.12.15 → specify_cli-0.12.16}/workflows/step-catalog.json +0 -0
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.12.16] - 2026-07-15
6
+
7
+ ### Changed
8
+
9
+ - fix(workflows): raise a clear error, not a cryptic crash, on non-string filter args (#3522)
10
+ - feat(workflows): expose workflow source directory to steps (#3469)
11
+ - fix(workflows): fan-out max_concurrency .inf falls back to sequential, not crash (#3521)
12
+ - Update Coding Standards Drift Control extension to v0.4.0 (#3540)
13
+ - fix(presets): seed constitution from preset constitution-template (#3272) (#3276)
14
+ - docs: add PyPI as second supported install route (#3425) (#3516)
15
+ - fix(workflows): fail while/do-while steps on non-list steps instead of crashing (#3519)
16
+ - Add PatchWarden Evidence Pack extension to community catalog (#3514)
17
+ - feat(extensions): port git extension scripts to Python (#3400)
18
+ - chore: release 0.12.15, begin 0.12.16.dev0 development (#3513)
19
+
5
20
  ## [0.12.15] - 2026-07-14
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.12.15
3
+ Version: 0.12.16
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
@@ -71,6 +71,12 @@ Requires **[uv](https://docs.astral.sh/uv/)** ([install uv](./docs/install/uv.md
71
71
  uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
72
72
  ```
73
73
 
74
+ Prefer installing from PyPI? The `specify-cli` package is also published there:
75
+
76
+ ```bash
77
+ uv tool install specify-cli
78
+ ```
79
+
74
80
  See the [Installation Guide](./docs/installation.md) for alternative methods, verification, upgrade, and troubleshooting.
75
81
 
76
82
  ### 2. Initialize a project
@@ -51,6 +51,12 @@ Requires **[uv](https://docs.astral.sh/uv/)** ([install uv](./docs/install/uv.md
51
51
  uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
52
52
  ```
53
53
 
54
+ Prefer installing from PyPI? The `specify-cli` package is also published there:
55
+
56
+ ```bash
57
+ uv tool install specify-cli
58
+ ```
59
+
54
60
  See the [Installation Guide](./docs/installation.md) for alternative methods, verification, upgrade, and troubleshooting.
55
61
 
56
62
  ### 2. Initialize a project
@@ -91,6 +91,7 @@ The following community-contributed extensions are available in [`catalog.commun
91
91
  | Optimize | Audit and optimize AI governance for context efficiency — token budgets, rule health, interpretability, compression, coherence, and echo detection | `process` | Read+Write | [spec-kit-optimize](https://github.com/sakitA/spec-kit-optimize) |
92
92
  | Orchestration Task Context Management | Adds subagent work-unit orchestration to generated Spec Kit task files | `process` | Read+Write | [spec-kit-orchestration-task-context-management](https://github.com/benizzio/spec-kit-orchestration-task-context-management) |
93
93
  | OWASP LLM Threat Model | OWASP Top 10 for LLM Applications 2025 threat analysis on agent artifacts | `code` | Read-only | [spec-kit-threatmodel](https://github.com/NaviaSamal/spec-kit-threatmodel) |
94
+ | PatchWarden Evidence Pack | Map Spec Kit tasks into a guarded PatchWarden Goal and export bounded, traceable evidence for an accepted lineage. | `process` | Read+Write | [spec-kit-patchwarden](https://github.com/jiezeng2004-design/spec-kit-patchwarden) |
94
95
  | Plan Review Gate | Require spec.md and plan.md to be merged via MR/PR before allowing task generation | `process` | Read-only | [spec-kit-plan-review-gate](https://github.com/luno/spec-kit-plan-review-gate) |
95
96
  | PR Bridge | Auto-generate pull request descriptions, checklists, and summaries from spec artifacts | `process` | Read-only | [spec-kit-pr-bridge-](https://github.com/Quratulain-bilal/spec-kit-pr-bridge-) |
96
97
  | Presetify | Create and validate presets and preset catalogs | `process` | Read+Write | [presetify](https://github.com/mnriem/spec-kit-extensions/tree/main/presetify) |
@@ -0,0 +1,83 @@
1
+ # Installing from PyPI
2
+
3
+ Spec Kit is published to PyPI as [`specify-cli`](https://pypi.org/project/specify-cli/), maintained by the Spec Kit maintainers. Installing from PyPI is the second supported install route alongside installing from the [GitHub source](../installation.md#install-from-source--persistent-installation-recommended). Use whichever fits your workflow — both provide the same `specify` CLI.
4
+
5
+ > [!NOTE]
6
+ > The PyPI release version tracks the GitHub release tags (for example, PyPI `0.12.11` corresponds to the `v0.12.11` tag). `specify version` is only a local version/runtime sanity check — it reports the installed version but not where the `specify` executable came from, so it cannot distinguish a PyPI install from a Git install. To confirm the install source, inspect the source metadata your package manager records: `pipx list --json` reports the exact install specification for each tool, and for uv/pip installs you can check the package's [PEP 610](https://peps.python.org/pep-0610/) `direct_url.json` inside its `*.dist-info` directory (a Git or URL install records the repository/archive URL there, while a plain PyPI index install does not create that file). Note that `pip show specify-cli` only prints package metadata and will not see uv/pipx-managed environments from the host interpreter.
7
+
8
+ ## Install Specify CLI
9
+
10
+ Use whichever Python tool you already have:
11
+
12
+ ```bash
13
+ # Using uv (recommended)
14
+ uv tool install specify-cli
15
+
16
+ # Or using pipx
17
+ pipx install specify-cli
18
+
19
+ # Or using pip
20
+ pip install specify-cli
21
+ ```
22
+
23
+ ### Install a specific release
24
+
25
+ Pin an exact version for reproducible installs (check [PyPI](https://pypi.org/project/specify-cli/#history) or [Releases](https://github.com/github/spec-kit/releases) for available versions):
26
+
27
+ ```bash
28
+ # Using uv
29
+ uv tool install specify-cli==0.12.11
30
+
31
+ # Or using pipx
32
+ pipx install specify-cli==0.12.11
33
+
34
+ # Or using pip
35
+ pip install specify-cli==0.12.11
36
+ ```
37
+
38
+ ## Verify
39
+
40
+ ```bash
41
+ specify version
42
+ ```
43
+
44
+ ## Initialize a project
45
+
46
+ ```bash
47
+ specify init <PROJECT_NAME> --integration copilot
48
+ ```
49
+
50
+ ## Upgrade
51
+
52
+ Upgrade by reinstalling the package through the same tool you used for the original install. If you originally pinned a version, note that `uv tool upgrade` preserves that pin; to move to the newest PyPI release, use an unpinned install command so you do not keep the existing version pin:
53
+
54
+ ```bash
55
+ # Using uv
56
+ uv tool install --force specify-cli
57
+
58
+ # Or using pipx
59
+ pipx install --force specify-cli
60
+
61
+ # Or using pip
62
+ pip install --upgrade specify-cli
63
+ ```
64
+
65
+ > [!NOTE]
66
+ > `specify self upgrade` currently rebuilds `uv tool` and `pipx` installs from the GitHub source release URL rather than preserving a PyPI-based installation. If you want to stay on the PyPI route, use the package-manager commands above. A plain `pip install specify-cli` is treated as an unmanaged install — upgrade it with `pip install --upgrade specify-cli`. See the [Upgrade Guide](../upgrade.md) for details.
67
+
68
+ ## Uninstall
69
+
70
+ ```bash
71
+ # Using uv
72
+ uv tool uninstall specify-cli
73
+
74
+ # Or using pipx
75
+ pipx uninstall specify-cli
76
+
77
+ # Or using pip
78
+ pip uninstall specify-cli
79
+ ```
80
+
81
+ ## Next steps
82
+
83
+ Head to the [Quick Start](../quickstart.md) to initialize your first project.
@@ -11,9 +11,14 @@
11
11
  ## Installation
12
12
 
13
13
  > [!IMPORTANT]
14
- > The only official, maintained packages for Spec Kit come from the [github/spec-kit](https://github.com/github/spec-kit) GitHub repository. Any packages with the same name available on PyPI (e.g. `specify-cli` on pypi.org) are **not** affiliated with this project and are not maintained by the Spec Kit maintainers. For normal installs, use the GitHub-based commands shown below. For offline or air-gapped environments, locally built wheels created from this repository are also valid.
14
+ > Spec Kit is distributed through two official channels, both published and maintained by the Spec Kit maintainers: the [github/spec-kit](https://github.com/github/spec-kit) GitHub repository (source installs) and the [`specify-cli`](https://pypi.org/project/specify-cli/) package on [PyPI](https://pypi.org/project/specify-cli/). Either route is supported for normal installs — use the commands shown below. After installing, run `specify version` as a local version/runtime sanity check. It confirms that the `specify` command is available and reports its version, but it does not prove whether the executable came from PyPI or GitHub. For offline or air-gapped environments, locally built wheels created from this repository are also valid.
15
15
 
16
- ### Persistent Installation (Recommended)
16
+ Spec Kit supports two install routes:
17
+
18
+ 1. **Install from source (GitHub)** — the recommended route, pinned to a release tag.
19
+ 2. **Install from PyPI** — install the published `specify-cli` package with your usual Python tooling.
20
+
21
+ ### Install from Source — Persistent Installation (Recommended)
17
22
 
18
23
  Install once and use everywhere. Replace `vX.Y.Z` with a release tag from [Releases](https://github.com/github/spec-kit/releases) — keep the leading `v` (for example, `v0.12.11`, not `0.12.11`):
19
24
 
@@ -30,12 +35,30 @@ Then initialize a project:
30
35
  specify init <PROJECT_NAME> --integration copilot
31
36
  ```
32
37
 
38
+ ### Install from PyPI
39
+
40
+ Spec Kit is also published to PyPI as [`specify-cli`](https://pypi.org/project/specify-cli/), so you can install it with your preferred Python package manager without referencing the Git URL:
41
+
42
+ ```bash
43
+ # Using uv (recommended)
44
+ uv tool install specify-cli
45
+
46
+ # Or using pipx
47
+ pipx install specify-cli
48
+
49
+ # Or using pip
50
+ pip install specify-cli
51
+ ```
52
+
53
+ To install a specific release, pin the version — for example `uv tool install specify-cli==0.12.11`. See the [PyPI installation guide](install/pypi.md) for details, including how to upgrade.
54
+
33
55
  ### One-time Usage
34
56
 
35
57
  Run directly without installing — see the [One-time usage (uvx)](install/one-time.md) guide.
36
58
 
37
59
  ### Alternative Package Managers
38
60
 
61
+ - **PyPI** — see the [PyPI installation guide](install/pypi.md)
39
62
  - **pipx** — see the [pipx installation guide](install/pipx.md)
40
63
  - **Enterprise / Air-Gapped** — see the [air-gapped installation guide](install/air-gapped.md)
41
64
 
@@ -81,13 +104,13 @@ specify init <project_name> --integration claude --ignore-agent-tools
81
104
 
82
105
  ## Verification
83
106
 
84
- After installation, run the following command to confirm the correct version is installed:
107
+ After installation, run the following command as a local version/runtime check:
85
108
 
86
109
  ```bash
87
110
  specify version
88
111
  ```
89
112
 
90
- This helps verify you are running the official Spec Kit build from GitHub, not an unrelated package with the same name.
113
+ This confirms that the `specify` command is available and reporting the expected version. It does not prove whether that executable came from PyPI or GitHub.
91
114
 
92
115
  **Stay current:** Run `specify self check` periodically to learn whether a newer release is available — it is read-only and never modifies your installation. When you are ready to upgrade, follow the [Upgrade Guide](./upgrade.md).
93
116
 
@@ -305,6 +305,8 @@ Steps can reference inputs and previous step outputs using `{{ expression }}` sy
305
305
  | `inputs.spec` | Workflow input values |
306
306
  | `steps.specify.output.file` | Output from a previous step |
307
307
  | `item` | Current item in a fan-out iteration |
308
+ | `context.run_id` | Current workflow run ID |
309
+ | `context.workflow_dir` | Resolved absolute path to the workflow source directory. Empty string for string-loaded workflows. |
308
310
 
309
311
  Available filters: `default`, `join`, `contains`, `map`, `from_json`.
310
312
 
@@ -316,6 +318,14 @@ args: "{{ inputs.spec }}"
316
318
  message: "{{ status | default('pending') }}"
317
319
  ```
318
320
 
321
+ ## Shell Step Environment Variables
322
+
323
+ Shell steps automatically receive the following environment variables:
324
+
325
+ | Variable | Description |
326
+ | -------- | ----------- |
327
+ | `SPECKIT_WORKFLOW_DIR` | Resolved absolute path to the workflow source directory (same value as `{{ context.workflow_dir }}`). Not set when the workflow has no source path. |
328
+
319
329
  ## Input Types
320
330
 
321
331
  | Type | Coercion |
@@ -13,6 +13,8 @@
13
13
  href: upgrade.md
14
14
  - name: Install uv
15
15
  href: install/uv.md
16
+ - name: Install from PyPI
17
+ href: install/pypi.md
16
18
  - name: Install with pipx
17
19
  href: install/pipx.md
18
20
  - name: One-time Usage (uvx)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-07-13T00:00:00Z",
3
+ "updated_at": "2026-07-15T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
5
5
  "extensions": {
6
6
  "aide": {
@@ -809,8 +809,8 @@
809
809
  "id": "coding-standards-drift-control",
810
810
  "description": "Generate coding-standards drift reports and remediation tasks for active Spec Kit features",
811
811
  "author": "Igor Benicio de Mesquita",
812
- "version": "0.3.1",
813
- "download_url": "https://github.com/benizzio/spec-kit-coding-standards-drift-control/archive/refs/tags/v0.3.1.zip",
812
+ "version": "0.4.0",
813
+ "download_url": "https://github.com/benizzio/spec-kit-coding-standards-drift-control/archive/refs/tags/v0.4.0.zip",
814
814
  "repository": "https://github.com/benizzio/spec-kit-coding-standards-drift-control",
815
815
  "homepage": "https://github.com/benizzio/spec-kit-coding-standards-drift-control",
816
816
  "documentation": "https://github.com/benizzio/spec-kit-coding-standards-drift-control#readme",
@@ -835,7 +835,7 @@
835
835
  "downloads": 0,
836
836
  "stars": 0,
837
837
  "created_at": "2026-06-11T00:00:00Z",
838
- "updated_at": "2026-06-11T00:00:00Z"
838
+ "updated_at": "2026-07-15T00:00:00Z"
839
839
  },
840
840
  "companion": {
841
841
  "name": "SpecKit Companion",
@@ -2677,6 +2677,46 @@
2677
2677
  "created_at": "2026-04-24T14:00:00Z",
2678
2678
  "updated_at": "2026-04-24T14:00:00Z"
2679
2679
  },
2680
+ "patchwarden-evidence": {
2681
+ "name": "PatchWarden Evidence Pack",
2682
+ "id": "patchwarden-evidence",
2683
+ "description": "Map Spec Kit tasks into a guarded PatchWarden Goal and export bounded, traceable evidence for an accepted lineage.",
2684
+ "author": "Zengjie",
2685
+ "version": "1.0.1",
2686
+ "download_url": "https://github.com/jiezeng2004-design/spec-kit-patchwarden/archive/refs/tags/v1.0.1.zip",
2687
+ "repository": "https://github.com/jiezeng2004-design/spec-kit-patchwarden",
2688
+ "homepage": "https://github.com/jiezeng2004-design/spec-kit-patchwarden",
2689
+ "documentation": "https://github.com/jiezeng2004-design/spec-kit-patchwarden/blob/main/README.md",
2690
+ "changelog": "https://github.com/jiezeng2004-design/spec-kit-patchwarden/blob/main/CHANGELOG.md",
2691
+ "license": "MIT",
2692
+ "category": "process",
2693
+ "effect": "read-write",
2694
+ "requires": {
2695
+ "speckit_version": ">=0.1.0",
2696
+ "tools": [
2697
+ {
2698
+ "name": "patchwarden",
2699
+ "version": ">=1.5.1",
2700
+ "required": true
2701
+ }
2702
+ ]
2703
+ },
2704
+ "provides": {
2705
+ "commands": 2,
2706
+ "hooks": 2
2707
+ },
2708
+ "tags": [
2709
+ "verification",
2710
+ "evidence",
2711
+ "traceability",
2712
+ "security"
2713
+ ],
2714
+ "verified": false,
2715
+ "downloads": 0,
2716
+ "stars": 0,
2717
+ "created_at": "2026-07-14T00:00:00Z",
2718
+ "updated_at": "2026-07-14T00:00:00Z"
2719
+ },
2680
2720
  "plan-review-gate": {
2681
2721
  "name": "Plan Review Gate",
2682
2722
  "id": "plan-review-gate",
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env python3
2
+ """Git extension: auto_commit.py
3
+
4
+ Automatically commit changes after a Spec Kit command completes.
5
+ Python port of ``auto-commit.sh`` / ``auto-commit.ps1``.
6
+ Checks per-command config keys in git-config.yml before committing.
7
+
8
+ Usage: auto_commit.py <event_name>
9
+ e.g.: auto_commit.py after_specify
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import re
15
+ import shutil
16
+ import subprocess
17
+ import sys
18
+ from pathlib import Path
19
+
20
+
21
+ def _find_project_root(start: Path) -> Path | None:
22
+ current = start
23
+ while True:
24
+ if (current / ".specify").is_dir() or (current / ".git").exists():
25
+ return current
26
+ if current.parent == current:
27
+ return None
28
+ current = current.parent
29
+
30
+
31
+ def _value_after_colon(line: str) -> str:
32
+ return re.sub(r"^[^:]*:\s*", "", line)
33
+
34
+
35
+ def _strip_quotes(value: str) -> str:
36
+ """Strip one leading quote and all trailing quotes, mirroring the bash sed."""
37
+ value = re.sub(r"^[\"']", "", value)
38
+ return re.sub(r"[\"']*$", "", value)
39
+
40
+
41
+ def _parse_auto_commit_config(
42
+ config_file: Path, event_name: str
43
+ ) -> tuple[bool, str]:
44
+ """Parse the auto_commit section for this event, mirroring the bash line parser.
45
+
46
+ Returns (enabled, commit_msg). Looks for auto_commit.<event_name>.enabled
47
+ and .message, with auto_commit.default as fallback.
48
+ """
49
+ enabled = False
50
+ commit_msg = ""
51
+ default_enabled = False
52
+ in_auto_commit = False
53
+ in_event = False
54
+
55
+ try:
56
+ content = config_file.read_text(encoding="utf-8")
57
+ except (OSError, UnicodeDecodeError):
58
+ # Unreadable or non-UTF-8 config is treated like a missing one:
59
+ # auto-commit stays disabled instead of crashing with a traceback.
60
+ return False, ""
61
+ for record in content.splitlines(keepends=True):
62
+ if not record.endswith("\n"):
63
+ break
64
+ line = record[:-1]
65
+ if line.startswith("auto_commit:"):
66
+ in_auto_commit = True
67
+ in_event = False
68
+ continue
69
+
70
+ # Exit auto_commit section on next top-level key
71
+ if in_auto_commit and re.match(r"^[a-z]", line):
72
+ break
73
+
74
+ if not in_auto_commit:
75
+ continue
76
+
77
+ if re.match(r"^\s+default:\s", line):
78
+ value = re.sub(r"\s", "", _value_after_colon(line)).lower()
79
+ if value == "true":
80
+ default_enabled = True
81
+
82
+ if re.match(rf"^\s+{re.escape(event_name)}:", line):
83
+ in_event = True
84
+ continue
85
+
86
+ if in_event:
87
+ # Exit on next sibling key (same indent level as event name)
88
+ if re.match(r"^\s{2}[a-z]", line) and not re.match(r"^\s{4}", line):
89
+ in_event = False
90
+ continue
91
+ if re.search(r"\s+enabled:", line):
92
+ value = re.sub(r"\s", "", _value_after_colon(line)).lower()
93
+ if value == "true":
94
+ enabled = True
95
+ elif value == "false":
96
+ enabled = False
97
+ if re.search(r"\s+message:", line):
98
+ commit_msg = _strip_quotes(_value_after_colon(line))
99
+
100
+ # If event-specific key not found, use default — but only if the event
101
+ # section didn't exist at all (an explicit false must win).
102
+ if not enabled and default_enabled:
103
+ if not re.search(rf"^\s*{re.escape(event_name)}:", content, re.MULTILINE):
104
+ enabled = True
105
+
106
+ return enabled, commit_msg
107
+
108
+
109
+ def main(argv: list[str]) -> int:
110
+ event_name = argv[0] if argv else ""
111
+ if not event_name:
112
+ print(f"Usage: {Path(sys.argv[0]).name} <event_name>", file=sys.stderr)
113
+ return 1
114
+
115
+ script_dir = Path(__file__).resolve().parent
116
+ repo_root = _find_project_root(script_dir) or Path.cwd()
117
+
118
+ if shutil.which("git") is None:
119
+ print("[specify] Warning: Git not found; skipped auto-commit", file=sys.stderr)
120
+ return 0
121
+
122
+ probe = subprocess.run(
123
+ ["git", "rev-parse", "--is-inside-work-tree"],
124
+ cwd=repo_root,
125
+ capture_output=True,
126
+ text=True,
127
+ )
128
+ if probe.returncode != 0:
129
+ print(
130
+ "[specify] Warning: Not a Git repository; skipped auto-commit",
131
+ file=sys.stderr,
132
+ )
133
+ return 0
134
+
135
+ config_file = repo_root / ".specify" / "extensions" / "git" / "git-config.yml"
136
+ if not config_file.is_file():
137
+ # No config file — auto-commit disabled by default
138
+ return 0
139
+
140
+ enabled, commit_msg = _parse_auto_commit_config(config_file, event_name)
141
+ if not enabled:
142
+ return 0
143
+
144
+ # Check if there are changes to commit
145
+ def _quiet(*args: str) -> bool:
146
+ return (
147
+ subprocess.run(
148
+ ["git", *args], cwd=repo_root, capture_output=True, text=True
149
+ ).returncode
150
+ == 0
151
+ )
152
+
153
+ untracked = subprocess.run(
154
+ ["git", "ls-files", "--others", "--exclude-standard"],
155
+ cwd=repo_root,
156
+ capture_output=True,
157
+ text=True,
158
+ ).stdout.strip()
159
+ if _quiet("diff", "--quiet", "HEAD") and _quiet("diff", "--cached", "--quiet") and not untracked:
160
+ print(f"[specify] No changes to commit after {event_name}", file=sys.stderr)
161
+ return 0
162
+
163
+ # Derive a human-readable command name from the event
164
+ # e.g., after_specify -> specify, before_plan -> plan
165
+ command_name = re.sub(r"^(after_|before_)", "", event_name)
166
+ phase = "before" if event_name.startswith("before_") else "after"
167
+
168
+ if not commit_msg:
169
+ commit_msg = f"[Spec Kit] Auto-commit {phase} {command_name}"
170
+
171
+ steps = [
172
+ (["git", "add", "."], "git add"),
173
+ (["git", "commit", "-q", "-m", commit_msg], "git commit"),
174
+ ]
175
+ for cmd, label in steps:
176
+ result = subprocess.run(cmd, cwd=repo_root, capture_output=True, text=True)
177
+ if result.returncode != 0:
178
+ output = (result.stdout + result.stderr).strip()
179
+ print(f"[specify] Error: {label} failed: {output}", file=sys.stderr)
180
+ return 1
181
+
182
+ print(f"[OK] Changes committed {phase} {command_name}", file=sys.stderr)
183
+ return 0
184
+
185
+
186
+ if __name__ == "__main__":
187
+ raise SystemExit(main(sys.argv[1:]))