[FEATURE] Native SKILL.local.md overlay — append local/private instructions onto a shared SKILL.md
Preflight
- [x] Searched existing issues. This is related but distinct from prior requests (see "Relation to existing issues" below) — it asks for an overlay/append onto an existing shared SKILL.md, not a separate private-skills directory.
- [x] Single feature request.
Problem
Claude Code has a consistent "shared + local override" pattern everywhere except skills:
| Shared (tracked) | Local (gitignored) |
|-------------------------|--------------------------------|
| CLAUDE.md | CLAUDE.local.md |
| .claude/settings.json | .claude/settings.local.json |
| .claude/skills/<n>/SKILL.md | — nothing — |
Teams commit a shared .claude/skills/<name>/SKILL.md. Individual developers need private, local-only additions to that same skill — local paths, machine-specific tool commands, personal preferences — without editing the shared file, copying the whole skill, or generating SKILL.md with a preprocessor.
settings.local.json skillOverrides only toggles off/collapsed state; it cannot add content. CLAUDE.local.md adds instructions but not scoped to a skill and not surfaced when the skill is invoked.
Empirical current behavior (repro)
- Create
.claude/skills/local-test/SKILL.md(prints "loaded SKILL.md"). - Add a sibling
.claude/skills/local-test/SKILL.local.md(prints "loaded local"). - Invoke
/local-testin a fresh session.
Result: SKILL.md loads; SKILL.local.md is silently ignored — no merge, no shadow, no warning. (CLI v2.x, confirmed.)
Proposed behavior
- If
.claude/skills/<name>/SKILL.local.mdexists, load it after SKILL.md and treat its content as appended local/private context for that skill. - Optional and gitignorable; absence is a no-op.
- Project-local overlay applies before user/plugin-installed skill fallbacks.
- Consistent across CLI and claude.ai/code web/mobile where project skills are supported.
Precedence
- Shared
SKILL.md - Adjacent
SKILL.local.mdappended as local/private overlay settings.local.jsonskillOverridesstill governs off/collapsed state
Why overlay (vs. a separate skills-local/ dir, as in #41967/#31155/#45094)
Those propose whole private skills. This is the missing complementary case: augmenting a shared skill in place — same mental model as CLAUDE.md → CLAUDE.local.md — so teams distribute one skill while each dev customizes locally.
Workaround today
A SessionStart/PreToolUse hook can regenerate SKILL.md by concatenating a base file + a local file. It works but produces a risky generated/tracked file and fights the dup-detection cache (see #56513, #20309). Native support avoids that.
Relation to existing issues
- #41967 / #31155 / #45094 — separate gitignored skills dir or
local:true(closed stale/dup). Complementary, not the same. - #56513 / #20309 — project-local skill precedence/caching bugs (one open). Overlap on load-order; this adds the overlay file.
- #59607 — referenced a third-party
SKILL.local.mdconvention; dup-closed. This is the native-support version.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