Summary
When opencode-sdlc-wizard is installed alongside its siblings (claude-sdlc-wizard in .claude/, codex-sdlc-wizard in .codex/, plus .agents/skills/), OpenCode's native skill discovery loads the sibling copies, not the wizard's own .opencode/skills/ copies, for any same-named skill.
The installer already detects siblings and prints both can coexist — and they do coexist on disk. But at runtime, OpenCode dedupes skills by name and the .opencode copy loses.
Evidence
Repo has sdlc in .opencode/skills/ AND .claude/skills/; gdlc in .opencode/skills/ AND .claude/skills/; rdlc in .opencode/skills/, .claude/skills/, AND .agents/skills/.
opencode debug skill resolves:
sdlc -> .claude/skills/sdlc/SKILL.md (NOT .opencode/skills/sdlc)
gdlc -> .claude/skills/gdlc/SKILL.md (NOT .opencode/skills/gdlc)
rdlc -> .agents/skills/rdlc/SKILL.md (NOT .opencode/skills/rdlc)
Observed precedence: .agents > .claude > .opencode. So the wizard's own .opencode/skills/sdlc/SKILL.md is shadowed by claude-sdlc-wizard's .claude/skills/sdlc/SKILL.md on any machine where both wizards are installed — which is exactly the "third lane" scenario the wizard is built for.
Per OpenCode docs (Agent Skills → Troubleshoot): "Ensure skill names are unique across all locations." The wizard ships colliding names by design.
Impact
- The opencode-sdlc-wizard's curated
.opencode/skills/sdlc/SKILL.md never loads via the skill tool when the Claude wizard is also present. Users think they're running the OpenCode skill; they're running the Claude one.
- Any OpenCode-native ports a user adds (e.g.
.opencode/skills/gdlc, .opencode/skills/rdlc) are silently shadowed.
instructions: [".opencode/skills/sdlc/SKILL.md"] (path-based load) still works, because that bypasses the skill-tool dedupe — but the skill({ name: "sdlc" }) path does not.
Suggested fixes (pick any)
- Post-install verification. After install, run
opencode debug skill and warn if any wizard-installed .opencode/skills/* is shadowed by a .claude/.agents copy. The installer already detects siblings at write time; extend it to a runtime-resolution check.
- Document the precedence + escape hatch. Note that OpenCode discovers
.claude/skills and .agents/skills natively and ranks them above .opencode/skills. Document OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 + OPENCODE_DISABLE_EXTERNAL_SKILLS=1 for users who want .opencode skills to win (note the side effect: hides claude-only meta-skills from OpenCode).
- Consider namespacing wizard skill names (or a config-level skill allowlist) so coexistence is real at runtime, not just on disk.
Bonus recipe request: skills vs slash-commands for Claude/Codex users
Related doc gap. Users coming from Claude Code / Codex expect /-commands, but OpenCode skills are invoked by the model via the skill tool, not as slash commands. A short recipe would help:
- Skills = workflow brains (auto-invoked by the model from their
description).
- Commands = user-facing entrypoints (
.opencode/commands/<name>.md).
- Pattern: thin
/sdlc, /gdlc, /rdlc command wrappers whose body is invoke skill({ name: "..." }) — gives Claude/Codex-style ergonomics while OpenCode still loads the skill on demand.
- Note that auto-invoke depends on a sharp
description; slash wrappers are the deterministic fallback.
Environment
- OpenCode: 1.16.2
- opencode-sdlc-wizard: 0.13.4
- Siblings present: claude-sdlc-wizard (.claude/), codex-sdlc-wizard (.codex/), .agents/skills/
- macOS 15.1 arm64
Summary
When opencode-sdlc-wizard is installed alongside its siblings (claude-sdlc-wizard in
.claude/, codex-sdlc-wizard in.codex/, plus.agents/skills/), OpenCode's native skill discovery loads the sibling copies, not the wizard's own.opencode/skills/copies, for any same-named skill.The installer already detects siblings and prints
both can coexist— and they do coexist on disk. But at runtime, OpenCode dedupes skills by name and the.opencodecopy loses.Evidence
Repo has
sdlcin.opencode/skills/AND.claude/skills/;gdlcin.opencode/skills/AND.claude/skills/;rdlcin.opencode/skills/,.claude/skills/, AND.agents/skills/.opencode debug skillresolves:Observed precedence:
.agents>.claude>.opencode. So the wizard's own.opencode/skills/sdlc/SKILL.mdis shadowed by claude-sdlc-wizard's.claude/skills/sdlc/SKILL.mdon any machine where both wizards are installed — which is exactly the "third lane" scenario the wizard is built for.Per OpenCode docs (Agent Skills → Troubleshoot): "Ensure skill names are unique across all locations." The wizard ships colliding names by design.
Impact
.opencode/skills/sdlc/SKILL.mdnever loads via theskilltool when the Claude wizard is also present. Users think they're running the OpenCode skill; they're running the Claude one..opencode/skills/gdlc,.opencode/skills/rdlc) are silently shadowed.instructions: [".opencode/skills/sdlc/SKILL.md"](path-based load) still works, because that bypasses the skill-tool dedupe — but theskill({ name: "sdlc" })path does not.Suggested fixes (pick any)
opencode debug skilland warn if any wizard-installed.opencode/skills/*is shadowed by a.claude/.agentscopy. The installer already detects siblings at write time; extend it to a runtime-resolution check..claude/skillsand.agents/skillsnatively and ranks them above.opencode/skills. DocumentOPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1+OPENCODE_DISABLE_EXTERNAL_SKILLS=1for users who want.opencodeskills to win (note the side effect: hides claude-only meta-skills from OpenCode).Bonus recipe request: skills vs slash-commands for Claude/Codex users
Related doc gap. Users coming from Claude Code / Codex expect
/-commands, but OpenCode skills are invoked by the model via theskilltool, not as slash commands. A short recipe would help:description)..opencode/commands/<name>.md)./sdlc,/gdlc,/rdlccommand wrappers whose body isinvoke skill({ name: "..." })— gives Claude/Codex-style ergonomics while OpenCode still loads the skill on demand.description; slash wrappers are the deterministic fallback.Environment