specify-cli 1.0.2__tar.gz → 1.0.3__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 (547) hide show
  1. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/agent_request.yml +1 -1
  2. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -0
  3. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/feature_request.yml +1 -0
  4. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/codeql.yml +2 -2
  5. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/publish-pypi.yml +5 -3
  6. {specify_cli-1.0.2 → specify_cli-1.0.3}/AGENTS.md +2 -0
  7. {specify_cli-1.0.2 → specify_cli-1.0.3}/CHANGELOG.md +25 -0
  8. {specify_cli-1.0.2 → specify_cli-1.0.3}/PKG-INFO +22 -1
  9. {specify_cli-1.0.2 → specify_cli-1.0.3}/README.md +21 -0
  10. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/extensions.md +2 -1
  11. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/integrations.md +1 -0
  12. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-PUBLISHING-GUIDE.md +1 -2
  13. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/catalog.community.json +47 -8
  14. {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/catalog.json +10 -1
  15. {specify_cli-1.0.2 → specify_cli-1.0.3}/pyproject.toml +1 -1
  16. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/check-prerequisites.sh +13 -0
  17. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/setup-plan.sh +2 -2
  18. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/check-prerequisites.ps1 +11 -0
  19. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/setup-plan.ps1 +5 -0
  20. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/check_prerequisites.py +14 -0
  21. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/setup_plan.py +3 -1
  22. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_github_http.py +3 -0
  23. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_utils.py +41 -0
  24. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/primitives.py +5 -3
  25. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/events.py +1 -1
  26. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/__init__.py +2 -0
  27. specify_cli-1.0.3/src/specify_cli/integrations/docker_agent/__init__.py +126 -0
  28. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/presets/__init__.py +4 -2
  29. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/catalog.py +8 -4
  30. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/expressions.py +36 -0
  31. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/do_while/__init__.py +16 -0
  32. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/if_then/__init__.py +16 -0
  33. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/while_loop/__init__.py +16 -0
  34. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/analyze.md +3 -3
  35. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/converge.md +3 -3
  36. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_bundle_cli.py +4 -1
  37. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_events.py +16 -0
  38. specify_cli-1.0.3/tests/integrations/test_integration_docker_agent.py +133 -0
  39. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_agent_config_consistency.py +1 -0
  40. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_check_prerequisites_python_parity.py +72 -0
  41. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_check_tool.py +36 -0
  42. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_github_http.py +18 -0
  43. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_github_workflows.py +86 -0
  44. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_presets.py +35 -0
  45. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_plan_python_parity.py +10 -8
  46. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_workflows.py +24 -0
  47. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_primitives.py +114 -15
  48. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_condition_expression_block.py +71 -0
  49. {specify_cli-1.0.2 → specify_cli-1.0.3}/.devcontainer/devcontainer.json +0 -0
  50. {specify_cli-1.0.2 → specify_cli-1.0.3}/.devcontainer/post-create.sh +0 -0
  51. {specify_cli-1.0.2 → specify_cli-1.0.3}/.editorconfig +0 -0
  52. {specify_cli-1.0.2 → specify_cli-1.0.3}/.gitattributes +0 -0
  53. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/CODEOWNERS +0 -0
  54. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/bundle_submission.yml +0 -0
  55. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  56. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  57. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  58. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  59. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/aw/actions-lock.json +0 -0
  60. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/dependabot.yml +0 -0
  61. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/scripts/check_security_requirements.py +0 -0
  62. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/security-audit-requirements.txt +0 -0
  63. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/skills/add-community-extension/SKILL.md +0 -0
  64. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/RELEASE-PROCESS.md +0 -0
  65. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-bundle.lock.yml +0 -0
  66. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-bundle.md +0 -0
  67. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-extension.lock.yml +0 -0
  68. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-extension.md +0 -0
  69. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-preset.lock.yml +0 -0
  70. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/add-community-preset.md +0 -0
  71. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-assess.lock.yml +0 -0
  72. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-assess.md +0 -0
  73. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-fix.lock.yml +0 -0
  74. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-fix.md +0 -0
  75. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-test.lock.yml +0 -0
  76. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/bug-test.md +0 -0
  77. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/catalog-assign.yml +0 -0
  78. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/docs.yml +0 -0
  79. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/feature-assess.lock.yml +0 -0
  80. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/feature-assess.md +0 -0
  81. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/lint.yml +0 -0
  82. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/release-trigger.yml +0 -0
  83. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/release.yml +0 -0
  84. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/security.yml +0 -0
  85. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/stale.yml +0 -0
  86. {specify_cli-1.0.2 → specify_cli-1.0.3}/.github/workflows/test.yml +0 -0
  87. {specify_cli-1.0.2 → specify_cli-1.0.3}/.gitignore +0 -0
  88. {specify_cli-1.0.2 → specify_cli-1.0.3}/.markdownlint-cli2.jsonc +0 -0
  89. {specify_cli-1.0.2 → specify_cli-1.0.3}/.pre-commit-config.yaml +0 -0
  90. {specify_cli-1.0.2 → specify_cli-1.0.3}/.zenodo.json +0 -0
  91. {specify_cli-1.0.2 → specify_cli-1.0.3}/CITATION.cff +0 -0
  92. {specify_cli-1.0.2 → specify_cli-1.0.3}/CODE_OF_CONDUCT.md +0 -0
  93. {specify_cli-1.0.2 → specify_cli-1.0.3}/CONTRIBUTING.md +0 -0
  94. {specify_cli-1.0.2 → specify_cli-1.0.3}/DEVELOPMENT.md +0 -0
  95. {specify_cli-1.0.2 → specify_cli-1.0.3}/LICENSE +0 -0
  96. {specify_cli-1.0.2 → specify_cli-1.0.3}/README.zh-CN.md +0 -0
  97. {specify_cli-1.0.2 → specify_cli-1.0.3}/SECURITY.md +0 -0
  98. {specify_cli-1.0.2 → specify_cli-1.0.3}/SUPPORT.md +0 -0
  99. {specify_cli-1.0.2 → specify_cli-1.0.3}/bundles/catalog.community.json +0 -0
  100. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/.gitignore +0 -0
  101. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/README.md +0 -0
  102. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/bundles.md +0 -0
  103. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/friends.md +0 -0
  104. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/overview.md +0 -0
  105. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/presets.md +0 -0
  106. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/community/walkthroughs.md +0 -0
  107. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/complex-features.md +0 -0
  108. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/sdd.md +0 -0
  109. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/spec-of-specs.md +0 -0
  110. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/concepts/spec-persistence.md +0 -0
  111. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/docfx.json +0 -0
  112. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/guides/evolving-specs.md +0 -0
  113. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/guides/existing-projects.md +0 -0
  114. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/guides/monorepo.md +0 -0
  115. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/history.md +0 -0
  116. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/images/spec-kit-logo.webp +0 -0
  117. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/index.md +0 -0
  118. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/air-gapped.md +0 -0
  119. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/one-time.md +0 -0
  120. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/pipx.md +0 -0
  121. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/pypi.md +0 -0
  122. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/install/uv.md +0 -0
  123. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/installation.md +0 -0
  124. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/local-development.md +0 -0
  125. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/quickstart.md +0 -0
  126. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/agentic-bugfix.md +0 -0
  127. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/agentic-sdd.md +0 -0
  128. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/authentication.md +0 -0
  129. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/bundles.md +0 -0
  130. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/core.md +0 -0
  131. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/extensions.md +0 -0
  132. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/overview.md +0 -0
  133. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/presets.md +0 -0
  134. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/reference/workflows.md +0 -0
  135. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/template/public/main.css +0 -0
  136. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/toc.yml +0 -0
  137. {specify_cli-1.0.2 → specify_cli-1.0.3}/docs/upgrade.md +0 -0
  138. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/business-analyst/README.md +0 -0
  139. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/business-analyst/bundle.yml +0 -0
  140. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/developer/README.md +0 -0
  141. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/developer/bundle.yml +0 -0
  142. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/product-manager/README.md +0 -0
  143. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/product-manager/bundle.yml +0 -0
  144. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/security-researcher/README.md +0 -0
  145. {specify_cli-1.0.2 → specify_cli-1.0.3}/examples/bundles/security-researcher/bundle.yml +0 -0
  146. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  147. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  148. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  149. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/README.md +0 -0
  150. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  151. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/README.md +0 -0
  152. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/agent-context-config.yml +0 -0
  153. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/agent-context-defaults.json +0 -0
  154. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  155. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/extension.yml +0 -0
  156. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  157. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  158. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/agent-context/scripts/python/update_agent_context.py +0 -0
  159. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/README.md +0 -0
  160. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.decide.md +0 -0
  161. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.define.md +0 -0
  162. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.intake.md +0 -0
  163. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.research.md +0 -0
  164. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/commands/speckit.assess.shape.md +0 -0
  165. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/assess/extension.yml +0 -0
  166. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/README.md +0 -0
  167. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  168. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  169. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/commands/speckit.bug.test.md +0 -0
  170. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/bug/extension.yml +0 -0
  171. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/catalog.json +0 -0
  172. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/README.md +0 -0
  173. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.commit.md +0 -0
  174. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.feature.md +0 -0
  175. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.initialize.md +0 -0
  176. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.remote.md +0 -0
  177. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/commands/speckit.git.validate.md +0 -0
  178. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/config-template.yml +0 -0
  179. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/extension.yml +0 -0
  180. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/git-config.yml +0 -0
  181. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  182. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  183. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/git-common.sh +0 -0
  184. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  185. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  186. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  187. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  188. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  189. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/auto_commit.py +0 -0
  190. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/create_new_feature_branch.py +0 -0
  191. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/git_common.py +0 -0
  192. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/git/scripts/python/initialize_repo.py +0 -0
  193. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/selftest/commands/selftest.md +0 -0
  194. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/selftest/extension.yml +0 -0
  195. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/.gitignore +0 -0
  196. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/CHANGELOG.md +0 -0
  197. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/EXAMPLE-README.md +0 -0
  198. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/LICENSE +0 -0
  199. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/README.md +0 -0
  200. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/commands/example.md +0 -0
  201. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/config-template.yml +0 -0
  202. {specify_cli-1.0.2 → specify_cli-1.0.3}/extensions/template/extension.yml +0 -0
  203. {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/CONTRIBUTING.md +0 -0
  204. {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/README.md +0 -0
  205. {specify_cli-1.0.2 → specify_cli-1.0.3}/integrations/catalog.community.json +0 -0
  206. {specify_cli-1.0.2 → specify_cli-1.0.3}/media/bootstrap-claude-code.gif +0 -0
  207. {specify_cli-1.0.2 → specify_cli-1.0.3}/media/logo_large.webp +0 -0
  208. {specify_cli-1.0.2 → specify_cli-1.0.3}/media/logo_small.webp +0 -0
  209. {specify_cli-1.0.2 → specify_cli-1.0.3}/media/spec-kit-video-header.jpg +0 -0
  210. {specify_cli-1.0.2 → specify_cli-1.0.3}/media/specify_cli.gif +0 -0
  211. {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-April.md +0 -0
  212. {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-February.md +0 -0
  213. {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-July.md +0 -0
  214. {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-June.md +0 -0
  215. {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-March.md +0 -0
  216. {specify_cli-1.0.2 → specify_cli-1.0.3}/newsletters/2026-May.md +0 -0
  217. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/ARCHITECTURE.md +0 -0
  218. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/PUBLISHING.md +0 -0
  219. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/README.md +0 -0
  220. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/catalog.community.json +0 -0
  221. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/catalog.json +0 -0
  222. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/constitution-sync/README.md +0 -0
  223. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/constitution-sync/commands/speckit.constitution.md +0 -0
  224. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/constitution-sync/preset.yml +0 -0
  225. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/README.md +0 -0
  226. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.constitution.md +0 -0
  227. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.implement.md +0 -0
  228. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.plan.md +0 -0
  229. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.specify.md +0 -0
  230. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/commands/speckit.tasks.md +0 -0
  231. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/lean/preset.yml +0 -0
  232. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/README.md +0 -0
  233. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  234. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/commands/speckit.specify.md +0 -0
  235. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/preset.yml +0 -0
  236. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/templates/myext-template.md +0 -0
  237. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/scaffold/templates/spec-template.md +0 -0
  238. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/commands/speckit.specify.md +0 -0
  239. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  240. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/preset.yml +0 -0
  241. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/checklist-template.md +0 -0
  242. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/constitution-template.md +0 -0
  243. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/plan-template.md +0 -0
  244. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/spec-template.md +0 -0
  245. {specify_cli-1.0.2 → specify_cli-1.0.3}/presets/self-test/templates/tasks-template.md +0 -0
  246. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/common.sh +0 -0
  247. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/create-new-feature.sh +0 -0
  248. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/resolve-template.sh +0 -0
  249. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/bash/setup-tasks.sh +0 -0
  250. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/common.ps1 +0 -0
  251. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/create-new-feature.ps1 +0 -0
  252. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/resolve-template.ps1 +0 -0
  253. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/powershell/setup-tasks.ps1 +0 -0
  254. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/common.py +0 -0
  255. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/create_new_feature.py +0 -0
  256. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/resolve_template.py +0 -0
  257. {specify_cli-1.0.2 → specify_cli-1.0.3}/scripts/python/setup_tasks.py +0 -0
  258. {specify_cli-1.0.2 → specify_cli-1.0.3}/spec-driven.md +0 -0
  259. {specify_cli-1.0.2 → specify_cli-1.0.3}/spec-kit.code-workspace +0 -0
  260. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/__init__.py +0 -0
  261. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_agent_config.py +0 -0
  262. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_assets.py +0 -0
  263. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_console.py +0 -0
  264. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_download_security.py +0 -0
  265. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_init_options.py +0 -0
  266. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_invocation_style.py +0 -0
  267. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_project.py +0 -0
  268. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_toml_string.py +0 -0
  269. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/_version.py +0 -0
  270. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/agents.py +0 -0
  271. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/__init__.py +0 -0
  272. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/azure_devops.py +0 -0
  273. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/base.py +0 -0
  274. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/config.py +0 -0
  275. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/github.py +0 -0
  276. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/authentication/http.py +0 -0
  277. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/__init__.py +0 -0
  278. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/commands_impl/__init__.py +0 -0
  279. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/commands_impl/catalog_config.py +0 -0
  280. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/__init__.py +0 -0
  281. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/project.py +0 -0
  282. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/versioning.py +0 -0
  283. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/lib/yamlio.py +0 -0
  284. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/__init__.py +0 -0
  285. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/catalog.py +0 -0
  286. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/manifest.py +0 -0
  287. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/models/records.py +0 -0
  288. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/__init__.py +0 -0
  289. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/adapters.py +0 -0
  290. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/catalog_stack.py +0 -0
  291. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/conflict.py +0 -0
  292. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/installer.py +0 -0
  293. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/packager.py +0 -0
  294. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/references.py +0 -0
  295. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/resolver.py +0 -0
  296. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/bundler/services/validator.py +0 -0
  297. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/catalogs.py +0 -0
  298. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/__init__.py +0 -0
  299. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/bundle/__init__.py +0 -0
  300. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/event.py +0 -0
  301. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/commands/init.py +0 -0
  302. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/extensions/__init__.py +0 -0
  303. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/extensions/_commands.py +0 -0
  304. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_runtime.py +0 -0
  305. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_scaffold.py +0 -0
  306. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_state.py +0 -0
  307. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integration_status.py +0 -0
  308. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_commands.py +0 -0
  309. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_helpers.py +0 -0
  310. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_install_commands.py +0 -0
  311. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  312. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_query_commands.py +0 -0
  313. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  314. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/agy/__init__.py +0 -0
  315. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/alquimia/__init__.py +0 -0
  316. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/amp/__init__.py +0 -0
  317. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  318. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/base.py +0 -0
  319. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/bob/__init__.py +0 -0
  320. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/catalog.py +0 -0
  321. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/claude/__init__.py +0 -0
  322. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/cline/__init__.py +0 -0
  323. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  324. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/codex/__init__.py +0 -0
  325. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/command_code/__init__.py +0 -0
  326. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  327. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  328. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/devin/__init__.py +0 -0
  329. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/droid/__init__.py +0 -0
  330. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/firebender/__init__.py +0 -0
  331. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/forge/__init__.py +0 -0
  332. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  333. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/generic/__init__.py +0 -0
  334. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/goose/__init__.py +0 -0
  335. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/grok/__init__.py +0 -0
  336. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  337. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/junie/__init__.py +0 -0
  338. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  339. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  340. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  341. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  342. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/manifest.py +0 -0
  343. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/omp/__init__.py +0 -0
  344. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  345. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/pi/__init__.py +0 -0
  346. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  347. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  348. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  349. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/shai/__init__.py +0 -0
  350. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  351. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/trae/__init__.py +0 -0
  352. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  353. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/zcode/__init__.py +0 -0
  354. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/integrations/zed/__init__.py +0 -0
  355. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/presets/_commands.py +0 -0
  356. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/shared_infra.py +0 -0
  357. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/__init__.py +0 -0
  358. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/_commands.py +0 -0
  359. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/base.py +0 -0
  360. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/engine.py +0 -0
  361. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/__init__.py +0 -0
  362. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/_commands.py +0 -0
  363. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/composer.py +0 -0
  364. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/layer_sources.py +0 -0
  365. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/merge.py +0 -0
  366. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/overlays/schema.py +0 -0
  367. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/__init__.py +0 -0
  368. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  369. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  370. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  371. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  372. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/init/__init__.py +0 -0
  373. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  374. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/shell/__init__.py +0 -0
  375. {specify_cli-1.0.2 → specify_cli-1.0.3}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  376. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/checklist-template.md +0 -0
  377. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/checklist.md +0 -0
  378. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/clarify.md +0 -0
  379. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/constitution.md +0 -0
  380. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/implement.md +0 -0
  381. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/plan.md +0 -0
  382. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/specify.md +0 -0
  383. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/tasks.md +0 -0
  384. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/commands/taskstoissues.md +0 -0
  385. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/constitution-template.md +0 -0
  386. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/plan-template.md +0 -0
  387. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/spec-template.md +0 -0
  388. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/tasks-template.md +0 -0
  389. {specify_cli-1.0.2 → specify_cli-1.0.3}/templates/vscode-settings.json +0 -0
  390. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/__init__.py +0 -0
  391. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/auth_helpers.py +0 -0
  392. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/bundler_helpers.py +0 -0
  393. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/conftest.py +0 -0
  394. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_catalog_schema.py +0 -0
  395. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_manifest_schema.py +0 -0
  396. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_wheel_bundled_presets.py +0 -0
  397. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/contract/test_wheel_core_pack_scripts.py +0 -0
  398. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/__init__.py +0 -0
  399. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/assess/__init__.py +0 -0
  400. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/assess/test_assess_extension.py +0 -0
  401. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/bug/__init__.py +0 -0
  402. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/bug/test_bug_extension.py +0 -0
  403. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/git/__init__.py +0 -0
  404. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/git/test_git_extension.py +0 -0
  405. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/git/test_git_extension_python_parity.py +0 -0
  406. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_agent_context_cli_free.py +0 -0
  407. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_extension_agent_context.py +0 -0
  408. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_update_agent_context_feature_json.py +0 -0
  409. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/extensions/test_update_agent_context_python_parity.py +0 -0
  410. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/TESTING.md +0 -0
  411. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/plan.md +0 -0
  412. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/spec.md +0 -0
  413. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/hooks/tasks.md +0 -0
  414. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/http_helpers.py +0 -0
  415. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_catalog_stack.py +0 -0
  416. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_init_install.py +0 -0
  417. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_install_flow.py +0 -0
  418. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_local_install.py +0 -0
  419. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_offline.py +0 -0
  420. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integration/test_bundler_security_paths.py +0 -0
  421. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/__init__.py +0 -0
  422. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/conftest.py +0 -0
  423. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_base.py +0 -0
  424. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_cli.py +0 -0
  425. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_extra_args.py +0 -0
  426. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_home_isolation.py +0 -0
  427. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_agy.py +0 -0
  428. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_alquimia.py +0 -0
  429. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_amp.py +0 -0
  430. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_auggie.py +0 -0
  431. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_markdown.py +0 -0
  432. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_skills.py +0 -0
  433. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_toml.py +0 -0
  434. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_base_yaml.py +0 -0
  435. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_bob.py +0 -0
  436. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_catalog.py +0 -0
  437. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_claude.py +0 -0
  438. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_cline.py +0 -0
  439. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_codebuddy.py +0 -0
  440. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_codex.py +0 -0
  441. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_command_code.py +0 -0
  442. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_copilot.py +0 -0
  443. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_cursor_agent.py +0 -0
  444. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_devin.py +0 -0
  445. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_droid.py +0 -0
  446. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_firebender.py +0 -0
  447. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_forge.py +0 -0
  448. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_gemini.py +0 -0
  449. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_generic.py +0 -0
  450. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_goose.py +0 -0
  451. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_grok.py +0 -0
  452. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_hermes.py +0 -0
  453. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_junie.py +0 -0
  454. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_kilocode.py +0 -0
  455. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_kimi.py +0 -0
  456. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_kiro_cli.py +0 -0
  457. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_lingma.py +0 -0
  458. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_omp.py +0 -0
  459. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_opencode.py +0 -0
  460. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_pi.py +0 -0
  461. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_qodercli.py +0 -0
  462. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_qwen.py +0 -0
  463. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_rovodev.py +0 -0
  464. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_scaffold.py +0 -0
  465. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_shai.py +0 -0
  466. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_state.py +0 -0
  467. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_subcommand.py +0 -0
  468. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_tabnine.py +0 -0
  469. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_trae.py +0 -0
  470. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_vibe.py +0 -0
  471. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_zcode.py +0 -0
  472. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_integration_zed.py +0 -0
  473. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_manifest.py +0 -0
  474. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_registry.py +0 -0
  475. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/integrations/test_skill_frontmatter_quoting.py +0 -0
  476. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/parity_helpers.py +0 -0
  477. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/self_upgrade_helpers.py +0 -0
  478. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_authentication.py +0 -0
  479. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_branch_numbering.py +0 -0
  480. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_check_prerequisites_paths_only.py +0 -0
  481. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_cli_version.py +0 -0
  482. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_command_template_py_scripts.py +0 -0
  483. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_commands_package.py +0 -0
  484. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_console_imports.py +0 -0
  485. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_create_new_feature_python_parity.py +0 -0
  486. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_download_security.py +0 -0
  487. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_event_command.py +0 -0
  488. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_add_path_traversal.py +0 -0
  489. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_registration.py +0 -0
  490. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_skills.py +0 -0
  491. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extension_update_hardening.py +0 -0
  492. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_extensions.py +0 -0
  493. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_init_dir.py +0 -0
  494. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_init_dir_cli.py +0 -0
  495. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_init_output_markup.py +0 -0
  496. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_live_transient_windows.py +0 -0
  497. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_merge.py +0 -0
  498. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_post_process.py +0 -0
  499. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_ps1_encoding.py +0 -0
  500. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_registrar_path_traversal.py +0 -0
  501. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_resolve_template_python_parity.py +0 -0
  502. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_security_workflow.py +0 -0
  503. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_detection.py +0 -0
  504. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_execution.py +0 -0
  505. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_guidance.py +0 -0
  506. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_self_upgrade_verification.py +0 -0
  507. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_plan_feature_json.py +0 -0
  508. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_plan_no_overwrite.py +0 -0
  509. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_tasks.py +0 -0
  510. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_setup_tasks_python_parity.py +0 -0
  511. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_shared_infra_gitignore.py +0 -0
  512. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_shared_infra_integrity.py +0 -0
  513. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_skill_placeholder_py.py +0 -0
  514. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_specify_template_numbering.py +0 -0
  515. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_timestamp_branches.py +0 -0
  516. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_upgrade.py +0 -0
  517. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_utils.py +0 -0
  518. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_utils_assets_imports.py +0 -0
  519. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_version_imports.py +0 -0
  520. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/test_workflow_run_without_project.py +0 -0
  521. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundle_download_url.py +0 -0
  522. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_adapters.py +0 -0
  523. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_catalog_config.py +0 -0
  524. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_conflict.py +0 -0
  525. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_packager.py +0 -0
  526. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_records.py +0 -0
  527. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_references.py +0 -0
  528. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_resolver.py +0 -0
  529. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_validator.py +0 -0
  530. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_versioning.py +0 -0
  531. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/unit/test_bundler_yamlio.py +0 -0
  532. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/conftest.py +0 -0
  533. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_commands.py +0 -0
  534. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_composer.py +0 -0
  535. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_layer_sources.py +0 -0
  536. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_merge.py +0 -0
  537. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_schema.py +0 -0
  538. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_overlay_security.py +0 -0
  539. {specify_cli-1.0.2 → specify_cli-1.0.3}/tests/workflows/test_resolver_integration.py +0 -0
  540. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/ARCHITECTURE.md +0 -0
  541. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/PUBLISHING.md +0 -0
  542. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/README.md +0 -0
  543. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/catalog.community.json +0 -0
  544. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/catalog.json +0 -0
  545. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/speckit/workflow.yml +0 -0
  546. {specify_cli-1.0.2 → specify_cli-1.0.3}/workflows/step-catalog.community.json +0 -0
  547. {specify_cli-1.0.2 → specify_cli-1.0.3}/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**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Factory Droid, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
11
+ **Currently supported agents**: Alquimia AI, Amp, Antigravity, Auggie CLI, Claude Code, Cline, CodeBuddy, Codex CLI, Command Code, Cursor, Devin for Terminal, Docker Agent, Factory Droid, Firebender, Forge, Gemini CLI, GitHub Copilot, Goose, Grok Build, Hermes Agent, IBM Bob, Junie, Kilo Code, Kimi Code, Kiro CLI, Lingma, Mistral Vibe, Oh My Pi, opencode, Pi Coding Agent, Qoder CLI, Qwen Code, RovoDev ACLI, SHAI, Tabnine CLI, Trae, ZCode, Zed
12
12
 
13
13
  - type: input
14
14
  id: agent-name
@@ -73,6 +73,7 @@ body:
73
73
  - Command Code
74
74
  - Cursor
75
75
  - Devin for Terminal
76
+ - Docker Agent
76
77
  - Factory Droid
77
78
  - Firebender
78
79
  - Forge
@@ -67,6 +67,7 @@ body:
67
67
  - Command Code
68
68
  - Cursor
69
69
  - Devin for Terminal
70
+ - Docker Agent
70
71
  - Factory Droid
71
72
  - Firebender
72
73
  - Forge
@@ -22,11 +22,11 @@ jobs:
22
22
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
23
 
24
24
  - name: Initialize CodeQL
25
- uses: github/codeql-action/init@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4
25
+ uses: github/codeql-action/init@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
26
26
  with:
27
27
  languages: ${{ matrix.language }}
28
28
 
29
29
  - name: Perform CodeQL Analysis
30
- uses: github/codeql-action/analyze@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4
30
+ uses: github/codeql-action/analyze@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
31
31
  with:
32
32
  category: "/language:${{ matrix.language }}"
@@ -19,8 +19,9 @@ jobs:
19
19
  actions: write
20
20
  steps:
21
21
  - name: Verify tag format
22
+ env:
23
+ TAG: ${{ inputs.tag }}
22
24
  run: |
23
- TAG="${{ inputs.tag }}"
24
25
  if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
25
26
  echo "Error: '$TAG' is not a valid release tag (expected vX.Y.Z)"
26
27
  exit 1
@@ -40,9 +41,10 @@ jobs:
40
41
  python-version: "3.13"
41
42
 
42
43
  - name: Verify tag matches package version
44
+ env:
45
+ TAG: ${{ inputs.tag }}
43
46
  run: |
44
- TAG_VERSION="${{ inputs.tag }}"
45
- TAG_VERSION="${TAG_VERSION#v}"
47
+ TAG_VERSION="${TAG#v}"
46
48
  PROJECT_VERSION="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
47
49
  if [[ "$TAG_VERSION" != "$PROJECT_VERSION" ]]; then
48
50
  echo "Error: Tag version ($TAG_VERSION) does not match pyproject.toml version ($PROJECT_VERSION)"
@@ -41,6 +41,8 @@ src/specify_cli/integrations/
41
41
  │ └── __init__.py
42
42
  ├── copilot/ # Example: IntegrationBase subclass (custom setup)
43
43
  │ └── __init__.py
44
+ ├── docker_agent/ # Example: Docker Agent SkillsIntegration subclass
45
+ │ └── __init__.py
44
46
  └── ... # One subpackage per supported agent
45
47
  ```
46
48
 
@@ -2,6 +2,31 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [1.0.3] - 2026-09-01
6
+
7
+ ### Changed
8
+
9
+ - fix(workflows): reject malformed step config on remove (#4095)
10
+ - fix(workflows): reject malformed workflow config on remove (#4096)
11
+ - fix(events): skip unreadable extension manifests (#4089)
12
+ - docs(extensions): fix private catalog FAQ command (#4373)
13
+ - [extension] Add Vurnix Honest Gate extension to community catalog (#4388)
14
+ - fix(presets): fail closed on unreadable provenance (#4092)
15
+ - docs: explain how Spec Kit dogfoods itself (#4381)
16
+ - add --require-spec to check-prerequisites (#4367)
17
+ - fix(ci): harden PyPI release tag handling (#4386)
18
+ - fix(github-http): reject malformed explicit URL ports (#4372)
19
+ - fix: scaffold extension config when installing via bundler (#4285)
20
+ - fix: reject unknown setup-plan arguments (#4371)
21
+ - feat(docker-agent): add Docker Agent integration (#4302)
22
+ - fix(workflows): reject a condition that is spliced into text, not evaluated (#4292)
23
+ - fix(bundler): pass explicit workflow_add options from bundle install (#4284)
24
+ - test(bundle): join across wrap points in the build output-path assertion (#4280)
25
+ - chore(deps): bump the codeql-action group with 2 updates (#4357)
26
+ - [extension] Update Spec Kit Figma extension to v3.1.1 (#4377)
27
+ - fix(presets): reject falsy non-mapping catalog roots (#4088)
28
+ - chore: release 1.0.2, begin 1.0.3.dev0 development (#4379)
29
+
5
30
  ## [1.0.2] - 2026-08-31
6
31
 
7
32
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: specify-cli
3
- Version: 1.0.2
3
+ Version: 1.0.3
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
@@ -64,6 +64,7 @@ Description-Content-Type: text/markdown
64
64
  - [🧩 Making Spec Kit Your Own: Extensions & Presets](#-making-spec-kit-your-own-extensions--presets)
65
65
  - [📦 Bundles: Role-Based Setups](#-bundles-role-based-setups)
66
66
  - [📚 Core Philosophy](#-core-philosophy)
67
+ - [🪞 Does Spec Kit Use Spec Kit?](#-does-spec-kit-use-spec-kit)
67
68
  - [🌟 Development Phases](#-development-phases)
68
69
  - [🎯 Experimental Goals](#-experimental-goals)
69
70
  - [🔧 Prerequisites](#-prerequisites)
@@ -421,6 +422,26 @@ Spec-Driven Development is a structured process that emphasizes:
421
422
  - **Multi-step refinement** rather than one-shot code generation from prompts
422
423
  - **Heavy reliance** on advanced AI model capabilities for specification interpretation
423
424
 
425
+ ## 🪞 Does Spec Kit Use Spec Kit?
426
+
427
+ Yes — we dogfood Spec Kit while developing Spec Kit, especially for substantial
428
+ features and changes to the development workflow. Contributors are asked to test
429
+ relevant changes through the Spec-Driven Development commands. The
430
+ [feature assessment workflow](./.github/workflows/feature-assess.md) is currently
431
+ the automated dogfooding path: its setup uses the CLI from the current checkout
432
+ to initialize Copilot and install the `assess` extension, after which Copilot
433
+ follows the generated assessment skills against feature requests. The other
434
+ agentic workflows currently operate independently of the Specify CLI.
435
+
436
+ This does not mean every change goes through the full workflow. Small fixes can
437
+ use the normal issue, pull request, review, and test process. Dogfooding
438
+ scaffolding and artifacts under `.github/agents/`, `.github/prompts/`,
439
+ `.github/copilot-instructions.md`, `.grok/`, `.specify/`, and `specs/` are
440
+ intentionally gitignored. The automated assessment workflow is ephemeral and
441
+ neither commits nor pushes its generated Copilot skills, so its output does not
442
+ enter repository history. See the [contributor development
443
+ workflow](./CONTRIBUTING.md#development-workflow) for the validation expectations.
444
+
424
445
  ## 🌟 Development Phases
425
446
 
426
447
  | Phase | Focus | Key Activities |
@@ -44,6 +44,7 @@
44
44
  - [🧩 Making Spec Kit Your Own: Extensions & Presets](#-making-spec-kit-your-own-extensions--presets)
45
45
  - [📦 Bundles: Role-Based Setups](#-bundles-role-based-setups)
46
46
  - [📚 Core Philosophy](#-core-philosophy)
47
+ - [🪞 Does Spec Kit Use Spec Kit?](#-does-spec-kit-use-spec-kit)
47
48
  - [🌟 Development Phases](#-development-phases)
48
49
  - [🎯 Experimental Goals](#-experimental-goals)
49
50
  - [🔧 Prerequisites](#-prerequisites)
@@ -401,6 +402,26 @@ Spec-Driven Development is a structured process that emphasizes:
401
402
  - **Multi-step refinement** rather than one-shot code generation from prompts
402
403
  - **Heavy reliance** on advanced AI model capabilities for specification interpretation
403
404
 
405
+ ## 🪞 Does Spec Kit Use Spec Kit?
406
+
407
+ Yes — we dogfood Spec Kit while developing Spec Kit, especially for substantial
408
+ features and changes to the development workflow. Contributors are asked to test
409
+ relevant changes through the Spec-Driven Development commands. The
410
+ [feature assessment workflow](./.github/workflows/feature-assess.md) is currently
411
+ the automated dogfooding path: its setup uses the CLI from the current checkout
412
+ to initialize Copilot and install the `assess` extension, after which Copilot
413
+ follows the generated assessment skills against feature requests. The other
414
+ agentic workflows currently operate independently of the Specify CLI.
415
+
416
+ This does not mean every change goes through the full workflow. Small fixes can
417
+ use the normal issue, pull request, review, and test process. Dogfooding
418
+ scaffolding and artifacts under `.github/agents/`, `.github/prompts/`,
419
+ `.github/copilot-instructions.md`, `.grok/`, `.specify/`, and `specs/` are
420
+ intentionally gitignored. The automated assessment workflow is ephemeral and
421
+ neither commits nor pushes its generated Copilot skills, so its output does not
422
+ enter repository history. See the [contributor development
423
+ workflow](./CONTRIBUTING.md#development-workflow) for the validation expectations.
424
+
404
425
  ## 🌟 Development Phases
405
426
 
406
427
  | Phase | Focus | Key Activities |
@@ -142,7 +142,7 @@ The following community-contributed extensions are available in [`catalog.commun
142
142
  | Spec Diagram | Auto-generate Mermaid diagrams of SDD workflow state, feature progress, and task dependencies | `visibility` | Read-only | [spec-kit-diagram-](https://github.com/Quratulain-bilal/spec-kit-diagram-) |
143
143
  | Spec Inventory | Read-only inventory of live requirement and task IDs, with focused per-task context packs instead of whole-file dumps | `visibility` | Read-only | [spec-kit-inventory-alignment](https://github.com/Yash-Chindam/spec-kit-inventory-alignment) |
144
144
  | Spec Kit Discovery Extension | Run technical discovery commands for feasibility, technology selection, scenario-specific technical decisions, legacy codebase assessment, implementation understanding, and proof-of-concept validation | `process` | Read+Write | [spec-kit-discovery](https://github.com/bigsmartben/spec-kit-discovery) |
145
- | Spec Kit Figma | Agent-agnostic SpecKit extension that grounds spec, plan & task generation in Figma design context REST + optional MCP, single/mono/multi-repo, macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-figma](https://github.com/Fyloss/spec-kit-figma) |
145
+ | Spec Kit Figma | Grounds SpecKit spec/plan/tasks in Figma design context via REST or MCP, on macOS/Linux/Windows. | `integration` | Read+Write | [spec-kit-figma](https://github.com/Fyloss/spec-kit-figma) |
146
146
  | Spec Kit Memory | Recalls prior specs and decisions from configurable memory tools (e.g. memsearch) before SDLC stages, so planning and specification start from what the project already knows | `docs` | Read+Write | [spec-kit-memory](https://github.com/zaytsevand/spec-kit-memory) |
147
147
  | Spec Kit Preview | Generate evidence-backed low, mid, or high fidelity previews from Spec Kit artifacts as Markdown or self-contained HTML | `docs` | Read+Write | [spec-kit-preview](https://github.com/bigsmartben/spec-kit-preview) |
148
148
  | Spec Kit Schedule | Optimal multi-agent task scheduling via CP-SAT — DAG precedence, hallucination-aware caps, file-conflict avoidance, stochastic durations, replanning, and interactive HTML output | `process` | Read+Write | [spec-kit-schedule](https://github.com/jfranc38/spec-kit-schedule) |
@@ -182,6 +182,7 @@ The following community-contributed extensions are available in [`catalog.commun
182
182
  | Verify Review Ship | Post-convergence operational verification, technical review, learning governance, and transactional delivery. | `process` | Read+Write | [spec-kit-verify-review-ship](https://github.com/cadugevaerd/spec-kit-verify-review-ship) |
183
183
  | Verify Tasks Extension | Detect phantom completions: tasks marked [X] in tasks.md with no real implementation | `code` | Read-only | [spec-kit-verify-tasks](https://github.com/datastone-inc/spec-kit-verify-tasks) |
184
184
  | Version Guard | Verify tech stack versions against live npm registries before planning and implementation | `process` | Read-only | [spec-kit-version-guard](https://github.com/KevinBrown5280/spec-kit-version-guard) |
185
+ | Vurnix Honest Gate | Deterministic three-state honest gate for AI-written code: compile + phantom-import + honest test count in one verdict, executed as code — not as agent self-review. PASS/BLOCK/UNPROVEN by exit code. | `process` | Read-only | [vurnix-spec-kit](https://github.com/shiersa/vurnix-spec-kit) |
185
186
  | What-if Analysis | Preview the downstream impact (complexity, effort, tasks, risks) of requirement changes before committing to them | `visibility` | Read-only | [spec-kit-whatif](https://github.com/DevAbdullah90/spec-kit-whatif) |
186
187
  | Wireframe Visual Feedback Loop | SVG wireframe generation, review, and sign-off for spec-driven development. Approved wireframes become spec constraints honored by /speckit.plan, /speckit.tasks, and /speckit.implement | `visibility` | Read+Write | [spec-kit-extension-wireframe](https://github.com/TortoiseWolfe/spec-kit-extension-wireframe) |
187
188
  | Work IQ | Integrate Microsoft 365 organizational knowledge into spec-driven development workflows | `integration` | Read-only | [spec-kit-workiq](https://github.com/sakitA/spec-kit-workiq) |
@@ -17,6 +17,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
17
17
  | [Command Code](https://commandcode.ai/docs) | `command-code` | Skills-based integration; installs skills into `.commandcode/skills/` and invokes them as `$speckit-<command>` |
18
18
  | [Cursor](https://cursor.sh/) | `cursor-agent` | |
19
19
  | [Devin for Terminal](https://cli.devin.ai/docs) | `devin` | Skills-based integration; installs skills into `.devin/skills/` and invokes them as `/speckit-<command>` |
20
+ | [Docker Agent](https://docs.docker.com/ai/docker-agent/) | `docker-agent` | Skills-based integration; installs skills into `.agents/skills/` (the same directory used by Codex and Zed). In the selected agent YAML, enable local skills with `skills: true` and provide filesystem read access. Detects either the standalone `docker-agent` binary or the Docker CLI plugin (`docker agent`). Configure workflow dispatch with `SPECKIT_INTEGRATION_DOCKER_AGENT_EXTRA_ARGS=./agent.yaml`; the Spec Kit prompt is appended after these arguments. Not multi-install safe by default because the skills directory is shared. |
20
21
  | [Factory Droid](https://docs.factory.ai/cli/getting-started/overview) | `droid` | Skills-based integration; installs skills into `.factory/skills/` and invokes them as `/speckit-<command>` |
21
22
  | [Firebender](https://firebender.com/) | `firebender` | IDE-based agent for Android Studio / IntelliJ |
22
23
  | [Forge](https://forgecode.dev/) | `forge` | |
@@ -274,8 +274,7 @@ When releasing a new version:
274
274
  A: The main catalog is for public extensions only. For private extensions:
275
275
 
276
276
  - Host your own catalog.json file
277
- - Users add your catalog: `specify extension add-catalog https://your-domain.com/catalog.json`
278
- - Not yet implemented - coming in Phase 4
277
+ - In a Spec Kit project, users add your catalog: `specify extension catalog add https://your-domain.com/catalog.json --name private-catalog`
279
278
 
280
279
  ### Q: How long does review take?
281
280
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-08-31T00:00:00Z",
3
+ "updated_at": "2026-09-01T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
5
5
  "extensions": {
6
6
  "adrkit": {
@@ -1783,10 +1783,10 @@
1783
1783
  "figma": {
1784
1784
  "name": "Spec Kit Figma",
1785
1785
  "id": "figma",
1786
- "description": "Agent-agnostic SpecKit extension that grounds spec, plan & task generation in Figma design context REST + optional MCP, single/mono/multi-repo, macOS/Linux/Windows.",
1786
+ "description": "Grounds SpecKit spec/plan/tasks in Figma design context via REST or MCP, on macOS/Linux/Windows.",
1787
1787
  "author": "Fyloss",
1788
- "version": "1.6.0",
1789
- "download_url": "https://github.com/Fyloss/spec-kit-figma/archive/refs/tags/v1.6.0.zip",
1788
+ "version": "3.1.1",
1789
+ "download_url": "https://github.com/Fyloss/spec-kit-figma/archive/refs/tags/v3.1.1.zip",
1790
1790
  "repository": "https://github.com/Fyloss/spec-kit-figma",
1791
1791
  "homepage": "https://github.com/Fyloss/spec-kit-figma",
1792
1792
  "documentation": "https://github.com/Fyloss/spec-kit-figma/blob/main/docs/INSTALL.md",
@@ -1795,7 +1795,7 @@
1795
1795
  "category": "integration",
1796
1796
  "effect": "read-write",
1797
1797
  "requires": {
1798
- "speckit_version": ">=0.1.0",
1798
+ "speckit_version": ">=0.11.2",
1799
1799
  "tools": [
1800
1800
  {
1801
1801
  "name": "git",
@@ -1820,8 +1820,8 @@
1820
1820
  ]
1821
1821
  },
1822
1822
  "provides": {
1823
- "commands": 5,
1824
- "hooks": 6
1823
+ "commands": 7,
1824
+ "hooks": 11
1825
1825
  },
1826
1826
  "tags": [
1827
1827
  "figma",
@@ -1834,7 +1834,7 @@
1834
1834
  "downloads": 0,
1835
1835
  "stars": 0,
1836
1836
  "created_at": "2026-07-08T00:00:00Z",
1837
- "updated_at": "2026-07-08T00:00:00Z"
1837
+ "updated_at": "2026-08-31T00:00:00Z"
1838
1838
  },
1839
1839
  "figma-starter": {
1840
1840
  "name": "Figma Starter",
@@ -5796,6 +5796,45 @@
5796
5796
  "created_at": "2026-04-20T00:00:00Z",
5797
5797
  "updated_at": "2026-04-22T21:10:00Z"
5798
5798
  },
5799
+ "vurnix": {
5800
+ "name": "Vurnix Honest Gate",
5801
+ "id": "vurnix",
5802
+ "description": "Deterministic three-state honest gate for AI-written code: compile + phantom-import + honest test count, executed as code — not agent self-review. PASS/BLOCK/UNPROVEN by exit code.",
5803
+ "author": "shiersa",
5804
+ "version": "0.1.1",
5805
+ "download_url": "https://github.com/shiersa/vurnix-spec-kit/releases/download/v0.1.1/vurnix-0.1.1.zip",
5806
+ "repository": "https://github.com/shiersa/vurnix-spec-kit",
5807
+ "homepage": "https://vurnix.dev",
5808
+ "documentation": "https://github.com/shiersa/vurnix-spec-kit#readme",
5809
+ "changelog": "",
5810
+ "license": "MIT",
5811
+ "category": "process",
5812
+ "effect": "read-only",
5813
+ "requires": {
5814
+ "speckit_version": ">=0.16.2",
5815
+ "tools": [
5816
+ { "name": "python3", "version": ">=3.10", "required": true },
5817
+ { "name": "vurnix", "version": ">=0.3.0", "required": true },
5818
+ { "name": "bash", "required": true }
5819
+ ]
5820
+ },
5821
+ "provides": {
5822
+ "commands": 1,
5823
+ "hooks": 1
5824
+ },
5825
+ "tags": [
5826
+ "deterministic",
5827
+ "honest-gate",
5828
+ "test-integrity",
5829
+ "quality",
5830
+ "fail-closed"
5831
+ ],
5832
+ "verified": false,
5833
+ "downloads": 0,
5834
+ "stars": 0,
5835
+ "created_at": "2026-09-01T00:00:00Z",
5836
+ "updated_at": "2026-09-01T00:00:00Z"
5837
+ },
5799
5838
  "whatif": {
5800
5839
  "name": "What-if Analysis",
5801
5840
  "id": "whatif",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
- "updated_at": "2026-07-27T00:00:00Z",
3
+ "updated_at": "2026-08-26T00:00:00Z",
4
4
  "catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json",
5
5
  "integrations": {
6
6
  "alquimia": {
@@ -102,6 +102,15 @@
102
102
  "repository": "https://github.com/github/spec-kit",
103
103
  "tags": ["cli", "skills"]
104
104
  },
105
+ "docker-agent": {
106
+ "id": "docker-agent",
107
+ "name": "Docker Agent",
108
+ "version": "1.0.0",
109
+ "description": "Docker Agent skills-based integration",
110
+ "author": "spec-kit-core",
111
+ "repository": "https://github.com/github/spec-kit",
112
+ "tags": ["cli", "skills", "docker"]
113
+ },
105
114
  "qwen": {
106
115
  "id": "qwen",
107
116
  "name": "Qwen Code",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "1.0.2"
3
+ version = "1.0.3"
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"
@@ -9,6 +9,7 @@
9
9
  #
10
10
  # OPTIONS:
11
11
  # --json Output in JSON format
12
+ # --require-spec Require spec.md to exist (for analysis phase)
12
13
  # --require-tasks Require tasks.md to exist (for implementation phase)
13
14
  # --include-tasks Include tasks.md in AVAILABLE_DOCS list
14
15
  # --paths-only Only output path variables (no validation)
@@ -24,6 +25,7 @@ set -e
24
25
 
25
26
  # Parse command line arguments
26
27
  JSON_MODE=false
28
+ REQUIRE_SPEC=false
27
29
  REQUIRE_TASKS=false
28
30
  INCLUDE_TASKS=false
29
31
  PATHS_ONLY=false
@@ -34,6 +36,9 @@ while [[ $# -gt 0 ]]; do
34
36
  --json)
35
37
  JSON_MODE=true
36
38
  ;;
39
+ --require-spec)
40
+ REQUIRE_SPEC=true
41
+ ;;
37
42
  --require-tasks)
38
43
  REQUIRE_TASKS=true
39
44
  ;;
@@ -59,6 +64,7 @@ Consolidated prerequisite checking for Spec-Driven Development workflow.
59
64
 
60
65
  OPTIONS:
61
66
  --json Output in JSON format
67
+ --require-spec Require spec.md to exist (for analysis phase)
62
68
  --require-tasks Require tasks.md to exist (for implementation phase)
63
69
  --include-tasks Include tasks.md in AVAILABLE_DOCS list
64
70
  --paths-only Only output path variables (no prerequisite validation)
@@ -142,6 +148,13 @@ if [[ ! -f "$IMPL_PLAN" ]]; then
142
148
  exit 1
143
149
  fi
144
150
 
151
+ # Check for spec.md if required
152
+ if $REQUIRE_SPEC && [[ ! -f "$FEATURE_SPEC" ]]; then
153
+ echo "ERROR: spec.md not found in $FEATURE_DIR" >&2
154
+ echo "Run $(format_speckit_command specify "$REPO_ROOT") first to create the feature specification." >&2
155
+ exit 1
156
+ fi
157
+
145
158
  # Check for tasks.md if required
146
159
  if $REQUIRE_TASKS && [[ ! -f "$TASKS" ]]; then
147
160
  echo "ERROR: tasks.md not found in $FEATURE_DIR" >&2
@@ -4,7 +4,6 @@ set -e
4
4
 
5
5
  # Parse command line arguments
6
6
  JSON_MODE=false
7
- ARGS=()
8
7
 
9
8
  for arg in "$@"; do
10
9
  case "$arg" in
@@ -18,7 +17,8 @@ for arg in "$@"; do
18
17
  exit 0
19
18
  ;;
20
19
  *)
21
- ARGS+=("$arg")
20
+ echo "ERROR: Unknown option '$arg'" >&2
21
+ exit 1
22
22
  ;;
23
23
  esac
24
24
  done
@@ -9,6 +9,7 @@
9
9
  #
10
10
  # OPTIONS:
11
11
  # -Json Output in JSON format
12
+ # -RequireSpec Require spec.md to exist (for analysis phase)
12
13
  # -RequireTasks Require tasks.md to exist (for implementation phase)
13
14
  # -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
14
15
  # -PathsOnly Only output path variables (no validation)
@@ -18,6 +19,7 @@
18
19
  [CmdletBinding()]
19
20
  param(
20
21
  [switch]$Json,
22
+ [switch]$RequireSpec,
21
23
  [switch]$RequireTasks,
22
24
  [switch]$IncludeTasks,
23
25
  [switch]$PathsOnly,
@@ -36,6 +38,7 @@ Consolidated prerequisite checking for Spec-Driven Development workflow.
36
38
 
37
39
  OPTIONS:
38
40
  -Json Output in JSON format
41
+ -RequireSpec Require spec.md to exist (for analysis phase)
39
42
  -RequireTasks Require tasks.md to exist (for implementation phase)
40
43
  -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
41
44
  -PathsOnly Only output path variables (no prerequisite validation)
@@ -105,6 +108,14 @@ if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
105
108
  exit 1
106
109
  }
107
110
 
111
+ # Check for spec.md if required
112
+ if ($RequireSpec -and -not (Test-Path $paths.FEATURE_SPEC -PathType Leaf)) {
113
+ [Console]::Error.WriteLine("ERROR: spec.md not found in $($paths.FEATURE_DIR)")
114
+ $specifyCommand = Format-SpecKitCommand -CommandName 'specify' -RepoRoot $paths.REPO_ROOT
115
+ [Console]::Error.WriteLine("Run $specifyCommand first to create the feature specification.")
116
+ exit 1
117
+ }
118
+
108
119
  # Check for tasks.md if required
109
120
  if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
110
121
  [Console]::Error.WriteLine("ERROR: tasks.md not found in $($paths.FEATURE_DIR)")
@@ -20,6 +20,11 @@ if ($Help) {
20
20
  exit 0
21
21
  }
22
22
 
23
+ if ($RemainingArgs.Count -gt 0) {
24
+ [Console]::Error.WriteLine("ERROR: Unknown option '$($RemainingArgs[0])'")
25
+ exit 1
26
+ }
27
+
23
28
  # Load common functions
24
29
  . "$PSScriptRoot/common.ps1"
25
30
 
@@ -37,6 +37,7 @@ Consolidated prerequisite checking for Spec-Driven Development workflow.
37
37
 
38
38
  OPTIONS:
39
39
  --json Output in JSON format
40
+ --require-spec Require spec.md to exist (for analysis phase)
40
41
  --require-tasks Require tasks.md to exist (for implementation phase)
41
42
  --include-tasks Include tasks.md in AVAILABLE_DOCS list
42
43
  --paths-only Only output path variables (no prerequisite validation)
@@ -59,6 +60,7 @@ EXAMPLES:
59
60
  @dataclass(frozen=True)
60
61
  class Args:
61
62
  json_mode: bool = False
63
+ require_spec: bool = False
62
64
  require_tasks: bool = False
63
65
  include_tasks: bool = False
64
66
  paths_only: bool = False
@@ -67,6 +69,7 @@ class Args:
67
69
 
68
70
  def _parse_args(argv: list[str]) -> Args:
69
71
  json_mode = False
72
+ require_spec = False
70
73
  require_tasks = False
71
74
  include_tasks = False
72
75
  paths_only = False
@@ -77,6 +80,8 @@ def _parse_args(argv: list[str]) -> Args:
77
80
  arg = argv[index]
78
81
  if arg == "--json":
79
82
  json_mode = True
83
+ elif arg == "--require-spec":
84
+ require_spec = True
80
85
  elif arg == "--require-tasks":
81
86
  require_tasks = True
82
87
  elif arg == "--include-tasks":
@@ -105,6 +110,7 @@ def _parse_args(argv: list[str]) -> Args:
105
110
 
106
111
  return Args(
107
112
  json_mode=json_mode,
113
+ require_spec=require_spec,
108
114
  require_tasks=require_tasks,
109
115
  include_tasks=include_tasks,
110
116
  paths_only=paths_only,
@@ -230,6 +236,14 @@ def main(argv: list[str] | None = None) -> int:
230
236
  )
231
237
  return 1
232
238
 
239
+ if args.require_spec and not paths.feature_spec.is_file():
240
+ print(f"ERROR: spec.md not found in {paths.feature_dir}", file=sys.stderr)
241
+ print(
242
+ f"Run {format_speckit_command('specify', paths.repo_root)} first to create the feature specification.",
243
+ file=sys.stderr,
244
+ )
245
+ return 1
246
+
233
247
  if args.require_tasks and not paths.tasks.is_file():
234
248
  print(f"ERROR: tasks.md not found in {paths.feature_dir}", file=sys.stderr)
235
249
  print(
@@ -42,7 +42,9 @@ def main(argv: list[str] | None = None) -> int:
42
42
  elif arg in {"--help", "-h"}:
43
43
  sys.stdout.write(_help_text(sys.argv[0]))
44
44
  return 0
45
- # Other arguments are accepted and silently ignored, matching setup-plan.sh.
45
+ else:
46
+ print(f"ERROR: Unknown option '{arg}'", file=sys.stderr)
47
+ return 1
46
48
 
47
49
  try:
48
50
  paths = get_feature_paths(script_file=Path(__file__))
@@ -39,6 +39,7 @@ def build_github_request(url: str) -> urllib.request.Request:
39
39
  ValueError: If ``url`` is empty or whitespace-only.
40
40
  ValueError: If ``url`` does not use the ``http`` or ``https`` scheme.
41
41
  ValueError: If ``url`` does not include a hostname.
42
+ ValueError: If ``url`` includes a malformed explicit port.
42
43
  """
43
44
  headers: Dict[str, str] = {}
44
45
  url = url.strip()
@@ -49,6 +50,8 @@ def build_github_request(url: str) -> urllib.request.Request:
49
50
  raise ValueError(f"url must start with http:// or https://, got: {url!r}")
50
51
  if not parsed.hostname:
51
52
  raise ValueError(f"url must include a hostname, got: {url!r}")
53
+ # Accessing ``port`` validates any explicit port before request construction.
54
+ parsed.port
52
55
  github_token = (os.environ.get("GITHUB_TOKEN") or "").strip()
53
56
  gh_token = (os.environ.get("GH_TOKEN") or "").strip()
54
57
  token = github_token or gh_token or None
@@ -16,6 +16,45 @@ from ._download_security import normalize_zip_member_name
16
16
 
17
17
  CLAUDE_LOCAL_PATH = Path.home() / ".claude" / "local" / "claude"
18
18
  CLAUDE_NPM_LOCAL_PATH = Path.home() / ".claude" / "local" / "node_modules" / ".bin" / "claude"
19
+ DOCKER_AGENT_CHECK_TIMEOUT = 5
20
+
21
+
22
+ def docker_agent_command(executable: str | None = None) -> list[str] | None:
23
+ """Return a runnable Docker Agent command, or ``None`` if unavailable.
24
+
25
+ Docker Agent is distributed either as the standalone ``docker-agent``
26
+ executable or as the ``docker agent`` Docker CLI plugin. The plugin form
27
+ is verified with a bounded, read-only version probe so a plain Docker CLI
28
+ is not mistaken for an installed Docker Agent.
29
+ """
30
+ resolved_from_path = executable is None
31
+ if executable is None:
32
+ if shutil.which("docker-agent"):
33
+ return ["docker-agent", "run"]
34
+ executable = shutil.which("docker")
35
+ if executable is None:
36
+ return None
37
+
38
+ executable_name = Path(executable).name.lower()
39
+ if executable_name in {"docker", "docker.exe"}:
40
+ command = [executable, "agent", "version"]
41
+ run_command = [executable, "agent", "run"]
42
+ else:
43
+ # An explicit non-Docker executable is an operator override. Preserve
44
+ # the existing override contract without probing a custom binary.
45
+ return [executable, "run"]
46
+ try:
47
+ result = subprocess.run(
48
+ command,
49
+ capture_output=True,
50
+ check=False,
51
+ timeout=DOCKER_AGENT_CHECK_TIMEOUT,
52
+ )
53
+ except (OSError, subprocess.TimeoutExpired):
54
+ return None
55
+ if result.returncode != 0:
56
+ return None
57
+ return ["docker", "agent", "run"] if resolved_from_path else run_command
19
58
 
20
59
 
21
60
  def relative_extension_path_violation(value: Any) -> str | None:
@@ -137,6 +176,8 @@ def check_tool(tool: str, tracker=None) -> bool:
137
176
  found = shutil.which("kiro-cli") is not None or shutil.which("kiro") is not None
138
177
  elif tool == "rovodev":
139
178
  found = shutil.which("acli") is not None
179
+ elif tool == "docker-agent":
180
+ found = docker_agent_command() is not None
140
181
  else:
141
182
  found = shutil.which(tool) is not None
142
183