Key features - Custom prompts accept arguments: $1..$9, $ARGUMENTS, and $$ (literal) - @ file picker in composer: type @ to fuzzy‑search and insert quoted paths - Frontmatter hints: optional description + argument-hint shown in palette (body stripped before send) Why - Make saved prompts reusable with runtime parameters. - Improve discoverability with concise, helpful hints in the slash popup. - Preserve privacy and approvals; no auto‑execution added. Details - Protocol: extend CustomPrompt with description, argument_hint (optional). - Core: parse minimal YAML‑style frontmatter at file top; strip it from the submitted body. - TUI: expand arguments; insert @ paths; render description/argument-hint or fallback excerpt. - Docs: prompts.md updated with frontmatter and argument examples. Tests - Frontmatter parsing (description/argument-hint extracted; body stripped). - Popup rows show description + argument-hint; excerpt fallback; builtin name collision. - Argument expansion for $1..$9, $ARGUMENTS, $$; quoted args and @ path insertion. Safety / Approvals - No changes to approvals or sandboxing; prompts do not auto‑run tools. Related - Closes #2890 - Related #3265 - Complements #3403
3.8 KiB
Custom Prompts
Save frequently used prompts as Markdown files and reuse them quickly from the slash menu.
- Location: Put files in
$CODEX_HOME/prompts/(defaults to~/.codex/prompts/). - File type: Only Markdown files with the
.mdextension are recognized. - Name: The filename without the
.mdextension becomes the slash entry. For a file namedmy-prompt.md, type/my-prompt. - Content: The file contents are sent as your message when you select the item in the slash popup and press Enter.
- Arguments: Local prompts support placeholders in their content:
$1..$9expand to the first nine positional arguments typed after the slash name$ARGUMENTSexpands to all arguments joined by a single space$$is preserved literally- Quoted args: Wrap a single argument in double quotes to include spaces, e.g.
/review "docs/My File.md". - File picker: While typing a slash command, type
@to open the file picker and fuzzy‑search files under the current working directory. Selecting a file inserts its path at the cursor; if it contains spaces it is auto‑quoted.
- How to use:
- Start a new session (Codex loads custom prompts on session start).
- In the composer, type
/to open the slash popup and begin typing your prompt name. - Use Up/Down to select it. Press Enter to submit its contents, or Tab to autocomplete the name.
- Notes:
- Files with names that collide with built‑in commands (e.g.
/init) are ignored and won’t appear. - New or changed files are discovered on session start. If you add a new prompt while Codex is running, start a new session to pick it up.
- Files with names that collide with built‑in commands (e.g.
Slash popup rendering
When you type /, the popup lists built‑in commands and your custom prompts. For custom prompts, the popup shows only:
- A five‑word excerpt from the first non‑empty line of the prompt file, rendered dim + italic.
Details:
- The excerpt strips simple Markdown markers (backticks,
*,_, leading#) and any$1..$9/$ARGUMENTSplaceholders before counting words. If the line is longer than five words, it ends with an ellipsis…. - If frontmatter provides an
argument-hint, it appears inline after the excerpt; otherwise only the excerpt is shown. Placeholders still expand when you submit the prompt.
Examples (illustrative):
- Prompt file
perf-investigation.mdstarts with:Profile the slow path in module $1→ popup shows:/perf-investigation Profile the slow path in module - Prompt file
release-runbook.mdstarts with:Assemble release checklist for this service→ popup shows:/release-runbook Assemble release checklist
Styling follows the Codex TUI conventions (command cyan + bold; excerpt dim + italic).
Frontmatter (optional)
Prompt files may start with a YAML‑style block to describe how the command should appear in the palette. The frontmatter is stripped before the prompt body is sent to the model.
---
description: "Run a post-incident retro"
argument-hint: "[incident-id] [severity]"
---
Draft a post-incident retrospective for incident $1 (severity $2).
List the timeline, impacted subsystems, contributing factors, and next steps.
With this file saved as incident-retro.md, the popup row shows:
- Name:
/incident-retro - Description:
Run a post-incident retro - Argument hint:
[incident-id] [severity]
Argument examples
All arguments with $ARGUMENTS:
# search-codebase.md
Search the repository for $ARGUMENTS and summarize the files that need attention.
Usage: /search-codebase async runtime contention → $ARGUMENTS becomes "async runtime contention".
Individual arguments with $1, $2, …:
# hotfix-plan.md
Prepare a hotfix plan for bug $1 targeting branch $2.
Assign engineering owners: $3.
Include smoke tests and rollback steps.
Usage: /hotfix-plan BUG-1234 main "alice,bob" → $1 is "BUG-1234", $2 is "main", $3 is "alice,bob".