docs(skill): customize-opencode table omits project-level .claude/skills and .agents/skills auto-discovery
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 88/100
- Issue type
- Documentation
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- typescript
- Domain
- documentation
Research direction
Start with the customize-opencode built-in skill and its “Where files live” table, then review the discoverSkills entry point described in the issue. Document project-level .claude/skills and .agents/skills auto-discovery, the applicable disable flags, and that skills.paths is for non-default locations. Done means the table and Skills section no longer imply these project paths require manual registration.
Written by the indexing model from the issue text.
Description
Problem
The customize-opencode built-in skill's "Where files live" table states:
| Scope | Path |
|---|---|
| External skills (auto-loaded) | ~/.claude/skills/<name>/SKILL.md, ~/.agents/skills/<name>/SKILL.md |
This reads as if .claude/skills and .agents/skills are picked up only from the home directory. Agents following this guidance conclude that a project-level .agents/skills/ (or .claude/skills/) is not scanned unless it is registered manually via skills.paths in opencode.json — which is wrong.
What the code actually does
In the skill loader (discoverSkills), the external directories are scanned at both scopes:
const CLAUDE_EXTERNAL_DIR = ".claude"
const AGENTS_EXTERNAL_DIR = ".agents"
const EXTERNAL_SKILL_PATTERN = "skills/**/SKILL.md"
// 1) global: ~/.claude/skills/**/SKILL.md and ~/.agents/skills/**/SKILL.md
for (const dir of externalDirs) {
const root = path.join(global.home, dir)
// ...
yield* scan(state, root, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "global" })
}
// 2) project: walk up from cwd to the worktree root, scanning
// <dir>/.claude/skills/**/SKILL.md and <dir>/.agents/skills/**/SKILL.md
const upDirs = yield* fsys.up({ targets: externalDirs, start: directory, stop: worktree })
for (const root of upDirs) {
yield* scan(state, root, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "project" })
}
FileSystem.up walks from the current directory up to the worktree root and collects every existing .claude / .agents directory along the way, so project-level .agents/skills/ and .claude/skills/ are auto-discovered with no config needed (verified on v1.18.15). Both scopes are gated by OPENCODE_DISABLE_EXTERNAL_SKILLS=1, and the .claude part additionally by OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1.
Why it matters
The vendor-neutral .agents/skills/ convention is shared across multiple agent tools (Claude Code, Codex, etc.). Users who want a single cross-tool skills folder per project currently get steered toward .opencode/skills/ + a manual skills.paths entry, duplicating configuration for no reason.
Suggested fix
Add a row to the table (and mention the disable flags apply to both scopes), e.g.:
| Scope | Path |
|---|---|
| Project external skills (auto-loaded) | .claude/skills/<name>/SKILL.md, .agents/skills/<name>/SKILL.md (discovered by walking up from the cwd to the worktree root) |
Optionally clarify in the "Skills" section that skills.paths is only needed for non-default locations, not for project-level .agents/skills / .claude/skills.
- Dominant language
- TypeScript
- Stars
- 209k
- Forks
- 27.5k
- Avg merge
- 7h 20m
- Merged PRs (30d)
- 358
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from anomalyco/opencode
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
[FEATURE]: Bump gitlab-ai-provider to 6.15.1 on v2 (Fable 5.1, GPT-6 Astra, workflow reconnect fix) Open
Difficulty 1/5 Under an hour Newbie friendliness 90/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
-
Difficulty 1/5 Under an hour Newbie friendliness 88/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
All issues in anomalyco/opencode
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Eynzof/Hermes-CN-Desktop#610 ·
-
bug clawsweeper:linked-pr-open clawsweeper:needs-live-repro clawsweeper:no-new-fix-pr impact:message-loss issue-rating: 🐚 platinum hermit P2 regression
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
calcite-components needs triage refactor
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Esri/calcite-design-system#15203 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 78/100
fullcalendar/fullcalendar#8106 ·