Local marketplace plugin is enabled but its plugin skills are not exposed in Codex sessions
Summary
A local marketplace plugin is enabled and its plugin manifest points to a valid skills directory, but Codex sessions do not expose the plugin's skills. This reproduces in Codex CLI and Codex App after multiple restarts.
This is currently blocking oh-my-codex plugin-mode usage without falling back to legacy skill installation.
Environment
codex-cli 0.130.0
oh-my-codex v0.16.3
macOS / arm64
Expected behavior
When a local marketplace plugin is configured and enabled, Codex should discover and expose the skills declared by the plugin manifest:
{
"name": "oh-my-codex",
"version": "0.16.3",
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"apps": "./.app.json"
}
In this case, skills such as team, ralph, deep-interview, ultrawork, wiki, etc. should be visible in a fresh Codex session.
Actual behavior
Only the legacy/user-installed omx-setup skill is visible. The rest of the oh-my-codex plugin skills are not exposed.
A fresh codex exec session shows only these matching skills:
omx-setup
compound-engineering:ce-plan
sophi:use-agent-team
Other plugin skills from non-local/plugin-cache sources, such as compound-engineering:*, sophi:*, browser-use:*, etc., are exposed correctly. The issue appears specific to this local marketplace plugin or its layout/discovery path.
Configuration evidence
Relevant ~/.codex/config.toml entries:
[marketplaces.oh-my-codex-local]
source_type = "local"
source = "/opt/homebrew/lib/node_modules/oh-my-codex"
[plugins."oh-my-codex@oh-my-codex-local"]
enabled = true
The plugin bundle exists and contains a valid manifest:
B=/opt/homebrew/lib/node_modules/oh-my-codex/plugins/oh-my-codex
node -e "const p=require('$B/.codex-plugin/plugin.json'); console.log(JSON.stringify({name:p.name,version:p.version,skills:p.skills,mcpServers:p.mcpServers,apps:p.apps}, null, 2))"
Output:
{
"name": "oh-my-codex",
"version": "0.16.3",
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"apps": "./.app.json"
}
The skills are physically present:
find /opt/homebrew/lib/node_modules/oh-my-codex/plugins/oh-my-codex/skills -maxdepth 2 -name SKILL.md | wc -l
# 26
omx doctor also reports the plugin-mode install as healthy:
Resolved setup scope: user
Resolved setup install mode: plugin
[OK] Skills: plugin marketplace oh-my-codex-local registered; OMX skills are supplied by /opt/homebrew/lib/node_modules/oh-my-codex/plugins/oh-my-codex
Results: 15 passed, 0 warnings, 0 failed
Reproduction
- Install and configure
oh-my-codexin plugin mode. - Ensure the local marketplace and plugin are enabled in
~/.codex/config.toml:
```toml
[marketplaces.oh-my-codex-local]
source_type = "local"
source = "/opt/homebrew/lib/node_modules/oh-my-codex"
[plugins."oh-my-codex@oh-my-codex-local"]
enabled = true
```
- Verify the plugin manifest has
skills: "./skills/"and that theskills/*/SKILL.mdfiles exist. - Start a fresh Codex CLI or Codex App session.
- Ask the model to list visible skills, or inspect the model-visible skill list.
Observed: oh-my-codex plugin skills are missing.
Local marketplace commands tried
codex plugin marketplace add /opt/homebrew/lib/node_modules/oh-my-codex
Output:
Marketplace `oh-my-codex-local` is already added from /opt/homebrew/lib/node_modules/oh-my-codex.
Installed marketplace root: /opt/homebrew/lib/node_modules/oh-my-codex
codex plugin marketplace upgrade oh-my-codex-local
Output:
Error: marketplace `oh-my-codex-local` is not configured as a Git marketplace
Questions
- Are skills from
source_type = "local"marketplaces expected to be loaded into Codex sessions? - If yes, is the
oh-my-codexlocal marketplace layout valid for Codex plugin discovery? - Is there a required cache/install step for local marketplace plugins beyond
codex plugin marketplace add <local-root>and[plugins."name@marketplace"].enabled = true? - If this is a Codex loader bug, could Codex surface diagnostics explaining why a plugin's declared
skillsdirectory was skipped?
Why this matters
oh-my-codex plugin mode intentionally avoids legacy skill installation and relies on Codex plugin discovery for bundled skills. Falling back to legacy mode works around the symptom but defeats the plugin-mode path.
8 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Thanks for the duplicate pointer. I checked #22051 and it looks related at the plugin discovery/cache layer, but I don't think this issue is an exact duplicate.
Key differences:
oh-my-codex-local).~/.codex/config.toml.skills: "./skills/".SKILL.mdfiles.So the shared root may be plugin discovery, but this issue is specifically about local marketplace plugin skill discovery / model-visible skills, not only App plugin UI listing or bundled marketplace cache generation.
I reproduced the same issue with an official
openai-curatedplugin.Environment
codex-cli 0.144.0-alpha.4superpowers@openai-curated5.1.3, marketplace revision2f1a8948Findings
config.tomlcontains[plugins."superpowers@openai-curated"] enabled = true.codex plugin listreports the plugin asinstalled, enabled.plugin/readreturns all 14 Superpowers skills withenabled: true.skills/listwithforceReload: truereturns nosuperpowers:*skills.errorsarray is empty.codex execprocess also reports that no Superpowers skills are available.In other words, the plugin details API reports a healthy plugin and complete skill inventory, while the model-visible skill catalog silently omits the entire plugin.
Workaround and isolation
I linked each Superpowers skill directory into
~/.codex/skills/<skill-name>. After that,codex debug prompt-inputincluded all 14 namespaced skills again, for example:The model-visible paths still point to the original marketplace files under
plugins/superpowers/skills/.../SKILL.md. This suggests that the SKILL.md files and Superpowers manifest are valid, and that the failure is in propagating the installed plugin's skill roots into the session skill loader.Possible source-level failure point
On current
main,skills/listfollows this path:effective_plugin_skill_roots()skips all skill roots for an otherwise active plugin whenplugin_namespaceis absent. I have not directly inspected that internal runtime value, so this is only a hypothesis, but it is one concrete point whereplugin/readandskills/listcould diverge without producing a skill loading error.Suggested regression coverage
skills: "./skills/"in its manifest.plugin/readandskills/list(forceReload: true)expose the same enabled skills.errorsor diagnostics instead of silently dropping it.If a maintainer confirms the intended fix and explicitly invites an external PR, I can prepare the regression test and implementation within that scope.
Confirmed on the current stable release after a clean official-only setup.
Environment
codex-cli 0.144.1(matchesnpm view @openai/codex version)source_type = "local"marketplaceEnabled official curated plugins:
codex plugin listreports every one asinstalled, enabledfrom the officialopenai-curatedmarketplace.Reproduction and observed result
openai-curated-remotecache.openai-curated.The resulting model-visible skills list contains 42 ordinary system/runtime/repo-local skills, but zero entries matching
superpowers,build-web-apps,github:, orsentry:.The same result occurs with
codex exec --strict-config --ephemeral.Why this is not only a skill-metadata budget issue
I initially had six curated plugins. I removed the two largest optional plugins (
build-web-data-visualizationandcodex-security), reducing the enabled curated set to the four above. Plugin skill descriptions were well below the documented fallback budget, yet all curated skills remain absent while non-plugin skills remain visible.The plugin state and the model-visible skill catalog therefore still diverge on the current stable release, even for the official curated marketplace and without a local marketplace layout.
A useful regression test would install an official curated plugin in a clean temporary CODEX_HOME and assert that its declared skill roots appear in
codex debug prompt-input/skills/list. Diagnostics should explain an omitted enabled plugin skill root rather than returning an empty skill set without errors.Additional diagnostic correlation: this report was reproduced and validated in Codex thread ID
019f5789-761a-7a60-a64f-185ccd1ab791.For temporary mitigation, globally symlinking each enabled official curated plugin skill directory into
~/.codex/skills/made all 25 skills appear in a freshcodex debug prompt-inputprocess. The displayed sources still resolve to the officialopenai-curatedplugin directories. This reinforces that the manifests and SKILL.md files are valid; the missing step is plugin skill-root propagation into the normal loader.Confirmed on Windows with the official curated GitHub plugin, including the current stable CLI.
Environment
26.707.71524codex-cli 0.144.2@openai/codex 0.144.4github@openai-curated0.1.6, marketplace revision2f1a8948Observed state
codex plugin list --jsonreportsgithub@openai-curatedinstalled and enabled.github:gh-address-comments,github:gh-fix-ci,github:github, andgithub:yeet.Controls attempted
All of these still returned 0/4 GitHub skills:
0.144.4).github@openai-curatedthroughcodex plugin remove/add.@githubinvocation.GITHUB_PAT_TOKENinjected only into the probe process.apps,plugins, andremote_pluginfeature flags are enabled.No manual cache edits or symlink workaround were used. The repository configuration and plugin declaration remained valid.
This independently reproduces the official-curated case on Windows and shows that the omission is not caused by GitHub authentication, the bundled CLI version, a stale plugin install, or lack of explicit invocation. Ideally, an enabled plugin with declared skills should either contribute those roots to
skills/list/debug prompt-input, or emit a diagnostic explaining why each root was excluded.This is what happens to superpowers plugin's skills on OpenAI Codex (v0.147.0):
<img width="1980" height="525" alt="Image" src="https://github.com/user-attachments/assets/a0c62762-c492-4a63-b3b8-5d3fe9c4edf7" />
<img width="243" height="159" alt="Image" src="https://github.com/user-attachments/assets/d16bdfeb-c51c-433c-a5a8-4b310d259ec6" />
---
This is on claude code with the same plugin:
<img width="756" height="310" alt="Image" src="https://github.com/user-attachments/assets/ae234c01-689d-4d7d-aee8-fab420c6ea86" />
Reproduced on a newer stable Codex release with a minimal Skills-only local Plugin.
Environment
codex-cli 0.149.1Packaging validation
The Plugin used the canonical plural Skill layout:
with one ordinary bundled Skill:
Plugin Creator validation passed.
For comparison, an earlier manifest using
skills: "./skill/"failed the static check with:Changing the package to
./skills/resolved that static validation error, but did not resolve runtime Skill registration.Installation succeeds
Local marketplace discovery succeeded. Plugin installation succeeded, and Codex reported the Plugin as installed, enabled, and version
0.2.0.The Plugin cache contained the declared payload, including:
A sanitized equivalent cache location is:
Native Skill registration still fails
I isolated the test from standalone Skill discovery:
deslopSkill completely outside the Skill discovery root.deslopSkill.skills/list(forceReload=true)API.The relevant catalog projection was:
(The protocol response may include unrelated fields depending on API version.) The installed Plugin cache contained the Skill, but the native host catalog did not register it and surfaced no relevant loading error. No filesystem search or manual reading of the Plugin cache was used to establish this result.
Standalone control
The same runtime Skill works through ordinary standalone/repository Skill discovery. In an isolated repo-local test, the host reported:
and loaded the same
skills/deslop/SKILL.mdsuccessfully.This appears to reproduce the same Plugin-to-session Skill propagation failure tracked here. The evidence narrows the boundary to Plugin Skill registration/propagation rather than Plugin installation, cache creation, Skill validity, or the plural package layout.
Plugin packaging was withheld from the project release rather than adding a duplicate runtime or compatibility workaround.