mirror of
https://github.com/EveryInc/compound-engineering-plugin.git
synced 2026-09-19 01:09:55 +08:00
65 lines
2.5 KiB
TypeScript
65 lines
2.5 KiB
TypeScript
import path from "path"
|
|
import { ensureDir, pathExists, readText, writeText } from "./files"
|
|
|
|
export const CODEX_AGENTS_BLOCK_START = "<!-- BEGIN COMPOUND CODEX TOOL MAP -->"
|
|
export const CODEX_AGENTS_BLOCK_END = "<!-- END COMPOUND CODEX TOOL MAP -->"
|
|
|
|
const CODEX_AGENTS_BLOCK_BODY = `## Compound Codex Tool Mapping (Claude Compatibility)
|
|
|
|
This section maps Claude Code plugin tool references to Codex behavior.
|
|
Only this block is managed automatically.
|
|
|
|
Tool mapping:
|
|
- Read: use shell reads (cat/sed) or rg
|
|
- Write: create files via shell redirection or apply_patch
|
|
- Edit/MultiEdit: use apply_patch
|
|
- Bash: use shell_command
|
|
- Grep: use rg (fallback: grep)
|
|
- Glob: use rg --files or find
|
|
- LS: use ls via shell_command
|
|
- WebFetch/WebSearch: use curl or Context7 for library docs
|
|
- AskUserQuestion/Question: present choices as a numbered list in chat and wait for a reply number. For multi-select (multiSelect: true), accept comma-separated numbers. Never skip or auto-configure — always wait for the user's response before proceeding.
|
|
- Task/Subagent/Parallel: run sequentially in main thread; use multi_tool_use.parallel for tool calls
|
|
- TodoWrite/TodoRead: use file-based todos in todos/ with todo-create skill
|
|
- Skill: open the referenced SKILL.md and follow it
|
|
- ExitPlanMode: ignore
|
|
`
|
|
|
|
export async function ensureCodexAgentsFile(codexHome: string): Promise<void> {
|
|
await ensureDir(codexHome)
|
|
const filePath = path.join(codexHome, "AGENTS.md")
|
|
const block = buildCodexAgentsBlock()
|
|
|
|
if (!(await pathExists(filePath))) {
|
|
await writeText(filePath, block + "\n")
|
|
return
|
|
}
|
|
|
|
const existing = await readText(filePath)
|
|
const updated = upsertBlock(existing, block)
|
|
if (updated !== existing) {
|
|
await writeText(filePath, updated)
|
|
}
|
|
}
|
|
|
|
function buildCodexAgentsBlock(): string {
|
|
return [CODEX_AGENTS_BLOCK_START, CODEX_AGENTS_BLOCK_BODY.trim(), CODEX_AGENTS_BLOCK_END].join("\n")
|
|
}
|
|
|
|
function upsertBlock(existing: string, block: string): string {
|
|
const startIndex = existing.indexOf(CODEX_AGENTS_BLOCK_START)
|
|
const endIndex = existing.indexOf(CODEX_AGENTS_BLOCK_END)
|
|
|
|
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
|
|
const before = existing.slice(0, startIndex).trimEnd()
|
|
const after = existing.slice(endIndex + CODEX_AGENTS_BLOCK_END.length).trimStart()
|
|
return [before, block, after].filter(Boolean).join("\n\n") + "\n"
|
|
}
|
|
|
|
if (existing.trim().length === 0) {
|
|
return block + "\n"
|
|
}
|
|
|
|
return existing.trimEnd() + "\n\n" + block + "\n"
|
|
}
|