specify-cli 0.11.10__tar.gz → 0.12.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 (450) hide show
  1. {specify_cli-0.11.10 → specify_cli-0.12.0}/AGENTS.md +8 -11
  2. {specify_cli-0.11.10 → specify_cli-0.12.0}/CHANGELOG.md +15 -0
  3. {specify_cli-0.11.10 → specify_cli-0.12.0}/PKG-INFO +1 -1
  4. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/workflows.md +1 -0
  5. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/agent-context/README.md +8 -7
  6. specify_cli-0.12.0/extensions/agent-context/agent-context-defaults.json +42 -0
  7. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/agent-context/scripts/bash/update-agent-context.sh +108 -16
  8. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +90 -0
  9. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/catalog.community.json +5 -5
  10. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +3 -2
  11. {specify_cli-0.11.10 → specify_cli-0.12.0}/pyproject.toml +1 -1
  12. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/powershell/common.ps1 +7 -1
  13. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/powershell/create-new-feature.ps1 +4 -0
  14. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/__init__.py +1 -77
  15. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/agents.py +0 -31
  16. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/commands/init.py +0 -44
  17. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integration_scaffold.py +1 -7
  18. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/_helpers.py +6 -56
  19. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/agy/__init__.py +0 -1
  20. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/amp/__init__.py +0 -1
  21. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/auggie/__init__.py +0 -1
  22. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/base.py +16 -549
  23. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/bob/__init__.py +0 -1
  24. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/claude/__init__.py +0 -1
  25. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/cline/__init__.py +0 -1
  26. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/codebuddy/__init__.py +0 -1
  27. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/codex/__init__.py +0 -1
  28. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/copilot/__init__.py +0 -7
  29. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -1
  30. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/devin/__init__.py +0 -1
  31. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/firebender/__init__.py +2 -3
  32. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/forge/__init__.py +0 -5
  33. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/gemini/__init__.py +0 -1
  34. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/generic/__init__.py +0 -5
  35. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/goose/__init__.py +0 -1
  36. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/hermes/__init__.py +1 -9
  37. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/iflow/__init__.py +0 -1
  38. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/junie/__init__.py +0 -1
  39. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/kilocode/__init__.py +0 -1
  40. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/kimi/__init__.py +3 -121
  41. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -1
  42. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/lingma/__init__.py +0 -1
  43. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/omp/__init__.py +0 -1
  44. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/opencode/__init__.py +0 -1
  45. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/pi/__init__.py +0 -1
  46. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/qodercli/__init__.py +0 -1
  47. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/qwen/__init__.py +0 -1
  48. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/roo/__init__.py +0 -1
  49. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/rovodev/__init__.py +1 -3
  50. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/shai/__init__.py +0 -1
  51. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/tabnine/__init__.py +0 -1
  52. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/trae/__init__.py +0 -1
  53. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/vibe/__init__.py +0 -1
  54. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/windsurf/__init__.py +0 -1
  55. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/zcode/__init__.py +0 -1
  56. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/zed/__init__.py +0 -1
  57. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/engine.py +34 -0
  58. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/expressions.py +7 -5
  59. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/gate/__init__.py +8 -1
  60. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/plan.md +2 -5
  61. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/extensions/git/test_git_extension.py +36 -0
  62. specify_cli-0.12.0/tests/extensions/test_agent_context_cli_free.py +57 -0
  63. specify_cli-0.12.0/tests/extensions/test_extension_agent_context.py +873 -0
  64. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/conftest.py +0 -1
  65. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_base.py +0 -1
  66. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_cli.py +5 -12
  67. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_extra_args.py +0 -5
  68. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_agy.py +0 -1
  69. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_amp.py +0 -1
  70. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_auggie.py +0 -1
  71. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_base_markdown.py +27 -74
  72. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_base_skills.py +30 -57
  73. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_base_toml.py +27 -73
  74. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_base_yaml.py +27 -73
  75. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_bob.py +0 -1
  76. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_claude.py +16 -48
  77. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_cline.py +0 -16
  78. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_codebuddy.py +0 -1
  79. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_codex.py +24 -50
  80. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_copilot.py +12 -50
  81. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_cursor_agent.py +0 -78
  82. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_devin.py +0 -1
  83. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_firebender.py +0 -1
  84. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_forge.py +8 -12
  85. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_gemini.py +0 -1
  86. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_generic.py +9 -57
  87. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_goose.py +0 -1
  88. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_hermes.py +3 -8
  89. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_iflow.py +0 -1
  90. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_junie.py +0 -1
  91. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_kilocode.py +0 -1
  92. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_kimi.py +0 -207
  93. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_kiro_cli.py +0 -1
  94. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_lingma.py +0 -1
  95. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_omp.py +0 -1
  96. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_opencode.py +0 -1
  97. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_pi.py +0 -1
  98. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_qodercli.py +0 -1
  99. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_qwen.py +0 -1
  100. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_roo.py +0 -1
  101. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_rovodev.py +2 -11
  102. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_shai.py +0 -1
  103. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_tabnine.py +0 -1
  104. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_trae.py +0 -1
  105. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_vibe.py +0 -1
  106. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_windsurf.py +0 -1
  107. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_zcode.py +0 -1
  108. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_zed.py +0 -1
  109. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_registry.py +0 -43
  110. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_setup_tasks.py +51 -0
  111. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_timestamp_branches.py +21 -0
  112. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_workflows.py +160 -0
  113. specify_cli-0.11.10/tests/extensions/test_extension_agent_context.py +0 -1235
  114. {specify_cli-0.11.10 → specify_cli-0.12.0}/.devcontainer/devcontainer.json +0 -0
  115. {specify_cli-0.11.10 → specify_cli-0.12.0}/.devcontainer/post-create.sh +0 -0
  116. {specify_cli-0.11.10 → specify_cli-0.12.0}/.editorconfig +0 -0
  117. {specify_cli-0.11.10 → specify_cli-0.12.0}/.gitattributes +0 -0
  118. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/CODEOWNERS +0 -0
  119. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  120. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  121. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  122. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  123. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  124. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  125. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  126. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  127. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/aw/actions-lock.json +0 -0
  128. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/dependabot.yml +0 -0
  129. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/skills/add-community-extension/SKILL.md +0 -0
  130. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/RELEASE-PROCESS.md +0 -0
  131. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/add-community-extension.lock.yml +0 -0
  132. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/add-community-extension.md +0 -0
  133. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/add-community-preset.lock.yml +0 -0
  134. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/add-community-preset.md +0 -0
  135. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/bug-assess.lock.yml +0 -0
  136. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/bug-assess.md +0 -0
  137. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/catalog-assign.yml +0 -0
  138. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/codeql.yml +0 -0
  139. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/docs.yml +0 -0
  140. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/lint.yml +0 -0
  141. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/publish-pypi.yml +0 -0
  142. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/release-trigger.yml +0 -0
  143. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/release.yml +0 -0
  144. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/stale.yml +0 -0
  145. {specify_cli-0.11.10 → specify_cli-0.12.0}/.github/workflows/test.yml +0 -0
  146. {specify_cli-0.11.10 → specify_cli-0.12.0}/.gitignore +0 -0
  147. {specify_cli-0.11.10 → specify_cli-0.12.0}/.markdownlint-cli2.jsonc +0 -0
  148. {specify_cli-0.11.10 → specify_cli-0.12.0}/.zenodo.json +0 -0
  149. {specify_cli-0.11.10 → specify_cli-0.12.0}/CITATION.cff +0 -0
  150. {specify_cli-0.11.10 → specify_cli-0.12.0}/CODE_OF_CONDUCT.md +0 -0
  151. {specify_cli-0.11.10 → specify_cli-0.12.0}/CONTRIBUTING.md +0 -0
  152. {specify_cli-0.11.10 → specify_cli-0.12.0}/DEVELOPMENT.md +0 -0
  153. {specify_cli-0.11.10 → specify_cli-0.12.0}/LICENSE +0 -0
  154. {specify_cli-0.11.10 → specify_cli-0.12.0}/README.md +0 -0
  155. {specify_cli-0.11.10 → specify_cli-0.12.0}/SECURITY.md +0 -0
  156. {specify_cli-0.11.10 → specify_cli-0.12.0}/SUPPORT.md +0 -0
  157. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/.gitignore +0 -0
  158. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/README.md +0 -0
  159. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/community/bundles.md +0 -0
  160. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/community/extensions.md +0 -0
  161. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/community/friends.md +0 -0
  162. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/community/overview.md +0 -0
  163. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/community/presets.md +0 -0
  164. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/community/walkthroughs.md +0 -0
  165. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/concepts/complex-features.md +0 -0
  166. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/concepts/sdd.md +0 -0
  167. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/concepts/spec-persistence.md +0 -0
  168. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/docfx.json +0 -0
  169. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/guides/evolving-specs.md +0 -0
  170. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/guides/monorepo.md +0 -0
  171. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/index.md +0 -0
  172. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/install/air-gapped.md +0 -0
  173. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/install/one-time.md +0 -0
  174. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/install/pipx.md +0 -0
  175. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/install/uv.md +0 -0
  176. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/installation.md +0 -0
  177. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/local-development.md +0 -0
  178. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/quickstart.md +0 -0
  179. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/authentication.md +0 -0
  180. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/bundles.md +0 -0
  181. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/core.md +0 -0
  182. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/extensions.md +0 -0
  183. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/integrations.md +0 -0
  184. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/overview.md +0 -0
  185. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/reference/presets.md +0 -0
  186. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/template/public/main.css +0 -0
  187. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/toc.yml +0 -0
  188. {specify_cli-0.11.10 → specify_cli-0.12.0}/docs/upgrade.md +0 -0
  189. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/business-analyst/README.md +0 -0
  190. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/business-analyst/bundle.yml +0 -0
  191. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/developer/README.md +0 -0
  192. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/developer/bundle.yml +0 -0
  193. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/product-manager/README.md +0 -0
  194. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/product-manager/bundle.yml +0 -0
  195. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/security-researcher/README.md +0 -0
  196. {specify_cli-0.11.10 → specify_cli-0.12.0}/examples/bundles/security-researcher/bundle.yml +0 -0
  197. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  198. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  199. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  200. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  201. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/README.md +0 -0
  202. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  203. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/agent-context/agent-context-config.yml +0 -0
  204. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  205. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/agent-context/extension.yml +0 -0
  206. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/bug/README.md +0 -0
  207. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  208. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  209. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/bug/commands/speckit.bug.test.md +0 -0
  210. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/bug/extension.yml +0 -0
  211. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/catalog.json +0 -0
  212. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/README.md +0 -0
  213. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/commands/speckit.git.commit.md +0 -0
  214. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/commands/speckit.git.feature.md +0 -0
  215. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/commands/speckit.git.initialize.md +0 -0
  216. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/commands/speckit.git.remote.md +0 -0
  217. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/commands/speckit.git.validate.md +0 -0
  218. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/config-template.yml +0 -0
  219. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/extension.yml +0 -0
  220. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/git-config.yml +0 -0
  221. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  222. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  223. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/bash/git-common.sh +0 -0
  224. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  225. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  226. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  227. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  228. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/selftest/commands/selftest.md +0 -0
  229. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/selftest/extension.yml +0 -0
  230. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/.gitignore +0 -0
  231. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/CHANGELOG.md +0 -0
  232. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/EXAMPLE-README.md +0 -0
  233. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/LICENSE +0 -0
  234. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/README.md +0 -0
  235. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/commands/example.md +0 -0
  236. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/config-template.yml +0 -0
  237. {specify_cli-0.11.10 → specify_cli-0.12.0}/extensions/template/extension.yml +0 -0
  238. {specify_cli-0.11.10 → specify_cli-0.12.0}/integrations/CONTRIBUTING.md +0 -0
  239. {specify_cli-0.11.10 → specify_cli-0.12.0}/integrations/README.md +0 -0
  240. {specify_cli-0.11.10 → specify_cli-0.12.0}/integrations/catalog.community.json +0 -0
  241. {specify_cli-0.11.10 → specify_cli-0.12.0}/integrations/catalog.json +0 -0
  242. {specify_cli-0.11.10 → specify_cli-0.12.0}/media/bootstrap-claude-code.gif +0 -0
  243. {specify_cli-0.11.10 → specify_cli-0.12.0}/media/logo_large.webp +0 -0
  244. {specify_cli-0.11.10 → specify_cli-0.12.0}/media/logo_small.webp +0 -0
  245. {specify_cli-0.11.10 → specify_cli-0.12.0}/media/spec-kit-video-header.jpg +0 -0
  246. {specify_cli-0.11.10 → specify_cli-0.12.0}/media/specify_cli.gif +0 -0
  247. {specify_cli-0.11.10 → specify_cli-0.12.0}/newsletters/2026-April.md +0 -0
  248. {specify_cli-0.11.10 → specify_cli-0.12.0}/newsletters/2026-February.md +0 -0
  249. {specify_cli-0.11.10 → specify_cli-0.12.0}/newsletters/2026-March.md +0 -0
  250. {specify_cli-0.11.10 → specify_cli-0.12.0}/newsletters/2026-May.md +0 -0
  251. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/ARCHITECTURE.md +0 -0
  252. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/PUBLISHING.md +0 -0
  253. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/README.md +0 -0
  254. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/catalog.community.json +0 -0
  255. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/catalog.json +0 -0
  256. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/README.md +0 -0
  257. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/commands/speckit.constitution.md +0 -0
  258. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/commands/speckit.implement.md +0 -0
  259. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/commands/speckit.plan.md +0 -0
  260. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/commands/speckit.specify.md +0 -0
  261. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/commands/speckit.tasks.md +0 -0
  262. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/lean/preset.yml +0 -0
  263. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/scaffold/README.md +0 -0
  264. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  265. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/scaffold/commands/speckit.specify.md +0 -0
  266. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/scaffold/preset.yml +0 -0
  267. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/scaffold/templates/myext-template.md +0 -0
  268. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/scaffold/templates/spec-template.md +0 -0
  269. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/commands/speckit.specify.md +0 -0
  270. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  271. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/preset.yml +0 -0
  272. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/templates/agent-file-template.md +0 -0
  273. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/templates/checklist-template.md +0 -0
  274. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/templates/constitution-template.md +0 -0
  275. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/templates/plan-template.md +0 -0
  276. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/templates/spec-template.md +0 -0
  277. {specify_cli-0.11.10 → specify_cli-0.12.0}/presets/self-test/templates/tasks-template.md +0 -0
  278. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/bash/check-prerequisites.sh +0 -0
  279. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/bash/common.sh +0 -0
  280. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/bash/create-new-feature.sh +0 -0
  281. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/bash/setup-plan.sh +0 -0
  282. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/bash/setup-tasks.sh +0 -0
  283. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/powershell/check-prerequisites.ps1 +0 -0
  284. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/powershell/setup-plan.ps1 +0 -0
  285. {specify_cli-0.11.10 → specify_cli-0.12.0}/scripts/powershell/setup-tasks.ps1 +0 -0
  286. {specify_cli-0.11.10 → specify_cli-0.12.0}/spec-driven.md +0 -0
  287. {specify_cli-0.11.10 → specify_cli-0.12.0}/spec-kit.code-workspace +0 -0
  288. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_agent_config.py +0 -0
  289. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_assets.py +0 -0
  290. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_console.py +0 -0
  291. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_github_http.py +0 -0
  292. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_init_options.py +0 -0
  293. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_invocation_style.py +0 -0
  294. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_utils.py +0 -0
  295. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/_version.py +0 -0
  296. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/authentication/__init__.py +0 -0
  297. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/authentication/azure_devops.py +0 -0
  298. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/authentication/base.py +0 -0
  299. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/authentication/config.py +0 -0
  300. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/authentication/github.py +0 -0
  301. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/authentication/http.py +0 -0
  302. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/__init__.py +0 -0
  303. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  304. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  305. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/lib/__init__.py +0 -0
  306. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/lib/project.py +0 -0
  307. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/lib/versioning.py +0 -0
  308. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  309. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/models/__init__.py +0 -0
  310. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/models/catalog.py +0 -0
  311. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/models/manifest.py +0 -0
  312. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/models/records.py +0 -0
  313. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/__init__.py +0 -0
  314. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/adapters.py +0 -0
  315. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  316. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/conflict.py +0 -0
  317. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/installer.py +0 -0
  318. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/packager.py +0 -0
  319. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/primitives.py +0 -0
  320. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/references.py +0 -0
  321. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/resolver.py +0 -0
  322. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/bundler/services/validator.py +0 -0
  323. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/catalogs.py +0 -0
  324. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/commands/__init__.py +0 -0
  325. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/commands/bundle/__init__.py +0 -0
  326. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/extensions/__init__.py +0 -0
  327. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/extensions/_commands.py +0 -0
  328. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integration_runtime.py +0 -0
  329. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integration_state.py +0 -0
  330. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integration_status.py +0 -0
  331. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/__init__.py +0 -0
  332. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/_commands.py +0 -0
  333. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/_install_commands.py +0 -0
  334. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  335. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/_query_commands.py +0 -0
  336. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  337. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/catalog.py +0 -0
  338. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/integrations/manifest.py +0 -0
  339. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/presets/__init__.py +0 -0
  340. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/presets/_commands.py +0 -0
  341. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/shared_infra.py +0 -0
  342. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/__init__.py +0 -0
  343. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/base.py +0 -0
  344. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/catalog.py +0 -0
  345. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/__init__.py +0 -0
  346. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  347. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  348. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  349. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  350. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  351. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  352. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  353. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  354. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  355. {specify_cli-0.11.10 → specify_cli-0.12.0}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  356. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/checklist-template.md +0 -0
  357. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/analyze.md +0 -0
  358. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/checklist.md +0 -0
  359. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/clarify.md +0 -0
  360. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/constitution.md +0 -0
  361. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/converge.md +0 -0
  362. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/implement.md +0 -0
  363. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/specify.md +0 -0
  364. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/tasks.md +0 -0
  365. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/commands/taskstoissues.md +0 -0
  366. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/constitution-template.md +0 -0
  367. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/plan-template.md +0 -0
  368. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/spec-template.md +0 -0
  369. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/tasks-template.md +0 -0
  370. {specify_cli-0.11.10 → specify_cli-0.12.0}/templates/vscode-settings.json +0 -0
  371. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/__init__.py +0 -0
  372. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/auth_helpers.py +0 -0
  373. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/bundler_helpers.py +0 -0
  374. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/conftest.py +0 -0
  375. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/contract/test_bundle_cli.py +0 -0
  376. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/contract/test_catalog_schema.py +0 -0
  377. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/contract/test_manifest_schema.py +0 -0
  378. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/extensions/__init__.py +0 -0
  379. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/extensions/bug/__init__.py +0 -0
  380. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/extensions/bug/test_bug_extension.py +0 -0
  381. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/extensions/git/__init__.py +0 -0
  382. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  383. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/hooks/TESTING.md +0 -0
  384. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/hooks/plan.md +0 -0
  385. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/hooks/spec.md +0 -0
  386. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/hooks/tasks.md +0 -0
  387. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/http_helpers.py +0 -0
  388. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integration/test_bundler_catalog_stack.py +0 -0
  389. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integration/test_bundler_init_install.py +0 -0
  390. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integration/test_bundler_install_flow.py +0 -0
  391. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integration/test_bundler_local_install.py +0 -0
  392. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integration/test_bundler_offline.py +0 -0
  393. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integration/test_bundler_security_paths.py +0 -0
  394. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/__init__.py +0 -0
  395. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_catalog.py +0 -0
  396. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_scaffold.py +0 -0
  397. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_state.py +0 -0
  398. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_integration_subcommand.py +0 -0
  399. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/integrations/test_manifest.py +0 -0
  400. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/self_upgrade_helpers.py +0 -0
  401. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_agent_config_consistency.py +0 -0
  402. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_authentication.py +0 -0
  403. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_branch_numbering.py +0 -0
  404. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_check_prerequisites_paths_only.py +0 -0
  405. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_check_tool.py +0 -0
  406. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_cli_version.py +0 -0
  407. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_commands_package.py +0 -0
  408. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_console_imports.py +0 -0
  409. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_extension_registration.py +0 -0
  410. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_extension_skills.py +0 -0
  411. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_extension_update_hardening.py +0 -0
  412. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_extensions.py +0 -0
  413. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_github_http.py +0 -0
  414. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_github_workflows.py +0 -0
  415. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_init_dir.py +0 -0
  416. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_live_transient_windows.py +0 -0
  417. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_merge.py +0 -0
  418. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_presets.py +0 -0
  419. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_ps1_encoding.py +0 -0
  420. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_registrar_path_traversal.py +0 -0
  421. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_self_upgrade_detection.py +0 -0
  422. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_self_upgrade_execution.py +0 -0
  423. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_self_upgrade_guidance.py +0 -0
  424. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_self_upgrade_verification.py +0 -0
  425. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_setup_plan_feature_json.py +0 -0
  426. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_setup_plan_no_overwrite.py +0 -0
  427. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_shared_infra_integrity.py +0 -0
  428. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_upgrade.py +0 -0
  429. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_utils.py +0 -0
  430. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_utils_assets_imports.py +0 -0
  431. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_version_imports.py +0 -0
  432. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/test_workflow_run_without_project.py +0 -0
  433. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_adapters.py +0 -0
  434. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_catalog_config.py +0 -0
  435. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_conflict.py +0 -0
  436. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_packager.py +0 -0
  437. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_primitives.py +0 -0
  438. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_records.py +0 -0
  439. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_references.py +0 -0
  440. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_resolver.py +0 -0
  441. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_validator.py +0 -0
  442. {specify_cli-0.11.10 → specify_cli-0.12.0}/tests/unit/test_bundler_versioning.py +0 -0
  443. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/ARCHITECTURE.md +0 -0
  444. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/PUBLISHING.md +0 -0
  445. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/README.md +0 -0
  446. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/catalog.community.json +0 -0
  447. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/catalog.json +0 -0
  448. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/speckit/workflow.yml +0 -0
  449. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/step-catalog.community.json +0 -0
  450. {specify_cli-0.11.10 → specify_cli-0.12.0}/workflows/step-catalog.json +0 -0
