specify-cli 0.11.4__tar.gz → 0.11.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. specify_cli-0.11.5/.github/workflows/publish-pypi.yml +80 -0
  2. {specify_cli-0.11.4 → specify_cli-0.11.5}/CHANGELOG.md +15 -0
  3. {specify_cli-0.11.4 → specify_cli-0.11.5}/PKG-INFO +2 -2
  4. {specify_cli-0.11.4 → specify_cli-0.11.5}/README.md +1 -1
  5. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/presets.md +2 -1
  6. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/integrations.md +1 -0
  7. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/README.md +9 -0
  8. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/agent-context-config.yml +6 -1
  9. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/commands/speckit.agent-context.update.md +3 -2
  10. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/scripts/bash/update-agent-context.sh +116 -34
  11. specify_cli-0.11.5/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +353 -0
  12. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/catalog.community.json +3 -3
  13. {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/catalog.json +9 -0
  14. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/catalog.community.json +39 -19
  15. {specify_cli-0.11.4 → specify_cli-0.11.5}/pyproject.toml +1 -1
  16. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/__init__.py +19 -1450
  17. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_invocation_style.py +14 -0
  18. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/agents.py +24 -4
  19. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/commands/init.py +12 -2
  20. specify_cli-0.11.4/src/specify_cli/extensions.py → specify_cli-0.11.5/src/specify_cli/extensions/__init__.py +68 -57
  21. specify_cli-0.11.5/src/specify_cli/extensions/_commands.py +1556 -0
  22. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/__init__.py +2 -0
  23. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_helpers.py +95 -6
  24. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_migrate_commands.py +36 -29
  25. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_query_commands.py +6 -0
  26. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/base.py +265 -89
  27. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/copilot/__init__.py +2 -1
  28. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/forge/__init__.py +2 -1
  29. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/generic/__init__.py +2 -1
  30. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/hermes/__init__.py +2 -1
  31. specify_cli-0.11.5/src/specify_cli/integrations/zcode/__init__.py +43 -0
  32. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/presets/__init__.py +4 -4
  33. specify_cli-0.11.5/tests/extensions/test_extension_agent_context.py +1235 -0
  34. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_cli.py +72 -0
  35. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_codex.py +74 -0
  36. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_subcommand.py +262 -7
  37. specify_cli-0.11.5/tests/integrations/test_integration_zcode.py +38 -0
  38. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extension_update_hardening.py +48 -0
  39. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extensions.py +561 -0
  40. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_presets.py +26 -0
  41. specify_cli-0.11.4/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -237
  42. specify_cli-0.11.4/tests/extensions/test_extension_agent_context.py +0 -455
  43. {specify_cli-0.11.4 → specify_cli-0.11.5}/.devcontainer/devcontainer.json +0 -0
  44. {specify_cli-0.11.4 → specify_cli-0.11.5}/.devcontainer/post-create.sh +0 -0
  45. {specify_cli-0.11.4 → specify_cli-0.11.5}/.editorconfig +0 -0
  46. {specify_cli-0.11.4 → specify_cli-0.11.5}/.gitattributes +0 -0
  47. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/CODEOWNERS +0 -0
  48. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  49. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  50. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  51. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  52. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  53. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  54. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  55. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/aw/actions-lock.json +0 -0
  56. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/dependabot.yml +0 -0
  57. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/skills/add-community-extension/SKILL.md +0 -0
  58. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/RELEASE-PROCESS.md +0 -0
  59. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-extension.lock.yml +0 -0
  60. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-extension.md +0 -0
  61. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-preset.lock.yml +0 -0
  62. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/add-community-preset.md +0 -0
  63. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/bug-assess.lock.yml +0 -0
  64. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/bug-assess.md +0 -0
  65. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/catalog-assign.yml +0 -0
  66. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/codeql.yml +0 -0
  67. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/docs.yml +0 -0
  68. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/lint.yml +0 -0
  69. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/release-trigger.yml +0 -0
  70. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/release.yml +0 -0
  71. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/stale.yml +0 -0
  72. {specify_cli-0.11.4 → specify_cli-0.11.5}/.github/workflows/test.yml +0 -0
  73. {specify_cli-0.11.4 → specify_cli-0.11.5}/.gitignore +0 -0
  74. {specify_cli-0.11.4 → specify_cli-0.11.5}/.markdownlint-cli2.jsonc +0 -0
  75. {specify_cli-0.11.4 → specify_cli-0.11.5}/.zenodo.json +0 -0
  76. {specify_cli-0.11.4 → specify_cli-0.11.5}/AGENTS.md +0 -0
  77. {specify_cli-0.11.4 → specify_cli-0.11.5}/CITATION.cff +0 -0
  78. {specify_cli-0.11.4 → specify_cli-0.11.5}/CODE_OF_CONDUCT.md +0 -0
  79. {specify_cli-0.11.4 → specify_cli-0.11.5}/CONTRIBUTING.md +0 -0
  80. {specify_cli-0.11.4 → specify_cli-0.11.5}/DEVELOPMENT.md +0 -0
  81. {specify_cli-0.11.4 → specify_cli-0.11.5}/LICENSE +0 -0
  82. {specify_cli-0.11.4 → specify_cli-0.11.5}/SECURITY.md +0 -0
  83. {specify_cli-0.11.4 → specify_cli-0.11.5}/SUPPORT.md +0 -0
  84. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/.gitignore +0 -0
  85. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/README.md +0 -0
  86. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/extensions.md +0 -0
  87. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/friends.md +0 -0
  88. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/overview.md +0 -0
  89. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/community/walkthroughs.md +0 -0
  90. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/concepts/complex-features.md +0 -0
  91. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/concepts/sdd.md +0 -0
  92. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/concepts/spec-persistence.md +0 -0
  93. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/docfx.json +0 -0
  94. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/guides/evolving-specs.md +0 -0
  95. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/index.md +0 -0
  96. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/air-gapped.md +0 -0
  97. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/one-time.md +0 -0
  98. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/pipx.md +0 -0
  99. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/install/uv.md +0 -0
  100. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/installation.md +0 -0
  101. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/local-development.md +0 -0
  102. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/quickstart.md +0 -0
  103. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/authentication.md +0 -0
  104. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/bundles.md +0 -0
  105. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/core.md +0 -0
  106. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/extensions.md +0 -0
  107. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/overview.md +0 -0
  108. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/presets.md +0 -0
  109. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/reference/workflows.md +0 -0
  110. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/template/public/main.css +0 -0
  111. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/toc.yml +0 -0
  112. {specify_cli-0.11.4 → specify_cli-0.11.5}/docs/upgrade.md +0 -0
  113. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/business-analyst/README.md +0 -0
  114. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/business-analyst/bundle.yml +0 -0
  115. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/developer/README.md +0 -0
  116. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/developer/bundle.yml +0 -0
  117. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/product-manager/README.md +0 -0
  118. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/product-manager/bundle.yml +0 -0
  119. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/security-researcher/README.md +0 -0
  120. {specify_cli-0.11.4 → specify_cli-0.11.5}/examples/bundles/security-researcher/bundle.yml +0 -0
  121. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  122. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  123. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  124. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  125. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/README.md +0 -0
  126. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  127. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/agent-context/extension.yml +0 -0
  128. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/README.md +0 -0
  129. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  130. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  131. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/commands/speckit.bug.test.md +0 -0
  132. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/bug/extension.yml +0 -0
  133. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/catalog.json +0 -0
  134. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/README.md +0 -0
  135. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.commit.md +0 -0
  136. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.feature.md +0 -0
  137. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.initialize.md +0 -0
  138. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.remote.md +0 -0
  139. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/commands/speckit.git.validate.md +0 -0
  140. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/config-template.yml +0 -0
  141. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/extension.yml +0 -0
  142. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/git-config.yml +0 -0
  143. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  144. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  145. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/git-common.sh +0 -0
  146. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  147. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  148. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  149. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  150. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  151. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/selftest/commands/selftest.md +0 -0
  152. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/selftest/extension.yml +0 -0
  153. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/.gitignore +0 -0
  154. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/CHANGELOG.md +0 -0
  155. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/EXAMPLE-README.md +0 -0
  156. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/LICENSE +0 -0
  157. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/README.md +0 -0
  158. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/commands/example.md +0 -0
  159. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/config-template.yml +0 -0
  160. {specify_cli-0.11.4 → specify_cli-0.11.5}/extensions/template/extension.yml +0 -0
  161. {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/CONTRIBUTING.md +0 -0
  162. {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/README.md +0 -0
  163. {specify_cli-0.11.4 → specify_cli-0.11.5}/integrations/catalog.community.json +0 -0
  164. {specify_cli-0.11.4 → specify_cli-0.11.5}/media/bootstrap-claude-code.gif +0 -0
  165. {specify_cli-0.11.4 → specify_cli-0.11.5}/media/logo_large.webp +0 -0
  166. {specify_cli-0.11.4 → specify_cli-0.11.5}/media/logo_small.webp +0 -0
  167. {specify_cli-0.11.4 → specify_cli-0.11.5}/media/spec-kit-video-header.jpg +0 -0
  168. {specify_cli-0.11.4 → specify_cli-0.11.5}/media/specify_cli.gif +0 -0
  169. {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-April.md +0 -0
  170. {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-February.md +0 -0
  171. {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-March.md +0 -0
  172. {specify_cli-0.11.4 → specify_cli-0.11.5}/newsletters/2026-May.md +0 -0
  173. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/ARCHITECTURE.md +0 -0
  174. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/PUBLISHING.md +0 -0
  175. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/README.md +0 -0
  176. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/catalog.json +0 -0
  177. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/README.md +0 -0
  178. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.constitution.md +0 -0
  179. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.implement.md +0 -0
  180. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.plan.md +0 -0
  181. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.specify.md +0 -0
  182. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/commands/speckit.tasks.md +0 -0
  183. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/lean/preset.yml +0 -0
  184. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/README.md +0 -0
  185. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  186. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/commands/speckit.specify.md +0 -0
  187. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/preset.yml +0 -0
  188. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/templates/myext-template.md +0 -0
  189. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/scaffold/templates/spec-template.md +0 -0
  190. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/commands/speckit.specify.md +0 -0
  191. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  192. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/preset.yml +0 -0
  193. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/agent-file-template.md +0 -0
  194. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/checklist-template.md +0 -0
  195. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/constitution-template.md +0 -0
  196. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/plan-template.md +0 -0
  197. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/spec-template.md +0 -0
  198. {specify_cli-0.11.4 → specify_cli-0.11.5}/presets/self-test/templates/tasks-template.md +0 -0
  199. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/check-prerequisites.sh +0 -0
  200. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/common.sh +0 -0
  201. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/create-new-feature.sh +0 -0
  202. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/setup-plan.sh +0 -0
  203. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/bash/setup-tasks.sh +0 -0
  204. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/check-prerequisites.ps1 +0 -0
  205. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/common.ps1 +0 -0
  206. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/create-new-feature.ps1 +0 -0
  207. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/setup-plan.ps1 +0 -0
  208. {specify_cli-0.11.4 → specify_cli-0.11.5}/scripts/powershell/setup-tasks.ps1 +0 -0
  209. {specify_cli-0.11.4 → specify_cli-0.11.5}/spec-driven.md +0 -0
  210. {specify_cli-0.11.4 → specify_cli-0.11.5}/spec-kit.code-workspace +0 -0
  211. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_agent_config.py +0 -0
  212. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_assets.py +0 -0
  213. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_console.py +0 -0
  214. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_github_http.py +0 -0
  215. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_init_options.py +0 -0
  216. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_utils.py +0 -0
  217. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/_version.py +0 -0
  218. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/__init__.py +0 -0
  219. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/azure_devops.py +0 -0
  220. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/base.py +0 -0
  221. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/config.py +0 -0
  222. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/github.py +0 -0
  223. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/authentication/http.py +0 -0
  224. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/__init__.py +0 -0
  225. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  226. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  227. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/__init__.py +0 -0
  228. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/project.py +0 -0
  229. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/versioning.py +0 -0
  230. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  231. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/__init__.py +0 -0
  232. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/catalog.py +0 -0
  233. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/manifest.py +0 -0
  234. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/models/records.py +0 -0
  235. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/__init__.py +0 -0
  236. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/adapters.py +0 -0
  237. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  238. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/conflict.py +0 -0
  239. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/installer.py +0 -0
  240. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/packager.py +0 -0
  241. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/primitives.py +0 -0
  242. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/references.py +0 -0
  243. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/resolver.py +0 -0
  244. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/bundler/services/validator.py +0 -0
  245. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/catalogs.py +0 -0
  246. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/commands/__init__.py +0 -0
  247. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/commands/bundle/__init__.py +0 -0
  248. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_runtime.py +0 -0
  249. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_scaffold.py +0 -0
  250. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_state.py +0 -0
  251. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integration_status.py +0 -0
  252. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_commands.py +0 -0
  253. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_install_commands.py +0 -0
  254. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  255. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/agy/__init__.py +0 -0
  256. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/amp/__init__.py +0 -0
  257. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  258. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/bob/__init__.py +0 -0
  259. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/catalog.py +0 -0
  260. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/claude/__init__.py +0 -0
  261. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/cline/__init__.py +0 -0
  262. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  263. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/codex/__init__.py +0 -0
  264. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  265. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/devin/__init__.py +0 -0
  266. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  267. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/goose/__init__.py +0 -0
  268. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/iflow/__init__.py +0 -0
  269. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/junie/__init__.py +0 -0
  270. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  271. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  272. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  273. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  274. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/manifest.py +0 -0
  275. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  276. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/pi/__init__.py +0 -0
  277. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  278. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  279. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/roo/__init__.py +0 -0
  280. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  281. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/shai/__init__.py +0 -0
  282. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  283. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/trae/__init__.py +0 -0
  284. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  285. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
  286. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/integrations/zed/__init__.py +0 -0
  287. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/presets/_commands.py +0 -0
  288. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/shared_infra.py +0 -0
  289. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/__init__.py +0 -0
  290. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/base.py +0 -0
  291. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/catalog.py +0 -0
  292. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/engine.py +0 -0
  293. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/expressions.py +0 -0
  294. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/__init__.py +0 -0
  295. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  296. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  297. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  298. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  299. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  300. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  301. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  302. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  303. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  304. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  305. {specify_cli-0.11.4 → specify_cli-0.11.5}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  306. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/checklist-template.md +0 -0
  307. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/analyze.md +0 -0
  308. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/checklist.md +0 -0
  309. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/clarify.md +0 -0
  310. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/constitution.md +0 -0
  311. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/converge.md +0 -0
  312. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/implement.md +0 -0
  313. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/plan.md +0 -0
  314. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/specify.md +0 -0
  315. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/tasks.md +0 -0
  316. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/commands/taskstoissues.md +0 -0
  317. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/constitution-template.md +0 -0
  318. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/plan-template.md +0 -0
  319. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/spec-template.md +0 -0
  320. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/tasks-template.md +0 -0
  321. {specify_cli-0.11.4 → specify_cli-0.11.5}/templates/vscode-settings.json +0 -0
  322. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/__init__.py +0 -0
  323. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/auth_helpers.py +0 -0
  324. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/bundler_helpers.py +0 -0
  325. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/conftest.py +0 -0
  326. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/contract/test_bundle_cli.py +0 -0
  327. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/contract/test_catalog_schema.py +0 -0
  328. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/contract/test_manifest_schema.py +0 -0
  329. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/__init__.py +0 -0
  330. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/bug/__init__.py +0 -0
  331. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/bug/test_bug_extension.py +0 -0
  332. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/git/__init__.py +0 -0
  333. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/extensions/git/test_git_extension.py +0 -0
  334. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/TESTING.md +0 -0
  335. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/plan.md +0 -0
  336. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/spec.md +0 -0
  337. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/hooks/tasks.md +0 -0
  338. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/http_helpers.py +0 -0
  339. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_catalog_stack.py +0 -0
  340. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_init_install.py +0 -0
  341. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_install_flow.py +0 -0
  342. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_local_install.py +0 -0
  343. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_offline.py +0 -0
  344. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integration/test_bundler_security_paths.py +0 -0
  345. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/__init__.py +0 -0
  346. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/conftest.py +0 -0
  347. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_base.py +0 -0
  348. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_extra_args.py +0 -0
  349. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_agy.py +0 -0
  350. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_amp.py +0 -0
  351. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_auggie.py +0 -0
  352. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_markdown.py +0 -0
  353. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_skills.py +0 -0
  354. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_toml.py +0 -0
  355. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_base_yaml.py +0 -0
  356. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_bob.py +0 -0
  357. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_catalog.py +0 -0
  358. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_claude.py +0 -0
  359. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_cline.py +0 -0
  360. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_codebuddy.py +0 -0
  361. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_copilot.py +0 -0
  362. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_cursor_agent.py +0 -0
  363. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_devin.py +0 -0
  364. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_forge.py +0 -0
  365. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_gemini.py +0 -0
  366. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_generic.py +0 -0
  367. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_goose.py +0 -0
  368. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_hermes.py +0 -0
  369. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_iflow.py +0 -0
  370. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_junie.py +0 -0
  371. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_kilocode.py +0 -0
  372. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_kimi.py +0 -0
  373. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_kiro_cli.py +0 -0
  374. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_lingma.py +0 -0
  375. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_opencode.py +0 -0
  376. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_pi.py +0 -0
  377. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_qodercli.py +0 -0
  378. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_qwen.py +0 -0
  379. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_roo.py +0 -0
  380. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_rovodev.py +0 -0
  381. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_scaffold.py +0 -0
  382. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_shai.py +0 -0
  383. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_state.py +0 -0
  384. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_tabnine.py +0 -0
  385. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_trae.py +0 -0
  386. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_vibe.py +0 -0
  387. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_windsurf.py +0 -0
  388. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_integration_zed.py +0 -0
  389. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_manifest.py +0 -0
  390. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/integrations/test_registry.py +0 -0
  391. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/self_upgrade_helpers.py +0 -0
  392. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_agent_config_consistency.py +0 -0
  393. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_authentication.py +0 -0
  394. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_branch_numbering.py +0 -0
  395. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_check_prerequisites_paths_only.py +0 -0
  396. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_check_tool.py +0 -0
  397. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_cli_version.py +0 -0
  398. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_commands_package.py +0 -0
  399. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_console_imports.py +0 -0
  400. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extension_registration.py +0 -0
  401. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_extension_skills.py +0 -0
  402. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_github_http.py +0 -0
  403. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_init_dir.py +0 -0
  404. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_live_transient_windows.py +0 -0
  405. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_merge.py +0 -0
  406. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_ps1_encoding.py +0 -0
  407. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_registrar_path_traversal.py +0 -0
  408. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_detection.py +0 -0
  409. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_execution.py +0 -0
  410. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_guidance.py +0 -0
  411. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_self_upgrade_verification.py +0 -0
  412. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_setup_plan_feature_json.py +0 -0
  413. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_setup_plan_no_overwrite.py +0 -0
  414. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_setup_tasks.py +0 -0
  415. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_timestamp_branches.py +0 -0
  416. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_upgrade.py +0 -0
  417. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_utils_assets_imports.py +0 -0
  418. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_version_imports.py +0 -0
  419. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_workflow_run_without_project.py +0 -0
  420. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/test_workflows.py +0 -0
  421. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_adapters.py +0 -0
  422. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_catalog_config.py +0 -0
  423. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_conflict.py +0 -0
  424. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_packager.py +0 -0
  425. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_primitives.py +0 -0
  426. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_records.py +0 -0
  427. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_references.py +0 -0
  428. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_resolver.py +0 -0
  429. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_validator.py +0 -0
  430. {specify_cli-0.11.4 → specify_cli-0.11.5}/tests/unit/test_bundler_versioning.py +0 -0
  431. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/ARCHITECTURE.md +0 -0
  432. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/PUBLISHING.md +0 -0
  433. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/README.md +0 -0
  434. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/catalog.community.json +0 -0
  435. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/catalog.json +0 -0
  436. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/speckit/workflow.yml +0 -0
  437. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/step-catalog.community.json +0 -0
  438. {specify_cli-0.11.4 → specify_cli-0.11.5}/workflows/step-catalog.json +0 -0
@@ -0,0 +1,80 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tag:
7
+ description: 'Release tag to publish (e.g., v0.10.1)'
8
+ required: true
9
+ type: string
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ build:
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read
19
+ actions: write
20
+ steps:
21
+ - name: Verify tag format
22
+ run: |
23
+ TAG="${{ inputs.tag }}"
24
+ if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
25
+ echo "Error: '$TAG' is not a valid release tag (expected vX.Y.Z)"
26
+ exit 1
27
+ fi
28
+
29
+ - name: Checkout release tag
30
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
31
+ with:
32
+ ref: refs/tags/${{ inputs.tag }}
33
+
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
36
+
37
+ - name: Set up Python
38
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
39
+ with:
40
+ python-version: "3.13"
41
+
42
+ - name: Verify tag matches package version
43
+ run: |
44
+ TAG_VERSION="${{ inputs.tag }}"
45
+ TAG_VERSION="${TAG_VERSION#v}"
46
+ PROJECT_VERSION="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
47
+ if [[ "$TAG_VERSION" != "$PROJECT_VERSION" ]]; then
48
+ echo "Error: Tag version ($TAG_VERSION) does not match pyproject.toml version ($PROJECT_VERSION)"
49
+ exit 1
50
+ fi
51
+
52
+ - name: Build package
53
+ run: uv build
54
+
55
+ - name: Upload build artifacts
56
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
57
+ with:
58
+ name: dist
59
+ path: dist/
60
+ if-no-files-found: error
61
+
62
+ publish:
63
+ needs: build
64
+ runs-on: ubuntu-latest
65
+ environment: pypi
66
+ permissions:
67
+ id-token: write
68
+ actions: read
69
+ steps:
70
+ - name: Download build artifacts
71
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
72
+ with:
73
+ name: dist
74
+ path: dist/
75
+
76
+ - name: Install uv
77
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
78
+
79
+ - name: Publish to PyPI
80
+ run: uv publish
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.11.5] - 2026-06-22
6
+
7
+ ### Changed
8
+
9
+ - fix: register enabled extensions for agent on integration use/upgrade (#2949)
10
+ - Add SicarioSpec Core preset to community catalog (#3102)
11
+ - Update Game Narrative Writing preset to v1.1.0 (#3099)
12
+ - feat: add PyPI publishing workflow and readme metadata (#2915)
13
+ - refactor: move extension command handlers to extensions/_commands.py (PR-7/8) (#3014)
14
+ - feat: add ZCode (Z.AI) integration (#3063)
15
+ - fix(agent-context): support multiple context files safely (#2969)
16
+ - Update DocGuard — CDD Enforcement extension to v0.27.0 (#3094)
17
+ - fix(presets): use _repo_root() for bundled-core source-checkout fallback (#3086) (#3091)
18
+ - chore: release 0.11.4, begin 0.11.5.dev0 development (#3092)
19
+
5
20
  ## [0.11.4] - 2026-06-22
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.11.4
3
+ Version: 0.11.5
4
4
  Summary: Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD).
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -423,7 +423,7 @@ specify init . --force --integration copilot
423
423
  specify init --here --force --integration copilot
424
424
  ```
425
425
 
426
- The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, or Mistral Vibe installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
426
+ The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
427
427
 
428
428
  ```bash
429
429
  specify init <project_name> --integration copilot --ignore-agent-tools
@@ -403,7 +403,7 @@ specify init . --force --integration copilot
403
403
  specify init --here --force --integration copilot
404
404
  ```
405
405
 
406
- The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, or Mistral Vibe installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
406
+ The CLI will check if you have Claude Code, Gemini CLI, Cursor CLI, Qwen CLI, opencode, Codex CLI, Qoder CLI, Tabnine CLI, Kiro CLI, Pi, Forge, Goose, Mistral Vibe, or ZCode installed. If you do not, or you prefer to get the templates without checking for the right tools, use `--ignore-agent-tools` with your command:
407
407
 
408
408
  ```bash
409
409
  specify init <project_name> --integration copilot --ignore-agent-tools
@@ -17,7 +17,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
17
17
  | Cross-Platform Governance | Adds Bash + PowerShell parity, Unix man-pages, bilingual comment-based help, Verb-Noun Cmdlet discipline, and audit-ready Spec Kit run evidence for scripting projects managed with Spec Kit | 8 templates, 3 commands | — | [spec-kit-preset-cross-platform-governance](https://github.com/hindermath/spec-kit-preset-cross-platform-governance) |
18
18
  | Explicit Task Dependencies | Adds explicit `(depends on T###)` dependency declarations and an Execution Wave DAG to tasks.md for parallel scheduling | 1 template, 1 command | — | [spec-kit-preset-explicit-task-dependencies](https://github.com/Quratulain-bilal/spec-kit-preset-explicit-task-dependencies) |
19
19
  | Fiction Book Writing | It adapts the Spec-Driven Development workflow for storytelling to create books or audiobooks (with annotations) in 12 languages: features become story elements, specs become story briefs, plans become story structures, and tasks become scene-by-scene writing tasks. Supports single and multi-POV, all major plot structure frameworks, and two style modes: an author voice sample or humanized AI prose principles. Supports interactive elements like brainstorming, interview, roleplay, and extras like statistics, cover builder, illustration builder, and bio command. Export with templates for KDP, D2D, etc. | 26 templates, 34 commands, 2 scripts | — | [speckit-preset-fiction-book-writing](https://github.com/adaumann/speckit-preset-fiction-book-writing) |
20
- | Game Narrative Writing | Spec-Driven Development for interactive game narrative pre-production for video games. Authors write in a portable generic format, Twine/Sugarcube (.twee) or Ink (.ink). Covers choice-IF, visual novels, and branching dialogue. Supports Tier 1 mechanic hooks (flag, counter, inventory, timer, trust, currency, npc_state, ending_condition), multi-ending design, series carry-over variable registry, and NPC-focused character architecture. | 22 templates, 36 commands, 2 scripts | — | [speckit-preset-game-narrative-writing](https://github.com/adaumann/speckit-preset-game-narrative-writing) |
20
+ | Game Narrative Writing | Preset for game narrative design and interactive storytelling. It adapts the Spec-Driven Development workflow for game narratives: features become story mechanics, specs become narrative briefs, plans become story maps, and tasks become dialogue and scene-writing tasks. Supports branching narratives, player agency systems, state machines, and interactive dialogue trees. | 37 templates, 34 commands, 5 scripts | — | [speckit-preset-game-narrative-writing](https://github.com/adaumann/speckit-preset-game-narrative-writing) |
21
21
  | iSAQB Architecture Governance | Adds general iSAQB/CPSA-F and arc42 software-architecture governance, including audit-ready Spec Kit run evidence for architecture goals, views, quality scenarios, ADRs, risks, and technical debt. | 13 templates, 3 commands | — | [spec-kit-preset-isaqb-architecture-governance](https://github.com/hindermath/spec-kit-preset-isaqb-architecture-governance) |
22
22
  | Jira Issue Tracking | Overrides `speckit.taskstoissues` to create Jira epics, stories, and tasks instead of GitHub Issues via Atlassian MCP tools | 1 command | — | [spec-kit-preset-jira](https://github.com/luno/spec-kit-preset-jira) |
23
23
  | Model Driven Engineering | Focuses on streamlined commands, app repository support, cross-spec support, and capability-aware project memory for model-driven engineering workflows | 6 templates, 11 commands | MDE extension | [spec-kit-preset-mde](https://github.com/AI-MDE/spec-kit-preset-mde) |
@@ -25,6 +25,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
25
25
  | Pirate Speak (Full) | Transforms all Spec Kit output into pirate speak — specs become "Voyage Manifests", plans become "Battle Plans", tasks become "Crew Assignments" | 6 templates, 9 commands | — | [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
26
26
  | Screenwriting | Spec-Driven Development for screenwriting/scriptwriting/tutorials: feature films, television (pilot, episode, limited series), and stage plays. Adapts the Spec Kit workflow to screenplay craft — slug lines, action lines, act breaks, beat sheets, and industry-standard pitch documents. Supports three-act, Save the Cat, TV pilot, network episode, cable/streaming episode, and stage-play structural frameworks. Export to Fountain, FTX, PDF | 26 templates, 32 commands, 1 script | — | [speckit-preset-screenwriting](https://github.com/adaumann/speckit-preset-screenwriting) |
27
27
  | Security Governance | Adds memory-safe-language preference, language-specific secure coding profiles, audit-ready Spec-Kit run evidence, ASVS verification, SBOM/AI-SBOM supply-chain transparency, CRA awareness, and regulatory applicability screening for NIS2, CRA, EU AI Act, and DORA | 14 templates, 3 commands | — | [spec-kit-preset-security-governance](https://github.com/hindermath/spec-kit-preset-security-governance) |
28
+ | SicarioSpec Core | Evidence-first security operations governance that maps feature risk to controls, gates, evidence, owners, approval, and accepted-risk decisions. | 5 templates | — | [sicario-spec](https://github.com/dfirs1car1o/sicario-spec) |
28
29
  | Spec2Cloud | Spec-driven workflow tuned for shipping to Azure: spec → plan → tasks → implement → deploy | 5 templates, 8 commands | — | [spec2cloud](https://github.com/Azure-Samples/Spec2Cloud) |
29
30
  | Table of Contents Navigation | Adds a navigable Table of Contents to generated spec.md, plan.md, and tasks.md documents | 3 templates, 3 commands | — | [spec-kit-preset-toc-navigation](https://github.com/Quratulain-bilal/spec-kit-preset-toc-navigation) |
30
31
  | VS Code Ask Questions | Enhances the clarify command to use `vscode/askQuestions` for batched interactive questioning. | 1 command | — | [spec-kit-presets](https://github.com/fdcastel/spec-kit-presets) |
@@ -38,6 +38,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
38
38
  | [Tabnine CLI](https://docs.tabnine.com/main/getting-started/tabnine-cli) | `tabnine` | |
39
39
  | [Trae](https://www.trae.ai/) | `trae` | Skills-based integration; skills are installed automatically |
40
40
  | [Windsurf](https://windsurf.com/) | `windsurf` | |
41
+ | [ZCode](https://zcode.z.ai/) | `zcode` | Skills-based integration; installs skills into `.zcode/skills/` and invokes them as `$speckit-<command>` |
41
42
  | [Zed](https://zed.dev/) | `zed` | Skills-based integration; installs skills into `.agents/skills` and invokes them as `/speckit-<command>` |
42
43
  | Generic | `generic` | Bring your own agent — use `--integration generic --integration-options="--commands-dir <path>"` for AI coding agents not listed above |
43
44
 
@@ -10,6 +10,7 @@ Not every Spec Kit user wants Spec Kit to write into the coding agent's context
10
10
 
11
11
  - **Opt out** entirely with `specify extension disable agent-context` — Spec Kit will then never create or modify the agent context file.
12
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.
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`.
13
14
  - **Refresh on demand** with `/speckit.agent-context.update`, or automatically through the hooks declared in `extension.yml` (`after_specify`, `after_plan`).
14
15
 
15
16
  ## Commands
@@ -27,6 +28,12 @@ All configuration flows through the extension's own config file at
27
28
  # Path to the coding agent context file managed by this extension
28
29
  context_file: CLAUDE.md
29
30
 
31
+ # Optional list of coding agent context files to manage together.
32
+ # When non-empty, this takes precedence over context_file.
33
+ context_files:
34
+ - AGENTS.md
35
+ - CLAUDE.md
36
+
30
37
  # Delimiters for the managed Spec Kit section
31
38
  context_markers:
32
39
  start: "<!-- SPECKIT START -->"
@@ -34,6 +41,7 @@ context_markers:
34
41
  ```
35
42
 
36
43
  - `context_file` — the project-relative path to the coding agent context file, written by `specify init` and `specify integration install`.
44
+ - `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.
37
45
  - `context_markers.start` / `.end` — the delimiters around the managed section. Edit these to use custom markers.
38
46
 
39
47
  ## Requirements
@@ -55,3 +63,4 @@ specify extension disable agent-context
55
63
  ```
56
64
 
57
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.
@@ -2,12 +2,17 @@
2
2
  # These values are populated automatically by `specify init` and
3
3
  # `specify integration use` / `specify integration install`.
4
4
 
5
- # Path (relative to the project root) to the coding agent context file
5
+ # Path (relative to the project root) to the default coding agent context file
6
6
  # managed by this extension (e.g. CLAUDE.md, AGENTS.md,
7
7
  # .github/copilot-instructions.md). Set automatically from the active
8
8
  # integration and regenerated during `specify init` or integration switches.
9
9
  context_file: ""
10
10
 
11
+ # Optional list of project-relative coding agent context files managed by this
12
+ # extension. When non-empty, this list takes precedence over `context_file`.
13
+ # Use this for projects that intentionally keep multiple agent anchors in sync.
14
+ context_files: []
15
+
11
16
  # Delimiters for the managed Spec Kit section.
12
17
  # Edit these to use custom markers.
13
18
  context_markers:
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Refresh the managed Spec Kit section in the coding agent context file"
2
+ description: "Refresh the managed Spec Kit section in coding agent context file(s)"
3
3
  ---
4
4
 
5
5
  # Update Coding Agent Context
@@ -12,11 +12,12 @@ The script reads the agent-context extension config at
12
12
  `.specify/extensions/agent-context/agent-context-config.yml` to discover:
13
13
 
14
14
  - `context_file` — the path of the coding agent context file to manage.
15
+ - `context_files` — optional project-relative paths for multiple coding agent context files. When non-empty, the script updates each listed file and the list takes precedence over `context_file`.
15
16
  - `context_markers.start` / `.end` — the delimiters surrounding the managed section. Defaults to `<!-- SPECKIT START -->` and `<!-- SPECKIT END -->` when the field is missing.
16
17
 
17
18
  It then creates, replaces, or appends the managed block so that the section points at the most recent plan path when one can be discovered (`specs/<feature>/plan.md`).
18
19
 
19
- If `context_file` is empty or the file cannot be located, the command reports nothing to do and exits successfully.
20
+ If `context_files` and `context_file` are empty, the command reports nothing to do and exits successfully. Context file paths must stay project-relative; absolute paths, Windows drive paths, backslash separators, and `..` path segments are rejected.
20
21
 
21
22
  ## Execution
22
23
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env bash
2
2
  # update-agent-context.sh
3
3
  #
4
- # Refresh the managed Spec Kit section in the coding agent's context file
4
+ # Refresh the managed Spec Kit section in the coding agent's context file(s)
5
5
  # (e.g. CLAUDE.md, .github/copilot-instructions.md, AGENTS.md).
6
6
  #
7
- # Reads `context_file` and `context_markers.{start,end}` from the
7
+ # Reads `context_files` or `context_file`, plus `context_markers.{start,end}`, from the
8
8
  # agent-context extension config:
9
9
  # .specify/extensions/agent-context/agent-context-config.yml
10
10
  #
@@ -26,22 +26,41 @@ if [[ ! -f "$EXT_CONFIG" ]]; then
26
26
  exit 0
27
27
  fi
28
28
 
29
- # Locate a suitable Python interpreter (python3, then python).
29
+ # Locate a Python 3 interpreter with PyYAML available.
30
30
  _python=""
31
- if command -v python3 >/dev/null 2>&1; then
32
- _python="python3"
33
- elif command -v python >/dev/null 2>&1 && python --version 2>&1 | grep -q "^Python 3"; then
34
- _python="python"
35
- fi
31
+ _python_candidates=()
32
+ [[ -n "${SPECKIT_PYTHON:-}" ]] && _python_candidates+=("$SPECKIT_PYTHON")
33
+ _python_candidates+=("python3" "python")
34
+ for _candidate in "${_python_candidates[@]}"; do
35
+ if command -v "$_candidate" >/dev/null 2>&1 \
36
+ && "$_candidate" - <<'PY' >/dev/null 2>&1
37
+ import sys
38
+ try:
39
+ import yaml # noqa: F401
40
+ except ImportError:
41
+ sys.exit(1)
42
+ sys.exit(0 if sys.version_info[0] == 3 else 1)
43
+ PY
44
+ then
45
+ _python="$_candidate"
46
+ break
47
+ fi
48
+ done
49
+ unset _candidate _python_candidates
36
50
 
37
51
  if [[ -z "$_python" ]]; then
38
- echo "agent-context: Python 3 not found on PATH; skipping update." >&2
52
+ echo "agent-context: Python 3 with PyYAML not found on PATH; skipping update." >&2
53
+ echo " To resolve: pip install pyyaml (or install it into the environment used by python3)." >&2
39
54
  exit 0
40
55
  fi
56
+ _case_insensitive_context_files=0
57
+ case "$(uname -s 2>/dev/null || true)" in
58
+ MINGW*|MSYS*|CYGWIN*) _case_insensitive_context_files=1 ;;
59
+ esac
41
60
 
42
- # Parse extension config once; emit three newline-separated fields:
43
- # context_file, context_markers.start, context_markers.end
44
- if ! _raw_opts="$("$_python" - "$EXT_CONFIG" <<'PY'
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'
63
+ import json
45
64
  import sys
46
65
  try:
47
66
  import yaml
@@ -73,7 +92,28 @@ def get_str(obj, *keys):
73
92
  else:
74
93
  return ""
75
94
  return node if isinstance(node, str) else ""
76
- print(get_str(data, "context_file"))
95
+ context_files = []
96
+ seen_context_files = set()
97
+ case_insensitive = sys.argv[2] == "1" or sys.platform.startswith(("win32", "cygwin"))
98
+ raw_files = data.get("context_files")
99
+ if isinstance(raw_files, list):
100
+ 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)
111
+ 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)
116
+ print(json.dumps(context_files))
77
117
  print(get_str(data, "context_markers", "start"))
78
118
  print(get_str(data, "context_markers", "end"))
79
119
  PY
@@ -87,31 +127,71 @@ while IFS= read -r _line || [[ -n "$_line" ]]; do
87
127
  _opts_lines+=("$_line")
88
128
  done < <(printf '%s\n' "$_raw_opts")
89
129
  if (( ${#_opts_lines[@]} < 3 )); then
90
- echo "agent-context: malformed config parser output; expected 3 lines (context_file, marker_start, marker_end), got ${#_opts_lines[@]}; skipping update." >&2
130
+ echo "agent-context: malformed config parser output; expected 3 lines (context_files, marker_start, marker_end), got ${#_opts_lines[@]}; skipping update." >&2
91
131
  exit 0
92
132
  fi
93
- CONTEXT_FILE="${_opts_lines[0]}"
133
+ CONTEXT_FILES_JSON="${_opts_lines[0]}"
94
134
  MARKER_START="${_opts_lines[1]}"
95
135
  MARKER_END="${_opts_lines[2]}"
96
136
 
97
- if [[ -z "$CONTEXT_FILE" ]]; then
98
- echo "agent-context: context_file not set in extension config; nothing to do." >&2
137
+ if ! _context_files_raw="$("$_python" - "$CONTEXT_FILES_JSON" <<'PY'
138
+ import json
139
+ import sys
140
+ try:
141
+ data = json.loads(sys.argv[1])
142
+ except Exception:
143
+ data = []
144
+ if not isinstance(data, list):
145
+ data = []
146
+ for value in data:
147
+ if isinstance(value, str) and value:
148
+ print(value)
149
+ PY
150
+ )"; then
151
+ echo "agent-context: malformed context_files parser output; skipping update." >&2
99
152
  exit 0
100
153
  fi
101
154
 
102
- # Reject absolute paths, backslash separators, and '..' path segments in context_file
103
- if [[ "$CONTEXT_FILE" == /* ]] || [[ "$CONTEXT_FILE" =~ ^[A-Za-z]: ]]; then
104
- echo "agent-context: context_file must be a project-relative path; got '$CONTEXT_FILE'." >&2
105
- exit 1
106
- fi
107
- if [[ "$CONTEXT_FILE" == *\\* ]]; then
108
- echo "agent-context: context_file must not contain backslash separators; got '$CONTEXT_FILE'." >&2
109
- exit 1
155
+ CONTEXT_FILES=()
156
+ while IFS= read -r _line || [[ -n "$_line" ]]; do
157
+ [[ -n "$_line" ]] && CONTEXT_FILES+=("$_line")
158
+ done < <(printf '%s\n' "$_context_files_raw")
159
+
160
+ if (( ${#CONTEXT_FILES[@]} == 0 )); then
161
+ echo "agent-context: context_files/context_file not set in extension config; nothing to do." >&2
162
+ exit 0
110
163
  fi
111
- IFS='/' read -ra _cf_parts <<< "$CONTEXT_FILE"
112
- for _seg in "${_cf_parts[@]}"; do
113
- if [[ "$_seg" == ".." ]]; then
114
- echo "agent-context: context_file must not contain '..' path segments; got '$CONTEXT_FILE'." >&2
164
+
165
+ for CONTEXT_FILE in "${CONTEXT_FILES[@]}"; do
166
+ # Reject absolute paths, backslash separators, and '..' path segments in context files
167
+ if [[ "$CONTEXT_FILE" == /* ]] || [[ "$CONTEXT_FILE" =~ ^[A-Za-z]: ]]; then
168
+ echo "agent-context: context files must be project-relative paths; got '$CONTEXT_FILE'." >&2
169
+ exit 1
170
+ fi
171
+ if [[ "$CONTEXT_FILE" == *\\* ]]; then
172
+ echo "agent-context: context files must not contain backslash separators; got '$CONTEXT_FILE'." >&2
173
+ exit 1
174
+ fi
175
+ IFS='/' read -ra _cf_parts <<< "$CONTEXT_FILE"
176
+ for _seg in "${_cf_parts[@]}"; do
177
+ if [[ "$_seg" == ".." ]]; then
178
+ echo "agent-context: context files must not contain '..' path segments; got '$CONTEXT_FILE'." >&2
179
+ exit 1
180
+ fi
181
+ done
182
+ if ! "$_python" - "$PROJECT_ROOT" "$CONTEXT_FILE" <<'PY'
183
+ import sys
184
+ from pathlib import Path
185
+
186
+ root = Path(sys.argv[1]).resolve()
187
+ target = (root / sys.argv[2]).resolve(strict=False)
188
+ try:
189
+ target.relative_to(root)
190
+ except ValueError:
191
+ sys.exit(1)
192
+ PY
193
+ then
194
+ echo "agent-context: context file path resolves outside the project root; got '$CONTEXT_FILE'." >&2
115
195
  exit 1
116
196
  fi
117
197
  done
@@ -142,9 +222,6 @@ PY
142
222
  fi
143
223
  fi
144
224
 
145
- CTX_PATH="$PROJECT_ROOT/$CONTEXT_FILE"
146
- mkdir -p "$(dirname "$CTX_PATH")"
147
-
148
225
  # Build the managed section
149
226
  TMP_SECTION="$(mktemp)"
150
227
  trap 'rm -f "$TMP_SECTION"' EXIT
@@ -158,7 +235,11 @@ trap 'rm -f "$TMP_SECTION"' EXIT
158
235
  echo "$MARKER_END"
159
236
  } > "$TMP_SECTION"
160
237
 
161
- "$_python" - "$CTX_PATH" "$MARKER_START" "$MARKER_END" "$TMP_SECTION" <<'PY'
238
+ for CONTEXT_FILE in "${CONTEXT_FILES[@]}"; do
239
+ CTX_PATH="$PROJECT_ROOT/$CONTEXT_FILE"
240
+ mkdir -p "$(dirname "$CTX_PATH")"
241
+
242
+ "$_python" - "$CTX_PATH" "$MARKER_START" "$MARKER_END" "$TMP_SECTION" <<'PY'
162
243
  import sys, os
163
244
  ctx_path, start, end, section_path = sys.argv[1:5]
164
245
  with open(section_path, "r", encoding="utf-8") as fh:
@@ -197,4 +278,5 @@ with open(ctx_path, "wb") as fh:
197
278
  fh.write(new_content.encode("utf-8"))
198
279
  PY
199
280
 
200
- echo "agent-context: updated $CONTEXT_FILE"
281
+ echo "agent-context: updated $CONTEXT_FILE"
282
+ done