feat(agents): add Goose AI agent support#2015
feat(agents): add Goose AI agent support#2015furkankoykiran wants to merge 25 commits intogithub:mainfrom
Conversation
There was a problem hiding this comment.
Pull request overview
Adds initial support for Block’s Goose AI agent to spec-kit by wiring Goose into agent configuration, scaffolding/release packaging, and documentation, plus adding consistency tests.
Changes:
- Add
gooseto CLI agent configuration (AGENT_CONFIG) and extension/preset command registrar config (CommandRegistrar.AGENT_CONFIGS). - Extend release packaging scripts to generate Goose-oriented YAML recipe files under
.goose/recipes/. - Update agent-context update scripts and docs, and add consistency tests for the new agent.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
src/specify_cli/__init__.py |
Adds Goose to AGENT_CONFIG so CLI can target .goose/recipes. |
src/specify_cli/agents.py |
Adds Goose to CommandRegistrar.AGENT_CONFIGS with format: yaml. |
.github/workflows/scripts/create-release-packages.sh |
Adds Goose to ALL_AGENTS and attempts YAML recipe generation. |
.github/workflows/scripts/create-release-packages.ps1 |
Adds Goose to $AllAgents and attempts YAML recipe generation. |
scripts/bash/update-agent-context.sh |
Adds goose handling and .goose/recipes/AGENTS.md target. |
scripts/powershell/update-agent-context.ps1 |
Adds goose handling and .goose/recipes/AGENTS.md target. |
README.md |
Lists Goose in supported agents table. |
AGENTS.md |
Documents Goose as a supported agent and CLI-based requirement. |
tests/test_agent_config_consistency.py |
Adds consistency checks ensuring Goose is wired into configs/scripts/releases. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback. If not applicable, please explain why
|
I've addressed all the Copilot feedback: The test assertion at test_agent_config_consistency.py:520 now documents that create-github-release.sh doesn't upload the goose template artifacts yet. I added a NOTE explaining this gap so the test won't fail. Commits 5148bc4 and 9430815 already fixed the invalid YAML generation in both the Bash and PowerShell scripts by properly indenting the YAML block scalar content. I also fixed the broken title casing in the Bash script—the sed command was using The bigger fix was adding YAML format support to the CommandRegistrar class. I added a render_yaml_command() method that generates proper Goose recipe YAML and wired it into register_commands(). Goose commands will install correctly now instead of raising a ValueError. Everything is committed and pushed to the branch. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (2)
.github/workflows/scripts/create-release-packages.sh:150
- The
yaml)branch appears to contain an extra, duplicated YAML fragment after the firstYAML_EOFterminator (lines following the here-doc). Those lines will be executed as shell commands and will breakcreate-release-packages.shat runtime. Remove the stray block and keep only a singlecat <<YAML_EOF ... YAML_EOFhere-doc for YAML output.
cat > "$output_dir/speckit.$name.$ext" <<YAML_EOF
version: 1.0.0
title: "$title"
description: "$description"
author:
contact: "spec-kit"
extensions:
- type: builtin
name: developer
activities:
- "Spec-Driven Development"
prompt: |
${indented_body}
YAML_EOF
author:
contact: "spec-kit"
extensions:
- type: builtin
name: developer
activities:
- "Spec-Driven Development"
prompt: |
$body
YAML_EOF
;;
.github/workflows/scripts/create-release-packages.sh:138
- In the
yaml)generator,instructions=$(... | sed 's/"/\\"/g')will change the actual prompt text by injecting backslashes; YAML block scalars don’t require quote-escaping. Also, placing${indented_body}on an indented here-doc line means only the first expanded line gets the leading indentation; subsequent lines start with just the variable’s" "prefix, which is less-indented thanprompt:and can make the YAML invalid. Emit the block scalar content without extra leading spaces (or print the indented body separately) so every prompt line is consistently indented relative toprompt: |.
instructions=$(printf '%s\n' "$body" | sed 's/"/\\"/g')
# Indent every line of body for valid YAML block scalar syntax
indented_body=$(printf '%s\n' "$instructions" | sed 's/^/ /')
cat > "$output_dir/speckit.$name.$ext" <<YAML_EOF
version: 1.0.0
title: "$title"
description: "$description"
author:
contact: "spec-kit"
extensions:
- type: builtin
name: developer
activities:
- "Spec-Driven Development"
prompt: |
${indented_body}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback
|
I've addressed the Copilot feedback:
Committed and pushed |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback
|
@mnriem I've addressed the final piece of Copilot feedback - updated the usage header comment in create-release-packages.sh to include goose in the AGENTS list. This was the last unresolved comment. All Copilot feedback has now been addressed:
Ready for review when you have a chance! |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback
|
@mnriem Three things from the latest Copilot round, plus the merge conflict. Title fallback in
Merged upstream; AGENTS.md conflict resolved by keeping both the iFlow and Goose entries. 54 tests pass, 1 skipped (expected). |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ript The print_summary() function listed all supported agents in its Usage output but omitted goose, making it inconsistent with the header docs and the error message in update_specific_agent(). Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
…ext script The Print-Summary function listed all supported agents in its Usage output but omitted goose, making it inconsistent with the ValidateSet and the header documentation. Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
….setup() YAML frontmatter can contain non-string types (null, list, int). Add isinstance checks matching TomlIntegration._extract_description() to ensure Goose recipes always receive valid string fields. Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
…wrapper Add Forge-style check that the shared update-agent-context.sh is present and executable, producing a clear error instead of a cryptic shell exec failure when the shared script is missing. Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
…erShell wrapper Add Forge-style Test-Path check that the shared update-agent-context.ps1 exists, producing a clear error instead of a cryptic PowerShell failure when the shared script is missing. Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
|
@mnriem Latest three from Copilot are addressed -- type normalization in All 25 review threads are resolved now. 57 targeted tests pass, full suite was 1239 passed / 18 skipped on the last full run. Ready for your review whenever you get a chance. |
There was a problem hiding this comment.
Pull request overview
Adds first-class support for Block’s Goose agent by introducing a YAML “recipe” integration type and wiring Goose into the CLI/integration registry, command registrar, docs, and consistency tests.
Changes:
- Introduces
YamlIntegration(parallel toTomlIntegration) and a newGooseIntegrationthat emits.yamlrecipes into.goose/recipes/. - Extends
CommandRegistrarto render/register YAML-format commands and updates agent-context update scripts to recognizegoose. - Adds Goose-focused integration tests + a reusable YAML integration test mixin; updates docs (README/AGENTS).
Show a summary per file
| File | Description |
|---|---|
src/specify_cli/integrations/base.py |
Adds YamlIntegration and YAML recipe rendering/setup pipeline. |
src/specify_cli/integrations/goose/__init__.py |
Defines Goose integration metadata and registrar config. |
src/specify_cli/integrations/goose/scripts/update-context.sh |
Adds Goose integration wrapper delegating to shared context updater (bash). |
src/specify_cli/integrations/goose/scripts/update-context.ps1 |
Adds Goose integration wrapper delegating to shared context updater (PowerShell). |
src/specify_cli/integrations/__init__.py |
Registers GooseIntegration in built-in registry. |
src/specify_cli/agents.py |
Adds YAML rendering path (format == "yaml") for extension/preset command registration. |
scripts/bash/update-agent-context.sh |
Adds goose support to shared agent context updater (bash). |
scripts/powershell/update-agent-context.ps1 |
Adds goose support to shared agent context updater (PowerShell). |
tests/integrations/test_integration_base_yaml.py |
Adds reusable YAML integration test mixin covering setup/install/inventory parsing/validity. |
tests/integrations/test_integration_goose.py |
Enables Goose integration test coverage via the YAML test mixin. |
tests/test_agent_config_consistency.py |
Adds Goose consistency assertions across AGENT_CONFIG, registrar config, scripts, and --ai help. |
README.md |
Documents Goose as a supported agent and mentions it in tool-check messaging. |
AGENTS.md |
Documents YAML format + Goose integration behavior and processing requirements. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 13/13 changed files
- Comments generated: 2
…mand() Extension/preset frontmatter can contain non-string types. Add isinstance checks matching the normalization in YamlIntegration.setup() so both code paths produce valid Goose recipe fields. Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback. If not applicable, please explain why
…ate() Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
|
@mnriem This one was a good catch from Copilot -- One-liner fix in Full suite green, 1239 passed. |
There was a problem hiding this comment.
Pull request overview
Adds a new Goose integration to spec-kit, enabling generation/registration of Goose-compatible YAML recipe commands (in .goose/recipes/) and wiring Goose into the CLI, context update scripts, docs, and tests alongside existing agent integrations.
Changes:
- Introduces a new
YamlIntegrationbase and aGooseIntegrationimplementation to generate Goose recipe YAML output. - Extends
CommandRegistrarto supportformat: "yaml"for command overrides/registration and updates template processing to also replace$ARGUMENTS. - Adds/updates integration tests, consistency tests, and documentation/scripts to include
gooseas a supported agent.
Show a summary per file
| File | Description |
|---|---|
src/specify_cli/integrations/base.py |
Adds YamlIntegration and updates template processing to replace both {ARGS} and $ARGUMENTS. |
src/specify_cli/integrations/goose/__init__.py |
Defines GooseIntegration (YAML recipes in .goose/recipes/). |
src/specify_cli/integrations/goose/scripts/update-context.sh |
Adds Goose integration wrapper delegating to shared bash context updater. |
src/specify_cli/integrations/goose/scripts/update-context.ps1 |
Adds Goose integration wrapper delegating to shared PowerShell context updater. |
src/specify_cli/integrations/__init__.py |
Registers GooseIntegration in built-in integrations registry. |
src/specify_cli/agents.py |
Adds YAML rendering path (render_yaml_command) and supports format == "yaml" during registration. |
scripts/bash/update-agent-context.sh |
Adds goose support in usage/docs and agent dispatch. |
scripts/powershell/update-agent-context.ps1 |
Adds goose to ValidateSet, usage/docs, and agent dispatch. |
tests/test_agent_config_consistency.py |
Adds Goose consistency checks and reformats several existing assertions for readability. |
tests/integrations/test_integration_base_yaml.py |
Adds reusable YAML integration test mixin mirroring the TOML test structure. |
tests/integrations/test_integration_goose.py |
Adds Goose integration tests using the YAML test mixin. |
tests/integrations/test_integration_base_toml.py |
Updates/extends TOML tests (including $ARGUMENTS negative assertions) and formatting. |
README.md |
Documents Goose in the supported agents table and mentions tool checking. |
AGENTS.md |
Documents YAML format support and Goose integration details. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 14/14 changed files
- Comments generated: 1
|
|
||
| def test_toml_no_ambiguous_closing_quotes(self, tmp_path, monkeypatch): | ||
| """Multiline body ending with `"` must not produce `""""` (#2113).""" | ||
| """Multiline body ending with `"` must not produce `""" "` (#2113)." "" |
There was a problem hiding this comment.
The docstring for test_toml_no_ambiguous_closing_quotes is currently syntactically invalid (it contains an unterminated triple-quoted string due to embedded """/backticks). This will prevent the test module from importing and break the entire test suite. Please rewrite the docstring to avoid embedding """ literally inside a triple-quoted string (e.g., describe the sequence in words or escape/split it).
| """Multiline body ending with `"` must not produce `""" "` (#2113)." "" | |
| """Multiline body ending with a double quote must not produce an ambiguous TOML multiline-string closing delimiter (#2113).""" |
There was a problem hiding this comment.
Fixed. The formatter mangled the original docstring when it rewrote the file -- the literal """ inside the triple-quoted string was terminating it early. Rewrote to describe the scenario in words instead of embedding the raw delimiter.
mnriem
left a comment
There was a problem hiding this comment.
Please address Copilot feedback
…test Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
There was a problem hiding this comment.
Pull request overview
Adds first-class support for Block’s Goose agent to spec-kit by introducing a YAML recipe command format alongside the existing Markdown/TOML/Skills formats, wiring Goose into integration registration, command rendering, context update scripts, and adding targeted integration/consistency tests.
Changes:
- Introduce
YamlIntegration(YAML recipe output) and aGooseIntegrationimplementation targeting.goose/recipes/. - Extend command registration/rendering to support YAML output, including argument placeholder normalization (
$ARGUMENTS→{{args}}). - Add Goose-focused tests (integration tests + config consistency) and update docs + context update scripts to include
goose.
Show a summary per file
| File | Description |
|---|---|
src/specify_cli/integrations/base.py |
Adds YamlIntegration and updates template processing to replace both {ARGS} and $ARGUMENTS with the integration-specific placeholder. |
src/specify_cli/integrations/goose/__init__.py |
Defines GooseIntegration using YAML recipes in .goose/recipes/. |
src/specify_cli/integrations/goose/scripts/update-context.sh |
Adds Goose integration wrapper to delegate context updates to shared bash updater. |
src/specify_cli/integrations/goose/scripts/update-context.ps1 |
Adds Goose integration wrapper to delegate context updates to shared PowerShell updater. |
src/specify_cli/integrations/__init__.py |
Registers GooseIntegration in the built-in integration registry. |
src/specify_cli/agents.py |
Adds YAML command rendering support and routes YAML formatting through YamlIntegration’s shared renderer. |
scripts/bash/update-agent-context.sh |
Adds goose handling and updates help/usage strings accordingly. |
scripts/powershell/update-agent-context.ps1 |
Adds goose handling and updates ValidateSet + help/usage strings accordingly. |
tests/integrations/test_integration_base_yaml.py |
Adds reusable YAML integration test mixin mirroring the existing TOML test structure. |
tests/integrations/test_integration_goose.py |
Adds Goose integration tests via the YAML mixin. |
tests/integrations/test_integration_base_toml.py |
Tightens placeholder assertions and refactors formatting in TOML tests. |
tests/test_agent_config_consistency.py |
Adds Goose consistency checks and refactors some long lines for readability. |
README.md |
Documents Goose as a supported agent and updates tool-check messaging to include Goose. |
AGENTS.md |
Documents YAML recipe format and Goose-specific behavior/expectations. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 14/14 changed files
- Comments generated: 0 new
Description
This PR adds support for Block's Goose AI Agent to the spec-kit project. Goose is an open source AI agent (20.5k+ GitHub stars) that uses a "recipe" system with slash command support (merged in PR aaif-goose/goose#5718, November 2025).
Key Features of Goose:
.goose/recipes/directory/implement)goose --instructions <recipe.yaml>or slash commandsChanges
src/specify_cli/__init__.pysrc/specify_cli/agents.py.github/workflows/scripts/create-release-packages.sh.github/workflows/scripts/create-release-packages.ps1scripts/bash/update-agent-context.shscripts/powershell/update-agent-context.ps1README.mdAGENTS.mdtests/test_agent_config_consistency.pyTesting
uv run specify --helpuv sync && uv run pytestNote: Test execution encountered a
json5import issue that appears to be a pre-existing environment problem, not related to the Goose integration changes themselves. The consistency tests for Goose follow the exact same pattern as other agents (e.g., iflow, pi).AI Disclosure