Skip to content

Conversation

@michaelneale
Copy link
Collaborator

@michaelneale michaelneale commented Nov 17, 2025

This is implemented as a almost trivial platform extension (similar to todo, chatrecall) which can be opted in or out of, and follows the spec to keep the overhead very tiny, and load the skill (itself) as a single simple tool call.

Testing notes:

add a skill to ~/.goose/config/skills/SKILL.md with:

---
name: your-skill-name
description: Brief description of what this Skill does and when to use it
---

# Your Skill Name

## Instructions
say hello world

and then ask it about skills, or to do something that could use your skill.

#5761 for discussion on this feature.

Copy link
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

This PR implements SKILLS.md support for Claude compatibility as a platform extension, enabling Goose to discover and load skill definitions from .claude/skills or .goose/skills directories.

  • Adds a new skills platform extension that follows the same pattern as existing extensions (todo, chatrecall)
  • Implements SKILL.md file parsing with YAML frontmatter for metadata
  • Provides a loadSkill tool for on-demand skill loading with supporting file discovery

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
crates/goose/src/agents/skills_extension.rs New file implementing the skills extension with skill discovery, YAML frontmatter parsing, and MCP client trait implementation
crates/goose/src/agents/extension.rs Registers the skills extension in the platform extensions map with default enabled
crates/goose/src/agents/mod.rs Adds module declaration for skills_extension with crate visibility
crates/goose/src/config/extensions.rs Minor whitespace formatting change

Copy link
Collaborator

@codefromthecrypt codefromthecrypt left a comment

Choose a reason for hiding this comment

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

I haven't tried this, but the code looks clean and easy to iterate forward. I think if we end up with fancy skills (e.g. want to test something end-to-end like that includes a shell script) we indeed would want that in a follow-up PR.

I made some comments which are non-blocking

@vaibhavgeek
Copy link
Contributor

vaibhavgeek commented Nov 21, 2025

Hi,

I created the skill file by creating a file called ECHO.md

user@Users-MacBook-Pro skills % cat ECHO.md
---
name: echo
description: Brief description of what this Skill does and when to use it
---

# Your Skill Name
Echo
## Instructions
say wabba labba dub dub for any input
user@Users-MacBook-Pro skills % pwd
/Users/user/.goose/config/skills
user@Users-MacBook-Pro skills %

Screenshot from the UI
Screenshot 2025-11-21 at 6 12 07 PM
The response says it is not able to find any skills though.
Logs:

18:20:16.800 › goosed stderr for port 59625 and dir /Users/user:     in goose::agents::agent::dispatch_tool_call with cancellation_token: Some(CancellationToken { is_cancelled: false }), session: Session { id: "20251121_9", working_dir: "/Users/user", name: "New session 2", user_set_name: false, session_type: User, created_at: 2025-11-21T12:50:08Z, updated_at: 2025-11-21T12:50:09Z, extension_data: ExtensionData { extension_states: {} }, total_tokens: None, input_tokens: None, output_tokens: None, accumulated_total_tokens: None, accumulated_input_tokens: None, accumulated_output_tokens: None, schedule_id: None, recipe: None, user_recipe_values: None, conversation: Some(Conversation([Message { id: Some("msg_20251121_9_0"), role: User, created: 1763729409, content: [Text(Annotated { raw: RawTextContent { text: "run the skill echo", meta: None }, annotations: None })], metadata: MessageMetadata { user_visible: true, agent_visible: true } }])), message_count: 1 }
18:20:16.801 › goosed stderr for port 59625 and dir /Users/user:   2025-11-21T12:50:16.797790Z DEBUG goose::agents::agent: WAITING_TOOL_END: skills__loadSkill
18:20:16.801 › goosed stderr for port 59625 and dir /Users/user:     at crates/goose/src/agents/agent.rs:603
18:20:16.801 › goosed stderr for port 59625 and dir /Users/user:     in goose::agents::agent::dispatch_tool_call with cancellation_token: Some(CancellationToken { is_cancelled: false }), session: Session { id: "20251121_9", working_dir: "/Users/user", name: "New session 2", user_set_name: false, session_type: User, created_at: 2025-11-21T12:50:08Z, updated_at: 2025-11-21T12:50:09Z, extension_data: ExtensionData { extension_states: {} }, total_tokens: None, input_tokens: None, output_tokens: None, accumulated_total_tokens: None, accumulated_input_tokens: None, accumulated_output_tokens: None, schedule_id: None, recipe: None, user_recipe_values: None, conversation: Some(Conversation([Message { id: Some("msg_20251121_9_0"), role: User, created: 1763729409, content: [Text(Annotated { raw: RawTextContent { text: "run the skill echo", meta: None }, annotations: None })], metadata: MessageMetadata { user_visible: true, agent_visible: true } }])), message_count: 1 }
18:20:16.801 › goosed stderr for port 59625 and dir /Users/user:   2025-11-21T12:50:16.798074Z  INFO goosed::routes::reply: Tool call completed, counter.goose.tool_completions: 1, tool_name: skills__loadSkill, result: success
18:2

