docs: standardize on ~/.agents/skills/ as canonical skill path (#8239)
Some checks are pending
Canary / Prepare Version (push) Waiting to run
Canary / build-cli (push) Blocked by required conditions
Canary / Upload Install Script (push) Blocked by required conditions
Canary / bundle-desktop (push) Blocked by required conditions
Canary / bundle-desktop-intel (push) Blocked by required conditions
Canary / bundle-desktop-linux (push) Blocked by required conditions
Canary / bundle-desktop-windows (push) Blocked by required conditions
Canary / Release (push) Blocked by required conditions
Unused Dependencies / machete (push) Waiting to run
CI / changes (push) Waiting to run
CI / Check Rust Code Format (push) Blocked by required conditions
CI / Build and Test Rust Project (push) Blocked by required conditions
CI / Build Rust Project on Windows (push) Waiting to run
CI / Lint Rust Code (push) Blocked by required conditions
CI / Check OpenAPI Schema is Up-to-Date (push) Blocked by required conditions
CI / Test and Lint Electron Desktop App (push) Blocked by required conditions
Deploy Documentation / deploy (push) Waiting to run
Live Provider Tests / Smoke Tests (Code Execution) (push) Blocked by required conditions
Live Provider Tests / check-fork (push) Waiting to run
Live Provider Tests / changes (push) Blocked by required conditions
Live Provider Tests / Build Binary (push) Blocked by required conditions
Live Provider Tests / Smoke Tests (push) Blocked by required conditions
Live Provider Tests / Compaction Tests (push) Blocked by required conditions
Live Provider Tests / goose server HTTP integration tests (push) Blocked by required conditions
Publish Ask AI Bot Docker Image / docker (push) Waiting to run
Publish Docker Image / docker (push) Waiting to run
Publish to npm / Generate ACP Schema (push) Waiting to run
Publish to npm / Build goose CLI (darwin-arm64) (push) Waiting to run
Publish to npm / Build goose CLI (darwin-x64) (push) Waiting to run
Publish to npm / Build goose CLI (linux-arm64) (push) Waiting to run
Publish to npm / Build goose CLI (linux-x64) (push) Waiting to run
Publish to npm / Release to npm (push) Blocked by required conditions
Scorecard supply-chain security / Scorecard analysis (push) Waiting to run

Signed-off-by: Bradley Axen <baxen@squareup.com>
This commit is contained in:
Bradley Axen 2026-04-01 09:11:43 -07:00 committed by GitHub
parent 496d6d728f
commit 277b61c410
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 37 additions and 20 deletions

View file

@ -154,11 +154,8 @@ impl Agent {
if skills.is_empty() {
output.push_str("No skills installed.\n\n");
output.push_str("Skills are loaded from SKILL.md files in:\n");
output.push_str(" - ~/.claude/skills/\n");
output.push_str(" - ~/.config/agents/skills/\n");
output.push_str(" - .goose/skills/ (in current directory)\n");
output.push_str(" - .claude/skills/ (in current directory)\n");
output.push_str(" - .agents/skills/ (in current directory)\n");
output.push_str(" - ~/.agents/skills/ (global)\n");
output.push_str(" - .agents/skills/ (in current project)\n");
} else {
output.push_str(&format!("**Installed skills ({}):**\n\n", skills.len()));
for skill in &skills {

View file

@ -410,6 +410,7 @@ fn discover_filesystem_sources(working_dir: &Path) -> Vec<Source> {
let local_recipe_dirs: Vec<PathBuf> = vec![
working_dir.to_path_buf(),
working_dir.join(".goose/recipes"),
working_dir.join(".agents/recipes"),
];
let global_recipe_dirs: Vec<PathBuf> = std::env::var("GOOSE_RECIPE_PATH")
@ -419,7 +420,14 @@ fn discover_filesystem_sources(working_dir: &Path) -> Vec<Source> {
let sep = if cfg!(windows) { ';' } else { ':' };
p.split(sep).map(PathBuf::from).collect::<Vec<_>>()
})
.chain([config.join("recipes")])
.chain(
[
Some(config.join("recipes")),
home.as_ref().map(|h| h.join(".agents/recipes")),
]
.into_iter()
.flatten(),
)
.collect();
let local_skill_dirs: Vec<PathBuf> = vec![
@ -429,6 +437,7 @@ fn discover_filesystem_sources(working_dir: &Path) -> Vec<Source> {
];
let global_skill_dirs: Vec<PathBuf> = [
home.as_ref().map(|h| h.join(".agents/skills")),
Some(config.join("skills")),
home.as_ref().map(|h| h.join(".claude/skills")),
home.as_ref().map(|h| h.join(".config/agents/skills")),
@ -440,9 +449,11 @@ fn discover_filesystem_sources(working_dir: &Path) -> Vec<Source> {
let local_agent_dirs: Vec<PathBuf> = vec![
working_dir.join(".goose/agents"),
working_dir.join(".claude/agents"),
working_dir.join(".agents/agents"),
];
let global_agent_dirs: Vec<PathBuf> = [
home.as_ref().map(|h| h.join(".agents/agents")),
Some(config.join("agents")),
home.as_ref().map(|h| h.join(".claude/agents")),
]
@ -1108,8 +1119,8 @@ impl SummonClient {
"No sources available for load/delegate.\n\n\
Sources are discovered from:\n\
Current recipe's sub_recipes\n\
.goose/recipes/, .goose/skills/, .goose/agents/\n\
~/.config/goose/recipes/, skills/, agents/\n\
.agents/skills/, .agents/recipes/, .agents/agents/ (project-level)\n\
~/.agents/skills/, ~/.agents/agents/ (global)\n\
GOOSE_RECIPE_PATH directories\n\
Builtin skills",
)]);

View file

@ -28,6 +28,14 @@ fn local_recipe_dirs() -> Vec<PathBuf> {
local_dirs.push(get_recipe_library_dir(true));
local_dirs.push(get_recipe_library_dir(false));
// Also scan .agents/recipes/ for consistency with the .agents/ convention
if let Ok(cwd) = env::current_dir() {
local_dirs.push(cwd.join(".agents/recipes"));
}
if let Some(home) = dirs::home_dir() {
local_dirs.push(home.join(".agents/recipes"));
}
let mut dirs: Vec<PathBuf> = local_dirs
.into_iter()
.map(|dir| dir.canonicalize().unwrap_or(dir))

View file

@ -25,16 +25,17 @@ goose skills are compatible with Claude Desktop and other [agents that support A
## Skill Locations
Skills can be stored globally and/or per-project. goose checks all of these directories in order and combines what it finds. If the same skill name exists in multiple directories, later directories take priority:
Skills can be stored globally or per-project:
1. `~/.claude/skills/` — Global, shared with Claude Desktop
2. `~/.config/agents/skills/` — Global, portable across AI coding agents
3. `~/.config/goose/skills/` — Global, goose-specific
4. `./.claude/skills/` — Project-level, shared with Claude Desktop
5. `./.goose/skills/` — Project-level, goose-specific
6. `./.agents/skills/` — Project-level, portable across AI coding agents
1. `~/.agents/skills/` — Global skills, available in all sessions
2. `.agents/skills/` — Project-level skills, scoped to the current project
Use global skills for workflows you use across projects. Use project-level skills for procedures unique to a codebase.
Place a `SKILL.md` file inside a named subdirectory. For example, a global skill called
`code-review` goes in `~/.agents/skills/code-review/SKILL.md`.
> **Backward compatibility:** goose also discovers skills from `.goose/skills/`,
> `.claude/skills/`, `~/.claude/skills/`, and platform-specific config directories,
> but `agents/skills/` is the recommended standard.
## Creating a Skill
@ -45,7 +46,7 @@ Create a skill when you have a repeatable workflow that involves multiple steps,
Each skill lives in its own directory with a `SKILL.md` file:
```
~/.config/agents/skills/
~/.agents/skills/
└── code-review/
└── SKILL.md
```
@ -88,7 +89,7 @@ When reviewing code, check each of these areas:
Skills can include supporting files like scripts, templates, or configuration files. Place them in the skill directory:
```
~/.config/agents/skills/
~/.agents/skills/
└── api-setup/
├── SKILL.md
├── setup.sh

View file

@ -14,7 +14,7 @@ This extension has been deprecated and is only available in v1.16.0 - v1.24.0. F
The Skills extension loads *skills* &mdash; reusable sets of instructions that teach goose how to perform specific tasks or follow particular workflows.
goose automatically discovers skills at startup and uses them when relevant to your request. goose loads skills from `.agents/skills/` in your project directory and `~/.config/agents/skills/` globally, making skills portable across different AI coding agents. To learn about creating skills and how goose uses them, see [Using Skills](/docs/guides/context-engineering/using-skills).
goose automatically discovers skills at startup and uses them when relevant to your request. goose loads skills from `.agents/skills/` in your project directory and `~/.agents/skills/` globally, making skills portable across different AI coding agents. To learn about creating skills and how goose uses them, see [Using Skills](/docs/guides/context-engineering/using-skills).
## Configuration
@ -52,7 +52,7 @@ goose automatically discovers skills at startup and uses them when relevant to y
## Example Usage
Let's say you have a skill that goose discovers on startup in `~/.config/agents/skills/deploy/SKILL.md`:
Let's say you have a skill that goose discovers on startup in `~/.agents/skills/deploy/SKILL.md`:
```markdown
---