尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

oh-my-openagent 之 codex-rules:用 Codex 生命周期钩子实现项目规则自动注入与去重

oh-my-openagent 之 codex-rules:用 Codex 生命周期钩子实现项目规则自动注入与去重 oh-my-openagent 之 codex-rules用 Codex 生命周期钩子实现项目规则自动注入与去重【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent导读本文以 packages/omo-codex/plugin/components/rules/CHANGELOG.md 为主线讲解 oh-my-openagent 仓库中codex-rules这个 Codex 插件的完整演进它如何把pi-rules的规则加载、匹配、格式化、截断与去重能力移植为原生 Codex 插件通过SessionStart、UserPromptSubmit、PostToolUse、PostCompact四个生命周期钩子把本地项目规则文件注入模型上下文并在未发布版本中完成匹配器收紧、调试日志、动态钩子加固与零生产依赖等改造。读完本文你将掌握该插件的钩子注册方式、CODEX_RULES_*配置体系、动态路径提取原理以及从源码、测试到本地安装的完整实战用法。一、为什么需要 codex-rules把 pi-rules 移植到 Codex 钩子生态Codex 本身会把AGENTS.md当作原生项目指令加载但工程实践中还有大量规则散落在CONTEXT.md、.claude/rules、.cursor/rules、.github/instructions等约定目录中。codex-rules的目标就是把这些文件统一识别、按文件级匹配后注入模型上下文避免规则存在但模型看不到。从 CHANGELOG 的 0.1.0 条目可以看到它的起点Portpi-rulesrule loading, matching, formatting, truncation, and deduplication to a Codex plugin.它并非重写一套规则引擎而是把成熟的pi-rules五大能力加载、匹配、格式化、截断、去重整体移植到 Codex 插件形态。在仓库中真正的规则引擎位于 packages/rules-engine而codex-rules通过 rules-engine-factory.ts 桥接引擎自身只负责钩子编排、路径提取、状态持久化与输出格式化见 AGENTS.md 的 Layout 说明。二、插件骨架四个生命周期钩子与 hooks.json 注册codex-rules是纯 Node 运行时插件CLI 由omo-rulesbin 暴露见 package.json。钩子的注册信息集中在 hooks/hooks.json这是 Codex 插件识别钩子的入口{ hooks: { SessionStart: [ { hooks: [{ type: command, command: node \${PLUGIN_ROOT}/dist/cli.js\ hook session-start, timeout: 10 }] } ], UserPromptSubmit: [ { hooks: [{ type: command, command: node \${PLUGIN_ROOT}/dist/cli.js\ hook user-prompt-submit, timeout: 10 }] } ], PostToolUse: [ { matcher: ^apply_patch$, hooks: [{ type: command, command: node \${PLUGIN_ROOT}/dist/cli.js\ hook post-tool-use, timeout: 10 }] } ], PostCompact: [ { matcher: manual|auto, hooks: [{ type: command, command: node \${PLUGIN_ROOT}/dist/cli.js\ hook post-compact, timeout: 10 }] } ] } }四个钩子的职责分工钩子触发时机职责SessionStart会话启动/恢复/清空每次会话加载一次静态项目指令UserPromptSubmit用户提交提示词补充静态规则注入带上下文压力与提示预算控制PostToolUse工具调用之后默认只监听apply_patch按被改动文件注入文件级规则PostCompact手动或自动压缩之后清空会话级注入缓存让规则可在压缩后的对话中重新引入CLI 路由位于 src/cli.ts只接受四个子命令hook session-start、hook user-prompt-submit、hook post-tool-use、hook post-compact并逐个校验 stdin 传入的 JSON 载荷isCodexSessionStartInput等类型守卫。PostToolUse 输出契约README 明确说明PostToolUse输出是纯上下文context-only通过hookSpecificOutput.additionalContext追加上下文绝不重写工具输出。对应实现是 hook-output.ts 的formatAdditionalContextOutput在 codex-hook.ts 中调用。这保证了钩子只补充信息而不干扰 Codex 对工具结果的解析。三、0.1.0 版本的核心能力CHANGELOG 逐条拆解1. 静态与动态双通道注入CHANGELOG 0.1.0 写明AddSessionStart,UserPromptSubmit, andPostToolUsehooks for static and file-specific context injection.静态注入SessionStart/UserPromptSubmit由 static-injection.ts 的runStaticInjection实现调用engine.loadStaticRules(cwd)加载项目级规则经filterRulesAlreadyInTranscript过滤后格式化输出。UserPromptSubmit通道还会套用提示预算withPromptBudget防止注入内容挤占用户提示上下文。动态注入PostToolUserunPostToolUseHook先从工具载荷提取目标路径再做动态目标指纹fingerprint比对只对文件内容发生变化的目标加载规则。2. 会话级持久化去重Add persistent per-session deduplication under Codex plugin data.去重状态静态staticDedup、动态dynamicDedup、目标指纹dynamicTargetFingerprints持久化在 Codex 插件数据目录下由 persistent-cache.ts 管理并通过 session-state-lock.ts 加锁防止并发钩子互相覆盖。在runPostToolUseHook中可以看到关键逻辑先hydrateEngineState恢复状态再筛选pendingTargetFingerprints指纹与缓存不同才需要处理最后对注入过的规则调用engine.markDynamicInjected(rule)并persistEngineState。3. Codex 感知的路径提取Add Codex-aware path extraction for read, write, edit, multi-edit,apply_patch, and shell command payloads.这是动态注入的入口关卡实现在 tool-paths.ts 的extractCodexToolPaths跟踪的工具名集合TRACKED_TOOL_NAMES覆盖read、write、edit、multiedit、apply_patch以及mcp__filesystem__*系列和bash/shell_command/exec_command对apply_patch载荷解析*** Add File:/*** Update File:/*** Move to:头提取被改动文件对 shell 工具做带引号与转义处理的 tokenize提取可能存在的文件路径要求路径真实存在失败的工具响应isError、status: error等直接跳过不产生注入。4. 测试、CI、发布与本地安装Add tests, CI, release workflow, marketplace metadata, and local install support.测试目录 packages/omo-codex/plugin/components/rules/test 提供了codex-hook.test.ts、config.test.ts、tool-paths.test.ts、package-smoke.test.ts、persistent-cache.test.ts等覆盖钩子行为、配置解析与打包产物的测试package.json暴露npm test、npm run check、npm run typecheck、npm pack --dry-run等验证命令。本地安装通过npx lazycodex-ai install完成会把干净的插件缓存复制到~/.codex/plugins/cache/sisyphuslabs/omo/0.1.0并在~/.codex/config.toml中启用plugins、plugin_hooks、multi_agent、child_agents_md特性及plugins.omosisyphuslabs。四、Unreleased下一版本的加固与瘦身CHANGELOG 的 Unreleased 部分记录了多个方向的改进逐一展开1. 收紧 PostToolUse 匹配器到 apply_patchRestrict the defaultPostToolUsehook matcher to Codexs canonicalapply_patchtool name.README 强调默认PostToolUse匹配器刻意严格只匹配 Codex 规范工具名apply_patchread 类工具、MCP filesystem 工具、shell 命令以及 Claude 风格的Write/Edit别名默认不注册。这与 hooks.json 中matcher: ^apply_patch$完全一致。同时 CHANGELOG 提到移除冗余的 apply_patch 路径扫描与过时的 tracked-tool 常量与工具名集合的精简相呼应。2. NODE_DEBUGcodex-rules 阶段计时日志Add opt-inNODE_DEBUGcodex-rulesphase timing logs forPostToolUsedebugging.调试方式READMENODE_DEBUGcodex-rules node dist/cli.js hook post-tool-use fixture.json由 debug-log.ts 的createHookDebugTimer实现。日志输出到 stderr钩子 JSON 保持 stdout 纯净包含PostToolUse的config、extract、hydrate、fingerprint、pending、load、filter、format、persist各阶段耗时ms与目标数、待处理数、规则数、输出字节数但不记录规则正文与工具响应内容。3. 动态钩子覆盖加固Harden dynamic hook coverage for additional-context JSON output, disabled/static modes, failed tool responses, and duplicate suppression.对应测试包括codex-hook.test.ts中对 disabled/static 模式提前返回config.mode off || config.mode static直接输出空、失败工具响应跳过、重复抑制同指纹不重复注入等场景的覆盖。4. 可移植插值、目录扫描上限与 Windows CIUse portable Codex hook interpolation and add package smoke coverage for hook entrypoints. Cap recursive rule directory scans and run CI on Windows in addition to Ubuntu and macOS.钩子命令使用${PLUGIN_ROOT}占位插值hooks.json 可见保证跨平台路径可移植规则目录的递归扫描设有上限防止异常目录结构导致钩子超时CI 矩阵从 Ubuntu macOS 扩展到 Windows。5. 零生产依赖内部 glob 匹配器Replace the external glob matcher dependency with an internal matcher so clean Codex plugin installs run withoutnode_modules.这是发布形态的关键决策用内部匹配器替换外部 glob 依赖后插件运行时无 npm 生产依赖README 明示 The runtime has no npm production dependencies因此 Codex marketplace 拉取到的干净副本无需再执行npm install即可直接运行降低插件安装失败的暴露面。五、配置体系CODEX_RULES_* 环境变量配置解析集中在 src/config.ts 的configFromEnvironment所有变量都支持PI_RULES_*别名作为从pi-rules迁移的兼容回退firstEnv按顺序取第一个非空值变量取值默认值源码处理CODEX_RULES_DISABLED1/true/yes/on未设置isTruthy判定后写入config.disabledCODEX_RULES_MODEboth/static/dynamic/offbothparseMode非法值回退默认CODEX_RULES_MAX_RULE_CHARS正整数12000parsePositiveIntegerCODEX_RULES_MAX_RESULT_CHARS正整数40000parsePositiveIntegerCODEX_RULES_ENABLED_SOURCES逗号分隔的源名或autoautoparseEnabledSourcestoRuleSource白名单CODEX_RULES_MODE与各钩子的联动关系可对照 codex-hook.ts 与 static-injection.tsstatic只做静态注入PostToolUse提前返回空输出dynamic只做动态注入静态通道提前返回off全部关闭各钩子零输出both默认两个通道同时工作。parseEnabledSources支持枚举的源包括.omo/rules、.claude/rules、.cursor/rules、.github/instructions、.github/copilot-instructions.md、CONTEXT.md、plugin-bundled、~/.omo/rules、~/.opencode/rules、~/.claude/rules。此外还有CODEX_RULES_DISABLE_BUNDLED可关闭内置规则以及CODEX_RULES_POST_COMPACT_MAX_*、CODEX_RULES_DYNAMIC_MAX_*、CODEX_RULES_PROMPT_MAX_*三组细粒度预算变量。六、规则来源、frontmatter 与内置规则默认auto模式包含的项目级规则源README 原文为CONTEXT.md、.omo/rules/**/*.md、.claude/rules/**/*.md、.cursor/rules/**/*.md、.github/instructions/**/*.md、.github/copilot-instructions.md。两个重要的刻意排除AGENTS.md不在auto中因为 Codex 已原生加载它重复注入会浪费上下文需要迁移行为时用CODEX_RULES_ENABLED_SOURCES显式开启用户主目录的~/.claude/rules、~/.claude/CLAUDE.md同样排除因为它们通常是 Claude Code 运行时指令而非 Codex 规则。规则文件支持 frontmatter 配置README 示例--- description: TypeScript defaults globs: [**/*.ts, **/*.tsx] alwaysApply: false --- Prefer strict TypeScript and keep runtime imports ESM-compatible.内置规则位于 bundled-rulesHephaestus 人格按钩子载荷中的model字段分族选取——含gpt-6的 slug如gpt-6-astra、gpt-6-astra-fast加载 hephaestus/gpt-6.mdgpt-5.6*加载 hephaestus/gpt-5.6.md其余回退到gpt-5.5.md另含 windows-git-bash.md。压缩后预算表已知gpt-6-astra系列为 600k 上下文模型未知 slug 走 200k 回退。相关行为由bundled-rules.test.ts、hephaestus-model-variant.test.ts、windows-git-bash-bundled-rule.test.ts等测试钉死。七、安装、调试与开发工作流本地安装READMEnpx lazycodex-ai install它会构建插件并写入~/.codex/plugins/cache/sisyphuslabs/omo/0.1.0同时在~/.codex/config.toml开启插件特性。手动 smoke 测试静态钩子npm run build printf %s\n {session_id:s,transcript_path:null,cwd:/path/to/project,hook_event_name:SessionStart,model:gpt-5.5,permission_mode:default,source:startup} \ | PLUGIN_DATA/tmp/codex-rules-data node dist/cli.js hook session-start动态钩子调试与性能验证NODE_DEBUGcodex-rules node dist/cli.js hook post-tool-use fixture.json npm run bench # 性能 smoke 测试构建后运行 scripts/bench-codex-rules.mjsbench 计时依赖本机环境跨机器对比时应使用相对计数与重复输出检查。开发侧完整命令为npm install、npm test、npm run checktypecheck biome build、npm run typecheck、npm pack --dry-run详见 AGENTS.md 的 Commands 小节。八、隐私与许可codex-rules完全本地运行读取本地规则文件与 Codex 钩子载荷仅在 Codex 插件数据目录写入会话级去重状态不发任何网络请求README Privacy 一节。许可证为 MIT见 LICENSE 与 NOTICE。九、总结从 CHANGELOG 的两次发布可以看出codex-rules的清晰演进路线0.1.0 完成移植落地——把pi-rules的规则能力以四个生命周期钩子、持久化去重、Codex 感知路径提取的形态接入 Codex 生态Unreleased 阶段则聚焦收敛与加固——收紧PostToolUse匹配器到规范工具名、引入NODE_DEBUGcodex-rules分阶段计时、加固动态钩子的边界场景、用内部匹配器去掉生产依赖、限制目录扫描递归并补齐 Windows CI。对使用者而言理解hooks.json的注册结构、CODEX_RULES_*配置语义与 codex-hook.ts 的双通道注入流程就足以对插件进行部署、调参与二次开发。【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表