specify-cli 0.14.4__tar.gz → 0.15.0__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 (528) hide show
  1. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/scripts/check_security_requirements.py +10 -2
  2. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/security.yml +1 -1
  3. {specify_cli-0.14.4 → specify_cli-0.15.0}/CHANGELOG.md +28 -0
  4. {specify_cli-0.14.4 → specify_cli-0.15.0}/PKG-INFO +1 -1
  5. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/extensions.md +1 -0
  6. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/catalog.community.json +35 -1
  7. {specify_cli-0.14.4 → specify_cli-0.15.0}/pyproject.toml +1 -1
  8. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/__init__.py +5 -0
  9. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_version.py +13 -2
  10. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/agents.py +13 -1
  11. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/manifest.py +26 -10
  12. specify_cli-0.15.0/src/specify_cli/commands/event.py +39 -0
  13. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/commands/init.py +8 -0
  14. specify_cli-0.15.0/src/specify_cli/events.py +2096 -0
  15. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/extensions/__init__.py +77 -13
  16. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/extensions/_commands.py +47 -0
  17. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_helpers.py +8 -3
  18. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_install_commands.py +9 -0
  19. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_migrate_commands.py +17 -0
  20. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/base.py +65 -2
  21. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/claude/__init__.py +11 -0
  22. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/codex/__init__.py +16 -3
  23. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/copilot/__init__.py +36 -8
  24. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/cursor_agent/__init__.py +16 -3
  25. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/devin/__init__.py +21 -2
  26. specify_cli-0.15.0/src/specify_cli/integrations/gemini/__init__.py +40 -0
  27. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/manifest.py +13 -1
  28. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/opencode/__init__.py +9 -0
  29. specify_cli-0.15.0/src/specify_cli/integrations/qwen/__init__.py +38 -0
  30. specify_cli-0.15.0/src/specify_cli/integrations/tabnine/__init__.py +41 -0
  31. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/presets/__init__.py +2 -2
  32. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/presets/_commands.py +68 -25
  33. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/prompt/__init__.py +59 -0
  34. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/shell/__init__.py +14 -6
  35. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_manifest_schema.py +39 -0
  36. specify_cli-0.15.0/tests/integrations/test_events.py +2226 -0
  37. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_copilot.py +15 -0
  38. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_subcommand.py +62 -0
  39. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_manifest.py +28 -0
  40. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extension_skills.py +129 -0
  41. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extensions.py +92 -1
  42. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_presets.py +284 -0
  43. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_security_workflow.py +21 -5
  44. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_verification.py +20 -0
  45. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_workflows.py +191 -3
  46. specify_cli-0.15.0/workflows/catalog.community.json +50 -0
  47. specify_cli-0.14.4/src/specify_cli/integrations/gemini/__init__.py +0 -21
  48. specify_cli-0.14.4/src/specify_cli/integrations/qwen/__init__.py +0 -21
  49. specify_cli-0.14.4/src/specify_cli/integrations/tabnine/__init__.py +0 -21
  50. specify_cli-0.14.4/workflows/catalog.community.json +0 -27
  51. {specify_cli-0.14.4 → specify_cli-0.15.0}/.devcontainer/devcontainer.json +0 -0
  52. {specify_cli-0.14.4 → specify_cli-0.15.0}/.devcontainer/post-create.sh +0 -0
  53. {specify_cli-0.14.4 → specify_cli-0.15.0}/.editorconfig +0 -0
  54. {specify_cli-0.14.4 → specify_cli-0.15.0}/.gitattributes +0 -0
  55. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/CODEOWNERS +0 -0
  56. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  57. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  58. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  59. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  60. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  61. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  62. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  63. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  64. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/aw/actions-lock.json +0 -0
  65. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/dependabot.yml +0 -0
  66. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/security-audit-requirements.txt +0 -0
  67. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/skills/add-community-extension/SKILL.md +0 -0
  68. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/RELEASE-PROCESS.md +0 -0
  69. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-bundle.lock.yml +0 -0
  70. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-bundle.md +0 -0
  71. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-extension.lock.yml +0 -0
  72. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-extension.md +0 -0
  73. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-preset.lock.yml +0 -0
  74. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/add-community-preset.md +0 -0
  75. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-assess.lock.yml +0 -0
  76. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-assess.md +0 -0
  77. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-fix.lock.yml +0 -0
  78. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-fix.md +0 -0
  79. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-test.lock.yml +0 -0
  80. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/bug-test.md +0 -0
  81. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/catalog-assign.yml +0 -0
  82. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/codeql.yml +0 -0
  83. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/docs.yml +0 -0
  84. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/lint.yml +0 -0
  85. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/publish-pypi.yml +0 -0
  86. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/release-trigger.yml +0 -0
  87. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/release.yml +0 -0
  88. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/stale.yml +0 -0
  89. {specify_cli-0.14.4 → specify_cli-0.15.0}/.github/workflows/test.yml +0 -0
  90. {specify_cli-0.14.4 → specify_cli-0.15.0}/.gitignore +0 -0
  91. {specify_cli-0.14.4 → specify_cli-0.15.0}/.markdownlint-cli2.jsonc +0 -0
  92. {specify_cli-0.14.4 → specify_cli-0.15.0}/.pre-commit-config.yaml +0 -0
  93. {specify_cli-0.14.4 → specify_cli-0.15.0}/.zenodo.json +0 -0
  94. {specify_cli-0.14.4 → specify_cli-0.15.0}/AGENTS.md +0 -0
  95. {specify_cli-0.14.4 → specify_cli-0.15.0}/CITATION.cff +0 -0
  96. {specify_cli-0.14.4 → specify_cli-0.15.0}/CODE_OF_CONDUCT.md +0 -0
  97. {specify_cli-0.14.4 → specify_cli-0.15.0}/CONTRIBUTING.md +0 -0
  98. {specify_cli-0.14.4 → specify_cli-0.15.0}/DEVELOPMENT.md +0 -0
  99. {specify_cli-0.14.4 → specify_cli-0.15.0}/LICENSE +0 -0
  100. {specify_cli-0.14.4 → specify_cli-0.15.0}/README.md +0 -0
  101. {specify_cli-0.14.4 → specify_cli-0.15.0}/README.zh-CN.md +0 -0
  102. {specify_cli-0.14.4 → specify_cli-0.15.0}/SECURITY.md +0 -0
  103. {specify_cli-0.14.4 → specify_cli-0.15.0}/SUPPORT.md +0 -0
  104. {specify_cli-0.14.4 → specify_cli-0.15.0}/bundles/catalog.community.json +0 -0
  105. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/.gitignore +0 -0
  106. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/README.md +0 -0
  107. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/bundles.md +0 -0
  108. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/friends.md +0 -0
  109. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/overview.md +0 -0
  110. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/presets.md +0 -0
  111. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/community/walkthroughs.md +0 -0
  112. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/complex-features.md +0 -0
  113. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/sdd.md +0 -0
  114. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/spec-of-specs.md +0 -0
  115. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/concepts/spec-persistence.md +0 -0
  116. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/docfx.json +0 -0
  117. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/guides/evolving-specs.md +0 -0
  118. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/guides/monorepo.md +0 -0
  119. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/index.md +0 -0
  120. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/air-gapped.md +0 -0
  121. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/one-time.md +0 -0
  122. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/pipx.md +0 -0
  123. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/pypi.md +0 -0
  124. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/install/uv.md +0 -0
  125. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/installation.md +0 -0
  126. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/local-development.md +0 -0
  127. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/quickstart.md +0 -0
  128. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/agentic-bugfix.md +0 -0
  129. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/agentic-sdd.md +0 -0
  130. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/authentication.md +0 -0
  131. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/bundles.md +0 -0
  132. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/core.md +0 -0
  133. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/extensions.md +0 -0
  134. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/integrations.md +0 -0
  135. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/overview.md +0 -0
  136. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/presets.md +0 -0
  137. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/reference/workflows.md +0 -0
  138. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/template/public/main.css +0 -0
  139. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/toc.yml +0 -0
  140. {specify_cli-0.14.4 → specify_cli-0.15.0}/docs/upgrade.md +0 -0
  141. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/business-analyst/README.md +0 -0
  142. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/business-analyst/bundle.yml +0 -0
  143. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/developer/README.md +0 -0
  144. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/developer/bundle.yml +0 -0
  145. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/product-manager/README.md +0 -0
  146. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/product-manager/bundle.yml +0 -0
  147. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/security-researcher/README.md +0 -0
  148. {specify_cli-0.14.4 → specify_cli-0.15.0}/examples/bundles/security-researcher/bundle.yml +0 -0
  149. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  150. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  151. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  152. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  153. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/README.md +0 -0
  154. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  155. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/README.md +0 -0
  156. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/agent-context-config.yml +0 -0
  157. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/agent-context-defaults.json +0 -0
  158. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  159. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/extension.yml +0 -0
  160. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  161. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  162. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  163. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/README.md +0 -0
  164. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.decide.md +0 -0
  165. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.define.md +0 -0
  166. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.intake.md +0 -0
  167. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.research.md +0 -0
  168. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/commands/speckit.assess.shape.md +0 -0
  169. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/assess/extension.yml +0 -0
  170. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/README.md +0 -0
  171. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  172. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  173. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/commands/speckit.bug.test.md +0 -0
  174. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/bug/extension.yml +0 -0
  175. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/catalog.json +0 -0
  176. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/README.md +0 -0
  177. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.commit.md +0 -0
  178. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.feature.md +0 -0
  179. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.initialize.md +0 -0
  180. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.remote.md +0 -0
  181. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/commands/speckit.git.validate.md +0 -0
  182. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/config-template.yml +0 -0
  183. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/extension.yml +0 -0
  184. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/git-config.yml +0 -0
  185. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  186. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  187. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/git-common.sh +0 -0
  188. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  189. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  190. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  191. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  192. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  193. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/auto_commit.py +0 -0
  194. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
  195. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/git_common.py +0 -0
  196. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/git/scripts/python/initialize_repo.py +0 -0
  197. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/selftest/commands/selftest.md +0 -0
  198. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/selftest/extension.yml +0 -0
  199. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/.gitignore +0 -0
  200. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/CHANGELOG.md +0 -0
  201. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/EXAMPLE-README.md +0 -0
  202. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/LICENSE +0 -0
  203. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/README.md +0 -0
  204. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/commands/example.md +0 -0
  205. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/config-template.yml +0 -0
  206. {specify_cli-0.14.4 → specify_cli-0.15.0}/extensions/template/extension.yml +0 -0
  207. {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/CONTRIBUTING.md +0 -0
  208. {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/README.md +0 -0
  209. {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/catalog.community.json +0 -0
  210. {specify_cli-0.14.4 → specify_cli-0.15.0}/integrations/catalog.json +0 -0
  211. {specify_cli-0.14.4 → specify_cli-0.15.0}/media/bootstrap-claude-code.gif +0 -0
  212. {specify_cli-0.14.4 → specify_cli-0.15.0}/media/logo_large.webp +0 -0
  213. {specify_cli-0.14.4 → specify_cli-0.15.0}/media/logo_small.webp +0 -0
  214. {specify_cli-0.14.4 → specify_cli-0.15.0}/media/spec-kit-video-header.jpg +0 -0
  215. {specify_cli-0.14.4 → specify_cli-0.15.0}/media/specify_cli.gif +0 -0
  216. {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-April.md +0 -0
  217. {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-February.md +0 -0
  218. {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-June.md +0 -0
  219. {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-March.md +0 -0
  220. {specify_cli-0.14.4 → specify_cli-0.15.0}/newsletters/2026-May.md +0 -0
  221. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/ARCHITECTURE.md +0 -0
  222. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/PUBLISHING.md +0 -0
  223. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/README.md +0 -0
  224. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/catalog.community.json +0 -0
  225. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/catalog.json +0 -0
  226. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/README.md +0 -0
  227. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.constitution.md +0 -0
  228. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.implement.md +0 -0
  229. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.plan.md +0 -0
  230. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.specify.md +0 -0
  231. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/commands/speckit.tasks.md +0 -0
  232. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/lean/preset.yml +0 -0
  233. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/README.md +0 -0
  234. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  235. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/commands/speckit.specify.md +0 -0
  236. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/preset.yml +0 -0
  237. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/templates/myext-template.md +0 -0
  238. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/scaffold/templates/spec-template.md +0 -0
  239. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/commands/speckit.specify.md +0 -0
  240. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  241. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/preset.yml +0 -0
  242. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/checklist-template.md +0 -0
  243. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/constitution-template.md +0 -0
  244. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/plan-template.md +0 -0
  245. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/spec-template.md +0 -0
  246. {specify_cli-0.14.4 → specify_cli-0.15.0}/presets/self-test/templates/tasks-template.md +0 -0
  247. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/check-prerequisites.sh +0 -0
  248. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/common.sh +0 -0
  249. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/create-new-feature.sh +0 -0
  250. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/setup-plan.sh +0 -0
  251. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/bash/setup-tasks.sh +0 -0
  252. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/check-prerequisites.ps1 +0 -0
  253. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/common.ps1 +0 -0
  254. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/create-new-feature.ps1 +0 -0
  255. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/setup-plan.ps1 +0 -0
  256. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/powershell/setup-tasks.ps1 +0 -0
  257. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/check_prerequisites.py +0 -0
  258. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/common.py +0 -0
  259. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/create_new_feature.py +0 -0
  260. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/setup_plan.py +0 -0
  261. {specify_cli-0.14.4 → specify_cli-0.15.0}/scripts/python/setup_tasks.py +0 -0
  262. {specify_cli-0.14.4 → specify_cli-0.15.0}/spec-driven.md +0 -0
  263. {specify_cli-0.14.4 → specify_cli-0.15.0}/spec-kit.code-workspace +0 -0
  264. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_agent_config.py +0 -0
  265. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_assets.py +0 -0
  266. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_console.py +0 -0
  267. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_download_security.py +0 -0
  268. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_github_http.py +0 -0
  269. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_init_options.py +0 -0
  270. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_invocation_style.py +0 -0
  271. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_project.py +0 -0
  272. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_toml_string.py +0 -0
  273. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/_utils.py +0 -0
  274. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/__init__.py +0 -0
  275. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/azure_devops.py +0 -0
  276. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/base.py +0 -0
  277. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/config.py +0 -0
  278. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/github.py +0 -0
  279. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/authentication/http.py +0 -0
  280. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/__init__.py +0 -0
  281. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  282. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  283. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/__init__.py +0 -0
  284. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/project.py +0 -0
  285. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/versioning.py +0 -0
  286. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  287. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/__init__.py +0 -0
  288. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/catalog.py +0 -0
  289. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/models/records.py +0 -0
  290. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/__init__.py +0 -0
  291. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/adapters.py +0 -0
  292. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  293. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/conflict.py +0 -0
  294. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/installer.py +0 -0
  295. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/packager.py +0 -0
  296. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/primitives.py +0 -0
  297. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/references.py +0 -0
  298. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/resolver.py +0 -0
  299. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/bundler/services/validator.py +0 -0
  300. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/catalogs.py +0 -0
  301. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/commands/__init__.py +0 -0
  302. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/commands/bundle/__init__.py +0 -0
  303. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_runtime.py +0 -0
  304. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_scaffold.py +0 -0
  305. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_state.py +0 -0
  306. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integration_status.py +0 -0
  307. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/__init__.py +0 -0
  308. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_commands.py +0 -0
  309. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_query_commands.py +0 -0
  310. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  311. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/agy/__init__.py +0 -0
  312. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
  313. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/amp/__init__.py +0 -0
  314. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  315. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/bob/__init__.py +0 -0
  316. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/catalog.py +0 -0
  317. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/cline/__init__.py +0 -0
  318. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  319. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/droid/__init__.py +0 -0
  320. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  321. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/forge/__init__.py +0 -0
  322. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/generic/__init__.py +0 -0
  323. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/goose/__init__.py +0 -0
  324. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/grok/__init__.py +0 -0
  325. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  326. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/junie/__init__.py +0 -0
  327. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  328. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  329. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  330. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  331. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/omp/__init__.py +0 -0
  332. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/pi/__init__.py +0 -0
  333. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  334. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  335. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/shai/__init__.py +0 -0
  336. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/trae/__init__.py +0 -0
  337. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  338. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  339. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/integrations/zed/__init__.py +0 -0
  340. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/shared_infra.py +0 -0
  341. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/__init__.py +0 -0
  342. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/_commands.py +0 -0
  343. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/base.py +0 -0
  344. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/catalog.py +0 -0
  345. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/engine.py +0 -0
  346. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/expressions.py +0 -0
  347. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/__init__.py +0 -0
  348. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/_commands.py +0 -0
  349. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/composer.py +0 -0
  350. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
  351. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/merge.py +0 -0
  352. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/overlays/schema.py +0 -0
  353. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/__init__.py +0 -0
  354. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  355. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  356. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  357. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  358. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  359. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  360. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  361. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  362. {specify_cli-0.14.4 → specify_cli-0.15.0}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  363. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/checklist-template.md +0 -0
  364. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/analyze.md +0 -0
  365. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/checklist.md +0 -0
  366. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/clarify.md +0 -0
  367. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/constitution.md +0 -0
  368. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/converge.md +0 -0
  369. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/implement.md +0 -0
  370. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/plan.md +0 -0
  371. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/specify.md +0 -0
  372. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/tasks.md +0 -0
  373. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/commands/taskstoissues.md +0 -0
  374. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/constitution-template.md +0 -0
  375. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/plan-template.md +0 -0
  376. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/spec-template.md +0 -0
  377. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/tasks-template.md +0 -0
  378. {specify_cli-0.14.4 → specify_cli-0.15.0}/templates/vscode-settings.json +0 -0
  379. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/__init__.py +0 -0
  380. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/auth_helpers.py +0 -0
  381. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/bundler_helpers.py +0 -0
  382. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/conftest.py +0 -0
  383. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_bundle_cli.py +0 -0
  384. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_catalog_schema.py +0 -0
  385. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
  386. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/__init__.py +0 -0
  387. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/assess/__init__.py +0 -0
  388. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/assess/test_assess_extension.py +0 -0
  389. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/bug/__init__.py +0 -0
  390. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/bug/test_bug_extension.py +0 -0
  391. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/git/__init__.py +0 -0
  392. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/git/test_git_extension.py +0 -0
  393. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
  394. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_agent_context_cli_free.py +0 -0
  395. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_extension_agent_context.py +0 -0
  396. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  397. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  398. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/TESTING.md +0 -0
  399. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/plan.md +0 -0
  400. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/spec.md +0 -0
  401. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/hooks/tasks.md +0 -0
  402. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/http_helpers.py +0 -0
  403. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_catalog_stack.py +0 -0
  404. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_init_install.py +0 -0
  405. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_install_flow.py +0 -0
  406. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_local_install.py +0 -0
  407. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_offline.py +0 -0
  408. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integration/test_bundler_security_paths.py +0 -0
  409. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/__init__.py +0 -0
  410. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/conftest.py +0 -0
  411. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_base.py +0 -0
  412. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_cli.py +0 -0
  413. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_extra_args.py +0 -0
  414. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_home_isolation.py +0 -0
  415. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_agy.py +0 -0
  416. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_alquimia.py +0 -0
  417. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_amp.py +0 -0
  418. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_auggie.py +0 -0
  419. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_markdown.py +0 -0
  420. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_skills.py +0 -0
  421. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_toml.py +0 -0
  422. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_base_yaml.py +0 -0
  423. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_bob.py +0 -0
  424. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_catalog.py +0 -0
  425. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_claude.py +0 -0
  426. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_cline.py +0 -0
  427. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_codebuddy.py +0 -0
  428. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_codex.py +0 -0
  429. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_cursor_agent.py +0 -0
  430. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_devin.py +0 -0
  431. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_droid.py +0 -0
  432. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_firebender.py +0 -0
  433. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_forge.py +0 -0
  434. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_gemini.py +0 -0
  435. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_generic.py +0 -0
  436. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_goose.py +0 -0
  437. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_grok.py +0 -0
  438. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_hermes.py +0 -0
  439. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_junie.py +0 -0
  440. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_kilocode.py +0 -0
  441. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_kimi.py +0 -0
  442. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_kiro_cli.py +0 -0
  443. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_lingma.py +0 -0
  444. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_omp.py +0 -0
  445. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_opencode.py +0 -0
  446. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_pi.py +0 -0
  447. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_qodercli.py +0 -0
  448. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_qwen.py +0 -0
  449. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_rovodev.py +0 -0
  450. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_scaffold.py +0 -0
  451. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_shai.py +0 -0
  452. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_state.py +0 -0
  453. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_tabnine.py +0 -0
  454. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_trae.py +0 -0
  455. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_vibe.py +0 -0
  456. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_zcode.py +0 -0
  457. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_integration_zed.py +0 -0
  458. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_registry.py +0 -0
  459. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  460. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/parity_helpers.py +0 -0
  461. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/self_upgrade_helpers.py +0 -0
  462. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_agent_config_consistency.py +0 -0
  463. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_authentication.py +0 -0
  464. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_branch_numbering.py +0 -0
  465. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_check_prerequisites_paths_only.py +0 -0
  466. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_check_prerequisites_python_parity.py +0 -0
  467. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_check_tool.py +0 -0
  468. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_cli_version.py +0 -0
  469. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_command_template_py_scripts.py +0 -0
  470. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_commands_package.py +0 -0
  471. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_console_imports.py +0 -0
  472. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_create_new_feature_python_parity.py +0 -0
  473. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_download_security.py +0 -0
  474. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extension_registration.py +0 -0
  475. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_extension_update_hardening.py +0 -0
  476. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_github_http.py +0 -0
  477. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_github_workflows.py +0 -0
  478. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_init_dir.py +0 -0
  479. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_init_dir_cli.py +0 -0
  480. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_live_transient_windows.py +0 -0
  481. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_merge.py +0 -0
  482. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_post_process.py +0 -0
  483. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_ps1_encoding.py +0 -0
  484. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_registrar_path_traversal.py +0 -0
  485. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_detection.py +0 -0
  486. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_execution.py +0 -0
  487. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_self_upgrade_guidance.py +0 -0
  488. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_plan_feature_json.py +0 -0
  489. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_plan_no_overwrite.py +0 -0
  490. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_plan_python_parity.py +0 -0
  491. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_tasks.py +0 -0
  492. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_setup_tasks_python_parity.py +0 -0
  493. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_shared_infra_integrity.py +0 -0
  494. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_skill_placeholder_py.py +0 -0
  495. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_specify_template_numbering.py +0 -0
  496. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_timestamp_branches.py +0 -0
  497. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_upgrade.py +0 -0
  498. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_utils.py +0 -0
  499. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_utils_assets_imports.py +0 -0
  500. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_version_imports.py +0 -0
  501. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/test_workflow_run_without_project.py +0 -0
  502. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundle_download_url.py +0 -0
  503. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_adapters.py +0 -0
  504. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_catalog_config.py +0 -0
  505. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_conflict.py +0 -0
  506. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_packager.py +0 -0
  507. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_primitives.py +0 -0
  508. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_records.py +0 -0
  509. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_references.py +0 -0
  510. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_resolver.py +0 -0
  511. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_validator.py +0 -0
  512. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_versioning.py +0 -0
  513. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/unit/test_bundler_yamlio.py +0 -0
  514. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/conftest.py +0 -0
  515. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_commands.py +0 -0
  516. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_composer.py +0 -0
  517. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_layer_sources.py +0 -0
  518. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_merge.py +0 -0
  519. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_schema.py +0 -0
  520. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_overlay_security.py +0 -0
  521. {specify_cli-0.14.4 → specify_cli-0.15.0}/tests/workflows/test_resolver_integration.py +0 -0
  522. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/ARCHITECTURE.md +0 -0
  523. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/PUBLISHING.md +0 -0
  524. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/README.md +0 -0
  525. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/catalog.json +0 -0
  526. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/speckit/workflow.yml +0 -0
  527. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/step-catalog.community.json +0 -0
  528. {specify_cli-0.14.4 → specify_cli-0.15.0}/workflows/step-catalog.json +0 -0
@@ -29,12 +29,20 @@ def _dependency_diff_refs() -> tuple[str, str]:
29
29
  def _dependency_inputs_changed() -> bool:
30
30
  base_ref, head_ref = _dependency_diff_refs()
31
31
  try:
32
+ merge_base = subprocess.run(
33
+ ["git", "merge-base", base_ref, head_ref],
34
+ check=True,
35
+ cwd=REPO_ROOT,
36
+ stderr=subprocess.PIPE,
37
+ stdout=subprocess.PIPE,
38
+ text=True,
39
+ ).stdout.strip()
32
40
  result = subprocess.run(
33
41
  [
34
42
  "git",
35
43
  "diff",
36
44
  "--name-only",
37
- base_ref,
45
+ merge_base,
38
46
  head_ref,
39
47
  "--",
40
48
  *DEPENDENCY_INPUTS,
@@ -77,6 +85,7 @@ def main() -> int:
77
85
 
78
86
  generated_requirements = Path(generated_requirements_env)
79
87
  generated_requirements.parent.mkdir(parents=True, exist_ok=True)
88
+ generated_requirements.write_bytes(COMMITTED_REQUIREMENTS.read_bytes())
80
89
 
81
90
  subprocess.run(
82
91
  [
@@ -87,7 +96,6 @@ def main() -> int:
87
96
  "--extra",
88
97
  "test",
89
98
  "--universal",
90
- "--upgrade",
91
99
  "--generate-hashes",
92
100
  "--quiet",
93
101
  "--no-header",
@@ -34,7 +34,7 @@ jobs:
34
34
  - name: Check committed audit requirements are current
35
35
  env:
36
36
  DEPENDENCY_DIFF_BASE: ${{ github.event.pull_request.base.sha || github.event.before || '' }}
37
- DEPENDENCY_DIFF_HEAD: ${{ github.sha }}
37
+ DEPENDENCY_DIFF_HEAD: ${{ github.event.pull_request.head.sha || github.sha }}
38
38
  GENERATED_REQUIREMENTS: ${{ runner.temp }}/security-audit-requirements.txt
39
39
  run: python .github/scripts/check_security_requirements.py
40
40
 
@@ -2,6 +2,34 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.15.0] - 2026-07-30
6
+
7
+ ### Changed
8
+
9
+ - Add yolo to community workflow catalog (#3864)
10
+ - fix(workflows): guard the shell step's timeout check against OverflowError (#3865)
11
+ - Add Intent Reconciliation extension to community catalog (#3858)
12
+ - fix(workflows): validate prompt step 'timeout' like the shell step (#3847)
13
+ - fix: add utf-8 encoding to registry file open calls (#3816)
14
+ - fix: eliminate TOCTOU race in file unlink calls (#3815)
15
+ - test(workflows): name the condition-rejection tests for the real boundary (#3808)
16
+ - fix: eliminate TOCTOU race in file unlink calls (#3811)
17
+ - fix(presets): escape user-supplied catalog name/URL in add/remove output (#3806)
18
+ - fix: add missing utf-8 encoding to registry file open calls (#3810)
19
+ - [bug-fix] Fix upgrade-overwrites-copilot-skills: pass force=True to extension skill re-registration after upgrade (#3853)
20
+ - fix(integrations): don't abort uninstall when the manifest can't be deleted (#3805)
21
+ - test(extensions): update stale manifest validation message assertion (#3859)
22
+ - fix(agents): coerce a non-string description in TOML command rendering (#3799)
23
+ - fix(workflows): make security requirements sync deterministic (#3832)
24
+ - fix(cli): render the literal [suffix] in --tag help and rejection message (#3800)
25
+ - fix(integrations): preserve non-UTF-8 VS Code settings (#3833)
26
+ - fix(bundler): treat an explicit-null manifest field as missing, not the text "None" (#3798)
27
+ - feat: first-class agent-native runtime hooks for integrations (#3704)
28
+ - fix(extensions): guard the required manifest sections so one bad extension cannot break `extension list` (#3797)
29
+ - fix(presets): escape installed preset metadata in Rich output (#3826)
30
+ - fix(workflows): dispatch prompt steps via the resolved executable (#3793)
31
+ - chore: release 0.14.4, begin 0.14.5.dev0 development (#3850)
32
+
5
33
  ## [0.14.4] - 2026-07-29
6
34
 
7
35
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.14.4
3
+ Version: 0.15.0
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
@@ -66,6 +66,7 @@ The following community-contributed extensions are available in [`catalog.commun
66
66
  | Improve Extension | Audits any codebase as a senior advisor and writes prioritized, self-contained spec prompts under specs/ that the spec-kit lifecycle can process | `process` | Read+Write | [spec-kit-improve](https://github.com/d0whc3r/spec-kit-improve) |
67
67
  | Intake | Normalize PRD, design, HTML SSOT, and test-case evidence into SDD-ready intake artifacts. | `docs` | Read+Write | [spec-kit-intake](https://github.com/bigsmartben/spec-kit-intake) |
68
68
  | Intelligent Agent Orchestrator | Cross-catalog agent discovery and intelligent prompt-to-command routing | `process` | Read+Write | [spec-kit-orchestrator](https://github.com/pragya247/spec-kit-orchestrator) |
69
+ | Intent Reconciliation | Reconcile implementation-discovered decisions against approved feature intent | `process` | Read+Write | [spec-kit-reconcile](https://github.com/SuhaibAslam/spec-kit-reconcile) |
69
70
  | Iterate | Iterate on spec documents with a two-phase define-and-apply workflow — refine specs mid-implementation and go straight back to building | `docs` | Read+Write | [spec-kit-iterate](https://github.com/imviancagrace/spec-kit-iterate) |
70
71
  | Jira Integration | Create Jira Epics, Stories, and Issues from spec-kit specifications and task breakdowns with configurable hierarchy and custom field support | `integration` | Read+Write | [spec-kit-jira](https://github.com/mbachorik/spec-kit-jira) |
71
72
  | Jira Integration (Sync Engine) | Idempotent, drift-aware, fail-closed reconcile engine mirroring spec-kit specs into Jira (Epic per repo, Story per spec, Subtask per phase) | `integration` | Read+Write | [spec-kit-jira-sync](https://github.com/ashbrener/spec-kit-jira-sync) |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-07-28T00:00:00Z",
3
+ "updated_at": "2026-07-29T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
5
5
  "extensions": {
6
6
  "aide": {
@@ -1861,6 +1861,40 @@
1861
1861
  "created_at": "2026-06-23T00:00:00Z",
1862
1862
  "updated_at": "2026-06-30T00:00:00Z"
1863
1863
  },
1864
+ "intent": {
1865
+ "name": "Intent Reconciliation",
1866
+ "id": "intent",
1867
+ "description": "Reconcile implementation-discovered decisions against approved feature intent",
1868
+ "author": "SuhaibAslam",
1869
+ "version": "1.0.2",
1870
+ "download_url": "https://github.com/SuhaibAslam/spec-kit-reconcile/archive/refs/tags/v1.0.2.zip",
1871
+ "repository": "https://github.com/SuhaibAslam/spec-kit-reconcile",
1872
+ "homepage": "https://github.com/SuhaibAslam/spec-kit-reconcile",
1873
+ "documentation": "https://github.com/SuhaibAslam/spec-kit-reconcile/blob/main/README.md",
1874
+ "changelog": "https://github.com/SuhaibAslam/spec-kit-reconcile/blob/main/CHANGELOG.md",
1875
+ "license": "MIT",
1876
+ "category": "process",
1877
+ "effect": "read-write",
1878
+ "requires": {
1879
+ "speckit_version": ">=0.12.0"
1880
+ },
1881
+ "provides": {
1882
+ "commands": 3,
1883
+ "hooks": 0
1884
+ },
1885
+ "tags": [
1886
+ "intent",
1887
+ "decisions",
1888
+ "reconciliation",
1889
+ "drift",
1890
+ "workflow"
1891
+ ],
1892
+ "verified": false,
1893
+ "downloads": 0,
1894
+ "stars": 0,
1895
+ "created_at": "2026-07-29T00:00:00Z",
1896
+ "updated_at": "2026-07-29T00:00:00Z"
1897
+ },
1864
1898
  "issue": {
1865
1899
  "name": "GitHub Issues Integration 2",
1866
1900
  "id": "issue",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.14.4"
3
+ version = "0.15.0"
4
4
  description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -514,6 +514,11 @@ _register_extension_cmds(app)
514
514
  from .integrations._commands import register as _register_integration_cmds # noqa: E402
515
515
  _register_integration_cmds(app)
516
516
 
517
+
518
+ # ===== Event Commands =====
519
+ from .commands.event import register as _register_event_cmds # noqa: E402
520
+ _register_event_cmds(app)
521
+
517
522
  # Re-export selected helpers to preserve the public import surface.
518
523
  from .integrations._helpers import ( # noqa: E402
519
524
  _clear_init_options_for_integration as _clear_init_options_for_integration,
@@ -27,6 +27,7 @@ from pathlib import Path
27
27
 
28
28
  import typer
29
29
  from packaging.version import InvalidVersion, Version
30
+ from rich.markup import escape as _escape_markup
30
31
 
31
32
  from ._download_security import MAX_JSON_METADATA_BYTES, read_response_limited
32
33
  from ._console import console
@@ -1230,7 +1231,10 @@ def self_upgrade(
1230
1231
  tag: str | None = typer.Option(
1231
1232
  None,
1232
1233
  "--tag",
1233
- help="Pin the target version (vX.Y.Z[suffix]). Without --tag, the "
1234
+ # Typer renders help through Rich, so escape the literal bracket (\[)
1235
+ # or `[suffix]` is parsed as a style tag and dropped -- `--help` then
1236
+ # advertises only `(vX.Y.Z)`, contradicting docs/upgrade.md and README.
1237
+ help="Pin the target version (vX.Y.Z\\[suffix]). Without --tag, the "
1234
1238
  "latest stable release is resolved via GitHub Releases.",
1235
1239
  ),
1236
1240
  ) -> None:
@@ -1270,7 +1274,14 @@ def self_upgrade(
1270
1274
  try:
1271
1275
  tag = _validate_tag(tag)
1272
1276
  except typer.BadParameter as exc:
1273
- console.print(str(exc), soft_wrap=True)
1277
+ # Escape at the print site rather than baking `\[` into
1278
+ # _INVALID_TAG_MESSAGE: the message is also raised through
1279
+ # typer.BadParameter, which Click renders without Rich, so the
1280
+ # constant must stay plain text. Unescaped, Rich parses the literal
1281
+ # `[suffix]` as a style tag and drops it, leaving the user with
1282
+ # "expected vMAJOR.MINOR.PATCH" -- implying a bare vX.Y.Z is the only
1283
+ # accepted form when -rc1 / .dev0 / +build.42 are all valid.
1284
+ console.print(_escape_markup(str(exc)), soft_wrap=True)
1274
1285
  raise typer.Exit(1) from exc
1275
1286
 
1276
1287
  plan, failure_reason = _build_upgrade_plan(target_tag_override=tag)
@@ -302,8 +302,20 @@ class CommandRegistrar:
302
302
  toml_lines = []
303
303
 
304
304
  if "description" in frontmatter:
305
+ # Frontmatter comes from ``yaml.safe_load``, so ``description`` can
306
+ # be any YAML type: ``description:`` with no value yields None,
307
+ # ``description: 2`` an int, an unquoted ``true`` a bool.
308
+ # ``_render_basic_toml_string`` iterates the value and calls ord()
309
+ # on each character, so a non-string raises a raw TypeError -- and a
310
+ # list of single-character items is silently concatenated into a
311
+ # wrong value (``["a", "b"]`` -> ``"ab"``). Coerce first, matching
312
+ # ``render_yaml_command`` below and ``TomlIntegration
313
+ # ._extract_description``, which both normalise it already.
314
+ description = frontmatter["description"]
315
+ if not isinstance(description, str):
316
+ description = str(description) if description is not None else ""
305
317
  toml_lines.append(
306
- f"description = {self._render_basic_toml_string(frontmatter['description'])}"
318
+ f"description = {self._render_basic_toml_string(description)}"
307
319
  )
308
320
  toml_lines.append("")
309
321
 
@@ -96,19 +96,19 @@ class BundleManifest:
96
96
  if not isinstance(data, dict):
97
97
  raise BundlerError("Manifest must be a YAML mapping at the top level.")
98
98
 
99
- schema_version = str(data.get("schema_version", "")).strip()
99
+ schema_version = _text(data.get("schema_version"))
100
100
 
101
101
  bundle_raw = data.get("bundle")
102
102
  if not isinstance(bundle_raw, dict):
103
103
  raise BundlerError("Manifest is missing the required 'bundle' mapping.")
104
104
  meta = BundleMeta(
105
- id=str(bundle_raw.get("id", "")).strip(),
106
- name=str(bundle_raw.get("name", "")).strip(),
107
- version=str(bundle_raw.get("version", "")).strip(),
108
- role=str(bundle_raw.get("role", "")).strip(),
109
- description=str(bundle_raw.get("description", "")).strip(),
110
- author=str(bundle_raw.get("author", "")).strip(),
111
- license=str(bundle_raw.get("license", "")).strip(),
105
+ id=_text(bundle_raw.get("id")),
106
+ name=_text(bundle_raw.get("name")),
107
+ version=_text(bundle_raw.get("version")),
108
+ role=_text(bundle_raw.get("role")),
109
+ description=_text(bundle_raw.get("description")),
110
+ author=_text(bundle_raw.get("author")),
111
+ license=_text(bundle_raw.get("license")),
112
112
  )
113
113
 
114
114
  requires_raw = data.get("requires")
@@ -117,7 +117,7 @@ class BundleManifest:
117
117
  elif not isinstance(requires_raw, dict):
118
118
  raise BundlerError("'requires' must be a mapping when present.")
119
119
  requires = Requires(
120
- speckit_version=str(requires_raw.get("speckit_version", "")).strip(),
120
+ speckit_version=_text(requires_raw.get("speckit_version")),
121
121
  tools=_parse_str_list(requires_raw.get("tools"), "requires.tools"),
122
122
  mcp=_parse_str_list(requires_raw.get("mcp"), "requires.mcp"),
123
123
  )
@@ -220,6 +220,22 @@ class BundleManifest:
220
220
  return self.integration is None
221
221
 
222
222
 
223
+ def _text(raw: Any) -> str:
224
+ """Coerce a manifest scalar into stripped text, mapping an explicit null to ``""``.
225
+
226
+ A ``.get(key, "")`` default only covers a *missing* key. A key that is
227
+ present but null -- how YAML spells an empty field (``author:`` with nothing
228
+ after it) -- yields ``None``, and ``str(None)`` is the literal ``"None"``.
229
+ That text is non-empty, so it sailed past the ``if not value`` required-field
230
+ checks in :meth:`BundleManifest.structural_errors`: an empty required field
231
+ was silently accepted and the bundle shipped ``"None"`` as its
232
+ author/license/description.
233
+ """
234
+ if raw is None:
235
+ return ""
236
+ return str(raw).strip()
237
+
238
+
223
239
  def _parse_str_list(raw: Any, field_name: str) -> tuple[str, ...]:
224
240
  """Coerce a manifest list-of-strings field into a tuple of strings.
225
241
 
@@ -247,7 +263,7 @@ def _parse_refs(kind: str, raw: Any) -> list[ComponentRef]:
247
263
  refs.append(
248
264
  ComponentRef(
249
265
  kind=kind,
250
- id=str(item.get("id", "")).strip(),
266
+ id=_text(item.get("id")),
251
267
  version=(str(item["version"]).strip() if item.get("version") else None),
252
268
  source=(str(item["source"]).strip() if item.get("source") else None),
253
269
  priority=priority,
@@ -0,0 +1,39 @@
1
+ """specify event * command handlers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ import sys
7
+ import typer
8
+
9
+ event_app = typer.Typer(
10
+ name="event",
11
+ help="Manage and execute event-driven commands",
12
+ add_completion=False,
13
+ )
14
+
15
+
16
+ @event_app.command("run")
17
+ def event_run(
18
+ command_name: str = typer.Argument(..., help="Name of the command to execute"),
19
+ event_name: str = typer.Argument(..., help="Canonical event name (e.g., session_start)"),
20
+ timeout: int = typer.Argument(
21
+ 120, help="Per-handler timeout in seconds (passed through from the native hook config)"
22
+ ),
23
+ ):
24
+ """Resolve and run an event-driven command script with stdin payload."""
25
+ from ..events import resolve_and_run_event_command
26
+
27
+ # Read payload from stdin if available
28
+ payload = sys.stdin.read() if not sys.stdin.isatty() else "{}"
29
+
30
+ # Run the event command
31
+ project_root = Path.cwd() # The agent runs events from project root
32
+ exit_code = resolve_and_run_event_command(
33
+ command_name, event_name, payload, project_root, timeout=timeout
34
+ )
35
+ raise typer.Exit(code=exit_code)
36
+
37
+
38
+ def register(app: typer.Typer) -> None:
39
+ app.add_typer(event_app, name="event")
@@ -443,12 +443,20 @@ def register(app: typer.Typer) -> None:
443
443
  if extra:
444
444
  integration_parsed_options.update(extra)
445
445
 
446
+ from ..events import resolve_events
447
+ events_map = resolve_events(
448
+ resolved_integration.key,
449
+ resolved_integration.config,
450
+ project_path,
451
+ integration_parsed_options or None,
452
+ )
446
453
  resolved_integration.setup(
447
454
  project_path,
448
455
  manifest,
449
456
  parsed_options=integration_parsed_options or None,
450
457
  script_type=selected_script,
451
458
  raw_options=integration_options,
459
+ events=events_map,
452
460
  )
453
461
  manifest.save()
454
462