6.5 KiB
Codex CLI Implementation
Codex CLI-specific implementation details for Agent Skills. For cross-platform concepts, see the main SKILL.md.
Discovery Paths
Codex loads skills from multiple locations with this precedence order (higher overrides lower):
| Scope | Location | Use Case |
|---|---|---|
REPO |
$CWD/.codex/skills |
Project-specific skills in current directory |
REPO |
$CWD/../.codex/skills |
Parent folder skills (when in Git repo) |
REPO |
$REPO_ROOT/.codex/skills |
Repository root skills |
USER |
$CODEX_HOME/skills (default: ~/.codex/skills) |
User's personal skills |
ADMIN |
/etc/codex/skills |
System/admin skills |
SYSTEM |
Bundled with Codex | Built-in skills |
Key behaviors:
- Skills with the same name from higher precedence scopes overwrite lower ones
- Skills are discovered at startup by scanning these paths
- Restart Codex after installing new skills to load them
Enabling Skills
Skills are gated behind a feature flag:
# Check if enabled
codex features list
# Enable once
codex --enable skills
# Enable permanently in ~/.codex/config.toml:
[features]
skills = true
Invocation Methods
Explicit Invocation
Supported in CLI and IDE extensions:
# Skill picker
Type $ to see available skills
# Slash command
/skills
# Direct mention in prompt
$skill-name analyze this code
Not yet supported in Codex Web or iOS.
Implicit Invocation
Works across all platforms (CLI, Web, iOS):
- Codex auto-detects when task matches a skill's description
- The
descriptionfield is the primary trigger signal - Write descriptions with "Use when..." clauses for better matching
# Good: clear trigger conditions
description: Extracts text and tables from PDFs. Use when working with PDF files or document extraction.
# Bad: vague, hard to match
description: Helps with files
AGENTS.md vs Skills
Codex uses AGENTS.md for project instructions, separate from skills:
| Aspect | AGENTS.md | Skills |
|---|---|---|
| Loading | Always loaded per-session | Loaded on-demand when invoked |
| Purpose | Project-wide context and rules | Task-specific capabilities |
| Scope | Per-repository | Personal, project, or system |
| Location | Repository root or ~/.codex/ |
skills/ directories |
AGENTS.md discovery order:
~/.codex/AGENTS.override.md(orAGENTS.md)- Repository root
AGENTS.md - Nested
AGENTS.override.mdin subdirectories
Built-in Skills
Codex includes utility skills:
| Skill | Purpose |
|---|---|
$skill-creator |
Creates new skills interactively |
$skill-installer |
Downloads skills from GitHub repos |
$create-plan |
Experimental planning skill |
Skill Installer
# Install from OpenAI's curated skills
$skill-installer linear
$skill-installer notion-spec-to-implementation
# Downloads to $CODEX_HOME/skills/
Tool Restrictions
The allowed-tools field is experimental in Codex:
allowed-tools: Bash(git:*) Bash(jq:*) Read
Status:
- Marked as "experimental" in the Agent Skills spec
- "Support for this field may vary between agent implementations"
- No explicit Codex documentation on implementation
Alternative controls in Codex:
- Global
sandbox_modesetting - Global
approval_policysetting - MCP servers support
enabled_toolsanddisabled_toolsarrays - No per-skill tool restrictions documented
Testing Skills
Validation
Use the skills-ref validator:
skills-ref validate ./my-skill
Checks:
- YAML frontmatter validity
- Name/description constraints
- Naming conventions
Testing Workflow
- Create skill in
~/.codex/skills/my-skill/ - Restart Codex to load it (required)
- Test explicit invocation:
$my-skill test task - Test implicit invocation: Use keywords from description
- Check
/skillscommand to confirm it's loaded
Debugging
- Check
~/.codex/log/codex-tui.logfor skill loading errors - Validation errors shown at startup if YAML malformed
- Codex ignores empty files and symlinked directories
Troubleshooting
Skill Not Loading
Check feature flag:
codex features list
# Look for: skills ... true
Verify file location:
# Personal skills
ls ~/.codex/skills/my-skill/SKILL.md
# Project skills
ls .codex/skills/my-skill/SKILL.md
Restart Codex:
Skills are only discovered at startup. After adding a new skill, restart the CLI.
Skill Not Activating
Check description triggers:
The description is the primary trigger for implicit invocation. Ensure it includes:
- What the skill does
- "Use when..." conditions
- Keywords users would naturally say
Try explicit invocation:
$skill-name do the task
If explicit works but implicit doesn't, improve the description.
Validation Errors
Check YAML syntax:
# Validate YAML
python3 -c "import yaml; yaml.safe_load(open('SKILL.md').read().split('---')[1])"
# Check for tabs (YAML requires spaces)
grep -P "\t" SKILL.md
Common issues:
- Tabs instead of spaces
- Missing quotes around special characters
- Missing closing
---delimiter
Differences from Claude Code
| Feature | Codex CLI | Claude Code |
|---|---|---|
| Skill loading | Feature flag required | Built-in support |
| Discovery paths | 6 scopes with precedence | Plugin system + .claude/skills/ |
| Invocation | $skill-name syntax |
Skill tool, natural language |
| Project instructions | AGENTS.md |
CLAUDE.md |
| Restart required | Yes, after adding skills | No, skills reload on /clear |
| Tool restrictions | allowed-tools (experimental) |
allowed-tools (functional) |
| Built-in creator | $skill-creator |
Manual or via outfitter plugin |
| Debug mode | Log files | claude --debug |
Quick Reference
# Check skills feature is enabled
codex features list
# Find all skills
find ~/.codex/skills .codex/skills -name "SKILL.md" 2>/dev/null
# Validate skill
skills-ref validate ./my-skill
# Check logs for errors
cat ~/.codex/log/codex-tui.log | grep -i skill
# Invoke skill explicitly
# In Codex prompt: $skill-name do something