@@ -75,7 +75,6 @@ class WindsurfIntegration(MarkdownIntegration):
75
75
  "args": "$ARGUMENTS",
76
76
  "extension": ".md",
77
77
  }
78
- context_file = ".windsurf/rules/specify-rules.md"
79
78
  ```
80
79
 
81
80
  **TOML agent (Gemini):**
@@ -101,7 +100,6 @@ class GeminiIntegration(TomlIntegration):
101
100
  "args": "{{args}}",
102
101
  "extension": ".toml",
103
102
  }
104
- context_file = "GEMINI.md"
105
103
  ```
106
104
 
107
105
  **Skills agent (Codex):**
@@ -129,7 +127,6 @@ class CodexIntegration(SkillsIntegration):
129
127
  "args": "$ARGUMENTS",
130
128
  "extension": "/SKILL.md",
131
129
  }
132
- context_file = "AGENTS.md"
133
130
 
134
131
  @classmethod
135
132
  def options(cls) -> list[IntegrationOption]:
@@ -150,7 +147,6 @@ class CodexIntegration(SkillsIntegration):
150
147
  | `key` | Class attribute | Unique identifier; for CLI-based integrations (`requires_cli: True`), must match the CLI executable name |
151
148
  | `config` | Class attribute (dict) | Agent metadata: `name`, `folder`, `commands_subdir`, `install_url`, `requires_cli` |
