Allow repo-committed skills to be opt-in per contributor (default-off, like Claude Code's @skills-dir + enabledPlugins)
What variant of Codex are you using?
CLI
What feature would you like to see?
A way to commit skills into a repository so they are discoverable but disabled by default, with each contributor opting in to the specific skills relevant to their work — without standing up a repo marketplace/plugin.
Context / who this is for
I maintain the agentic-coding setup for an iOS app monorepo with 20+ contributors. People own different areas, so a repo-wide skill set that force-activates for everyone is noisy and eats the ~2% skills context budget on every session.
On Claude Code this is a first-class, named feature. Two pieces combine:
- Skills-directory plugins — a skill folder committed under the repo's
.claude/skills/<name>/with a.claude-plugin/plugin.jsonloads in place as<name>@skills-diron the next session, with no marketplace and no install step. Docs: https://code.claude.com/docs/en/plugins-reference#skills-directory-plugins
defaultEnabled: false(Claude Code v2.1.154+) — a plugin can ship so that it "installs disabled. The user turns it on withclaude plugin enable <plugin>or the/plugininterface. Use this for plugins that add cost or scope a user should opt into." The user's ownenabledPluginsentry then takes precedence and persists across updates/reinstalls. Docs: https://code.claude.com/docs/en/plugins-reference#default-enablement
Net result: the repo distributes the skills, but they are off by default and each contributor opts in to the ones they need — controlled per-contributor via enabledPlugins in their settings, while the folder itself is checked into the repo.
That combination — repo-committed and default-off and per-contributor opt-in, with no marketplace — is exactly what's blocking our Claude Code → Codex migration.
Why current Codex mechanisms don't cover this
- Committing to
.agents/skills(or.codex/skills) force-activates for everyone — there is no default-off. [[skills.config]]is only honored fromUserandSessionFlagsconfig layers, not theProjectlayer, so a repo cannot ship a default-off state. (This is the root cause behind #24237 and #20210.)[skills] include_instructions = falseis all-or-nothing — it drops repo/project skills too.agents/openai.yamlallow_implicit_invocation: falseis a repo-level authoring choice, not a per-contributor setting, and the skill still occupies the initial skills list / metadata budget.
Proposed directions (any one solves it)
- Per-skill default state (mirrors Claude Code's
defaultEnabled: false). Support adefault_enabled = falsefield (inagents/openai.yamlorSKILL.toml) so a repo-committed skill ships opt-in. Contributors flip it on with[[skills.config]] enabled = truein their own~/.codex/config.toml, and that user setting persists across updates.
- **Honor
[[skills.config]]from the Project layer for trusted projects.** This lets a repo commitenabled = falsedefaults that contributors override in user config. (This would also resolve #24237.)
Either direction keeps the global default unchanged and adds no forced activation. Direction 1 is the closest analog to what Claude Code already ships.
Relationship to existing issues
- Distinct from #20210 (selective filtering of already-global skills, closed not-planned). This request is about repo-distributed, default-off, per-contributor opt-in skills — a different capability.
- Adjacent to #24237 (project layer can't filter user/global skills) and #21425 (decoupling install/enable from per-session injection). This is the authoring/distribution side of the same gap.
- Related framing precedent: #18193 asks for repo-level opt-in without changing the global default.
Additional information
_No response_
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