Skip to content

feat(agents): add Goose AI agent support#2015

Open
furkankoykiran wants to merge 25 commits intogithub:mainfrom
furkankoykiran:add-goose-agent-support
Open

feat(agents): add Goose AI agent support#2015
furkankoykiran wants to merge 25 commits intogithub:mainfrom
furkankoykiran:add-goose-agent-support

Conversation

@furkankoykiran
Copy link
Copy Markdown

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:

  • Uses YAML recipe files stored in .goose/recipes/ directory
  • Slash commands support - recipes can be mapped to slash commands (e.g., /implement)
  • Invocation via goose --instructions <recipe.yaml> or slash commands
  • Recipe schema: version, title, description, instructions, author, extensions, activities, prompt, parameters

Changes

File Change
src/specify_cli/__init__.py Add Goose to AGENT_CONFIG with .goose/recipes directory
src/specify_cli/agents.py Add Goose to CommandRegistrar.AGENT_CONFIGS with YAML format
.github/workflows/scripts/create-release-packages.sh Add goose to ALL_AGENTS and implement YAML recipe generation
.github/workflows/scripts/create-release-packages.ps1 Add goose to AllAgents and implement YAML recipe generation
scripts/bash/update-agent-context.sh Add GOOSE_FILE variable and goose case statement
scripts/powershell/update-agent-context.ps1 Add GOOSE_FILE variable and goose case statement
README.md Add Goose to supported agents table
AGENTS.md Add Goose documentation to current supported agents and CLI-Based Agents sections
tests/test_agent_config_consistency.py Add comprehensive consistency tests for Goose

Testing

  • Tested locally with uv run specify --help
  • Ran existing tests with uv sync && uv run pytest
  • Tested with a sample project (if applicable)

Note: Test execution encountered a json5 import 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

  • I did not use AI assistance for this contribution

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 goose to 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.

Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback. If not applicable, please explain why

@furkankoykiran
Copy link
Copy Markdown
Author

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 \u instead of \u\1, so it wasn't actually capturing the character to uppercase.

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.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 first YAML_EOF terminator (lines following the here-doc). Those lines will be executed as shell commands and will break create-release-packages.sh at runtime. Remove the stray block and keep only a single cat <<YAML_EOF ... YAML_EOF here-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 than prompt: 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 to prompt: |.
        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.

Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback

@furkankoykiran
Copy link
Copy Markdown
Author

I've addressed the Copilot feedback:

  • Replaced the sed \b pattern in create-release-packages.sh with awk (sed \b isn't portable)
  • Switched agents.py to use yaml.safe_dump() for proper escaping in title/description
  • Added @pytest.mark.skip to the GitHub release test—it should be re-enabled once the release script uploads the goose artifacts

Committed and pushed

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback

@furkankoykiran
Copy link
Copy Markdown
Author

@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:

  • YAML generation fixed with proper indentation
  • Title casing switched to portable awk
  • YAML escaping using yaml.safe_dump()
  • Test marked with @pytest.mark.skip
  • Usage header now includes goose

Ready for review when you have a chance!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback

@furkankoykiran
Copy link
Copy Markdown
Author

@mnriem Three things from the latest Copilot round, plus the merge conflict.

Title fallback in render_yaml_command() now chains through cmd_name, then source_id stem, then "Command". Command templates only have description in frontmatter — the title/name lookups were always going to miss.

indented_body is local in the bash script now. Both scripts also replace $ARGUMENTS with arg_format before the YAML body gets built, so Goose recipes don't end up with a literal $ARGUMENTS in them.

Merged upstream; AGENTS.md conflict resolved by keeping both the iFlow and Goose entries.

54 tests pass, 1 skipped (expected).

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot AI review requested due to automatic review settings April 1, 2026 11:48
…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>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
@furkankoykiran
Copy link
Copy Markdown
Author

@mnriem Latest three from Copilot are addressed -- type normalization in YamlIntegration.setup() to match TomlIntegration's pattern, and Forge-style script validation in both the bash and PowerShell wrappers.

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.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 to TomlIntegration) and a new GooseIntegration that emits .yaml recipes into .goose/recipes/.
  • Extends CommandRegistrar to render/register YAML-format commands and updates agent-context update scripts to recognize goose.
  • 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>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 mnriem requested a review from Copilot April 10, 2026 15:10
@furkankoykiran
Copy link
Copy Markdown
Author

@mnriem This one was a good catch from Copilot -- process_template() was only swapping {ARGS} but the shared command templates also use $ARGUMENTS in their User Input blocks. So YAML and TOML output had literal $ARGUMENTS leaking through when it should've been {{args}}.

One-liner fix in process_template() itself, which keeps it a no-op for Markdown/Skills agents (their placeholder is already $ARGUMENTS). Both the YAML and TOML tests now assert the token is gone, not just that {{args}} shows up somewhere.

Full suite green, 1239 passed.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 YamlIntegration base and a GooseIntegration implementation to generate Goose recipe YAML output.
  • Extends CommandRegistrar to support format: "yaml" for command overrides/registration and updates template processing to also replace $ARGUMENTS.
  • Adds/updates integration tests, consistency tests, and documentation/scripts to include goose as 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)." ""
Copy link

Copilot AI Apr 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Suggested change
"""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)."""

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 mnriem self-requested a review April 10, 2026 15:15
Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address Copilot feedback

…test

Signed-off-by: Furkan Köykıran <furkankoykiran@gmail.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 a GooseIntegration implementation 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants