You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The OpenCode integration ships 10 hand-written skills while Claude has 53
and Copilot CLI has 49. Notably absent is the entire planning arc documented
in Design Before Coding — /ctx-brainstorm, /ctx-spec, /ctx-task-out, /ctx-implement — so OpenCode
users cannot follow the project's own recommended design workflow.
Rather than hand-porting again, this proposes aligning OpenCode with the
Copilot CLI model: generate the tree from the canonical Claude skills at
build time.
Current state
Tree
Skills
Maintenance
Claude
53
canonical source of truth
Copilot CLI
49
35 auto-synced by hack/sync-copilot-skills.sh, 14 legacy-named and unsynced
OpenCode
10
fully hand-written
hack/sync-copilot-skills.sh already solves this for Copilot: it derives each
skill from internal/assets/claude/skills/<name>/SKILL.md with a one-line sed stripping the Claude-specific allowed-tools: frontmatter key. It is
opt-in by directory presence (a skill with no Claude counterpart is left
untouched), wired into make build, and gated in CI by make check-copilot-skills.
OpenCode has no equivalent. Its 10 skills are hand-written terse variants at
roughly 30% the length of their Claude counterparts — and diffing them shows
the terseness is truncated reference material (dropped flag tables, output
descriptions), not OpenCode-specific adaptation.
Why this is low-cost
The OpenCode skill path is already fully generic — no Go changes needed:
internal/assets/embed.go:22 embeds by glob: integrations/opencode/skills/*/SKILL.md
deploySkills() (internal/cli/setup/core/opencode/skill.go:34) iterates whatever it finds
TestSkillFrontmatter enforces only name + description
Adding a skill is mkdir + a SKILL.md. Nothing registers or enumerates.
The planning arc is the easiest possible port: ctx-brainstorm, ctx-spec, ctx-task-out, ctx-implement, and ctx-plan carry no allowed-tools key
at all, so the sync transform is a byte-identical copy. Their cross-skill
references are closed within that set. The only Claude-specific line across all
five is a parenthetical at ctx-brainstorm/SKILL.md:200.
Proposed solution
Add hack/sync-opencode-skills.sh as a sibling of the Copilot script — same
opt-in-by-directory model, same allowed-tools: strip.
Wire sync-opencode-skills into make build and add a check-opencode-skills CI gate mirroring check-copilot-skills.
Enroll the planning arc (ctx-brainstorm, ctx-spec, ctx-task-out, ctx-implement, ctx-plan) plus the capture skills its bodies reference
(ctx-task-add, ctx-decision-add) so no reference dangles.
Enroll the existing 10 hand-written skills so the tree becomes uniform,
replacing the truncated bodies with the canonical ones.
Use canonical Claude skill names throughout. The 14 unsynced Copilot skills
are unsynced precisely because they were renamed (ctx-add-task vs ctx-task-add); OpenCode already uses canonical names and should keep them.
Open question: terse variants
If lean skill bodies are wanted for OpenCode's context budget, the honest fix
is a terse transform in the sync script rather than two conventions coexisting
in one tree. Otherwise the truncation is unintentional divergence and should go.
Acceptance criteria
hack/sync-opencode-skills.sh exists and mirrors the Copilot script's contract
make build syncs OpenCode skills; make check-opencode-skills fails on staleness
The Design Before Coding arc is available in OpenCode
Enrolled OpenCode skills are byte-identical to their Claude source minus allowed-tools:
Phase KB-followup in .context/TASKS.md — "adversarial design review of parallel
skill trees" — this issue picks the canonical + build-time transform shape
that Copilot already proves in production.
Summary
The OpenCode integration ships 10 hand-written skills while Claude has 53
and Copilot CLI has 49. Notably absent is the entire planning arc documented
in Design Before Coding —
/ctx-brainstorm,/ctx-spec,/ctx-task-out,/ctx-implement— so OpenCodeusers cannot follow the project's own recommended design workflow.
Rather than hand-porting again, this proposes aligning OpenCode with the
Copilot CLI model: generate the tree from the canonical Claude skills at
build time.
Current state
hack/sync-copilot-skills.sh, 14 legacy-named and unsyncedhack/sync-copilot-skills.shalready solves this for Copilot: it derives eachskill from
internal/assets/claude/skills/<name>/SKILL.mdwith a one-linesedstripping the Claude-specificallowed-tools:frontmatter key. It isopt-in by directory presence (a skill with no Claude counterpart is left
untouched), wired into
make build, and gated in CI bymake check-copilot-skills.OpenCode has no equivalent. Its 10 skills are hand-written terse variants at
roughly 30% the length of their Claude counterparts — and diffing them shows
the terseness is truncated reference material (dropped flag tables, output
descriptions), not OpenCode-specific adaptation.
Why this is low-cost
The OpenCode skill path is already fully generic — no Go changes needed:
internal/assets/embed.go:22embeds by glob:integrations/opencode/skills/*/SKILL.mdagent.OpenCodeSkills()(internal/assets/read/agent/agent.go:135) walks directory entriesdeploySkills()(internal/cli/setup/core/opencode/skill.go:34) iterates whatever it findsTestSkillFrontmatterenforces onlyname+descriptionAdding a skill is
mkdir+ aSKILL.md. Nothing registers or enumerates.The planning arc is the easiest possible port:
ctx-brainstorm,ctx-spec,ctx-task-out,ctx-implement, andctx-plancarry noallowed-toolskeyat all, so the sync transform is a byte-identical copy. Their cross-skill
references are closed within that set. The only Claude-specific line across all
five is a parenthetical at
ctx-brainstorm/SKILL.md:200.Proposed solution
hack/sync-opencode-skills.shas a sibling of the Copilot script — sameopt-in-by-directory model, same
allowed-tools:strip.sync-opencode-skillsintomake buildand add acheck-opencode-skillsCI gate mirroringcheck-copilot-skills.ctx-brainstorm,ctx-spec,ctx-task-out,ctx-implement,ctx-plan) plus the capture skills its bodies reference(
ctx-task-add,ctx-decision-add) so no reference dangles.replacing the truncated bodies with the canonical ones.
are unsynced precisely because they were renamed (
ctx-add-taskvsctx-task-add); OpenCode already uses canonical names and should keep them.Open question: terse variants
If lean skill bodies are wanted for OpenCode's context budget, the honest fix
is a terse transform in the sync script rather than two conventions coexisting
in one tree. Otherwise the truncation is unintentional divergence and should go.
Acceptance criteria
hack/sync-opencode-skills.shexists and mirrors the Copilot script's contractmake buildsyncs OpenCode skills;make check-opencode-skillsfails on stalenessallowed-tools:Related
.context/TASKS.md— "adversarial design review of parallelskill trees" — this issue picks the canonical + build-time transform shape
that Copilot already proves in production.