specify-cli 0.11.6__tar.gz → 0.11.7__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 (443) hide show
  1. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/agent_request.yml +1 -1
  2. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -0
  3. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/feature_request.yml +1 -0
  4. {specify_cli-0.11.6 → specify_cli-0.11.7}/CHANGELOG.md +15 -0
  5. {specify_cli-0.11.6 → specify_cli-0.11.7}/PKG-INFO +2 -2
  6. {specify_cli-0.11.6 → specify_cli-0.11.7}/README.md +1 -1
  7. specify_cli-0.11.7/docs/guides/monorepo.md +111 -0
  8. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/installation.md +2 -1
  9. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/integrations.md +1 -0
  10. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/workflows.md +2 -0
  11. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/toc.yml +2 -0
  12. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/upgrade.md +5 -1
  13. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-PUBLISHING-GUIDE.md +1 -0
  14. {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/catalog.json +10 -1
  15. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/PUBLISHING.md +1 -0
  16. {specify_cli-0.11.6 → specify_cli-0.11.7}/pyproject.toml +11 -1
  17. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/check-prerequisites.ps1 +6 -6
  18. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/create-new-feature.ps1 +5 -2
  19. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_utils.py +21 -4
  20. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/agents.py +34 -4
  21. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/extensions/__init__.py +14 -5
  22. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/__init__.py +2 -0
  23. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/base.py +3 -0
  24. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/codex/__init__.py +1 -0
  25. specify_cli-0.11.7/src/specify_cli/integrations/omp/__init__.py +45 -0
  26. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/presets/__init__.py +5 -0
  27. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/shared_infra.py +71 -0
  28. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/engine.py +51 -3
  29. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/shell/__init__.py +1 -1
  30. specify_cli-0.11.7/tests/integrations/test_integration_omp.py +31 -0
  31. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_agent_config_consistency.py +7 -0
  32. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_check_prerequisites_paths_only.py +60 -4
  33. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extension_skills.py +78 -0
  34. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extensions.py +255 -0
  35. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_presets.py +84 -0
  36. specify_cli-0.11.7/tests/test_shared_infra_integrity.py +101 -0
  37. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_timestamp_branches.py +46 -0
  38. specify_cli-0.11.7/tests/test_utils.py +15 -0
  39. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_workflows.py +142 -0
  40. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/PUBLISHING.md +12 -0
  41. {specify_cli-0.11.6 → specify_cli-0.11.7}/.devcontainer/devcontainer.json +0 -0
  42. {specify_cli-0.11.6 → specify_cli-0.11.7}/.devcontainer/post-create.sh +0 -0
  43. {specify_cli-0.11.6 → specify_cli-0.11.7}/.editorconfig +0 -0
  44. {specify_cli-0.11.6 → specify_cli-0.11.7}/.gitattributes +0 -0
  45. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/CODEOWNERS +0 -0
  46. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  47. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  48. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  49. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  50. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/aw/actions-lock.json +0 -0
  51. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/dependabot.yml +0 -0
  52. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/skills/add-community-extension/SKILL.md +0 -0
  53. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/RELEASE-PROCESS.md +0 -0
  54. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-extension.lock.yml +0 -0
  55. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-extension.md +0 -0
  56. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-preset.lock.yml +0 -0
  57. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/add-community-preset.md +0 -0
  58. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/bug-assess.lock.yml +0 -0
  59. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/bug-assess.md +0 -0
  60. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/catalog-assign.yml +0 -0
  61. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/codeql.yml +0 -0
  62. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/docs.yml +0 -0
  63. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/lint.yml +0 -0
  64. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/publish-pypi.yml +0 -0
  65. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/release-trigger.yml +0 -0
  66. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/release.yml +0 -0
  67. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/stale.yml +0 -0
  68. {specify_cli-0.11.6 → specify_cli-0.11.7}/.github/workflows/test.yml +0 -0
  69. {specify_cli-0.11.6 → specify_cli-0.11.7}/.gitignore +0 -0
  70. {specify_cli-0.11.6 → specify_cli-0.11.7}/.markdownlint-cli2.jsonc +0 -0
  71. {specify_cli-0.11.6 → specify_cli-0.11.7}/.zenodo.json +0 -0
  72. {specify_cli-0.11.6 → specify_cli-0.11.7}/AGENTS.md +0 -0
  73. {specify_cli-0.11.6 → specify_cli-0.11.7}/CITATION.cff +0 -0
  74. {specify_cli-0.11.6 → specify_cli-0.11.7}/CODE_OF_CONDUCT.md +0 -0
  75. {specify_cli-0.11.6 → specify_cli-0.11.7}/CONTRIBUTING.md +0 -0
  76. {specify_cli-0.11.6 → specify_cli-0.11.7}/DEVELOPMENT.md +0 -0
  77. {specify_cli-0.11.6 → specify_cli-0.11.7}/LICENSE +0 -0
  78. {specify_cli-0.11.6 → specify_cli-0.11.7}/SECURITY.md +0 -0
  79. {specify_cli-0.11.6 → specify_cli-0.11.7}/SUPPORT.md +0 -0
  80. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/.gitignore +0 -0
  81. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/README.md +0 -0
  82. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/extensions.md +0 -0
  83. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/friends.md +0 -0
  84. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/overview.md +0 -0
  85. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/presets.md +0 -0
  86. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/community/walkthroughs.md +0 -0
  87. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/concepts/complex-features.md +0 -0
  88. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/concepts/sdd.md +0 -0
  89. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/concepts/spec-persistence.md +0 -0
  90. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/docfx.json +0 -0
  91. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/guides/evolving-specs.md +0 -0
  92. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/index.md +0 -0
  93. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/air-gapped.md +0 -0
  94. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/one-time.md +0 -0
  95. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/pipx.md +0 -0
  96. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/install/uv.md +0 -0
  97. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/local-development.md +0 -0
  98. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/quickstart.md +0 -0
  99. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/authentication.md +0 -0
  100. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/bundles.md +0 -0
  101. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/core.md +0 -0
  102. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/extensions.md +0 -0
  103. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/overview.md +0 -0
  104. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/reference/presets.md +0 -0
  105. {specify_cli-0.11.6 → specify_cli-0.11.7}/docs/template/public/main.css +0 -0
  106. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/business-analyst/README.md +0 -0
  107. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/business-analyst/bundle.yml +0 -0
  108. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/developer/README.md +0 -0
  109. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/developer/bundle.yml +0 -0
  110. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/product-manager/README.md +0 -0
  111. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/product-manager/bundle.yml +0 -0
  112. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/security-researcher/README.md +0 -0
  113. {specify_cli-0.11.6 → specify_cli-0.11.7}/examples/bundles/security-researcher/bundle.yml +0 -0
  114. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  115. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  116. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  117. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/README.md +0 -0
  118. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  119. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/README.md +0 -0
  120. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/agent-context-config.yml +0 -0
  121. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  122. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/extension.yml +0 -0
  123. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  124. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  125. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/README.md +0 -0
  126. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  127. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  128. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/commands/speckit.bug.test.md +0 -0
  129. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/bug/extension.yml +0 -0
  130. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/catalog.community.json +0 -0
  131. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/catalog.json +0 -0
  132. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/README.md +0 -0
  133. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.commit.md +0 -0
  134. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.feature.md +0 -0
  135. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.initialize.md +0 -0
  136. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.remote.md +0 -0
  137. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/commands/speckit.git.validate.md +0 -0
  138. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/config-template.yml +0 -0
  139. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/extension.yml +0 -0
  140. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/git-config.yml +0 -0
  141. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  142. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  143. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/git-common.sh +0 -0
  144. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  145. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  146. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  147. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  148. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  149. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/selftest/commands/selftest.md +0 -0
  150. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/selftest/extension.yml +0 -0
  151. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/.gitignore +0 -0
  152. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/CHANGELOG.md +0 -0
  153. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/EXAMPLE-README.md +0 -0
  154. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/LICENSE +0 -0
  155. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/README.md +0 -0
  156. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/commands/example.md +0 -0
  157. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/config-template.yml +0 -0
  158. {specify_cli-0.11.6 → specify_cli-0.11.7}/extensions/template/extension.yml +0 -0
  159. {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/CONTRIBUTING.md +0 -0
  160. {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/README.md +0 -0
  161. {specify_cli-0.11.6 → specify_cli-0.11.7}/integrations/catalog.community.json +0 -0
  162. {specify_cli-0.11.6 → specify_cli-0.11.7}/media/bootstrap-claude-code.gif +0 -0
  163. {specify_cli-0.11.6 → specify_cli-0.11.7}/media/logo_large.webp +0 -0
  164. {specify_cli-0.11.6 → specify_cli-0.11.7}/media/logo_small.webp +0 -0
  165. {specify_cli-0.11.6 → specify_cli-0.11.7}/media/spec-kit-video-header.jpg +0 -0
  166. {specify_cli-0.11.6 → specify_cli-0.11.7}/media/specify_cli.gif +0 -0
  167. {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-April.md +0 -0
  168. {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-February.md +0 -0
  169. {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-March.md +0 -0
  170. {specify_cli-0.11.6 → specify_cli-0.11.7}/newsletters/2026-May.md +0 -0
  171. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/ARCHITECTURE.md +0 -0
  172. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/README.md +0 -0
  173. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/catalog.community.json +0 -0
  174. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/catalog.json +0 -0
  175. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/README.md +0 -0
  176. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.constitution.md +0 -0
  177. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.implement.md +0 -0
  178. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.plan.md +0 -0
  179. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.specify.md +0 -0
  180. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/commands/speckit.tasks.md +0 -0
  181. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/lean/preset.yml +0 -0
  182. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/README.md +0 -0
  183. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  184. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/commands/speckit.specify.md +0 -0
  185. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/preset.yml +0 -0
  186. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/templates/myext-template.md +0 -0
  187. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/scaffold/templates/spec-template.md +0 -0
  188. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/commands/speckit.specify.md +0 -0
  189. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  190. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/preset.yml +0 -0
  191. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/agent-file-template.md +0 -0
  192. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/checklist-template.md +0 -0
  193. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/constitution-template.md +0 -0
  194. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/plan-template.md +0 -0
  195. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/spec-template.md +0 -0
  196. {specify_cli-0.11.6 → specify_cli-0.11.7}/presets/self-test/templates/tasks-template.md +0 -0
  197. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/check-prerequisites.sh +0 -0
  198. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/common.sh +0 -0
  199. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/create-new-feature.sh +0 -0
  200. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/setup-plan.sh +0 -0
  201. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/bash/setup-tasks.sh +0 -0
  202. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/common.ps1 +0 -0
  203. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/setup-plan.ps1 +0 -0
  204. {specify_cli-0.11.6 → specify_cli-0.11.7}/scripts/powershell/setup-tasks.ps1 +0 -0
  205. {specify_cli-0.11.6 → specify_cli-0.11.7}/spec-driven.md +0 -0
  206. {specify_cli-0.11.6 → specify_cli-0.11.7}/spec-kit.code-workspace +0 -0
  207. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/__init__.py +0 -0
  208. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_agent_config.py +0 -0
  209. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_assets.py +0 -0
  210. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_console.py +0 -0
  211. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_github_http.py +0 -0
  212. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_init_options.py +0 -0
  213. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_invocation_style.py +0 -0
  214. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/_version.py +0 -0
  215. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/__init__.py +0 -0
  216. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/azure_devops.py +0 -0
  217. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/base.py +0 -0
  218. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/config.py +0 -0
  219. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/github.py +0 -0
  220. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/authentication/http.py +0 -0
  221. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/__init__.py +0 -0
  222. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  223. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  224. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/__init__.py +0 -0
  225. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/project.py +0 -0
  226. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/versioning.py +0 -0
  227. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  228. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/__init__.py +0 -0
  229. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/catalog.py +0 -0
  230. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/manifest.py +0 -0
  231. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/models/records.py +0 -0
  232. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/__init__.py +0 -0
  233. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/adapters.py +0 -0
  234. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  235. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/conflict.py +0 -0
  236. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/installer.py +0 -0
  237. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/packager.py +0 -0
  238. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/primitives.py +0 -0
  239. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/references.py +0 -0
  240. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/resolver.py +0 -0
  241. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/bundler/services/validator.py +0 -0
  242. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/catalogs.py +0 -0
  243. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/commands/__init__.py +0 -0
  244. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/commands/bundle/__init__.py +0 -0
  245. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/commands/init.py +0 -0
  246. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/extensions/_commands.py +0 -0
  247. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_runtime.py +0 -0
  248. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_scaffold.py +0 -0
  249. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_state.py +0 -0
  250. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integration_status.py +0 -0
  251. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_commands.py +0 -0
  252. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_helpers.py +0 -0
  253. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_install_commands.py +0 -0
  254. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  255. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_query_commands.py +0 -0
  256. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  257. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/agy/__init__.py +0 -0
  258. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/amp/__init__.py +0 -0
  259. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  260. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/bob/__init__.py +0 -0
  261. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/catalog.py +0 -0
  262. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/claude/__init__.py +0 -0
  263. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/cline/__init__.py +0 -0
  264. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  265. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  266. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  267. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/devin/__init__.py +0 -0
  268. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  269. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/forge/__init__.py +0 -0
  270. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  271. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/generic/__init__.py +0 -0
  272. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/goose/__init__.py +0 -0
  273. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  274. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/iflow/__init__.py +0 -0
  275. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/junie/__init__.py +0 -0
  276. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  277. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  278. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  279. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  280. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/manifest.py +0 -0
  281. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  282. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/pi/__init__.py +0 -0
  283. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  284. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  285. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/roo/__init__.py +0 -0
  286. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  287. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/shai/__init__.py +0 -0
  288. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  289. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/trae/__init__.py +0 -0
  290. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  291. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
  292. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  293. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/integrations/zed/__init__.py +0 -0
  294. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/presets/_commands.py +0 -0
  295. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/__init__.py +0 -0
  296. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/base.py +0 -0
  297. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/catalog.py +0 -0
  298. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/expressions.py +0 -0
  299. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/__init__.py +0 -0
  300. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  301. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  302. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  303. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  304. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  305. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  306. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  307. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  308. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  309. {specify_cli-0.11.6 → specify_cli-0.11.7}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  310. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/checklist-template.md +0 -0
  311. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/analyze.md +0 -0
  312. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/checklist.md +0 -0
  313. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/clarify.md +0 -0
  314. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/constitution.md +0 -0
  315. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/converge.md +0 -0
  316. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/implement.md +0 -0
  317. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/plan.md +0 -0
  318. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/specify.md +0 -0
  319. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/tasks.md +0 -0
  320. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/commands/taskstoissues.md +0 -0
  321. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/constitution-template.md +0 -0
  322. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/plan-template.md +0 -0
  323. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/spec-template.md +0 -0
  324. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/tasks-template.md +0 -0
  325. {specify_cli-0.11.6 → specify_cli-0.11.7}/templates/vscode-settings.json +0 -0
  326. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/__init__.py +0 -0
  327. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/auth_helpers.py +0 -0
  328. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/bundler_helpers.py +0 -0
  329. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/conftest.py +0 -0
  330. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/contract/test_bundle_cli.py +0 -0
  331. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/contract/test_catalog_schema.py +0 -0
  332. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/contract/test_manifest_schema.py +0 -0
  333. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/__init__.py +0 -0
  334. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/bug/__init__.py +0 -0
  335. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/bug/test_bug_extension.py +0 -0
  336. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/git/__init__.py +0 -0
  337. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/git/test_git_extension.py +0 -0
  338. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/extensions/test_extension_agent_context.py +0 -0
  339. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/TESTING.md +0 -0
  340. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/plan.md +0 -0
  341. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/spec.md +0 -0
  342. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/hooks/tasks.md +0 -0
  343. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/http_helpers.py +0 -0
  344. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_catalog_stack.py +0 -0
  345. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_init_install.py +0 -0
  346. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_install_flow.py +0 -0
  347. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_local_install.py +0 -0
  348. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_offline.py +0 -0
  349. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integration/test_bundler_security_paths.py +0 -0
  350. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/__init__.py +0 -0
  351. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/conftest.py +0 -0
  352. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_base.py +0 -0
  353. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_cli.py +0 -0
  354. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_extra_args.py +0 -0
  355. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_agy.py +0 -0
  356. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_amp.py +0 -0
  357. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_auggie.py +0 -0
  358. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_markdown.py +0 -0
  359. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_skills.py +0 -0
  360. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_toml.py +0 -0
  361. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_base_yaml.py +0 -0
  362. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_bob.py +0 -0
  363. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_catalog.py +0 -0
  364. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_claude.py +0 -0
  365. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_cline.py +0 -0
  366. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_codebuddy.py +0 -0
  367. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_codex.py +0 -0
  368. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_copilot.py +0 -0
  369. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_cursor_agent.py +0 -0
  370. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_devin.py +0 -0
  371. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_firebender.py +0 -0
  372. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_forge.py +0 -0
  373. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_gemini.py +0 -0
  374. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_generic.py +0 -0
  375. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_goose.py +0 -0
  376. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_hermes.py +0 -0
  377. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_iflow.py +0 -0
  378. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_junie.py +0 -0
  379. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_kilocode.py +0 -0
  380. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_kimi.py +0 -0
  381. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_kiro_cli.py +0 -0
  382. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_lingma.py +0 -0
  383. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_opencode.py +0 -0
  384. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_pi.py +0 -0
  385. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_qodercli.py +0 -0
  386. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_qwen.py +0 -0
  387. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_roo.py +0 -0
  388. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_rovodev.py +0 -0
  389. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_scaffold.py +0 -0
  390. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_shai.py +0 -0
  391. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_state.py +0 -0
  392. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_subcommand.py +0 -0
  393. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_tabnine.py +0 -0
  394. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_trae.py +0 -0
  395. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_vibe.py +0 -0
  396. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_windsurf.py +0 -0
  397. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_zcode.py +0 -0
  398. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_integration_zed.py +0 -0
  399. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_manifest.py +0 -0
  400. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/integrations/test_registry.py +0 -0
  401. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/self_upgrade_helpers.py +0 -0
  402. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_authentication.py +0 -0
  403. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_branch_numbering.py +0 -0
  404. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_check_tool.py +0 -0
  405. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_cli_version.py +0 -0
  406. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_commands_package.py +0 -0
  407. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_console_imports.py +0 -0
  408. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extension_registration.py +0 -0
  409. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_extension_update_hardening.py +0 -0
  410. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_github_http.py +0 -0
  411. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_init_dir.py +0 -0
  412. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_live_transient_windows.py +0 -0
  413. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_merge.py +0 -0
  414. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_ps1_encoding.py +0 -0
  415. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_registrar_path_traversal.py +0 -0
  416. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_detection.py +0 -0
  417. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_execution.py +0 -0
  418. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_guidance.py +0 -0
  419. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_self_upgrade_verification.py +0 -0
  420. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_setup_plan_feature_json.py +0 -0
  421. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_setup_plan_no_overwrite.py +0 -0
  422. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_setup_tasks.py +0 -0
  423. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_upgrade.py +0 -0
  424. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_utils_assets_imports.py +0 -0
  425. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_version_imports.py +0 -0
  426. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/test_workflow_run_without_project.py +0 -0
  427. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_adapters.py +0 -0
  428. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_catalog_config.py +0 -0
  429. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_conflict.py +0 -0
  430. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_packager.py +0 -0
  431. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_primitives.py +0 -0
  432. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_records.py +0 -0
  433. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_references.py +0 -0
  434. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_resolver.py +0 -0
  435. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_validator.py +0 -0
  436. {specify_cli-0.11.6 → specify_cli-0.11.7}/tests/unit/test_bundler_versioning.py +0 -0
  437. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/ARCHITECTURE.md +0 -0
  438. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/README.md +0 -0
  439. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/catalog.community.json +0 -0
  440. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/catalog.json +0 -0
  441. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/speckit/workflow.yml +0 -0
  442. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/step-catalog.community.json +0 -0
  443. {specify_cli-0.11.6 → specify_cli-0.11.7}/workflows/step-catalog.json +0 -0
@@ -8,7 +8,7 @@ body:
8
8
  value: |
9
9
  Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
10
10
 
11
- **Currently supported agents**: Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Cursor, Devin for Terminal, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Hermes Agent, IBM Bob, iFlow CLI, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, Roo Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, Windsurf, ZCode, Zed
11
+ **Currently supported agents**: Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Cursor, Devin for Terminal, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Hermes Agent, IBM Bob, iFlow CLI, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, Roo Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, Windsurf, ZCode, Zed
12
12
 
13
13
  - type: input
14
14
  id: agent-name
@@ -85,6 +85,7 @@ body:
85
85
  - Kiro CLI
86
86
  - Lingma
87
87
  - Mistral Vibe
88
+ - Oh My Pi
88
89
  - opencode
89
90
  - Pi Coding Agent
90
91
  - Qoder CLI
@@ -79,6 +79,7 @@ body:
79
79
  - Kiro CLI
80
80
  - Lingma
81
81
  - Mistral Vibe
82
+ - Oh My Pi
82
83
  - opencode
83
84
  - Pi Coding Agent
84
85
  - Qoder CLI
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.11.7] - 2026-06-24
6
+
7
+ ### Changed
8
+
9
+ - feat(extensions): verify catalog archive sha256 before install (#3080)
10
+ - fix(workflows): validate requires keys and reject phantom permissions gate (#3079)
11
+ - fix(scripts): use case-sensitive match for acronym retention in PS branch names (#3130)
12
+ - feat(integrations): add omp support (#3107)
13
+ - fix: render valid TOML when a command body contains backslashes (#3135)
14
+ - harden: reject shell=True in run_command (#3132)
15
+ - docs: add monorepo guide (#3084)
16
+ - fix(scripts): send check-prerequisites.ps1 errors to stderr (#3123)
17
+ - fix: write Codex dev skills as files (#2988)
18
+ - chore: release 0.11.6, begin 0.11.7.dev0 development (#3121)
19
+
5
20
  ## [0.11.6] - 2026-06-23
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.11.6
3
+ Version: 0.11.7
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, 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:
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, Oh My 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, 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:
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, Oh My 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
@@ -0,0 +1,111 @@
1
+ # Using Spec Kit in a Monorepo
2
+
3
+ A Spec Kit project is **directory-scoped**: the project is whichever directory
4
+ contains `.specify/`. A monorepo can hold several independent Spec Kit projects
5
+ under one repository root, each with its own `.specify/`, `specs/`, constitution,
6
+ and feature numbering.
7
+
8
+ Root resolution already prefers the **nearest** `.specify/` over the Git
9
+ toplevel, so commands run from inside a member project resolve to that project,
10
+ not the repo root.
11
+
12
+ ## Layout
13
+
14
+ ```text
15
+ my-monorepo/
16
+ ├── .git/ # one Git repository at the root
17
+ ├── apps/
18
+ │ ├── web/
19
+ │ │ └── .specify/ # Spec Kit project "web"
20
+ │ │ └── memory/constitution.md
21
+ │ └── api/
22
+ │ └── .specify/ # Spec Kit project "api"
23
+ │ └── memory/constitution.md
24
+ └── packages/
25
+ └── ui/
26
+ └── .specify/ # Spec Kit project "ui"
27
+ ```
28
+
29
+ Initialize each member project independently:
30
+
31
+ ```bash
32
+ specify init apps/web --integration claude
33
+ specify init apps/api --integration claude
34
+ ```
35
+
36
+ Each project keeps its own `specs/` directory and numbers features
37
+ independently (`apps/web/specs/001-…`, `apps/api/specs/001-…`).
38
+
39
+ ## Working inside a member project
40
+
41
+ The default workflow is unchanged: change into the project directory and run the
42
+ slash commands. Root resolution finds the nearest `.specify/`.
43
+
44
+ ```bash
45
+ cd apps/web
46
+ # then run /speckit.specify, /speckit.plan, … in your agent
47
+ ```
48
+
49
+ ## Targeting a member project from the repo root
50
+
51
+ For non-interactive or CI runs where you do not want to `cd`, set
52
+ **`SPECIFY_INIT_DIR`** to the member project root (the directory *containing*
53
+ `.specify/`). Relative paths resolve against the current directory.
54
+
55
+ ```bash
56
+ # operate on apps/web from the monorepo root (no cd required)
57
+ export SPECIFY_INIT_DIR=apps/web
58
+ ```
59
+
60
+ The path must exist and contain `.specify/`. If it does not, the command
61
+ **errors and does not fall back** to the current directory or the Git toplevel.
62
+ This is deliberate: a typo never writes specs into the wrong project. A
63
+ nonexistent path is reported as you typed it; a path that exists but is not a
64
+ Spec Kit project is reported as its resolved absolute path:
65
+
66
+ ```text
67
+ # SPECIFY_INIT_DIR=apps/wbe (typo: no such directory)
68
+ ERROR: SPECIFY_INIT_DIR does not point to an existing directory: apps/wbe
69
+
70
+ # SPECIFY_INIT_DIR=apps (exists, but has no .specify/ of its own)
71
+ ERROR: SPECIFY_INIT_DIR is not a Spec Kit project (no .specify/ directory): /home/you/my-monorepo/apps
72
+ ```
73
+
74
+ `SPECIFY_INIT_DIR` selects the **project**; `SPECIFY_FEATURE_DIRECTORY` selects
75
+ the **feature** within it. They compose: set both to pick a project and a
76
+ feature non-interactively. See the
77
+ [`SPECIFY_INIT_DIR` reference](../reference/core.md#environment-variables) for
78
+ the full contract and the two-axes model.
79
+
80
+ ## How `SPECIFY_INIT_DIR` reaches your agent
81
+
82
+ `SPECIFY_INIT_DIR` is read by the shell scripts that the slash commands invoke
83
+ (`get_repo_root` in Bash, `Get-RepoRoot` in PowerShell). It takes effect only
84
+ when it is present in the environment of the shell that runs those scripts.
85
+
86
+ - **Scripted / CI runs:** export it in the same shell that drives the commands;
87
+ it is reliable there.
88
+ - **Interactive agents:** whether an exported variable reaches the shell tool an
89
+ agent uses is agent-specific. Export `SPECIFY_INIT_DIR` *before* launching the
90
+ agent, and verify once (e.g. run `/speckit.specify` and confirm the new feature
91
+ landed under the intended project's `specs/`).
92
+
93
+ ## Git in a monorepo
94
+
95
+ > [!NOTE]
96
+ > Spec Kit project files are scoped to the **resolved project root**, but Git
97
+ > operations still run in the containing Git work tree. In a monorepo with a
98
+ > single Git repository at the root and projects in subdirectories, feature
99
+ > branch creation creates or switches branches in the shared root repository.
100
+ > Spec directories still live under the selected member project, while the Git
101
+ > branch namespace is shared by the whole monorepo. Manage branches and commits
102
+ > at the repository root, or initialize Git per member project if you want
103
+ > isolated per-project branch namespaces.
104
+
105
+ ## Constitutions
106
+
107
+ Each member project has its own `.specify/memory/constitution.md` and
108
+ `/speckit.constitution` edits the local project's file. Spec Kit does not provide
109
+ a built-in base/inheritance mechanism; if you want one constitution to reference
110
+ shared rules elsewhere in the monorepo, you need to maintain that wiring yourself.
111
+ Otherwise, duplicate or sync shared engineering rules per project.
@@ -3,7 +3,7 @@
3
3
  ## Prerequisites
4
4
 
5
5
  - **Linux/macOS** (or Windows; PowerShell scripts now supported without WSL)
6
- - AI coding agent: [Claude Code](https://www.anthropic.com/claude-code), [GitHub Copilot](https://code.visualstudio.com/), [Codebuddy CLI](https://www.codebuddy.ai/cli), [Gemini CLI](https://github.com/google-gemini/gemini-cli), or [Pi Coding Agent](https://pi.dev)
6
+ - AI coding agent: [Claude Code](https://www.anthropic.com/claude-code), [GitHub Copilot](https://code.visualstudio.com/), [Codebuddy CLI](https://www.codebuddy.ai/cli), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Pi Coding Agent](https://pi.dev), or [Oh My Pi](https://www.npmjs.com/package/@oh-my-pi/pi-coding-agent)
7
7
  - [uv](https://docs.astral.sh/uv/) for package management (recommended) or [pipx](https://pipx.pypa.io/) for persistent installation
8
8
  - [Python 3.11+](https://www.python.org/downloads/)
9
9
  - [Git](https://git-scm.com/downloads) _(optional — required only when the git extension is enabled)_
@@ -51,6 +51,7 @@ specify init <project_name> --integration gemini
51
51
  specify init <project_name> --integration copilot
52
52
  specify init <project_name> --integration codebuddy
53
53
  specify init <project_name> --integration pi
54
+ specify init <project_name> --integration omp
54
55
  ```
55
56
 
56
57
  ### Specify Script Type (Shell vs PowerShell)
@@ -29,6 +29,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
29
29
  | [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
30
30
  | [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
31
31
  | [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `vibe` | |
32
+ | [Oh My Pi](https://www.npmjs.com/package/@oh-my-pi/pi-coding-agent) | `omp` | Installs slash commands into `.omp/commands` |
32
33
  | [opencode](https://opencode.ai/) | `opencode` | |
33
34
  | [Pi Coding Agent](https://pi.dev) | `pi` | Pi doesn't have MCP support out of the box, so `taskstoissues` won't work as intended. MCP support can be added via [extensions](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent#extensions) |
34
35
  | [Qoder CLI](https://qoder.com/cli) | `qodercli` | |
@@ -270,6 +270,8 @@ specify workflow run speckit -i spec="Build a kanban board with drag-and-drop ta
270
270
  | `fan-out` | Dispatch a step for each item in a list |
271
271
  | `fan-in` | Aggregate results from a fan-out step |
272
272
 
273
+ > **Security note:** a `shell` step runs a local command with **your** privileges. There is no capability sandbox — `requires` is an advisory pre-condition block (spec-kit version, integrations), not a runtime gate, so it does **not** restrict what a step can do. In particular there is no `requires.permissions` capability gate: it is rejected by validation precisely because it would imply a sandbox that does not exist. Review any catalog or downloaded workflow before running it, and use a `gate` step to require explicit approval before sensitive or destructive shell commands.
274
+
273
275
  ## Expressions
274
276
 
275
277
  Steps can reference inputs and previous step outputs using `{{ expression }}` syntax:
@@ -53,6 +53,8 @@
53
53
  href: local-development.md
54
54
  - name: Evolving Specs
55
55
  href: guides/evolving-specs.md
56
+ - name: Monorepos
57
+ href: guides/monorepo.md
56
58
 
57
59
  # Community
58
60
  - name: Community
@@ -308,6 +308,7 @@ Alternatively, run the `/speckit.specify` command which creates `.specify/featur
308
308
  ls -la .gemini/commands/ # Gemini
309
309
  ls -la .cursor/skills/ # Cursor
310
310
  ls -la .pi/prompts/ # Pi Coding Agent
311
+ ls -la .omp/commands/ # Oh My Pi
311
312
  ```
312
313
 
313
314
  3. **Check agent-specific setup:**
@@ -427,7 +428,7 @@ The `specify` CLI tool is used for:
427
428
  - **Upgrades:** `specify init --here --force` to update templates and commands
428
429
  - **Diagnostics:** `specify check` to verify tool installation
429
430
 
430
- Once you've run `specify init`, the slash commands (like `/speckit.specify`, `/speckit.plan`, etc.) are **permanently installed** in your project's agent folder (`.claude/`, `.github/prompts/`, `.pi/prompts/`, etc.). Your AI coding agent reads these command files directly—no need to run `specify` again.
431
+ Once you've run `specify init`, the slash commands (like `/speckit.specify`, `/speckit.plan`, etc.) are **permanently installed** in your project's agent folder (`.claude/`, `.github/prompts/`, `.pi/prompts/`, `.omp/commands/`, etc.). Your AI coding agent reads these command files directly—no need to run `specify` again.
431
432
 
432
433
  **If your agent isn't recognizing slash commands:**
433
434
 
@@ -442,6 +443,9 @@ Once you've run `specify init`, the slash commands (like `/speckit.specify`, `/s
442
443
 
443
444
  # For Pi
444
445
  ls -la .pi/prompts/
446
+
447
+ # For Oh My Pi
448
+ ls -la .omp/commands/
445
449
  ```
446
450
 
447
451
  2. **Restart your IDE/editor completely** (not just reload window)
@@ -320,6 +320,7 @@ A: Extensions should be free and open-source. Commercial support/services are al
320
320
  "author": "string (required)",
321
321
  "version": "string (required, semver)",
322
322
  "download_url": "string (required, valid URL)",
323
+ "sha256": "string (optional, SHA-256 hex digest of the archive at download_url; verified before install)",
323
324
  "repository": "string (required, valid URL)",
324
325
  "homepage": "string (optional, valid URL)",
325
326
  "documentation": "string (optional, valid URL)",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-06-22T00:00:00Z",
3
+ "updated_at": "2026-06-23T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json",
5
5
  "integrations": {
6
6
  "claude": {
@@ -255,6 +255,15 @@
255
255
  "repository": "https://github.com/github/spec-kit",
256
256
  "tags": ["cli"]
257
257
  },
258
+ "omp": {
259
+ "id": "omp",
260
+ "name": "Oh My Pi",
261
+ "version": "1.0.0",
262
+ "description": "Oh My Pi (omp) terminal coding agent prompt-based integration",
263
+ "author": "spec-kit-core",
264
+ "repository": "https://github.com/github/spec-kit",
265
+ "tags": ["cli"]
266
+ },
258
267
  "iflow": {
259
268
  "id": "iflow",
260
269
  "name": "iFlow CLI",
@@ -185,6 +185,7 @@ Edit `presets/catalog.community.json` and add your preset.
185
185
  "author": "Your Name",
186
186
  "version": "1.0.0",
187
187
  "download_url": "https://github.com/your-org/spec-kit-preset-your-preset/archive/refs/tags/v1.0.0.zip",
188
+ "sha256": "OPTIONAL: SHA-256 hex digest of the archive above; verified before install",
188
189
  "repository": "https://github.com/your-org/spec-kit-preset-your-preset",
189
190
  "license": "MIT",
190
191
  "requires": {
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.11.6"
3
+ version = "0.11.7"
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"
@@ -74,3 +74,13 @@ precision = 2
74
74
  show_missing = true
75
75
  skip_covered = false
76
76
 
77
+ [tool.ruff.lint]
78
+ # Lock in subprocess security posture: any reintroduction of shell=True
79
+ # (or os.system / popen2) must be acknowledged with an explicit `# noqa`
80
+ # pointing at the rule, making the deviation visible in review.
81
+ extend-select = [
82
+ "S602", # subprocess-popen-with-shell-equals-true
83
+ "S604", # call-with-shell-equals-true
84
+ "S605", # start-process-with-a-shell
85
+ ]
86
+
@@ -83,24 +83,24 @@ if ($PathsOnly) {
83
83
 
84
84
  # Validate required directories and files
85
85
  if (-not (Test-Path $paths.FEATURE_DIR -PathType Container)) {
86
- Write-Output "ERROR: Feature directory not found: $($paths.FEATURE_DIR)"
86
+ [Console]::Error.WriteLine("ERROR: Feature directory not found: $($paths.FEATURE_DIR)")
87
87
  $specifyCommand = Format-SpecKitCommand -CommandName 'specify' -RepoRoot $paths.REPO_ROOT
88
- Write-Output "Run $specifyCommand first to create the feature structure."
88
+ [Console]::Error.WriteLine("Run $specifyCommand first to create the feature structure.")
89
89
  exit 1
90
90
  }
91
91
 
92
92
  if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
93
- Write-Output "ERROR: plan.md not found in $($paths.FEATURE_DIR)"
93
+ [Console]::Error.WriteLine("ERROR: plan.md not found in $($paths.FEATURE_DIR)")
94
94
  $planCommand = Format-SpecKitCommand -CommandName 'plan' -RepoRoot $paths.REPO_ROOT
95
- Write-Output "Run $planCommand first to create the implementation plan."
95
+ [Console]::Error.WriteLine("Run $planCommand first to create the implementation plan.")
96
96
  exit 1
97
97
  }
98
98
 
99
99
  # Check for tasks.md if required
100
100
  if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
101
- Write-Output "ERROR: tasks.md not found in $($paths.FEATURE_DIR)"
101
+ [Console]::Error.WriteLine("ERROR: tasks.md not found in $($paths.FEATURE_DIR)")
102
102
  $tasksCommand = Format-SpecKitCommand -CommandName 'tasks' -RepoRoot $paths.REPO_ROOT
103
- Write-Output "Run $tasksCommand first to create the task list."
103
+ [Console]::Error.WriteLine("Run $tasksCommand first to create the task list.")
104
104
  exit 1
105
105
  }
106
106
 
@@ -111,8 +111,11 @@ function Get-BranchName {
111
111
  # Keep words that are length >= 3 OR appear as uppercase in original (likely acronyms)
112
112
  if ($word.Length -ge 3) {
113
113
  $meaningfulWords += $word
114
- } elseif ($Description -match "\b$($word.ToUpper())\b") {
115
- # Keep short words if they appear as uppercase in original (likely acronyms)
114
+ } elseif ($Description -cmatch "\b$($word.ToUpper())\b") {
115
+ # Keep short words only if they appear as uppercase in original (likely
116
+ # acronyms). Use -cmatch so the comparison is case-sensitive, matching the
117
+ # bash script's case-sensitive grep; -match would be case-insensitive and
118
+ # would keep every short word.
116
119
  $meaningfulWords += $word
117
120
  }
118
121
  }
@@ -65,14 +65,31 @@ def dump_frontmatter(data: dict[str, Any]) -> str:
65
65
  return yaml.safe_dump(data, sort_keys=False, allow_unicode=True).strip()
66
66
 
67
67
 
68
- def run_command(cmd: list[str], check_return: bool = True, capture: bool = False, shell: bool = False) -> str | None:
69
- """Run a shell command and optionally capture output."""
68
+ def run_command(
69
+ cmd: list[str],
70
+ check_return: bool = True,
71
+ capture: bool = False,
72
+ shell: bool = False,
73
+ ) -> str | None:
74
+ """Run a command without invoking a shell and optionally capture output.
75
+
76
+ The ``shell`` parameter is kept in the signature so existing keyword
77
+ callers (and the re-export from ``specify_cli``) don't raise ``TypeError``,
78
+ but only the default ``shell=False`` is honoured. ``shell=True`` is
79
+ rejected with ``ValueError`` rather than silently ignored, so the
80
+ unsupported mode fails loudly instead of running with a different meaning.
81
+ """
82
+ if shell:
83
+ raise ValueError(
84
+ "run_command() does not support shell=True; pass argv as a list"
85
+ )
86
+
70
87
  try:
71
88
  if capture:
72
- result = subprocess.run(cmd, check=check_return, capture_output=True, text=True, shell=shell)
89
+ result = subprocess.run(cmd, check=check_return, capture_output=True, text=True)
73
90
  return result.stdout.strip()
74
91
  else:
75
- subprocess.run(cmd, check=check_return, shell=shell)
92
+ subprocess.run(cmd, check=check_return)
76
93
  return None
77
94
  except subprocess.CalledProcessError as e:
78
95
  if check_return:
@@ -37,6 +37,8 @@ def _build_agent_configs() -> dict[str, Any]:
37
37
  # when register_commands() resolves __SPECKIT_COMMAND_*__ tokens.
38
38
  if "invoke_separator" not in config:
39
39
  config["invoke_separator"] = integration.invoke_separator
40
+ if integration.dev_no_symlink:
41
+ config["dev_no_symlink"] = True
40
42
  configs[key] = config
41
43
  return configs
42
44
 
@@ -234,9 +236,14 @@ class CommandRegistrar:
234
236
  toml_lines.append(f"# Source: {source_id}")
235
237
  toml_lines.append("")
236
238
 
237
- # Keep TOML output valid even when body contains triple-quote delimiters.
238
- # Prefer multiline forms, then fall back to escaped basic string.
239
- if '"""' not in body:
239
+ # Keep TOML output valid even when body contains triple-quote delimiters
240
+ # or backslashes. Prefer multiline forms, then fall back to escaped basic
241
+ # string. A multiline *basic* string ("""...""") processes backslash escape
242
+ # sequences, so a body containing a backslash (e.g. a Windows path
243
+ # ``C:\\Users\\...`` whose ``\\U`` reads as an invalid unicode escape) would
244
+ # produce unparseable TOML — route those to the *literal* form ('''...'''),
245
+ # which does not process escapes, or to the escaped basic string.
246
+ if '"""' not in body and "\\" not in body:
240
247
  toml_lines.append('prompt = """')
241
248
  toml_lines.append(body)
242
249
  toml_lines.append('"""')
@@ -714,6 +721,7 @@ class CommandRegistrar:
714
721
  output_name,
715
722
  agent_config["extension"],
716
723
  link_outputs,
724
+ agent_config,
717
725
  )
718
726
 
719
727
  if agent_name == "copilot":
@@ -788,6 +796,7 @@ class CommandRegistrar:
788
796
  alias_output_name,
789
797
  agent_config["extension"],
790
798
  link_outputs,
799
+ agent_config,
791
800
  )
792
801
  if agent_name == "copilot":
793
802
  self.write_copilot_prompt(project_root, alias)
@@ -804,9 +813,12 @@ class CommandRegistrar:
804
813
  output_name: str,
805
814
  extension: str,
806
815
  link_outputs: bool,
816
+ agent_config: dict[str, Any] | None = None,
807
817
  ) -> None:
808
818
  """Write a rendered agent artifact, optionally as a dev-mode symlink."""
809
- if not link_outputs:
819
+ if not link_outputs or (agent_config or {}).get("dev_no_symlink"):
820
+ if dest_file.is_symlink():
821
+ dest_file.unlink()
810
822
  dest_file.write_text(content, encoding="utf-8")
811
823
  return
812
824
 
@@ -927,6 +939,16 @@ class CommandRegistrar:
927
939
  self._active_skills_agent(project_root)
928
940
  if create_missing_active_skills_dir else None
929
941
  )
942
+ active_skills_dir: Optional[Path] = None
943
+ if active_skills_agent:
944
+ active_skills_config = self.AGENT_CONFIGS.get(active_skills_agent)
945
+ if (
946
+ active_skills_config
947
+ and active_skills_config.get("extension") == "/SKILL.md"
948
+ ):
949
+ active_skills_dir = self._resolve_agent_dir(
950
+ active_skills_agent, active_skills_config, project_root,
951
+ )
930
952
  active_created_skills_dir: Optional[Path] = None
931
953
  for agent_name, agent_config in self.AGENT_CONFIGS.items():
932
954
  active_skills_output = (
@@ -958,6 +980,14 @@ class CommandRegistrar:
958
980
  agent_dir = self._resolve_agent_dir(
959
981
  agent_name, agent_config, project_root,
960
982
  )
983
+ shares_active_skills_dir = (
984
+ active_skills_dir is not None
985
+ and agent_name != active_skills_agent
986
+ and agent_config.get("extension") == "/SKILL.md"
987
+ and self._same_lexical_path(agent_dir, active_skills_dir)
988
+ )
989
+ if shares_active_skills_dir:
990
+ continue
961
991
 
962
992
  agent_dir_existed = agent_dir.is_dir()
963
993
  register_missing_active_skills_agent = (
@@ -31,6 +31,7 @@ from .._invocation_style import is_dollar_skills_agent, is_slash_skills_agent
31
31
  from .._utils import dump_frontmatter, relative_extension_path_violation
32
32
  from ..catalogs import CatalogEntry as BaseCatalogEntry
33
33
  from ..catalogs import CatalogStackBase
34
+ from ..shared_infra import verify_archive_sha256
34
35
 
35
36
  _FALLBACK_CORE_COMMAND_NAMES = frozenset(
36
37
  {
@@ -997,6 +998,7 @@ class ExtensionManager:
997
998
  if not isinstance(selected_ai, str) or not selected_ai:
998
999
  return []
999
1000
  registrar = CommandRegistrar()
1001
+ agent_config = registrar.AGENT_CONFIGS.get(selected_ai, {})
1000
1002
  integration = get_integration(selected_ai)
1001
1003
 
1002
1004
  for cmd_info in manifest.commands:
@@ -1030,15 +1032,16 @@ class ExtensionManager:
1030
1032
  skill_file = skill_subdir / "SKILL.md"
1031
1033
  cache_root = extension_dir / ".specify-dev" / "extension-skills"
1032
1034
  cache_file = cache_root / skill_name / "SKILL.md"
1035
+ use_dev_symlink = link_outputs and not agent_config.get("dev_no_symlink")
1033
1036
  CommandRegistrar._ensure_inside(cache_file, cache_root)
1034
1037
  if skill_file.exists() or skill_file.is_symlink():
1038
+ is_expected_dev_symlink = self._is_expected_dev_symlink(
1039
+ skill_file, cache_file
1040
+ )
1035
1041
  # Do not overwrite user-customized skills, but allow dev-mode
1036
1042
  # symlinks that point back to this extension's generated cache
1037
1043
  # to be refreshed on a subsequent dev install.
1038
- if not (
1039
- link_outputs
1040
- and self._is_expected_dev_symlink(skill_file, cache_file)
1041
- ):
1044
+ if not is_expected_dev_symlink:
1042
1045
  continue
1043
1046
 
1044
1047
  # Create skill directory; track whether we created it so we can clean
@@ -1093,7 +1096,7 @@ class ExtensionManager:
1093
1096
  ):
1094
1097
  skill_content = integration.post_process_skill_content(skill_content)
1095
1098
 
1096
- if link_outputs:
1099
+ if use_dev_symlink:
1097
1100
  try:
1098
1101
  cache_file.parent.mkdir(parents=True, exist_ok=True)
1099
1102
  cache_file.write_text(skill_content, encoding="utf-8")
@@ -1106,6 +1109,8 @@ class ExtensionManager:
1106
1109
  skill_file.unlink()
1107
1110
  skill_file.write_text(skill_content, encoding="utf-8")
1108
1111
  else:
1112
+ if skill_file.is_symlink():
1113
+ skill_file.unlink()
1109
1114
  skill_file.write_text(skill_content, encoding="utf-8")
1110
1115
  written.append(skill_name)
1111
1116
 
@@ -2617,6 +2622,10 @@ class ExtensionCatalog(CatalogStackBase):
2617
2622
  ) as response:
2618
2623
  zip_data = response.read()
2619
2624
 
2625
+ verify_archive_sha256(
2626
+ zip_data, ext_info.get("sha256"), extension_id, ExtensionError
2627
+ )
2628
+
2620
2629
  zip_path.write_bytes(zip_data)
2621
2630
  return zip_path
2622
2631
 
@@ -70,6 +70,7 @@ def _register_builtins() -> None:
70
70
  from .kimi import KimiIntegration
71
71
  from .kiro_cli import KiroCliIntegration
72
72
  from .lingma import LingmaIntegration
73
+ from .omp import OmpIntegration
73
74
  from .opencode import OpencodeIntegration
74
75
  from .pi import PiIntegration
75
76
  from .qodercli import QodercliIntegration
@@ -108,6 +109,7 @@ def _register_builtins() -> None:
108
109
  _register(KimiIntegration())
109
110
  _register(KiroCliIntegration())
110
111
  _register(LingmaIntegration())
112
+ _register(OmpIntegration())
111
113
  _register(OpencodeIntegration())
112
114
  _register(PiIntegration())
113
115
  _register(QodercliIntegration())
@@ -119,6 +119,9 @@ class IntegrationBase(ABC):
119
119
  invoke_separator: str = "."
120
120
  """Separator used in slash-command invocations (``"."`` → ``/speckit.plan``)."""
121
121
 
122
+ dev_no_symlink: bool = False
123
+ """Whether dev-mode registration should write files instead of symlinks."""
124
+
122
125
  multi_install_safe: bool = False
123
126
  """Whether this integration is declared safe to install alongside others.
124
127
 
@@ -27,6 +27,7 @@ class CodexIntegration(SkillsIntegration):
27
27
  "extension": "/SKILL.md",
28
28
  }
29
29
  context_file = "AGENTS.md"
30
+ dev_no_symlink = True
30
31
  multi_install_safe = True
31
32
 
32
33
  def build_exec_args(