152
149
  | `registrar_config` | Class attribute (dict) | Command output config: `dir`, `format`, `args` placeholder, file `extension` |
153
- | `context_file` | Class attribute (str or None) | Path to agent context/instructions file (e.g., `"CLAUDE.md"`, `".github/copilot-instructions.md"`) |
154
150
 
155
151
  **Key design rule:** For CLI-based integrations (`requires_cli: True`), `key` must be the actual executable name (e.g., `"cursor-agent"` not `"cursor"`). This ensures `shutil.which(key)` works for CLI-tool checks without special-case mappings. IDE-based integrations (`requires_cli: False`) should use their canonical identifier (e.g., `"windsurf"`, `"copilot"`).
156
152
 
@@ -175,9 +171,11 @@ def _register_builtins() -> None:
175
171
 
176
172
  ### 4. Context file behavior
177
173
 
178
- Set `context_file` on the integration class. The base integration setup creates or updates the managed Spec Kit section in that file, and uninstall removes the managed section when appropriate.
174
+ The Specify CLI carries **no agent-context state whatsoever**. Integration classes do **not** declare a `context_file`, and the CLI never creates, updates, removes, resolves, or migrates a context/instruction file (`CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, …). New integrations add nothing for context handling.
179
175
 
180
- The managed section is owned by the bundled `agent-context` extension (`extensions/agent-context/`). All configuration flows through the extension's own config file at `.specify/extensions/agent-context/agent-context-config.yml`:
176
+ Managing the "Spec Kit" section in the context file is fully owned by the bundled `agent-context` extension (`extensions/agent-context/`), which is a **full opt-in**: `specify init` does not install it. A user adds/enables it through the standard extension verbs, after which the extension's own bundled scripts maintain the context section. When the extension is absent or disabled, nothing in Spec Kit touches the context file.
177
+
178
+ The extension reads its own config file at `.specify/extensions/agent-context/agent-context-config.yml`:
181
179
 
182
180
  ```yaml
183
181
  # Path to the coding agent context file managed by this extension
@@ -189,10 +187,10 @@ context_markers:
189
187
  end: "<!-- SPECKIT END -->"
190
188
  ```
191
189
 
192
- - `context_file` is written automatically from the integration's class attribute when `specify init` or `specify integration use` is run.
193
- - `context_markers.{start,end}` defaults to `IntegrationBase.CONTEXT_MARKER_START` / `CONTEXT_MARKER_END`. Users who want custom markers edit `agent-context-config.yml` directly — both the Python layer (`upsert_context_section()` / `remove_context_section()`) and the bundled scripts (`extensions/agent-context/scripts/bash/update-agent-context.sh` and `.ps1`) read from this single source of truth.
190
+ - The Specify CLI does **not** write this config. When `context_file` is empty, the extension's bundled scripts self-seed it by looking up the active integration's key in the extension's own `agent-context-defaults.json` map (`extensions/agent-context/scripts/bash/update-agent-context.sh` and `.ps1`). The CLI registry is never consulted — all agent→context-file knowledge lives inside the extension.
191
+ - `context_markers.{start,end}` are read solely by the extension's scripts; they default to the Spec Kit markers shown above and can be customized by editing `agent-context-config.yml` directly.
194
192
 
195
- Users can opt out entirely with `specify extension disable agent-context`; while disabled, Spec Kit skips context-file creation, updates, and removal (the gates are inside `upsert_context_section()` and `remove_context_section()`).
193
+ Existing projects created by older Spec Kit versions keep working: any previously written managed section or extension config is left intact and is only ever updated by the extension when run.
196
194
 
197
195
  Only add custom setup logic when the agent needs non-standard behavior. Integrations no longer require per-agent thin wrapper scripts or shared context-update dispatcher scripts — the `agent-context` extension is fully generic.
198
196
 
@@ -401,7 +399,6 @@ Implementation: Extends `YamlIntegration` (parallel to `TomlIntegration`):
401
399
  2. Extracts title and description from frontmatter
402
400
  3. Renders output as Goose recipe YAML (version, title, description, author, extensions, activities, prompt)
403
401
  4. Uses `yaml.safe_dump()` for header fields to ensure proper escaping
404
- 5. Sets `context_file = "AGENTS.md"` so the base setup manages the Spec Kit context section there
405
402
 
406
403
  ## Branch Naming Convention
407
404
 
@@ -466,7 +463,7 @@ Disclosure is **continuous**, not a one-time event. A single AI-disclosure parag
466
463
  ## Common Pitfalls
467
464
 
468
465
  1. **Using shorthand keys for CLI-based integrations**: For CLI-based integrations (`requires_cli: True`), the `key` must match the executable name (e.g., `"cursor-agent"` not `"cursor"`). `shutil.which(key)` is used for CLI tool checks — mismatches require special-case mappings. IDE-based integrations (`requires_cli: False`) are not subject to this constraint.
469
- 2. **Forgetting context configuration**: The bundled `agent-context` extension reads from `.specify/extensions/agent-context/agent-context-config.yml`. New integrations only need to set `context_file` on the class — markers and dispatcher scripts are managed centrally.
466
+ 2. **Reintroducing context handling into the CLI**: The opt-in `agent-context` extension owns everything about context files — including the per-agent default mapping in `agent-context-defaults.json`. Integration classes must **not** declare a `context_file`, and no CLI code should read, write, resolve, or migrate context files. All context-file logic lives in `.specify/extensions/agent-context/` and its bundled scripts.
470
467
  3. **Incorrect `requires_cli` value**: Set to `True` only for agents that have a CLI tool; set to `False` for IDE-based agents.
471
468
  4. **Wrong argument format**: Use `$ARGUMENTS` for Markdown agents, `{{args}}` for TOML agents.
472
469
  5. **Skipping registration**: The import and `_register()` call in `_register_builtins()` must both be added.
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.12.0] - 2026-06-29
6
+
7
+ ### Changed
8
+
9
+ - feat: make agent-context extension a full opt-in (#3097)
10
+ - docs(workflows): add the built-in 'init' step type to the Step Types table (#3234)
11
+ - fix(workflows): gate validate() must not crash on non-string options (#3233)
12
+ - fix(workflows): make pipe-filter detection quote-aware in expressions (#3232)
13
+ - fix(workflows): reject a fan-in wait_for that names an unknown step at validation (#3225)
14
+ - fix(scripts): warn when spec template is missing in create-new-feature.ps1 (parity with bash) (#3230)
15
+ - fix(scripts): count subdirectory-only dirs as non-empty in PowerShell (parity with bash) (#3137)
16
+ - fix(scripts): drop HAS_GIT from PowerShell git-extension output (parity with bash) (#3195)
17
+ - Update Product Spec Extension to v1.0.1 (#3226)
18
+ - chore: release 0.11.10, begin 0.11.11.dev0 development (#3240)
19
+
5
20
  ## [0.11.10] - 2026-06-29
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.11.10
3
+ Version: 0.12.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
@@ -262,6 +262,7 @@ specify workflow run speckit -i spec="Build a kanban board with drag-and-drop ta
262
262
  | `command` | Invoke a Spec Kit command (e.g., `speckit.plan`) |
263
263
  | `prompt` | Send an arbitrary prompt to the AI coding agent |
264
264
  | `shell` | Execute a shell command and capture output |
265
+ | `init` | Bootstrap a project (like `specify init`) |
265
266
  | `gate` | Pause for human approval before continuing |
266
267
  | `if` | Conditional branching (then/else) |
267
268
  | `switch` | Multi-branch dispatch on an expression |
@@ -6,15 +6,17 @@ It owns the lifecycle of the managed section delimited by the configurable start
6
6
 
7
7
  ## Why an extension?
8
8
 
9
- Not every Spec Kit user wants Spec Kit to write into the coding agent's context file. Extracting this behavior into a dedicated extension lets users:
9
+ Not every Spec Kit user wants Spec Kit to write into the coding agent's context file. Keeping this behavior in a dedicated, **opt-in** extension lets users:
10
10
 
11
- - **Opt out** entirely with `specify extension disable agent-context` — Spec Kit will then never create or modify the agent context file.
12
- - **Customize the markers** by editing `.specify/extensions/agent-context/agent-context-config.yml` — both the Python layer and the bundled scripts honor the same `context_markers` value.
11
+ - **Choose whether to install it at all** — `specify init` does not install it. Add it explicitly when you want Spec Kit to manage the agent context file; if it is absent or disabled, Spec Kit never creates or modifies that file.
12
+ - **Customize the markers** by editing `.specify/extensions/agent-context/agent-context-config.yml` — the bundled scripts honor the `context_markers` value.
13
13
  - **Synchronize multiple agent anchors** by setting `context_files` when a project intentionally uses more than one coding agent context file, such as `AGENTS.md` and `CLAUDE.md`.
14
- - **Refresh on demand** with `/speckit.agent-context.update`, or automatically through the hooks declared in `extension.yml` (`after_specify`, `after_plan`).
14
+ - **Refresh on demand** by running the `speckit.agent-context.update` command in your agent, or automatically through the hooks declared in `extension.yml` (`after_specify`, `after_plan`). Invoke it using your agent's slash-command separator — `/speckit.agent-context.update` for dot-separator agents or `/speckit-agent-context-update` for hyphen-separator agents (e.g. Forge, Cline).
15
15
 
16
16
  ## Commands
17
17
 
18
+ The command ID below is canonical. When invoking it as a slash command, use your agent's separator: `/speckit.agent-context.update` for dot-separator agents or `/speckit-agent-context-update` for hyphen-separator agents (e.g. Forge, Cline).
19
+
18
20
  | Command | Description |
19
21
  |---------|-------------|
20
22
  | `speckit.agent-context.update` | Refresh the managed section in the agent context file with the current plan path. |
@@ -40,7 +42,7 @@ context_markers:
40
42
  end: "<!-- SPECKIT END -->"
41
43
  ```
42
44
 
43
- - `context_file` — the project-relative path to the coding agent context file, written by `specify init` and `specify integration install`.
45
+ - `context_file` — the project-relative path to the coding agent context file. When empty, the bundled update scripts self-seed it by looking up the active integration's key in this extension's own `agent-context-defaults.json` map. The Specify CLI is never consulted.
44
46
  - `context_files` — optional project-relative paths to multiple coding agent context files. When non-empty, the list takes precedence over `context_file`. Absolute paths, backslash separators, and `..` path segments are rejected.
45
47
  - `context_markers.start` / `.end` — the delimiters around the managed section. Edit these to use custom markers.
46
48
 
@@ -62,5 +64,4 @@ pip install pyyaml
62
64
  specify extension disable agent-context
63
65
  ```
64
66
 
65
- When disabled, Spec Kit skips context file creation, updates, and removal (the gates are inside `upsert_context_section()` and `remove_context_section()`).
66
- Disabled projects also ignore stale `context_files` values during command rendering so disabling the extension remains a complete opt-out.
67
+ When disabled (or never installed), Spec Kit performs no agent context file creation, updates, or removal — the extension's bundled scripts are the only code that ever touches the managed section. The Specify CLI carries no agent-context state at all: it never reads this config, never resolves a context file, and the `__CONTEXT_FILE__` placeholder (if present in any template) is left untouched. All context-file knowledge — including the per-agent default mapping in `agent-context-defaults.json` — lives entirely within this extension, so disabling it is a complete opt-out.
@@ -0,0 +1,42 @@
1
+ {
2
+ "_comment": "Default coding agent context file per integration, owned by the agent-context extension. Used to self-seed agent-context-config.yml when it declares no context_file/context_files. Keyed by the Spec Kit integration key recorded in .specify/init-options.json. This mapping is independent of the Specify CLI by design.",
3
+ "agents": {
4
+ "agy": "AGENTS.md",
5
+ "amp": "AGENTS.md",
6
+ "auggie": ".augment/rules/specify-rules.md",
7
+ "bob": "AGENTS.md",
8
+ "claude": "CLAUDE.md",
9
+ "cline": ".clinerules/specify-rules.md",
10
+ "codebuddy": "CODEBUDDY.md",
11
+ "codex": "AGENTS.md",
12
+ "copilot": ".github/copilot-instructions.md",
13
+ "cursor-agent": ".cursor/rules/specify-rules.mdc",
14
+ "devin": "AGENTS.md",
15
+ "firebender": ".firebender/rules/specify-rules.mdc",
16
+ "forge": "AGENTS.md",
17
+ "gemini": "GEMINI.md",
18
+ "generic": "AGENTS.md",
19
+ "goose": "AGENTS.md",
20
+ "hermes": "AGENTS.md",
21
+ "iflow": "IFLOW.md",
22
+ "junie": ".junie/AGENTS.md",
23
+ "kilocode": ".kilocode/rules/specify-rules.md",
24
+ "kimi": "AGENTS.md",
25
+ "kiro-cli": "AGENTS.md",
26
+ "lingma": ".lingma/rules/specify-rules.md",
27
+ "omp": "AGENTS.md",
28
+ "opencode": "AGENTS.md",
29
+ "pi": "AGENTS.md",
30
+ "qodercli": "QODER.md",
31
+ "qwen": "QWEN.md",
32
+ "roo": ".roo/rules/specify-rules.md",
33
+ "rovodev": "AGENTS.md",
34
+ "shai": "SHAI.md",
35
+ "tabnine": "TABNINE.md",
36
+ "trae": ".trae/rules/project_rules.md",
37
+ "vibe": "AGENTS.md",
38
+ "windsurf": ".windsurf/rules/specify-rules.md",
39
+ "zcode": "ZCODE.md",
40
+ "zed": "AGENTS.md"
41
+ }
42
+ }
@@ -59,7 +59,7 @@ case "$(uname -s 2>/dev/null || true)" in
59
59
  esac
60
60
 
61
61
  # Parse extension config once; emit context files as JSON, followed by marker strings.
62
- if ! _raw_opts="$("$_python" - "$EXT_CONFIG" "$_case_insensitive_context_files" <<'PY'
62
+ if ! _raw_opts="$("$_python" - "$EXT_CONFIG" "$_case_insensitive_context_files" "$PROJECT_ROOT" <<'PY'
63
63
  import json
64
64
  import sys
65
65
  try:
@@ -95,24 +95,67 @@ def get_str(obj, *keys):
95
95
  context_files = []
96
96
  seen_context_files = set()
97
97
  case_insensitive = sys.argv[2] == "1" or sys.platform.startswith(("win32", "cygwin"))
98
+ def add_context_file(value):
99
+ if not isinstance(value, str):
100
+ return
101
+ candidate = value.strip()
102
+ if not candidate:
103
+ return
104
+ key = candidate.casefold() if case_insensitive else candidate
105
+ if key in seen_context_files:
106
+ return
107
+ context_files.append(candidate)
108
+ seen_context_files.add(key)
98
109
  raw_files = data.get("context_files")
99
110
  if isinstance(raw_files, list):
100
111
  for value in raw_files:
101
- if not isinstance(value, str):
102
- continue
103
- candidate = value.strip()
104
- if not candidate:
105
- continue
106
- key = candidate.casefold() if case_insensitive else candidate
107
- if key in seen_context_files:
108
- continue
109
- context_files.append(candidate)
110
- seen_context_files.add(key)
112
+ add_context_file(value)
111
113
  if not context_files:
112
- raw_file = get_str(data, "context_file")
113
- candidate = raw_file.strip()
114
- if candidate:
115
- context_files.append(candidate)
114
+ add_context_file(get_str(data, "context_file"))
115
+ if not context_files:
116
+ # Self-seed: the agent-context extension owns its lifecycle, so when its
117
+ # own config declares no target it derives one from the active integration
118
+ # recorded in init-options.json, using the extension's OWN bundled mapping
119
+ # (agent-context-defaults.json). This is independent of the Specify CLI by
120
+ # design — nothing here imports specify_cli.
121
+ project_root = sys.argv[3] if len(sys.argv) > 3 else "."
122
+ integration_key = ""
123
+ try:
124
+ with open(
125
+ f"{project_root}/.specify/init-options.json", "r", encoding="utf-8"
126
+ ) as fh:
127
+ opts = json.load(fh)
128
+ if isinstance(opts, dict):
129
+ value = opts.get("integration") or opts.get("ai") or ""
130
+ integration_key = value if isinstance(value, str) else ""
131
+ except Exception:
132
+ integration_key = ""
133
+ if integration_key:
134
+ defaults_path = (
135
+ f"{project_root}/.specify/extensions/agent-context/"
136
+ "agent-context-defaults.json"
137
+ )
138
+ mapping = {}
139
+ try:
140
+ with open(defaults_path, "r", encoding="utf-8") as fh:
141
+ loaded = json.load(fh)
142
+ agents = loaded.get("agents", {}) if isinstance(loaded, dict) else {}
143
+ mapping = agents if isinstance(agents, dict) else {}
144
+ except Exception:
145
+ print(
146
+ "agent-context: unable to read %s; cannot self-seed the context "
147
+ "file. Set 'context_file' in the extension config." % defaults_path,
148
+ file=sys.stderr,
149
+ )
150
+ mapping = {}
151
+ add_context_file(mapping.get(integration_key, "") or "")
152
+ if not context_files:
153
+ print(
154
+ "agent-context: no default context file is known for integration "
155
+ "'%s'. Set 'context_file' in the extension config to choose one."
156
+ % integration_key,
157
+ file=sys.stderr,
158
+ )
116
159
  print(json.dumps(context_files))
117
160
  print(get_str(data, "context_markers", "start"))
118
161
  print(get_str(data, "context_markers", "end"))
@@ -295,11 +338,58 @@ for CONTEXT_FILE in "${CONTEXT_FILES[@]}"; do
295
338
  mkdir -p "$(dirname "$CTX_PATH")"
296
339
 
297
340
  "$_python" - "$CTX_PATH" "$MARKER_START" "$MARKER_END" "$TMP_SECTION" <<'PY'
298
- import sys, os
341
+ import os
342
+ import re
343
+ import sys
344
+
299
345
  ctx_path, start, end, section_path = sys.argv[1:5]
300
346
  with open(section_path, "r", encoding="utf-8") as fh:
301
347
  section = fh.read().rstrip("\n") + "\n"
302
348
 
349
+
350
+ def ensure_mdc_frontmatter(content):
351
+ """Ensure ``.mdc`` content has YAML frontmatter with ``alwaysApply: true``.
352
+
353
+ Cursor only auto-loads ``.mdc`` rule files that carry frontmatter with
354
+ ``alwaysApply: true``. Prepend it when missing, or repair the value while
355
+ preserving any existing frontmatter comments/formatting.
356
+ """
357
+ leading_ws = len(content) - len(content.lstrip())
358
+ leading = content[:leading_ws]
359
+ stripped = content[leading_ws:]
360
+
361
+ if not stripped.startswith("---"):
362
+ return "---\nalwaysApply: true\n---\n\n" + content
363
+
364
+ match = re.match(
365
+ r"^(---[ \t]*\r?\n)(.*?)(\r?\n---[ \t]*)(\r?\n|$)(.*)",
366
+ stripped,
367
+ re.DOTALL,
368
+ )
369
+ if not match:
370
+ return "---\nalwaysApply: true\n---\n\n" + content
371
+
372
+ opening, fm_text, closing, sep, rest = match.groups()
373
+ newline = "\r\n" if "\r\n" in opening else "\n"
374
+
375
+ if re.search(r"(?m)^[ \t]*alwaysApply[ \t]*:[ \t]*true[ \t]*(?:#.*)?$", fm_text):
376
+ return content
377
+
378
+ if re.search(r"(?m)^[ \t]*alwaysApply[ \t]*:", fm_text):
379
+ fm_text = re.sub(
380
+ r"(?m)^([ \t]*)alwaysApply[ \t]*:.*?([ \t]*(?:#.*)?)$",
381
+ r"\1alwaysApply: true\2",
382
+ fm_text,
383
+ count=1,
384
+ )
385
+ elif fm_text.strip():
386
+ fm_text = fm_text + newline + "alwaysApply: true"
387
+ else:
388
+ fm_text = "alwaysApply: true"
389
+
390
+ return f"{leading}{opening}{fm_text}{closing}{sep}{rest}"
391
+
392
+
303
393
  if os.path.exists(ctx_path):
304
394
  with open(ctx_path, "r", encoding="utf-8-sig") as fh:
305
395
  content = fh.read()
@@ -329,6 +419,8 @@ else:
329
419
  new_content = section
330
420
 
331
421
  new_content = new_content.replace("\r\n", "\n").replace("\r", "\n")
422
+ if ctx_path.casefold().endswith(".mdc"):
423
+ new_content = ensure_mdc_frontmatter(new_content)
332
424
  with open(ctx_path, "wb") as fh:
333
425
  fh.write(new_content.encode("utf-8"))
334
426
  PY
@@ -20,6 +20,56 @@ param(
20
20
  [string]$PlanPath
21
21
  )
22
22
 
23
+ function Add-MdcFrontmatter {
24
+ <#
25
+ Ensure .mdc content has YAML frontmatter with alwaysApply: true.
26
+
27
+ Cursor only auto-loads .mdc rule files that carry frontmatter with
28
+ alwaysApply: true. Prepend it when missing, or repair the value while
29
+ preserving any existing frontmatter comments/formatting.
30
+ #>
31
+ param([Parameter(Mandatory = $true)][AllowEmptyString()][string]$Content)
32
+
33
+ $leading = ''
34
+ $stripped = $Content
35
+ $m = [regex]::Match($Content, '^\s*')
36
+ if ($m.Success) {
37
+ $leading = $m.Value
38
+ $stripped = $Content.Substring($m.Length)
39
+ }
40
+
41
+ if (-not $stripped.StartsWith('---')) {
42
+ return "---`nalwaysApply: true`n---`n`n" + $Content
43
+ }
44
+
45
+ $fm = [regex]::Match($stripped, '^(---[ \t]*\r?\n)(.*?)(\r?\n---[ \t]*)(\r?\n|$)(.*)', [System.Text.RegularExpressions.RegexOptions]::Singleline)
46
+ if (-not $fm.Success) {
47
+ return "---`nalwaysApply: true`n---`n`n" + $Content
48
+ }
49
+
50
+ $opening = $fm.Groups[1].Value
51
+ $fmText = $fm.Groups[2].Value
52
+ $closing = $fm.Groups[3].Value
53
+ $sep = $fm.Groups[4].Value
54
+ $rest = $fm.Groups[5].Value
55
+ $newline = if ($opening.Contains("`r`n")) { "`r`n" } else { "`n" }
56
+
57
+ if ([regex]::IsMatch($fmText, '(?m)^[ \t]*alwaysApply[ \t]*:[ \t]*true[ \t]*(?:#.*)?$')) {
58
+ return $Content
59
+ }
60
+
61
+ if ([regex]::IsMatch($fmText, '(?m)^[ \t]*alwaysApply[ \t]*:')) {
62
+ $alwaysApplyRegex = [regex]'(?m)^([ \t]*)alwaysApply[ \t]*:.*?([ \t]*(?:#.*)?)$'
63
+ $fmText = $alwaysApplyRegex.Replace($fmText, '${1}alwaysApply: true${2}', 1)
64
+ } elseif ($fmText.Trim()) {
65
+ $fmText = $fmText + $newline + 'alwaysApply: true'
66
+ } else {
67
+ $fmText = 'alwaysApply: true'
68
+ }
69
+
70
+ return "$leading$opening$fmText$closing$sep$rest"
71
+ }
72
+
23
73
  function Get-ConfigValue {
24
74
  param(
25
75
  [AllowNull()][object]$Object,
@@ -250,6 +300,43 @@ foreach ($ContextFile in $ContextFiles) {
250
300
  }
251
301
  }
252
302
  $ContextFiles = $dedupedContextFiles
303
+ if ($ContextFiles.Count -eq 0) {
304
+ # Self-seed: the agent-context extension owns its lifecycle, so when its
305
+ # own config declares no target it derives one from the active integration
306
+ # recorded in init-options.json, using the extension's OWN bundled mapping
307
+ # (agent-context-defaults.json). Independent of the Specify CLI by design.
308
+ $initOptionsPath = Join-Path $ProjectRoot '.specify/init-options.json'
309
+ if (Test-Path -LiteralPath $initOptionsPath) {
310
+ try {
311
+ $initOpts = Get-Content -LiteralPath $initOptionsPath -Raw | ConvertFrom-Json -ErrorAction Stop
312
+ $integrationKey = $null
313
+ if ($initOpts.PSObject.Properties['integration'] -and $initOpts.integration) {
314
+ $integrationKey = [string]$initOpts.integration
315
+ } elseif ($initOpts.PSObject.Properties['ai'] -and $initOpts.ai) {
316
+ $integrationKey = [string]$initOpts.ai
317
+ }
318
+ if ($integrationKey) {
319
+ $defaultsPath = Join-Path $ProjectRoot '.specify/extensions/agent-context/agent-context-defaults.json'
320
+ if (Test-Path -LiteralPath $defaultsPath) {
321
+ $defaults = Get-Content -LiteralPath $defaultsPath -Raw | ConvertFrom-Json -ErrorAction Stop
322
+ $derived = $null
323
+ if ($defaults.PSObject.Properties['agents'] -and $defaults.agents.PSObject.Properties[$integrationKey]) {
324
+ $derived = [string]$defaults.agents.PSObject.Properties[$integrationKey].Value
325
+ }
326
+ if ($derived -and -not [string]::IsNullOrWhiteSpace($derived)) {
327
+ $ContextFiles += $derived.Trim()
328
+ } else {
329
+ Write-Warning ("agent-context: no default context file is known for integration '{0}'; set 'context_file' in the extension config to choose one." -f $integrationKey)
330
+ }
331
+ } else {
332
+ Write-Warning ("agent-context: unable to read {0}; cannot self-seed the context file. Set 'context_file' in the extension config." -f $defaultsPath)
333
+ }
334
+ }
335
+ } catch {
336
+ # Non-fatal: fall through to the nothing-to-do guard below.
337
+ }
338
+ }
339
+ }
253
340
  if ($ContextFiles.Count -eq 0) {
254
341
  Write-Warning 'agent-context: context_files/context_file not set in extension config; nothing to do.'
255
342
  exit 0
@@ -411,6 +498,9 @@ foreach ($ContextFile in $ContextFiles) {
411
498
  }
412
499
 
413
500
  $newContent = $newContent.Replace("`r`n", "`n").Replace("`r", "`n")
501
+ if ($ContextFile -match '\.mdc$') {
502
+ $newContent = Add-MdcFrontmatter -Content $newContent
503
+ }
414
504
  [System.IO.File]::WriteAllText($CtxPath, $newContent, (New-Object System.Text.UTF8Encoding($false)))
415
505
 
416
506
  Write-Host "agent-context: updated $ContextFile"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-06-24T00:00:00Z",
3
+ "updated_at": "2026-06-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": {
@@ -2501,8 +2501,8 @@
2501
2501
  "id": "product",
2502
2502
  "description": "Generates PRFAQ, Lean PRD, stakeholder summaries, and technical designs from engineering specs.",
2503
2503
  "author": "d0whc3r",
2504
- "version": "0.8.3",
2505
- "download_url": "https://github.com/d0whc3r/spec-kit-product/releases/download/v0.8.3/product-0.8.3.zip",
2504
+ "version": "1.0.1",
2505
+ "download_url": "https://github.com/d0whc3r/spec-kit-product/releases/download/v1.0.1/product-1.0.1.zip",
2506
2506
  "repository": "https://github.com/d0whc3r/spec-kit-product",
2507
2507
  "homepage": "https://d0whc3r.github.io/spec-kit-product/",
2508
2508
  "documentation": "https://github.com/d0whc3r/spec-kit-product/wiki",
@@ -2514,7 +2514,7 @@
2514
2514
  "speckit_version": ">=0.2.0"
2515
2515
  },
2516
2516
  "provides": {
2517
- "commands": 4,
2517
+ "commands": 3,
2518
2518
  "hooks": 3
2519
2519
  },
2520
2520
  "tags": [
@@ -2538,7 +2538,7 @@
2538
2538
  "downloads": 0,
2539
2539
  "stars": 0,
2540
2540
  "created_at": "2026-05-26T00:00:00Z",
2541
- "updated_at": "2026-06-01T00:00:00Z"
2541
+ "updated_at": "2026-06-29T00:00:00Z"
2542
2542
  },
2543
2543
  "product-forge": {
2544
2544
  "name": "Product Forge",
@@ -400,8 +400,10 @@ if ($Json) {
400
400
  $obj = [PSCustomObject]@{
401
401
  BRANCH_NAME = $branchName
402
402
  FEATURE_NUM = $featureNum
403
- HAS_GIT = $hasGit
404
403
  }
404
+ # $hasGit is computed for branch-creation logic only; it is intentionally not
405
+ # emitted so this output contract matches the bash twin: BRANCH_NAME and
406
+ # FEATURE_NUM, plus DRY_RUN (added just below) on dry runs.
405
407
  if ($DryRun) {
406
408
  $obj | Add-Member -NotePropertyName 'DRY_RUN' -NotePropertyValue $true
407
409
  }
@@ -409,7 +411,6 @@ if ($Json) {
409
411
  } else {
410
412
  Write-Output "BRANCH_NAME: $branchName"
411
413
  Write-Output "FEATURE_NUM: $featureNum"
412
- Write-Output "HAS_GIT: $hasGit"
413
414
  if (-not $DryRun) {
414
415
  Write-Output "SPECIFY_FEATURE environment variable set to: $branchName"
415
416
  }
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.11.10"
3
+ version = "0.12.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"
@@ -209,7 +209,13 @@ function Test-FileExists {
209
209
 
210
210
  function Test-DirHasFiles {
211
211
  param([string]$Path, [string]$Description)
212
- if ((Test-Path -Path $Path -PathType Container) -and (Get-ChildItem -Path $Path -ErrorAction SilentlyContinue | Where-Object { -not $_.PSIsContainer } | Select-Object -First 1)) {
212
+ # A directory counts as non-empty when Get-ChildItem returns any entry
213
+ # (files or subdirectories) -- matching the JSON contracts checks in
214
+ # check-prerequisites.ps1 / setup-tasks.ps1, and treating a directory whose
215
+ # only contents are subdirectories (e.g. contracts/v1/openapi.yaml) as
216
+ # non-empty like bash check_dir. Filtering out subdirectories would
217
+ # mis-report such a directory as empty.
218
+ if ((Test-Path -Path $Path -PathType Container) -and (Get-ChildItem -Path $Path -ErrorAction SilentlyContinue | Select-Object -First 1)) {
213
219
  Write-Output " [OK] $Description"
214
220
  return $true
215
221
  } else {
@@ -211,6 +211,10 @@ if (-not $DryRun) {
211
211
  $utf8NoBom = New-Object System.Text.UTF8Encoding($false)
212
212
  [System.IO.File]::WriteAllText($specFile, $content, $utf8NoBom)
213
213
  } else {
214
+ # Match the bash twin (create-new-feature.sh): warn on stderr that no
215
+ # spec template was found before creating an empty spec file, so the
216
+ # missing-template signal is not silently swallowed on Windows.
217
+ [Console]::Error.WriteLine("Warning: Spec template not found; created empty spec file")
214
218
  New-Item -ItemType File -Path $specFile -Force | Out-Null
215
219
  }
216
220
  }