specify-cli 0.11.0__tar.gz → 0.11.1__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 (377) hide show
  1. {specify_cli-0.11.0 → specify_cli-0.11.1}/.gitignore +9 -0
  2. {specify_cli-0.11.0 → specify_cli-0.11.1}/CHANGELOG.md +15 -0
  3. {specify_cli-0.11.0 → specify_cli-0.11.1}/PKG-INFO +7 -1
  4. {specify_cli-0.11.0 → specify_cli-0.11.1}/README.md +6 -0
  5. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/presets.md +1 -1
  6. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/concepts/sdd.md +3 -2
  7. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/docfx.json +1 -1
  8. specify_cli-0.11.1/docs/guides/evolving-specs.md +90 -0
  9. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/quickstart.md +1 -1
  10. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/toc.yml +2 -0
  11. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/catalog.community.json +9 -5
  12. {specify_cli-0.11.0 → specify_cli-0.11.1}/pyproject.toml +1 -1
  13. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/__init__.py +16 -2
  14. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_console.py +3 -1
  15. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_utils.py +11 -0
  16. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/commands/init.py +7 -2
  17. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/extensions.py +19 -3
  18. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/claude/__init__.py +2 -3
  19. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/presets/__init__.py +6 -5
  20. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/shell/__init__.py +24 -0
  21. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_claude.py +10 -0
  22. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extension_skills.py +61 -5
  23. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extensions.py +50 -0
  24. specify_cli-0.11.1/tests/test_live_transient_windows.py +90 -0
  25. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_workflow_run_without_project.py +3 -1
  26. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_workflows.py +159 -0
  27. specify_cli-0.11.0/tests/hooks/.specify/extensions.yml +0 -34
  28. {specify_cli-0.11.0 → specify_cli-0.11.1}/.devcontainer/devcontainer.json +0 -0
  29. {specify_cli-0.11.0 → specify_cli-0.11.1}/.devcontainer/post-create.sh +0 -0
  30. {specify_cli-0.11.0 → specify_cli-0.11.1}/.editorconfig +0 -0
  31. {specify_cli-0.11.0 → specify_cli-0.11.1}/.gitattributes +0 -0
  32. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/CODEOWNERS +0 -0
  33. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
  34. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  35. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  36. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
  37. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  38. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
  39. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  40. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/aw/actions-lock.json +0 -0
  41. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/dependabot.yml +0 -0
  42. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/skills/add-community-extension/SKILL.md +0 -0
  43. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/RELEASE-PROCESS.md +0 -0
  44. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-extension.lock.yml +0 -0
  45. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-extension.md +0 -0
  46. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-preset.lock.yml +0 -0
  47. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-preset.md +0 -0
  48. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/catalog-assign.yml +0 -0
  49. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/codeql.yml +0 -0
  50. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/docs.yml +0 -0
  51. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/lint.yml +0 -0
  52. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/release-trigger.yml +0 -0
  53. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/release.yml +0 -0
  54. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/stale.yml +0 -0
  55. {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/test.yml +0 -0
  56. {specify_cli-0.11.0 → specify_cli-0.11.1}/.markdownlint-cli2.jsonc +0 -0
  57. {specify_cli-0.11.0 → specify_cli-0.11.1}/.zenodo.json +0 -0
  58. {specify_cli-0.11.0 → specify_cli-0.11.1}/AGENTS.md +0 -0
  59. {specify_cli-0.11.0 → specify_cli-0.11.1}/CITATION.cff +0 -0
  60. {specify_cli-0.11.0 → specify_cli-0.11.1}/CODE_OF_CONDUCT.md +0 -0
  61. {specify_cli-0.11.0 → specify_cli-0.11.1}/CONTRIBUTING.md +0 -0
  62. {specify_cli-0.11.0 → specify_cli-0.11.1}/DEVELOPMENT.md +0 -0
  63. {specify_cli-0.11.0 → specify_cli-0.11.1}/LICENSE +0 -0
  64. {specify_cli-0.11.0 → specify_cli-0.11.1}/SECURITY.md +0 -0
  65. {specify_cli-0.11.0 → specify_cli-0.11.1}/SUPPORT.md +0 -0
  66. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/.gitignore +0 -0
  67. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/README.md +0 -0
  68. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/extensions.md +0 -0
  69. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/friends.md +0 -0
  70. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/overview.md +0 -0
  71. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/walkthroughs.md +0 -0
  72. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/concepts/complex-features.md +0 -0
  73. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/concepts/spec-persistence.md +0 -0
  74. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/index.md +0 -0
  75. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/air-gapped.md +0 -0
  76. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/one-time.md +0 -0
  77. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/pipx.md +0 -0
  78. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/uv.md +0 -0
  79. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/installation.md +0 -0
  80. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/local-development.md +0 -0
  81. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/authentication.md +0 -0
  82. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/core.md +0 -0
  83. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/extensions.md +0 -0
  84. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/integrations.md +0 -0
  85. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/overview.md +0 -0
  86. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/presets.md +0 -0
  87. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/workflows.md +0 -0
  88. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/template/public/main.css +0 -0
  89. {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/upgrade.md +0 -0
  90. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  91. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  92. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
  93. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-USER-GUIDE.md +0 -0
  94. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/README.md +0 -0
  95. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
  96. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/README.md +0 -0
  97. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/agent-context-config.yml +0 -0
  98. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
  99. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/extension.yml +0 -0
  100. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
  101. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
  102. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/README.md +0 -0
  103. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/commands/speckit.bug.assess.md +0 -0
  104. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/commands/speckit.bug.fix.md +0 -0
  105. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/commands/speckit.bug.test.md +0 -0
  106. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/extension.yml +0 -0
  107. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/catalog.community.json +0 -0
  108. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/catalog.json +0 -0
  109. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/README.md +0 -0
  110. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.commit.md +0 -0
  111. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.feature.md +0 -0
  112. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.initialize.md +0 -0
  113. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.remote.md +0 -0
  114. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.validate.md +0 -0
  115. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/config-template.yml +0 -0
  116. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/extension.yml +0 -0
  117. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/git-config.yml +0 -0
  118. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/auto-commit.sh +0 -0
  119. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
  120. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/git-common.sh +0 -0
  121. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  122. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  123. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
  124. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  125. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  126. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/selftest/commands/selftest.md +0 -0
  127. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/selftest/extension.yml +0 -0
  128. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/.gitignore +0 -0
  129. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/CHANGELOG.md +0 -0
  130. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/EXAMPLE-README.md +0 -0
  131. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/LICENSE +0 -0
  132. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/README.md +0 -0
  133. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/commands/example.md +0 -0
  134. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/config-template.yml +0 -0
  135. {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/extension.yml +0 -0
  136. {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/CONTRIBUTING.md +0 -0
  137. {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/README.md +0 -0
  138. {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/catalog.community.json +0 -0
  139. {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/catalog.json +0 -0
  140. {specify_cli-0.11.0 → specify_cli-0.11.1}/media/bootstrap-claude-code.gif +0 -0
  141. {specify_cli-0.11.0 → specify_cli-0.11.1}/media/logo_large.webp +0 -0
  142. {specify_cli-0.11.0 → specify_cli-0.11.1}/media/logo_small.webp +0 -0
  143. {specify_cli-0.11.0 → specify_cli-0.11.1}/media/spec-kit-video-header.jpg +0 -0
  144. {specify_cli-0.11.0 → specify_cli-0.11.1}/media/specify_cli.gif +0 -0
  145. {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-April.md +0 -0
  146. {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-February.md +0 -0
  147. {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-March.md +0 -0
  148. {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-May.md +0 -0
  149. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/ARCHITECTURE.md +0 -0
  150. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/PUBLISHING.md +0 -0
  151. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/README.md +0 -0
  152. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/catalog.json +0 -0
  153. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/README.md +0 -0
  154. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.constitution.md +0 -0
  155. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.implement.md +0 -0
  156. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.plan.md +0 -0
  157. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.specify.md +0 -0
  158. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.tasks.md +0 -0
  159. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/preset.yml +0 -0
  160. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/README.md +0 -0
  161. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
  162. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/commands/speckit.specify.md +0 -0
  163. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/preset.yml +0 -0
  164. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/templates/myext-template.md +0 -0
  165. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/templates/spec-template.md +0 -0
  166. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/commands/speckit.specify.md +0 -0
  167. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/commands/speckit.wrap-test.md +0 -0
  168. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/preset.yml +0 -0
  169. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/agent-file-template.md +0 -0
  170. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/checklist-template.md +0 -0
  171. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/constitution-template.md +0 -0
  172. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/plan-template.md +0 -0
  173. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/spec-template.md +0 -0
  174. {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/tasks-template.md +0 -0
  175. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/check-prerequisites.sh +0 -0
  176. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/common.sh +0 -0
  177. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/create-new-feature.sh +0 -0
  178. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/setup-plan.sh +0 -0
  179. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/setup-tasks.sh +0 -0
  180. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/check-prerequisites.ps1 +0 -0
  181. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/common.ps1 +0 -0
  182. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/create-new-feature.ps1 +0 -0
  183. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/setup-plan.ps1 +0 -0
  184. {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/setup-tasks.ps1 +0 -0
  185. {specify_cli-0.11.0 → specify_cli-0.11.1}/spec-driven.md +0 -0
  186. {specify_cli-0.11.0 → specify_cli-0.11.1}/spec-kit.code-workspace +0 -0
  187. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_agent_config.py +0 -0
  188. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_assets.py +0 -0
  189. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_github_http.py +0 -0
  190. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_init_options.py +0 -0
  191. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_invocation_style.py +0 -0
  192. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_version.py +0 -0
  193. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/agents.py +0 -0
  194. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/__init__.py +0 -0
  195. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/azure_devops.py +0 -0
  196. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/base.py +0 -0
  197. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/config.py +0 -0
  198. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/github.py +0 -0
  199. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/http.py +0 -0
  200. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/catalogs.py +0 -0
  201. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/commands/__init__.py +0 -0
  202. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_runtime.py +0 -0
  203. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_scaffold.py +0 -0
  204. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_state.py +0 -0
  205. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_status.py +0 -0
  206. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/__init__.py +0 -0
  207. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_commands.py +0 -0
  208. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_helpers.py +0 -0
  209. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_install_commands.py +0 -0
  210. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_migrate_commands.py +0 -0
  211. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_query_commands.py +0 -0
  212. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
  213. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/agy/__init__.py +0 -0
  214. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/amp/__init__.py +0 -0
  215. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/auggie/__init__.py +0 -0
  216. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/base.py +0 -0
  217. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/bob/__init__.py +0 -0
  218. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/catalog.py +0 -0
  219. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/cline/__init__.py +0 -0
  220. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
  221. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/codex/__init__.py +0 -0
  222. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/copilot/__init__.py +0 -0
  223. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
  224. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/devin/__init__.py +0 -0
  225. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/forge/__init__.py +0 -0
  226. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/gemini/__init__.py +0 -0
  227. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/generic/__init__.py +0 -0
  228. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/goose/__init__.py +0 -0
  229. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/hermes/__init__.py +0 -0
  230. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/iflow/__init__.py +0 -0
  231. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/junie/__init__.py +0 -0
  232. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
  233. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/kimi/__init__.py +0 -0
  234. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
  235. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/lingma/__init__.py +0 -0
  236. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/manifest.py +0 -0
  237. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/opencode/__init__.py +0 -0
  238. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/pi/__init__.py +0 -0
  239. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
  240. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/qwen/__init__.py +0 -0
  241. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/roo/__init__.py +0 -0
  242. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
  243. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/shai/__init__.py +0 -0
  244. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
  245. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/trae/__init__.py +0 -0
  246. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/vibe/__init__.py +0 -0
  247. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
  248. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/zed/__init__.py +0 -0
  249. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/presets/_commands.py +0 -0
  250. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/shared_infra.py +0 -0
  251. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/__init__.py +0 -0
  252. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/base.py +0 -0
  253. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/catalog.py +0 -0
  254. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/engine.py +0 -0
  255. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/expressions.py +0 -0
  256. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/__init__.py +0 -0
  257. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
  258. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
  259. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
  260. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
  261. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
  262. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
  263. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
  264. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
  265. {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
  266. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/checklist-template.md +0 -0
  267. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/analyze.md +0 -0
  268. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/checklist.md +0 -0
  269. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/clarify.md +0 -0
  270. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/constitution.md +0 -0
  271. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/implement.md +0 -0
  272. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/plan.md +0 -0
  273. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/specify.md +0 -0
  274. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/tasks.md +0 -0
  275. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/taskstoissues.md +0 -0
  276. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/constitution-template.md +0 -0
  277. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/plan-template.md +0 -0
  278. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/spec-template.md +0 -0
  279. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/tasks-template.md +0 -0
  280. {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/vscode-settings.json +0 -0
  281. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/__init__.py +0 -0
  282. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/auth_helpers.py +0 -0
  283. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/conftest.py +0 -0
  284. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/__init__.py +0 -0
  285. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/bug/__init__.py +0 -0
  286. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/bug/test_bug_extension.py +0 -0
  287. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/git/__init__.py +0 -0
  288. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/git/test_git_extension.py +0 -0
  289. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/test_extension_agent_context.py +0 -0
  290. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/TESTING.md +0 -0
  291. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/plan.md +0 -0
  292. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/spec.md +0 -0
  293. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/tasks.md +0 -0
  294. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/http_helpers.py +0 -0
  295. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/__init__.py +0 -0
  296. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/conftest.py +0 -0
  297. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_base.py +0 -0
  298. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_cli.py +0 -0
  299. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_extra_args.py +0 -0
  300. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_agy.py +0 -0
  301. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_amp.py +0 -0
  302. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_auggie.py +0 -0
  303. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_markdown.py +0 -0
  304. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_skills.py +0 -0
  305. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_toml.py +0 -0
  306. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_yaml.py +0 -0
  307. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_bob.py +0 -0
  308. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_catalog.py +0 -0
  309. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_cline.py +0 -0
  310. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_codebuddy.py +0 -0
  311. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_codex.py +0 -0
  312. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_copilot.py +0 -0
  313. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_cursor_agent.py +0 -0
  314. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_devin.py +0 -0
  315. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_forge.py +0 -0
  316. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_gemini.py +0 -0
  317. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_generic.py +0 -0
  318. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_goose.py +0 -0
  319. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_hermes.py +0 -0
  320. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_iflow.py +0 -0
  321. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_junie.py +0 -0
  322. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_kilocode.py +0 -0
  323. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_kimi.py +0 -0
  324. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_kiro_cli.py +0 -0
  325. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_lingma.py +0 -0
  326. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_opencode.py +0 -0
  327. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_pi.py +0 -0
  328. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_qodercli.py +0 -0
  329. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_qwen.py +0 -0
  330. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_roo.py +0 -0
  331. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_rovodev.py +0 -0
  332. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_scaffold.py +0 -0
  333. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_shai.py +0 -0
  334. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_state.py +0 -0
  335. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_subcommand.py +0 -0
  336. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_tabnine.py +0 -0
  337. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_trae.py +0 -0
  338. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_vibe.py +0 -0
  339. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_windsurf.py +0 -0
  340. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_zed.py +0 -0
  341. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_manifest.py +0 -0
  342. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_registry.py +0 -0
  343. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/self_upgrade_helpers.py +0 -0
  344. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_agent_config_consistency.py +0 -0
  345. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_authentication.py +0 -0
  346. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_branch_numbering.py +0 -0
  347. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_check_prerequisites_paths_only.py +0 -0
  348. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_check_tool.py +0 -0
  349. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_cli_version.py +0 -0
  350. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_commands_package.py +0 -0
  351. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_console_imports.py +0 -0
  352. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extension_registration.py +0 -0
  353. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extension_update_hardening.py +0 -0
  354. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_github_http.py +0 -0
  355. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_merge.py +0 -0
  356. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_presets.py +0 -0
  357. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_ps1_encoding.py +0 -0
  358. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_registrar_path_traversal.py +0 -0
  359. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_detection.py +0 -0
  360. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_execution.py +0 -0
  361. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_guidance.py +0 -0
  362. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_verification.py +0 -0
  363. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_setup_plan_feature_json.py +0 -0
  364. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_setup_plan_no_overwrite.py +0 -0
  365. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_setup_tasks.py +0 -0
  366. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_timestamp_branches.py +0 -0
  367. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_upgrade.py +0 -0
  368. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_utils_assets_imports.py +0 -0
  369. {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_version_imports.py +0 -0
  370. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/ARCHITECTURE.md +0 -0
  371. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/PUBLISHING.md +0 -0
  372. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/README.md +0 -0
  373. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/catalog.community.json +0 -0
  374. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/catalog.json +0 -0
  375. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/speckit/workflow.yml +0 -0
  376. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/step-catalog.community.json +0 -0
  377. {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/step-catalog.json +0 -0
@@ -50,3 +50,12 @@ docs/dev
50
50
  .specify/extensions/.cache/
51
51
  .specify/extensions/.backup/
52
52
  .specify/extensions/*/local-config.yml
53
+
54
+ # The following directories/file are intentionally ignored so that they are not accidentally
55
+ # committed to the repository. They contain the scaffolding `specify init --integration copilot`
56
+ # does and they are meant for dogfooding Spec Kit during its own feature development.
57
+ .github/agents/
58
+ .github/prompts/
59
+ .github/copilot-instructions.md
60
+ .specify/
61
+ specs/
@@ -2,6 +2,21 @@
2
2
 
3
3
  <!-- insert new changelog below this comment -->
4
4
 
5
+ ## [0.11.1] - 2026-06-17
6
+
7
+ ### Changed
8
+
9
+ - chore: ignore Copilot dogfooding scaffolding in .gitignore (#3019)
10
+ - docs: clarify Taskify specify command (#3016)
11
+ - docs: document evolving specs in existing projects (#2902)
12
+ - feat(workflows): opt-in output_format: json exposes parsed shell stdout as output.data (#2963)
13
+ - fix: non-zero exit code when a workflow run ends failed or aborted (#2959)
14
+ - fix(skills): preserve non-ASCII characters in skill frontmatter (#2917)
15
+ - fix: prevent extension self-install from deleting source dir (#2990) (#2991)
16
+ - fix: disable Rich Live transient mode on Windows to prevent PS 5.1 hang (#2938)
17
+ - Update a11y-governance preset to v0.4.0 (#2981)
18
+ - chore: release 0.11.0, begin 0.11.1.dev0 development (#3012)
19
+
5
20
  ## [0.11.0] - 2026-06-16
6
21
 
7
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specify-cli
3
- Version: 0.11.0
3
+ Version: 0.11.1
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
@@ -274,6 +274,12 @@ Spec-Driven Development is a structured process that emphasizes:
274
274
  | **Creative Exploration** | Parallel implementations | <ul><li>Explore diverse solutions</li><li>Support multiple technology stacks & architectures</li><li>Experiment with UX patterns</li></ul> |
275
275
  | **Iterative Enhancement** ("Brownfield") | Brownfield modernization | <ul><li>Add features iteratively</li><li>Modernize legacy systems</li><li>Adapt processes</li></ul> |
276
276
 
277
+ For existing projects, keep Spec Kit tooling updates separate from feature
278
+ artifact evolution: refresh managed project files when upgrading, and update
279
+ `specs/` artifacts when intended behavior changes. The
280
+ [Evolving Specs guide](./docs/guides/evolving-specs.md) describes the
281
+ recommended brownfield loop.
282
+
277
283
  ## 🎯 Experimental Goals
278
284
 
279
285
  Our research and experimentation focus on:
@@ -254,6 +254,12 @@ Spec-Driven Development is a structured process that emphasizes:
254
254
  | **Creative Exploration** | Parallel implementations | <ul><li>Explore diverse solutions</li><li>Support multiple technology stacks & architectures</li><li>Experiment with UX patterns</li></ul> |
255
255
  | **Iterative Enhancement** ("Brownfield") | Brownfield modernization | <ul><li>Add features iteratively</li><li>Modernize legacy systems</li><li>Adapt processes</li></ul> |
256
256
 
257
+ For existing projects, keep Spec Kit tooling updates separate from feature
258
+ artifact evolution: refresh managed project files when upgrading, and update
259
+ `specs/` artifacts when intended behavior changes. The
260
+ [Evolving Specs guide](./docs/guides/evolving-specs.md) describes the
261
+ recommended brownfield loop.
262
+
257
263
  ## 🎯 Experimental Goals
258
264
 
259
265
  Our research and experimentation focus on:
@@ -7,7 +7,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
7
7
 
8
8
  | Preset | Purpose | Provides | Requires | URL |
9
9
  |--------|---------|----------|----------|-----|
10
- | A11Y Governance | Adds WCAG 2.2 AA accessibility checks, bilingual DE/EN delivery, CEFR-B2 readability, CLI accessibility, inclusive-content guidance, and didactic inline-code-comment review | 10 templates, 3 commands | — | [spec-kit-preset-a11y-governance](https://github.com/hindermath/spec-kit-preset-a11y-governance) |
10
+ | A11Y Governance | Adds accessibility (WCAG 2.2 AA), bilingual DE/EN delivery, CEFR-B2 readability, inclusive-content governance, didactic inline-code-comment review, and audit-ready Spec Kit run evidence | 10 templates, 3 commands | — | [spec-kit-preset-a11y-governance](https://github.com/hindermath/spec-kit-preset-a11y-governance) |
11
11
  | Agent Parity Governance | Adds shared-guidance parity, audit-ready Spec-Kit run evidence, and agent-neutral model-routing guidance across a project's declared AI-agent instruction surfaces so agent guidance does not drift. | 6 templates, 3 commands | — | [spec-kit-preset-agent-parity-governance](https://github.com/hindermath/spec-kit-preset-agent-parity-governance) |
12
12
  | AIDE In-Place Migration | Adapts the AIDE extension workflow for in-place technology migrations (X → Y pattern) — adds migration objectives, verification gates, knowledge documents, and behavioral equivalence criteria | 2 templates, 8 commands | AIDE extension | [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
13
13
  | Architecture Governance | Adds secure software architecture, STRIDE+CAPEC threat modeling, arc42 security cross-cutting concepts, S-ADRs, Zero Trust applicability, OWASP SAMM governance, BSI C3A cloud autonomy, BSI C5 cloud compliance assurance, and audit-ready Spec Kit run evidence | 13 templates, 3 commands | — | [spec-kit-preset-architecture-governance](https://github.com/hindermath/spec-kit-preset-architecture-governance) |
@@ -13,8 +13,9 @@ Spec-Driven Development is a structured process that emphasizes:
13
13
 
14
14
  Spec Kit does not prescribe how teams preserve or mutate `spec.md`, `plan.md`,
15
15
  and `tasks.md` after requirements change. See
16
- [Spec Persistence Models](spec-persistence.md) for three common ways to manage
17
- those artifacts over time.
16
+ [Spec Persistence Models](spec-persistence.md) for the concepts and
17
+ [Evolving Specs in Existing Projects](../guides/evolving-specs.md) for the
18
+ existing-project evolution workflows.
18
19
 
19
20
  ## Development Phases
20
21
 
@@ -7,6 +7,7 @@
7
7
  "toc.yml",
8
8
  "community/*.md",
9
9
  "concepts/*.md",
10
+ "guides/*.md",
10
11
  "reference/*.md",
11
12
  "install/*.md"
12
13
  ]
@@ -78,4 +79,3 @@
78
79
  }
79
80
  }
80
81
  }
81
-
@@ -0,0 +1,90 @@
1
+ # Evolving Specs in Existing Projects
2
+
3
+ Existing projects need two separate maintenance loops:
4
+
5
+ - **Spec Kit project-file updates** refresh managed commands, scripts,
6
+ templates, and shared memory files.
7
+ - **Feature artifact evolution** keeps repository-specific `specs/` artifacts
8
+ aligned with the code and product behavior you intend to ship.
9
+
10
+ Use the [upgrade workflow](../upgrade.md) when you need newer Spec Kit project
11
+ files. Use one of the artifact persistence models below when requirements or
12
+ implementation insights change an existing project.
13
+
14
+ For the conceptual model definitions, see
15
+ [Spec Persistence Models](../concepts/spec-persistence.md).
16
+
17
+ ## Flow-Forward Spec
18
+
19
+ Use flow-forward when each feature directory should remain a historical record.
20
+
21
+ When you add another feature or make a substantial follow-up change, create a
22
+ new feature spec through your installed `/speckit.specify` command and continue
23
+ through the standard flow:
24
+
25
+ 1. Run `/speckit.specify` to create a new feature directory under `specs/`.
26
+ 2. Run `/speckit.plan` to define the implementation approach.
27
+ 3. Run `/speckit.tasks` to derive the work breakdown.
28
+ 4. Run `/speckit.implement` and review the resulting code and artifact diffs.
29
+
30
+ The previous feature directory remains intact for audit, comparison, or
31
+ explaining how the project reached its current state. Use clear feature names or
32
+ cross-links when a new directory supersedes or extends earlier work.
33
+
34
+ ## Living Spec
35
+
36
+ Use living spec when `spec.md` is the contract and `plan.md` and `tasks.md` are
37
+ derived from it.
38
+
39
+ When intended behavior changes, revise the existing `spec.md` first. Then
40
+ regenerate or manually revise downstream artifacts so they match the updated
41
+ spec:
42
+
43
+ 1. Start from a clean working tree or a dedicated branch so every generated
44
+ change is reviewable.
45
+ 2. Update `spec.md` with `/speckit.clarify` or an explicit edit.
46
+ 3. Rerun `/speckit.plan` or revise `plan.md` so the technical approach matches
47
+ the revised spec.
48
+ 4. Rerun `/speckit.tasks` or revise `tasks.md` so implementation work matches
49
+ the revised plan.
50
+ 5. Run `/speckit.analyze` before implementation resumes to catch gaps between
51
+ the spec, plan, and tasks.
52
+ 6. Run `/speckit.implement`, then review the code and artifact diffs together.
53
+
54
+ Preserve important implementation rationale before replacing derived artifacts.
55
+ If a plan or task list contains decisions that still matter, carry them forward
56
+ explicitly.
57
+
58
+ ## Flow-Back Spec
59
+
60
+ Use flow-back when implementation discoveries are allowed to reshape the
61
+ artifact set.
62
+
63
+ In this model, the first useful edit can happen wherever the insight lands:
64
+ `spec.md`, `plan.md`, `tasks.md`, or the implementation. After the change, bring
65
+ the artifact set back into alignment:
66
+
67
+ 1. Capture the discovery in the artifact closest to the work.
68
+ 2. Decide whether it changes intended behavior, implementation strategy, task
69
+ breakdown, or only code.
70
+ 3. Update any other artifacts that now disagree with the accepted direction.
71
+ 4. Run `/speckit.analyze` to check for gaps across `spec.md`, `plan.md`, and
72
+ `tasks.md`.
73
+ 5. Continue implementation only after the artifact set describes the behavior
74
+ and approach you want future contributors to trust.
75
+
76
+ Flow-back is flexible, but it requires discipline. Do not leave a lower-level
77
+ change in `tasks.md` or code if `spec.md` still says something different and the
78
+ spec is meant to remain trustworthy.
79
+
80
+ ## Before Updating Spec Kit Project Files
81
+
82
+ Before refreshing Spec Kit project files with the terminal command
83
+ `specify init --here --force --integration <your-agent>`, protect any
84
+ project-specific material that lives outside `specs/`, especially
85
+ `.specify/memory/constitution.md` and customized files under
86
+ `.specify/templates/` or `.specify/scripts/`. Use `<your-agent>` for the AI
87
+ coding agent integration used by the target project.
88
+
89
+ Your `specs/` directory is not part of the template package, but shared project
90
+ files can be overwritten by a forced refresh.
@@ -127,7 +127,7 @@ Initialize the project's constitution to set ground rules:
127
127
  ### Step 2: Define Requirements with `/speckit.specify`
128
128
 
129
129
  ```text
130
- Develop Taskify, a team productivity platform. It should allow users to create projects, add team members,
130
+ /speckit.specify Develop Taskify, a team productivity platform. It should allow users to create projects, add team members,
131
131
  assign tasks, comment and move tasks between boards in Kanban style. In this initial phase for this feature,
132
132
  let's call it "Create Taskify," let's have multiple users but the users will be declared ahead of time, predefined.
133
133
  I want five users in two different categories, one product manager and four engineers. Let's create three
@@ -51,6 +51,8 @@
51
51
  items:
52
52
  - name: Local Development
53
53
  href: local-development.md
54
+ - name: Evolving Specs
55
+ href: guides/evolving-specs.md
54
56
 
55
57
  # Community
56
58
  - name: Community
@@ -6,11 +6,11 @@
6
6
  "a11y-governance": {
7
7
  "name": "A11Y Governance",
8
8
  "id": "a11y-governance",
9
- "version": "0.3.0",
10
- "description": "Adds accessibility, bilingual DE/EN delivery, CEFR-B2 readability, inclusive-content governance, and didactic inline-code-comment review to Spec Kit.",
9
+ "version": "0.4.0",
10
+ "description": "Adds accessibility (WCAG 2.2 AA), bilingual DE/EN delivery, CEFR-B2 readability, inclusive-content governance, didactic inline-code-comment review, and audit-ready Spec Kit run evidence.",
11
11
  "author": "Thorsten Hindermann",
12
12
  "repository": "https://github.com/hindermath/spec-kit-preset-a11y-governance",
13
- "download_url": "https://github.com/hindermath/spec-kit-preset-a11y-governance/archive/refs/tags/v0.3.0.zip",
13
+ "download_url": "https://github.com/hindermath/spec-kit-preset-a11y-governance/archive/refs/tags/v0.4.0.zip",
14
14
  "homepage": "https://github.com/hindermath/spec-kit-preset-a11y-governance",
15
15
  "documentation": "https://github.com/hindermath/spec-kit-preset-a11y-governance/blob/main/README.md",
16
16
  "license": "MIT",
@@ -26,10 +26,14 @@
26
26
  "accessibility",
27
27
  "bilingual",
28
28
  "wcag",
29
- "inclusion"
29
+ "wcag-2-2",
30
+ "cefr-b2",
31
+ "inclusion",
32
+ "include-everyone",
33
+ "didactic-comments"
30
34
  ],
31
35
  "created_at": "2026-04-27T00:00:00Z",
32
- "updated_at": "2026-06-05T00:00:00Z"
36
+ "updated_at": "2026-06-14T00:00:00Z"
33
37
  },
34
38
  "agent-parity-governance": {
35
39
  "name": "Agent Parity Governance",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "specify-cli"
3
- version = "0.11.0"
3
+ version = "0.11.1"
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"
@@ -2100,6 +2100,16 @@ def _workflow_run_payload(state: Any) -> dict[str, Any]:
2100
2100
  }
2101
2101
 
2102
2102
 
2103
+ def _run_outcome_exit_code(status_value: str) -> int:
2104
+ """Exit code for a finished run/resume: non-zero on terminal failure.
2105
+
2106
+ ``failed`` and ``aborted`` map to 1 so scripts and orchestrators can
2107
+ rely on the process exit code; ``completed`` and ``paused`` map to 0
2108
+ (paused is a legitimate waiting state, not a failure).
2109
+ """
2110
+ return 1 if status_value in ("failed", "aborted") else 0
2111
+
2112
+
2103
2113
  def _emit_workflow_json(payload: dict[str, Any]) -> None:
2104
2114
  """Write a workflow payload as machine-readable JSON to stdout.
2105
2115
 
@@ -2214,7 +2224,7 @@ def workflow_run(
2214
2224
 
2215
2225
  if json_output:
2216
2226
  _emit_workflow_json(_workflow_run_payload(state))
2217
- return
2227
+ raise typer.Exit(_run_outcome_exit_code(state.status.value))
2218
2228
 
2219
2229
  status_colors = {
2220
2230
  "completed": "green",
@@ -2229,6 +2239,8 @@ def workflow_run(
2229
2239
  if state.status.value == "paused":
2230
2240
  console.print(f"\nResume with: [cyan]specify workflow resume {state.run_id}[/cyan]")
2231
2241
 
2242
+ raise typer.Exit(_run_outcome_exit_code(state.status.value))
2243
+
2232
2244
 
2233
2245
  @workflow_app.command("resume")
2234
2246
  def workflow_resume(
@@ -2269,7 +2281,7 @@ def workflow_resume(
2269
2281
 
2270
2282
  if json_output:
2271
2283
  _emit_workflow_json(_workflow_run_payload(state))
2272
- return
2284
+ raise typer.Exit(_run_outcome_exit_code(state.status.value))
2273
2285
 
2274
2286
  status_colors = {
2275
2287
  "completed": "green",
@@ -2280,6 +2292,8 @@ def workflow_resume(
2280
2292
  color = status_colors.get(state.status.value, "white")
2281
2293
  console.print(f"\n[{color}]Status: {state.status.value}[/{color}]")
2282
2294
 
2295
+ raise typer.Exit(_run_outcome_exit_code(state.status.value))
2296
+
2283
2297
 
2284
2298
  @workflow_app.command("status")
2285
2299
  def workflow_status(
@@ -7,6 +7,7 @@ layer, not out of it, to avoid circular imports.
7
7
  """
8
8
  from __future__ import annotations
9
9
 
10
+ import sys
10
11
  from collections.abc import Callable
11
12
 
12
13
  import readchar
@@ -192,7 +193,8 @@ def select_with_arrows(
192
193
 
193
194
  def run_selection_loop():
194
195
  nonlocal selected_key, selected_index
195
- with Live(create_selection_panel(), console=console, transient=True, auto_refresh=False) as live:
196
+ _transient = sys.platform != "win32"
197
+ with Live(create_selection_panel(), console=console, transient=_transient, auto_refresh=False) as live:
196
198
  while True:
197
199
  try:
198
200
  key = get_key()
@@ -8,6 +8,7 @@ import shutil
8
8
  import stat
9
9
  import subprocess
10
10
  import tempfile
11
+ import yaml
11
12
  from pathlib import Path
12
13
  from typing import Any
13
14
  from ._console import console
@@ -16,6 +17,16 @@ CLAUDE_LOCAL_PATH = Path.home() / ".claude" / "local" / "claude"
16
17
  CLAUDE_NPM_LOCAL_PATH = Path.home() / ".claude" / "local" / "node_modules" / ".bin" / "claude"
17
18
 
18
19
 
20
+ def dump_frontmatter(data: dict[str, Any]) -> str:
21
+ """Serialize skill/command frontmatter to a YAML string.
22
+
23
+ Centralizes the dump options used for SKILL.md frontmatter: ``allow_unicode``
24
+ preserves Unicode descriptions and ``sort_keys=False`` keeps key order, so no
25
+ call site can silently drop either.
26
+ """
27
+ return yaml.safe_dump(data, sort_keys=False, allow_unicode=True).strip()
28
+
29
+
19
30
  def run_command(cmd: list[str], check_return: bool = True, capture: bool = False, shell: bool = False) -> str | None:
20
31
  """Run a shell command and optionally capture output."""
21
32
  try:
@@ -381,8 +381,12 @@ def register(app: typer.Typer) -> None:
381
381
  ]:
382
382
  tracker.add(key, label)
383
383
 
384
+ # Disable transient mode on Windows: PowerShell 5.1's legacy console
385
+ # hangs when Rich tries to restore cursor state via VT escape sequences.
386
+ _transient = sys.platform != "win32"
387
+
384
388
  with Live(
385
- tracker.render(), console=console, refresh_per_second=8, transient=True
389
+ tracker.render(), console=console, refresh_per_second=8, transient=_transient
386
390
  ) as live:
387
391
  tracker.attach_refresh(lambda: live.update(tracker.render()))
388
392
  try:
@@ -652,7 +656,8 @@ def register(app: typer.Typer) -> None:
652
656
  finally:
653
657
  pass
654
658
 
655
- console.print(tracker.render())
659
+ if _transient:
660
+ console.print(tracker.render())
656
661
  console.print("\n[bold green]Project ready.[/bold green]")
657
662
 
658
663
  agent_config = AGENT_CONFIG.get(selected_ai)
@@ -28,6 +28,7 @@ from packaging.specifiers import InvalidSpecifier, SpecifierSet
28
28
 
29
29
  from ._init_options import is_ai_skills_enabled
30
30
  from ._invocation_style import is_slash_skills_agent
31
+ from ._utils import dump_frontmatter
31
32
  from .catalogs import CatalogEntry as BaseCatalogEntry
32
33
  from .catalogs import CatalogStackBase
33
34
 
@@ -1073,7 +1074,7 @@ class ExtensionManager:
1073
1074
  and hasattr(integration, "inject_argument_hint")
1074
1075
  ):
1075
1076
  frontmatter_data["argument-hint"] = str(argument_hint)
1076
- frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
1077
+ frontmatter_text = dump_frontmatter(frontmatter_data)
1077
1078
 
1078
1079
  # Derive a human-friendly title from the command name
1079
1080
  short_name = cmd_name
@@ -1337,6 +1338,22 @@ class ExtensionManager:
1337
1338
  # Reject manifests that would shadow core commands or installed extensions.
1338
1339
  self._validate_install_conflicts(manifest)
1339
1340
 
1341
+ # Refuse to install an extension from its own install destination — with
1342
+ # --force this would delete the source before copying it (issue #2990).
1343
+ dest_dir = self.extensions_dir / manifest.id
1344
+ try:
1345
+ same_location = source_dir.resolve(strict=False) == dest_dir.resolve(
1346
+ strict=False
1347
+ )
1348
+ except (OSError, RuntimeError):
1349
+ same_location = source_dir.absolute() == dest_dir.absolute()
1350
+ if same_location:
1351
+ raise ValidationError(
1352
+ f"Source path is the install destination for '{manifest.id}' "
1353
+ f"({dest_dir}). Refusing to proceed to avoid deleting the "
1354
+ f"extension. Install from a copy in a different location instead."
1355
+ )
1356
+
1340
1357
  # Remove existing installation AFTER all validations pass so that a
1341
1358
  # validation failure doesn't leave the user with a half-uninstalled
1342
1359
  # extension (configs stranded in .backup/).
@@ -1355,8 +1372,7 @@ class ExtensionManager:
1355
1372
  backup_config_dir.unlink()
1356
1373
  did_remove = self.remove(manifest.id)
1357
1374
 
1358
- # Install extension
1359
- dest_dir = self.extensions_dir / manifest.id
1375
+ # Install extension (dest_dir computed above during self-install guard)
1360
1376
  if dest_dir.exists():
1361
1377
  shutil.rmtree(dest_dir)
1362
1378
 
@@ -5,10 +5,9 @@ from __future__ import annotations
5
5
  from pathlib import Path
6
6
  from typing import Any
7
7
 
8
- import yaml
9
-
10
8
  from ..base import SkillsIntegration
11
9
  from ..manifest import IntegrationManifest
10
+ from ..._utils import dump_frontmatter
12
11
 
13
12
  # Mapping of command template stem → argument-hint text shown inline
14
13
  # when a user invokes the slash command in Claude Code.
@@ -103,7 +102,7 @@ class ClaudeIntegration(SkillsIntegration):
103
102
  skill_frontmatter = self._build_skill_fm(
104
103
  skill_name, description, f"templates/commands/{template_name}.md"
105
104
  )
106
- frontmatter_text = yaml.safe_dump(skill_frontmatter, sort_keys=False).strip()
105
+ frontmatter_text = dump_frontmatter(skill_frontmatter)
107
106
  return f"---\n{frontmatter_text}\n---\n\n{body.strip()}\n"
108
107
 
109
108
  def _build_skill_fm(self, name: str, description: str, source: str) -> dict:
@@ -30,6 +30,7 @@ from packaging.specifiers import SpecifierSet, InvalidSpecifier
30
30
  from ..extensions import REINSTALL_COMMAND, ExtensionRegistry, normalize_priority
31
31
  from .._init_options import is_ai_skills_enabled
32
32
  from ..integrations.base import IntegrationBase
33
+ from .._utils import dump_frontmatter
33
34
 
34
35
 
35
36
  def _substitute_core_template(
@@ -1068,7 +1069,7 @@ class PresetManager:
1068
1069
  skill_name, desc,
1069
1070
  f"override:{cmd_name}",
1070
1071
  )
1071
- fm_text = yaml.safe_dump(fm_data, sort_keys=False).strip()
1072
+ fm_text = dump_frontmatter(fm_data)
1072
1073
  skill_title = self._skill_title_from_command(cmd_name)
1073
1074
  skill_content = (
1074
1075
  f"---\n{fm_text}\n---\n\n"
@@ -1345,7 +1346,7 @@ class PresetManager:
1345
1346
  enhanced_desc,
1346
1347
  f"preset:{manifest.id}",
1347
1348
  )
1348
- frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
1349
+ frontmatter_text = dump_frontmatter(frontmatter_data)
1349
1350
  skill_content = (
1350
1351
  f"---\n"
1351
1352
  f"{frontmatter_text}\n"
@@ -1441,7 +1442,7 @@ class PresetManager:
1441
1442
  enhanced_desc,
1442
1443
  f"templates/commands/{short_name}.md",
1443
1444
  )
1444
- frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
1445
+ frontmatter_text = dump_frontmatter(frontmatter_data)
1445
1446
  skill_title = self._skill_title_from_command(short_name)
1446
1447
  skill_content = (
1447
1448
  f"---\n"
@@ -1478,7 +1479,7 @@ class PresetManager:
1478
1479
  frontmatter.get("description", f"Extension command: {command_name}"),
1479
1480
  extension_restore["source"],
1480
1481
  )
1481
- frontmatter_text = yaml.safe_dump(frontmatter_data, sort_keys=False).strip()
1482
+ frontmatter_text = dump_frontmatter(frontmatter_data)
1482
1483
  skill_content = (
1483
1484
  f"---\n"
1484
1485
  f"{frontmatter_text}\n"
@@ -3276,7 +3277,7 @@ class PresetResolver:
3276
3277
  if top_fm:
3277
3278
  top_frontmatter_text = (
3278
3279
  "---\n"
3279
- + yaml.safe_dump(top_fm, sort_keys=False).strip()
3280
+ + dump_frontmatter(top_fm)
3280
3281
  + "\n---"
3281
3282
  )
3282
3283
  else:
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import subprocess
6
7
  from typing import Any
7
8
 
@@ -49,6 +50,23 @@ class ShellStep(StepBase):
49
50
  error=f"Shell command exited with code {proc.returncode}.",
50
51
  output=output,
51
52
  )
53
+ if config.get("output_format") == "json":
54
+ # Opt-in structured output: expose the parsed stdout under
55
+ # ``output.data`` so later steps can consume typed values
56
+ # (e.g. a fan-out's ``items:``). A parse failure fails the
57
+ # step — declaring ``output_format: json`` is a contract.
58
+ try:
59
+ output["data"] = json.loads(proc.stdout)
60
+ except json.JSONDecodeError as exc:
61
+ return StepResult(
62
+ status=StepStatus.FAILED,
63
+ error=(
64
+ f"Shell step {config.get('id', '?')!r} declared "
65
+ f"output_format: json but stdout is not valid "
66
+ f"JSON: {exc}"
67
+ ),
68
+ output=output,
69
+ )
52
70
  return StepResult(
53
71
  status=StepStatus.COMPLETED,
54
72
  output=output,
@@ -72,4 +90,10 @@ class ShellStep(StepBase):
72
90
  errors.append(
73
91
  f"Shell step {config.get('id', '?')!r} is missing 'run' field."
74
92
  )
93
+ output_format = config.get("output_format")
94
+ if output_format is not None and output_format != "json":
95
+ errors.append(
96
+ f"Shell step {config.get('id', '?')!r}: 'output_format' must "
97
+ f"be 'json' when present, got {output_format!r}."
98
+ )
75
99
  return errors
@@ -66,6 +66,16 @@ class TestClaudeIntegration:
66
66
  assert parsed["disable-model-invocation"] is False
67
67
  assert parsed["metadata"]["source"] == "templates/commands/plan.md"
68
68
 
69
+ def test_render_skill_unicode(self):
70
+ """Test rendering a skill preserves non-ASCII characters."""
71
+ integration = get_integration("claude")
72
+ rendered = integration._render_skill(
73
+ "constitution",
74
+ {"description": "Prüfe Konformität der Implementierung"},
75
+ "Body",
76
+ )
77
+ assert "Prüfe Konformität" in rendered
78
+
69
79
  def test_setup_upserts_context_section(self, tmp_path):
70
80
  integration = get_integration("claude")
71
81
  manifest = IntegrationManifest("claude", tmp_path)