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.
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.gitignore +9 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/CHANGELOG.md +15 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/PKG-INFO +7 -1
- {specify_cli-0.11.0 → specify_cli-0.11.1}/README.md +6 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/presets.md +1 -1
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/concepts/sdd.md +3 -2
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/docfx.json +1 -1
- specify_cli-0.11.1/docs/guides/evolving-specs.md +90 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/quickstart.md +1 -1
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/toc.yml +2 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/catalog.community.json +9 -5
- {specify_cli-0.11.0 → specify_cli-0.11.1}/pyproject.toml +1 -1
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/__init__.py +16 -2
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_console.py +3 -1
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_utils.py +11 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/commands/init.py +7 -2
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/extensions.py +19 -3
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/claude/__init__.py +2 -3
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/presets/__init__.py +6 -5
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/shell/__init__.py +24 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_claude.py +10 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extension_skills.py +61 -5
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extensions.py +50 -0
- specify_cli-0.11.1/tests/test_live_transient_windows.py +90 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_workflow_run_without_project.py +3 -1
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_workflows.py +159 -0
- specify_cli-0.11.0/tests/hooks/.specify/extensions.yml +0 -34
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.devcontainer/devcontainer.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.devcontainer/post-create.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.editorconfig +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.gitattributes +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/CODEOWNERS +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/agent_request.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/extension_submission.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/ISSUE_TEMPLATE/preset_submission.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/aw/actions-lock.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/dependabot.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/skills/add-community-extension/SKILL.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/RELEASE-PROCESS.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-extension.lock.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-extension.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-preset.lock.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/add-community-preset.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/catalog-assign.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/codeql.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/docs.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/lint.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/release-trigger.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/release.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/stale.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.github/workflows/test.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.markdownlint-cli2.jsonc +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/.zenodo.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/AGENTS.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/CITATION.cff +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/CODE_OF_CONDUCT.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/DEVELOPMENT.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/LICENSE +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/SECURITY.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/SUPPORT.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/.gitignore +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/extensions.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/friends.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/overview.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/community/walkthroughs.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/concepts/complex-features.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/concepts/spec-persistence.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/index.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/air-gapped.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/one-time.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/pipx.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/install/uv.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/installation.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/local-development.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/authentication.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/core.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/extensions.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/integrations.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/overview.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/presets.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/reference/workflows.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/template/public/main.css +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/docs/upgrade.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-PUBLISHING-GUIDE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/EXTENSION-USER-GUIDE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/RFC-EXTENSION-SYSTEM.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/agent-context-config.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/commands/speckit.agent-context.update.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/extension.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/scripts/bash/update-agent-context.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/agent-context/scripts/powershell/update-agent-context.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/commands/speckit.bug.assess.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/commands/speckit.bug.fix.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/commands/speckit.bug.test.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/bug/extension.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/catalog.community.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/catalog.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.commit.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.feature.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.initialize.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.remote.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/commands/speckit.git.validate.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/config-template.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/extension.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/git-config.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/create-new-feature-branch.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/git-common.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/create-new-feature-branch.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/selftest/commands/selftest.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/selftest/extension.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/.gitignore +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/CHANGELOG.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/EXAMPLE-README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/LICENSE +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/commands/example.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/config-template.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/extensions/template/extension.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/CONTRIBUTING.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/catalog.community.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/integrations/catalog.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/media/bootstrap-claude-code.gif +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/media/logo_large.webp +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/media/logo_small.webp +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/media/spec-kit-video-header.jpg +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/media/specify_cli.gif +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-April.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-February.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-March.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/newsletters/2026-May.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/PUBLISHING.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/catalog.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.constitution.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.implement.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.plan.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/commands/speckit.tasks.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/lean/preset.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/commands/speckit.myext.myextcmd.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/preset.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/templates/myext-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/scaffold/templates/spec-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/commands/speckit.specify.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/commands/speckit.wrap-test.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/preset.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/agent-file-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/checklist-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/constitution-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/plan-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/spec-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/presets/self-test/templates/tasks-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/check-prerequisites.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/common.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/create-new-feature.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/setup-plan.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/bash/setup-tasks.sh +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/check-prerequisites.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/common.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/create-new-feature.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/setup-plan.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/scripts/powershell/setup-tasks.ps1 +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/spec-driven.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/spec-kit.code-workspace +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_agent_config.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_assets.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_github_http.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_init_options.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_invocation_style.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/_version.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/agents.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/azure_devops.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/base.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/config.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/github.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/authentication/http.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/catalogs.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/commands/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_runtime.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_scaffold.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_state.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integration_status.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_commands.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_helpers.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_install_commands.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_migrate_commands.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_query_commands.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/_scaffold_commands.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/agy/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/amp/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/auggie/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/base.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/bob/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/catalog.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/cline/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/codebuddy/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/codex/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/copilot/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/cursor_agent/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/devin/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/forge/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/gemini/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/generic/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/goose/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/hermes/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/iflow/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/junie/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/kilocode/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/kimi/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/kiro_cli/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/lingma/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/manifest.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/opencode/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/pi/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/qodercli/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/qwen/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/roo/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/rovodev/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/shai/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/tabnine/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/trae/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/vibe/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/windsurf/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/integrations/zed/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/presets/_commands.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/shared_infra.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/base.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/catalog.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/engine.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/expressions.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/command/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/do_while/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/fan_in/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/fan_out/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/gate/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/if_then/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/prompt/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/switch/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/src/specify_cli/workflows/steps/while_loop/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/checklist-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/analyze.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/checklist.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/clarify.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/constitution.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/implement.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/plan.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/specify.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/tasks.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/commands/taskstoissues.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/constitution-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/plan-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/spec-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/tasks-template.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/templates/vscode-settings.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/auth_helpers.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/conftest.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/bug/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/bug/test_bug_extension.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/git/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/git/test_git_extension.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/extensions/test_extension_agent_context.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/TESTING.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/plan.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/spec.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/hooks/tasks.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/http_helpers.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/__init__.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/conftest.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_base.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_cli.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_extra_args.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_agy.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_amp.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_auggie.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_markdown.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_skills.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_toml.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_base_yaml.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_bob.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_catalog.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_cline.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_codebuddy.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_codex.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_copilot.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_cursor_agent.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_devin.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_forge.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_gemini.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_generic.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_goose.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_hermes.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_iflow.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_junie.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_kilocode.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_kimi.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_kiro_cli.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_lingma.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_opencode.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_pi.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_qodercli.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_qwen.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_roo.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_rovodev.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_scaffold.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_shai.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_state.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_subcommand.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_tabnine.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_trae.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_vibe.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_windsurf.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_integration_zed.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_manifest.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/integrations/test_registry.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/self_upgrade_helpers.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_agent_config_consistency.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_authentication.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_branch_numbering.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_check_prerequisites_paths_only.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_check_tool.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_cli_version.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_commands_package.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_console_imports.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extension_registration.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_extension_update_hardening.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_github_http.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_merge.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_presets.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_ps1_encoding.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_registrar_path_traversal.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_detection.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_execution.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_guidance.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_self_upgrade_verification.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_setup_plan_feature_json.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_setup_plan_no_overwrite.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_setup_tasks.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_timestamp_branches.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_upgrade.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_utils_assets_imports.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/tests/test_version_imports.py +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/ARCHITECTURE.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/PUBLISHING.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/README.md +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/catalog.community.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/catalog.json +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/speckit/workflow.yml +0 -0
- {specify_cli-0.11.0 → specify_cli-0.11.1}/workflows/step-catalog.community.json +0 -0
- {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.
|
|
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
|
|
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
|
|
17
|
-
|
|
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
|
|
|
@@ -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
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
"a11y-governance": {
|
|
7
7
|
"name": "A11Y Governance",
|
|
8
8
|
"id": "a11y-governance",
|
|
9
|
-
"version": "0.
|
|
10
|
-
"description": "Adds accessibility, bilingual DE/EN delivery, CEFR-B2 readability, inclusive-content governance,
|
|
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.
|
|
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
|
-
"
|
|
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-
|
|
36
|
+
"updated_at": "2026-06-14T00:00:00Z"
|
|
33
37
|
},
|
|
34
38
|
"agent-parity-governance": {
|
|
35
39
|
"name": "Agent Parity Governance",
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
+
|
|
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)
|