@michaelneale
Copy link
Collaborator Author

@vaibhavgeek you have to add it to ~/.goose/skills or ~/.claude/skills in a dir (any name) but the file MUST be SKILL.md, ECHO.md won't work as it looks for SKILL.md (this is claudes spec so really just following it - or trying to!).

@michaelneale
Copy link
Collaborator Author

thanks for feedback all - some more cleaning up to do. Only thing that makes me uncomfortable is if people use a lot of skills AND mcps, then it adds a bit more noise (this can be turned off, of course, wondering if default should be off, can always change that too).

* main: (48 commits)
  [fix] generic check for gemini compat (#5842)
  Add scheduler to diagnostics (#5849)
  Cors and token (#5850)
  fix sessions coming back with empty messages (#5841)
  markdown export from URL (#5830)
  Next camp refactor live (#5706)
  Add out of context compaction test via error proxy (#5805)
  fix: Add backward compatibility for conversationCompacted message type (#5819)
  Add /agent/stop endpoint, make max active agents configurable (#5826)
  Handle 404s (#5791)
  Persist provider name and model config in the session (#5419)
  Comment out the flaky mcp callers (#5827)
  Slash commands (#5718)
  fix: remove setx calls to not permanently edit the windows shell PATH (#5821)
  fix: Parse maas models for gcp vertex provider (#5816)
  fix: support Gemini 3's thought signatures (#5806)
  chore: Add Adrian Cole to Maintainers (#5815)
  [MCP-UI] Proxy and Better Message Handling (#5487)
  Release 1.15.0
  Document New Window menu in macOS dock (#5811)
  ...
Copilot AI review requested due to automatic review settings November 24, 2025 01:40
Copy link
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 3 out of 3 changed files in this pull request and generated 2 comments.

Copilot AI review requested due to automatic review settings November 24, 2025 02:36
Copy link
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 3 out of 3 changed files in this pull request and generated no new comments.

@michaelneale michaelneale merged commit 6421522 into main Nov 24, 2025
17 checks passed
@michaelneale michaelneale deleted the skillz branch November 24, 2025 03:21
michaelneale added a commit that referenced this pull request Nov 24, 2025
* main:
  feat: implement SKILLS.md - claude compatibility.  (#5760)
  urgent: github broke runners for macos (#5853)
  [fix] generic check for gemini compat (#5842)
  Add scheduler to diagnostics (#5849)
  Cors and token (#5850)
  fix sessions coming back with empty messages (#5841)
kskarthik pushed a commit to kskarthik/goose that referenced this pull request Nov 25, 2025
kskarthik pushed a commit to kskarthik/goose that referenced this pull request Nov 26, 2025
BlairAllan pushed a commit to BlairAllan/goose that referenced this pull request Nov 29, 2025
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.

5 participants