From a52ea087ba3273b62fe9092a3a1876eb33889ed2 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 16 May 2026 16:34:22 +0900 Subject: [PATCH 01/13] fix(rules): harden codex post-tool hooks Track Codex MCP filesystem PostToolUse paths and keep dynamic rule injection aligned with the plugin hook output contract. Remove stale tracked-tool constants and duplicate apply_patch path scanning while adding contract, deduplication, and no-op tests. Plan: plans/post-hook-support-codex-plugins.md --- CHANGELOG.md | 6 +++ README.md | 5 +- dist/rules/constants.d.ts | 5 -- dist/rules/constants.d.ts.map | 2 +- dist/rules/constants.js | 5 -- dist/rules/constants.js.map | 2 +- dist/tool-paths.d.ts.map | 2 +- dist/tool-paths.js | 7 ++- dist/tool-paths.js.map | 2 +- hooks/hooks.json | 2 +- skills/rules/SKILL.md | 4 +- src/rules/constants.ts | 6 --- src/tool-paths.ts | 7 ++- test/codex-hook.test.ts | 88 ++++++++++++++++++++++++++++++++++ test/tool-paths.test.ts | 89 +++++++++++++++++++++++++++++++++++ 15 files changed, 201 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f19670..c04935b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +- Add `PostToolUse` matching for MCP filesystem write, edit, and multi-read payloads. +- Harden dynamic hook coverage for additional-context JSON output, disabled/static modes, failed tool responses, and duplicate suppression. +- Remove redundant apply_patch path scanning and stale tracked-tool constants. + ## 0.1.0 - 2026-05-15 - Port `pi-rules` rule loading, matching, formatting, truncation, and deduplication to a Codex plugin. diff --git a/README.md b/README.md index 2e871be..1c9b29f 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,11 @@ Codex plugin that injects local project rule files into model context through li It ports the `pi-rules` rule injector to Codex: - `SessionStart` and `UserPromptSubmit` load static project instructions once per session. -- `PostToolUse` watches file reads and edits, then injects matching file-specific rules. +- `PostToolUse` watches supported file reads, edits, `apply_patch`, MCP filesystem payloads, and shell command file references, then injects matching file-specific rules as additional context. - Session-level deduplication prevents the same rule from being repeated after it has been injected. +`PostToolUse` output is context-only: it emits `hookSpecificOutput.additionalContext` and does not rewrite tool output. + ## Rule Sources Project-level sources: @@ -55,6 +57,7 @@ It also enables: ```toml [features] plugins = true +plugin_hooks = true [plugins."codex-rules@code-yeongyu-codex-plugins"] enabled = true diff --git a/dist/rules/constants.d.ts b/dist/rules/constants.d.ts index 5886ded..f78b1a3 100644 --- a/dist/rules/constants.d.ts +++ b/dist/rules/constants.d.ts @@ -45,11 +45,6 @@ export declare const DEFAULT_MAX_RESULT_CHARS = 40000; * Truncation marker template. `{path}` is replaced with the relative path. */ export declare const TRUNCATION_NOTICE = "\n\n[Rule truncated. Read full rule: {path}]"; -/** - * Built-in tool names whose results trigger dynamic rule injection. - */ -export declare const TRACKED_BUILTIN_TOOLS: readonly string[]; -export declare const TRACKED_BUILTIN_TOOL_SET: ReadonlySet; /** * Directories excluded by the recursive scanner regardless of glob settings. */ diff --git a/dist/rules/constants.d.ts.map b/dist/rules/constants.d.ts.map index aec4f2c..dfce850 100644 --- a/dist/rules/constants.d.ts.map +++ b/dist/rules/constants.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4D,CAAC;AAEjH;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAwD,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAc1D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAA8B,CAAC;AAClF,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAkC,CAAC;AAE5F;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4D,CAAC;AAEjH;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAwD,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAc1D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC"} \ No newline at end of file diff --git a/dist/rules/constants.js b/dist/rules/constants.js index 34d264c..f3a7246 100644 --- a/dist/rules/constants.js +++ b/dist/rules/constants.js @@ -76,11 +76,6 @@ export const DEFAULT_MAX_RESULT_CHARS = 40000; * Truncation marker template. `{path}` is replaced with the relative path. */ export const TRUNCATION_NOTICE = "\n\n[Rule truncated. Read full rule: {path}]"; -/** - * Built-in tool names whose results trigger dynamic rule injection. - */ -export const TRACKED_BUILTIN_TOOLS = ["read", "edit", "write"]; -export const TRACKED_BUILTIN_TOOL_SET = new Set(TRACKED_BUILTIN_TOOLS); /** * Directories excluded by the recursive scanner regardless of glob settings. */ diff --git a/dist/rules/constants.js.map b/dist/rules/constants.js.map index 93a74b2..39ca804 100644 --- a/dist/rules/constants.js.map +++ b/dist/rules/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,MAAM;IACN,qBAAqB;IACrB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6C;IAC7E,CAAC,WAAW,EAAE,OAAO,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACtD,iCAAiC;IACjC,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAEjH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACvE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3B,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAE5F;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACvD,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,MAAM;IACN,qBAAqB;IACrB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6C;IAC7E,CAAC,WAAW,EAAE,OAAO,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACtD,iCAAiC;IACjC,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAEjH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACvE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3B,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACvD,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC"} \ No newline at end of file diff --git a/dist/tool-paths.d.ts.map b/dist/tool-paths.d.ts.map index 35a62a1..66f4a6c 100644 --- a/dist/tool-paths.d.ts.map +++ b/dist/tool-paths.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"tool-paths.d.ts","sourceRoot":"","sources":["../src/tool-paths.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACvB;AAkBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBxF"} \ No newline at end of file +{"version":3,"file":"tool-paths.d.ts","sourceRoot":"","sources":["../src/tool-paths.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACvB;AAoBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxF"} \ No newline at end of file diff --git a/dist/tool-paths.js b/dist/tool-paths.js index 7d33486..70491d5 100644 --- a/dist/tool-paths.js +++ b/dist/tool-paths.js @@ -1,11 +1,13 @@ import { existsSync, statSync } from "node:fs"; import { isAbsolute, resolve } from "node:path"; const COMMAND_TOOL_NAMES = new Set(["bash", "shell_command", "exec_command"]); -const PATCH_TOOL_NAMES = new Set(["apply_patch"]); const TRACKED_TOOL_NAMES = new Set([ "read", "read_file", "mcp__filesystem__read_file", + "mcp__filesystem__read_multiple_files", + "mcp__filesystem__write_file", + "mcp__filesystem__edit_file", "write", "edit", "multiedit", @@ -26,9 +28,6 @@ export function extractCodexToolPaths(input, cwd) { addPatchPayloadPaths(paths, toolInput, cwd); addPatchRecordPaths(paths, toolInput.files, cwd); addPatchRecordPaths(paths, toolInput.changes, cwd); - if (PATCH_TOOL_NAMES.has(toolName)) { - addPatchPayloadPaths(paths, toolInput, cwd); - } if (COMMAND_TOOL_NAMES.has(toolName)) { const command = stringProperty(toolInput, "command") ?? stringProperty(toolInput, "cmd"); const workdir = stringProperty(toolInput, "workdir") ?? stringProperty(toolInput, "cwd"); diff --git a/dist/tool-paths.js.map b/dist/tool-paths.js.map index cd986ee..c2a3a41 100644 --- a/dist/tool-paths.js.map +++ b/dist/tool-paths.js.map @@ -1 +1 @@ -{"version":3,"file":"tool-paths.js","sourceRoot":"","sources":["../src/tool-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQhD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;AAC9E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAClD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IAClC,MAAM;IACN,WAAW;IACX,4BAA4B;IAC5B,OAAO;IACP,MAAM;IACN,WAAW;IACX,YAAY;IACZ,aAAa;IACb,MAAM;IACN,eAAe;IACf,cAAc;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,KAA2B,EAAE,GAAW;IAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACpF,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC3C,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC5C,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjD,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEnD,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACzF,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACzF,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAkB,EAAE,KAA8B,EAAE,GAAW;IAC3F,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;QAC5F,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACxD,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAkB,EAAE,KAA8B,EAAE,GAAW;IAC5F,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAkB,EAAE,KAAa,EAAE,GAAW;IAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,CAAC,EAAE,CAAC;YAC/E,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAkB,EAAE,KAAc,EAAE,GAAW;IAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACjC,SAAS;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9B,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB,EAAE,OAA2B,EAAE,GAAW;IACpF,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxE,SAAS;QACV,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB,EAAE,KAAc,EAAE,GAAW,EAAE,SAAkB;IACxF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;AACF,CAAC;AAED,SAAS,OAAO,CAAC,KAAkB,EAAE,KAAc,EAAE,GAAW,EAAE,SAAkB;IACnF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,OAAO;IACR,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO;IACR,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,QAAgB;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACvC,IAAI,CAAC;QACJ,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IAClC,OAAO,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,KAA8B,EAAE,GAAW;IAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAqB,IAAI,CAAC;IACnC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,SAAS,CAAC;YACrB,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACV,CAAC;QACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACV,CAAC;QACD,IAAI,CAAC,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChE,KAAK,GAAG,SAAS,CAAC;YAClB,SAAS;QACV,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACV,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC;YACd,CAAC;YACD,SAAS;QACV,CAAC;QACD,OAAO,IAAI,SAAS,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;AAC9G,CAAC"} \ No newline at end of file +{"version":3,"file":"tool-paths.js","sourceRoot":"","sources":["../src/tool-paths.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/hooks/hooks.json b/hooks/hooks.json index 1d08839..b9d359f 100644 --- a/hooks/hooks.json +++ b/hooks/hooks.json @@ -26,7 +26,7 @@ ], "PostToolUse": [ { - "matcher": "^(apply_patch|read|Read|read_file|mcp__filesystem__read_file|write|Write|edit|Edit|multi_edit|MultiEdit|multiedit|bash|Bash|shell_command|exec_command)$", + "matcher": "^(apply_patch|read|Read|read_file|mcp__filesystem__read_file|mcp__filesystem__read_multiple_files|mcp__filesystem__write_file|mcp__filesystem__edit_file|write|Write|edit|Edit|multi_edit|MultiEdit|multiedit|bash|Bash|shell_command|exec_command)$", "hooks": [ { "type": "command", diff --git a/skills/rules/SKILL.md b/skills/rules/SKILL.md index 6e6538c..0afd2b2 100644 --- a/skills/rules/SKILL.md +++ b/skills/rules/SKILL.md @@ -8,7 +8,9 @@ description: Use when the user asks about Codex Rules behavior, injected project Codex Rules is automatic once the plugin is enabled. It injects: - static project instructions on `SessionStart` and `UserPromptSubmit` -- matching file-specific rules after tracked `PostToolUse` file reads/edits +- matching file-specific rules after tracked `PostToolUse` file reads, edits, patches, MCP filesystem payloads, and shell command file references + +Dynamic `PostToolUse` output is injected as additional context and is deduplicated per plugin data session. Codex Rules does not rewrite tool output. Supported project sources: diff --git a/src/rules/constants.ts b/src/rules/constants.ts index c4bd466..bc49111 100644 --- a/src/rules/constants.ts +++ b/src/rules/constants.ts @@ -89,12 +89,6 @@ export const DEFAULT_MAX_RESULT_CHARS = 40000; */ export const TRUNCATION_NOTICE = "\n\n[Rule truncated. Read full rule: {path}]"; -/** - * Built-in tool names whose results trigger dynamic rule injection. - */ -export const TRACKED_BUILTIN_TOOLS: readonly string[] = ["read", "edit", "write"]; -export const TRACKED_BUILTIN_TOOL_SET: ReadonlySet = new Set(TRACKED_BUILTIN_TOOLS); - /** * Directories excluded by the recursive scanner regardless of glob settings. */ diff --git a/src/tool-paths.ts b/src/tool-paths.ts index b7cea83..f6d7175 100644 --- a/src/tool-paths.ts +++ b/src/tool-paths.ts @@ -8,11 +8,13 @@ export interface CodexPostToolUseLike { } const COMMAND_TOOL_NAMES = new Set(["bash", "shell_command", "exec_command"]); -const PATCH_TOOL_NAMES = new Set(["apply_patch"]); const TRACKED_TOOL_NAMES = new Set([ "read", "read_file", "mcp__filesystem__read_file", + "mcp__filesystem__read_multiple_files", + "mcp__filesystem__write_file", + "mcp__filesystem__edit_file", "write", "edit", "multiedit", @@ -36,9 +38,6 @@ export function extractCodexToolPaths(input: CodexPostToolUseLike, cwd: string): addPatchRecordPaths(paths, toolInput.files, cwd); addPatchRecordPaths(paths, toolInput.changes, cwd); - if (PATCH_TOOL_NAMES.has(toolName)) { - addPatchPayloadPaths(paths, toolInput, cwd); - } if (COMMAND_TOOL_NAMES.has(toolName)) { const command = stringProperty(toolInput, "command") ?? stringProperty(toolInput, "cmd"); const workdir = stringProperty(toolInput, "workdir") ?? stringProperty(toolInput, "cwd"); diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index 9b07fb6..4c9c8e8 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -148,5 +148,93 @@ describe("codex rules hooks", () => { "Additional project instructions matched for src/app.ts", ); expect(parsed.hookSpecificOutput?.additionalContext).toContain("Prefer strict TypeScript"); + expect(output).not.toContain("updatedMCPToolOutput"); + expect(output).not.toContain("suppressOutput"); + expect(output).not.toContain('"decision"'); + }); + + it("#given dynamic context already injected #when PostToolUse repeats #then emits no duplicate context", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + const input = postToolUseInput(root, filePath); + await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + + // when + const output = await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + + // then + expect(output).toBe(""); + }); + + it("#given static-only mode #when PostToolUse runs #then emits no dynamic context", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + + // when + const output = await runPostToolUseHook(postToolUseInput(root, filePath), { + pluginDataRoot: pluginData, + env: { + ...PROJECT_ONLY_ENV, + CODEX_RULES_MODE: "static", + }, + }); + + // then + expect(output).toBe(""); + }); + + it("#given rules disabled #when PostToolUse runs #then emits no dynamic context", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + + // when + const output = await runPostToolUseHook(postToolUseInput(root, filePath), { + pluginDataRoot: pluginData, + env: { + ...PROJECT_ONLY_ENV, + CODEX_RULES_DISABLED: "true", + }, + }); + + // then + expect(output).toBe(""); + }); + + it("#given failed tool response #when PostToolUse runs #then emits no dynamic context", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + + // when + const output = await runPostToolUseHook( + { + ...postToolUseInput(root, filePath), + tool_response: { is_error: true }, + }, + { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }, + ); + + // then + expect(output).toBe(""); + }); + + it("#given tracked tool without path #when PostToolUse runs #then emits no dynamic context", async () => { + // given + const { root, pluginData } = makeTempProject(); + + // when + const output = await runPostToolUseHook( + { + ...postToolUseInput(root, ""), + tool_input: {}, + }, + { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }, + ); + + // then + expect(output).toBe(""); }); }); diff --git a/test/tool-paths.test.ts b/test/tool-paths.test.ts index acf0181..17be094 100644 --- a/test/tool-paths.test.ts +++ b/test/tool-paths.test.ts @@ -72,6 +72,95 @@ describe("extractCodexToolPaths", () => { expect(paths).toEqual([path.join(root, "src", "app.ts")]); }); + it("#given apply_patch add update and move payload #when extracting #then returns each target once", () => { + // given + const root = makeProject(); + + // when + const paths = extractCodexToolPaths( + postToolUse({ + toolName: "apply_patch", + toolInput: { + command: [ + "*** Begin Patch", + "*** Add File: src/new.ts", + "+export const created = true;", + "*** Update File: src/app.ts", + "*** Move to: src/moved.ts", + "@@", + "-export const app = true;", + "+export const moved = true;", + "*** Update File: src/moved.ts", + "@@", + "-export const moved = true;", + "+export const moved = false;", + "*** End Patch", + ].join("\n"), + }, + }), + root, + ); + + // then + expect(paths).toEqual([ + path.join(root, "src", "new.ts"), + path.join(root, "src", "app.ts"), + path.join(root, "src", "moved.ts"), + ]); + }); + + it("#given mcp write-file payload #when extracting #then returns resolved path", () => { + // given + const root = makeProject(); + + // when + const paths = extractCodexToolPaths( + postToolUse({ + toolName: "mcp__filesystem__write_file", + toolInput: { path: "src/app.ts", content: "export const app = true;\n" }, + }), + root, + ); + + // then + expect(paths).toEqual([path.join(root, "src", "app.ts")]); + }); + + it("#given mcp edit-file payload #when extracting #then returns resolved path", () => { + // given + const root = makeProject(); + + // when + const paths = extractCodexToolPaths( + postToolUse({ + toolName: "mcp__filesystem__edit_file", + toolInput: { path: "src/app.ts", edits: [] }, + }), + root, + ); + + // then + expect(paths).toEqual([path.join(root, "src", "app.ts")]); + }); + + it("#given mcp read-multiple-files payload #when extracting #then returns all resolved paths", () => { + // given + const root = makeProject(); + writeFileSync(path.join(root, "src", "other.ts"), "export const other = true;\n"); + + // when + const paths = extractCodexToolPaths( + postToolUse({ + toolName: "mcp__filesystem__read_multiple_files", + toolInput: { paths: ["src/app.ts", "src/other.ts"] }, + }), + root, + ); + + // then + expect(paths).toEqual([path.join(root, "src", "app.ts"), path.join(root, "src", "other.ts")]); + }); + it("#given shell command payload #when extracting #then returns only existing file tokens", () => { // given const root = makeProject(); From 2ab086c511f0488d7e64e79ff6ac10b5255ff739 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 16 May 2026 19:35:30 +0900 Subject: [PATCH 02/13] chore(rules): harden portable scanning Pin plugin metadata, use Codex-managed plugin-root interpolation, cap recursive rule scans, and add package/scanner regression tests with Windows CI coverage. Plan: ../plans/plugin-portability-hardening.md --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 2 ++ README.md | 1 + dist/rules/constants.d.ts | 1 + dist/rules/constants.d.ts.map | 2 +- dist/rules/constants.js | 1 + dist/rules/constants.js.map | 2 +- dist/rules/scanner.d.ts | 1 + dist/rules/scanner.d.ts.map | 2 +- dist/rules/scanner.js | 30 ++++++++++++++++++++------- dist/rules/scanner.js.map | 2 +- hooks/hooks.json | 6 +++--- package.json | 1 + src/rules/constants.ts | 2 ++ src/rules/scanner.ts | 32 ++++++++++++++++++++++++----- test/package-smoke.test.ts | 38 +++++++++++++++++++++++++++++++++++ test/scanner.test.ts | 31 ++++++++++++++++++++++++++++ 17 files changed, 136 insertions(+), 20 deletions(-) create mode 100644 test/package-smoke.test.ts create mode 100644 test/scanner.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 495dba0..6cc7a16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] node: ["20", "22"] steps: - name: Checkout diff --git a/CHANGELOG.md b/CHANGELOG.md index c04935b..3333e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - Add `PostToolUse` matching for MCP filesystem write, edit, and multi-read payloads. - Harden dynamic hook coverage for additional-context JSON output, disabled/static modes, failed tool responses, and duplicate suppression. - Remove redundant apply_patch path scanning and stale tracked-tool constants. +- Use 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. ## 0.1.0 - 2026-05-15 diff --git a/README.md b/README.md index 1c9b29f..74b11f5 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ For migration from `pi-rules`, equivalent `PI_RULES_*` variables are accepted as npm install npm test npm run check +npm run typecheck npm pack --dry-run ``` diff --git a/dist/rules/constants.d.ts b/dist/rules/constants.d.ts index f78b1a3..4578725 100644 --- a/dist/rules/constants.d.ts +++ b/dist/rules/constants.d.ts @@ -37,6 +37,7 @@ export declare const GLOBAL_DISTANCE = 9999; * Per-rule body character cap (default). */ export declare const DEFAULT_MAX_RULE_CHARS = 12000; +export declare const DEFAULT_MAX_SCAN_FILES = 1000; /** * Total injected chars per tool result (default). */ diff --git a/dist/rules/constants.d.ts.map b/dist/rules/constants.d.ts.map index dfce850..b92af79 100644 --- a/dist/rules/constants.d.ts.map +++ b/dist/rules/constants.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4D,CAAC;AAEjH;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAwD,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAc1D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4D,CAAC;AAEjH;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAwD,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAc1D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC"} \ No newline at end of file diff --git a/dist/rules/constants.js b/dist/rules/constants.js index f3a7246..a737faa 100644 --- a/dist/rules/constants.js +++ b/dist/rules/constants.js @@ -68,6 +68,7 @@ export const GLOBAL_DISTANCE = 9999; * Per-rule body character cap (default). */ export const DEFAULT_MAX_RULE_CHARS = 12000; +export const DEFAULT_MAX_SCAN_FILES = 1000; /** * Total injected chars per tool result (default). */ diff --git a/dist/rules/constants.js.map b/dist/rules/constants.js.map index 39ca804..8b7f7c8 100644 --- a/dist/rules/constants.js.map +++ b/dist/rules/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,MAAM;IACN,qBAAqB;IACrB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6C;IAC7E,CAAC,WAAW,EAAE,OAAO,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACtD,iCAAiC;IACjC,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAEjH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACvE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3B,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACvD,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,MAAM;IACN,qBAAqB;IACrB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6C;IAC7E,CAAC,WAAW,EAAE,OAAO,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACtD,iCAAiC;IACjC,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAEjH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACvE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3B,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACvD,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC"} \ No newline at end of file diff --git a/dist/rules/scanner.d.ts b/dist/rules/scanner.d.ts index 70bc265..3bc07e4 100644 --- a/dist/rules/scanner.d.ts +++ b/dist/rules/scanner.d.ts @@ -3,6 +3,7 @@ export interface ScanOptions { excludedDirs?: ReadonlyArray; /** Maximum recursion depth. Default: 10 */ maxDepth?: number; + maxFiles?: number; } export interface ScannedFile { /** Absolute path as encountered (may be a symlink). */ diff --git a/dist/rules/scanner.d.ts.map b/dist/rules/scanner.d.ts.map index 998db9a..c7909d7 100644 --- a/dist/rules/scanner.d.ts.map +++ b/dist/rules/scanner.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/rules/scanner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,EAAE,CAwBjE"} \ No newline at end of file +{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/rules/scanner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,EAAE,CAyBjE"} \ No newline at end of file diff --git a/dist/rules/scanner.js b/dist/rules/scanner.js index 8b27872..a2985d7 100644 --- a/dist/rules/scanner.js +++ b/dist/rules/scanner.js @@ -1,6 +1,6 @@ import { existsSync, lstatSync, readdirSync, realpathSync, statSync } from "node:fs"; import { isAbsolute, join, resolve } from "node:path"; -import { RULE_FILE_EXTENSIONS, SCANNER_EXCLUDED_DIRS } from "./constants.js"; +import { DEFAULT_MAX_SCAN_FILES, RULE_FILE_EXTENSIONS, SCANNER_EXCLUDED_DIRS } from "./constants.js"; export function scanRuleFiles(options) { const rootPath = toAbsolutePath(options.rootDir); if (!existsSync(rootPath)) { @@ -20,13 +20,23 @@ export function scanRuleFiles(options) { const visitedDirectories = new Set(); const excludedDirs = new Set(options.excludedDirs ?? SCANNER_EXCLUDED_DIRS); const maxDepth = options.maxDepth ?? 10; - scanDirectory(rootPath, 0, maxDepth, excludedDirs, visitedDirectories, results); + const maxFiles = normalizeMaxFiles(options.maxFiles); + scanDirectory(rootPath, 0, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); return results; } +function normalizeMaxFiles(maxFiles) { + const value = maxFiles ?? DEFAULT_MAX_SCAN_FILES; + if (!Number.isFinite(value) || value < 0) + return DEFAULT_MAX_SCAN_FILES; + return Math.floor(value); +} function toAbsolutePath(filePath) { return isAbsolute(filePath) ? filePath : resolve(filePath); } -function scanDirectory(directoryPath, depth, maxDepth, excludedDirs, visitedDirectories, results) { +function scanDirectory(directoryPath, depth, maxDepth, maxFiles, excludedDirs, visitedDirectories, results) { + if (results.length >= maxFiles) { + return; + } let realDirectoryPath; try { realDirectoryPath = realpathSync.native(directoryPath); @@ -46,15 +56,18 @@ function scanDirectory(directoryPath, depth, maxDepth, excludedDirs, visitedDire return; } for (const entry of entries) { + if (results.length >= maxFiles) { + return; + } const entryPath = join(directoryPath, entry.name); if (entry.isDirectory()) { if (!excludedDirs.has(entry.name) && depth < maxDepth) { - scanDirectory(entryPath, depth + 1, maxDepth, excludedDirs, visitedDirectories, results); + scanDirectory(entryPath, depth + 1, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); } continue; } if (entry.isSymbolicLink()) { - scanSymbolicLink(entryPath, entry.name, depth, maxDepth, excludedDirs, visitedDirectories, results); + scanSymbolicLink(entryPath, entry.name, depth, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); continue; } if (entry.isFile() && isRuleFile(entry.name)) { @@ -62,7 +75,10 @@ function scanDirectory(directoryPath, depth, maxDepth, excludedDirs, visitedDire } } } -function scanSymbolicLink(linkPath, linkName, depth, maxDepth, excludedDirs, visitedDirectories, results) { +function scanSymbolicLink(linkPath, linkName, depth, maxDepth, maxFiles, excludedDirs, visitedDirectories, results) { + if (results.length >= maxFiles) { + return; + } let targetStats; try { targetStats = statSync(linkPath); @@ -72,7 +88,7 @@ function scanSymbolicLink(linkPath, linkName, depth, maxDepth, excludedDirs, vis } if (targetStats.isDirectory()) { if (!excludedDirs.has(linkName) && depth < maxDepth) { - scanDirectory(linkPath, depth + 1, maxDepth, excludedDirs, visitedDirectories, results); + scanDirectory(linkPath, depth + 1, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); } return; } diff --git a/dist/rules/scanner.js.map b/dist/rules/scanner.js.map index ef7cb48..cbfdc32 100644 --- a/dist/rules/scanner.js.map +++ b/dist/rules/scanner.js.map @@ -1 +1 @@ -{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/rules/scanner.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/rules/scanner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/hooks/hooks.json b/hooks/hooks.json index b9d359f..0421ed0 100644 --- a/hooks/hooks.json +++ b/hooks/hooks.json @@ -5,7 +5,7 @@ "hooks": [ { "type": "command", - "command": "node \"$PLUGIN_ROOT/dist/cli.js\" hook session-start", + "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start", "timeout": 10, "statusMessage": "loading project rules" } @@ -17,7 +17,7 @@ "hooks": [ { "type": "command", - "command": "node \"$PLUGIN_ROOT/dist/cli.js\" hook user-prompt-submit", + "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit", "timeout": 10, "statusMessage": "loading project rules" } @@ -30,7 +30,7 @@ "hooks": [ { "type": "command", - "command": "node \"$PLUGIN_ROOT/dist/cli.js\" hook post-tool-use", + "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use", "timeout": 10, "statusMessage": "matching project rules" } diff --git a/package.json b/package.json index c0f7593..c29e3c8 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.", "type": "module", + "packageManager": "npm@11.12.1", "license": "MIT", "homepage": "https://github.com/code-yeongyu/codex-rules", "repository": { diff --git a/src/rules/constants.ts b/src/rules/constants.ts index bc49111..f30be5c 100644 --- a/src/rules/constants.ts +++ b/src/rules/constants.ts @@ -79,6 +79,8 @@ export const GLOBAL_DISTANCE = 9999; */ export const DEFAULT_MAX_RULE_CHARS = 12000; +export const DEFAULT_MAX_SCAN_FILES = 1000; + /** * Total injected chars per tool result (default). */ diff --git a/src/rules/scanner.ts b/src/rules/scanner.ts index 839985a..8c6f4ef 100644 --- a/src/rules/scanner.ts +++ b/src/rules/scanner.ts @@ -1,13 +1,14 @@ import { type Dirent, existsSync, lstatSync, readdirSync, realpathSync, type Stats, statSync } from "node:fs"; import { isAbsolute, join, resolve } from "node:path"; -import { RULE_FILE_EXTENSIONS, SCANNER_EXCLUDED_DIRS } from "./constants.js"; +import { DEFAULT_MAX_SCAN_FILES, RULE_FILE_EXTENSIONS, SCANNER_EXCLUDED_DIRS } from "./constants.js"; export interface ScanOptions { rootDir: string; excludedDirs?: ReadonlyArray; /** Maximum recursion depth. Default: 10 */ maxDepth?: number; + maxFiles?: number; } export interface ScannedFile { @@ -38,11 +39,18 @@ export function scanRuleFiles(options: ScanOptions): ScannedFile[] { const visitedDirectories = new Set(); const excludedDirs = new Set(options.excludedDirs ?? SCANNER_EXCLUDED_DIRS); const maxDepth = options.maxDepth ?? 10; + const maxFiles = normalizeMaxFiles(options.maxFiles); - scanDirectory(rootPath, 0, maxDepth, excludedDirs, visitedDirectories, results); + scanDirectory(rootPath, 0, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); return results; } +function normalizeMaxFiles(maxFiles: number | undefined): number { + const value = maxFiles ?? DEFAULT_MAX_SCAN_FILES; + if (!Number.isFinite(value) || value < 0) return DEFAULT_MAX_SCAN_FILES; + return Math.floor(value); +} + function toAbsolutePath(filePath: string): string { return isAbsolute(filePath) ? filePath : resolve(filePath); } @@ -51,10 +59,15 @@ function scanDirectory( directoryPath: string, depth: number, maxDepth: number, + maxFiles: number, excludedDirs: ReadonlySet, visitedDirectories: Set, results: ScannedFile[], ): void { + if (results.length >= maxFiles) { + return; + } + let realDirectoryPath: string; try { realDirectoryPath = realpathSync.native(directoryPath); @@ -77,17 +90,21 @@ function scanDirectory( } for (const entry of entries) { + if (results.length >= maxFiles) { + return; + } + const entryPath = join(directoryPath, entry.name); if (entry.isDirectory()) { if (!excludedDirs.has(entry.name) && depth < maxDepth) { - scanDirectory(entryPath, depth + 1, maxDepth, excludedDirs, visitedDirectories, results); + scanDirectory(entryPath, depth + 1, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); } continue; } if (entry.isSymbolicLink()) { - scanSymbolicLink(entryPath, entry.name, depth, maxDepth, excludedDirs, visitedDirectories, results); + scanSymbolicLink(entryPath, entry.name, depth, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); continue; } @@ -102,10 +119,15 @@ function scanSymbolicLink( linkName: string, depth: number, maxDepth: number, + maxFiles: number, excludedDirs: ReadonlySet, visitedDirectories: Set, results: ScannedFile[], ): void { + if (results.length >= maxFiles) { + return; + } + let targetStats: Stats; try { targetStats = statSync(linkPath); @@ -115,7 +137,7 @@ function scanSymbolicLink( if (targetStats.isDirectory()) { if (!excludedDirs.has(linkName) && depth < maxDepth) { - scanDirectory(linkPath, depth + 1, maxDepth, excludedDirs, visitedDirectories, results); + scanDirectory(linkPath, depth + 1, maxDepth, maxFiles, excludedDirs, visitedDirectories, results); } return; } diff --git a/test/package-smoke.test.ts b/test/package-smoke.test.ts new file mode 100644 index 0000000..aaae30f --- /dev/null +++ b/test/package-smoke.test.ts @@ -0,0 +1,38 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +function readJson(path: string): Record { + return JSON.parse(readFileSync(path, "utf8")) as Record; +} + +describe("plugin package metadata", () => { + it("#given packaged plugin files #when validating entrypoints #then hook commands use portable plugin root interpolation", () => { + // given + const packageJson = readJson("package.json"); + const pluginJson = readJson(".codex-plugin/plugin.json"); + const hooksJson = readJson("hooks/hooks.json"); + const cliSource = readFileSync("src/cli.ts", "utf8"); + + // when + const bin = packageJson.bin as Record; + const hookConfig = hooksJson.hooks as Record }>>; + const pluginRoot = ["$", "{PLUGIN_ROOT}"].join(""); + const commands = [ + hookConfig.SessionStart?.[0]?.hooks[0]?.command, + hookConfig.UserPromptSubmit?.[0]?.hooks[0]?.command, + hookConfig.PostToolUse?.[0]?.hooks[0]?.command, + ]; + + // then + expect(packageJson.type).toBe("module"); + expect(packageJson.packageManager).toBe("npm@11.12.1"); + expect(bin["codex-rules"]).toBe("./dist/cli.js"); + expect(pluginJson.hooks).toBe("./hooks/hooks.json"); + expect(cliSource.startsWith("#!/usr/bin/env node")).toBe(true); + expect(commands).toEqual([ + `node "${pluginRoot}/dist/cli.js" hook session-start`, + `node "${pluginRoot}/dist/cli.js" hook user-prompt-submit`, + `node "${pluginRoot}/dist/cli.js" hook post-tool-use`, + ]); + }); +}); diff --git a/test/scanner.test.ts b/test/scanner.test.ts new file mode 100644 index 0000000..0fdf502 --- /dev/null +++ b/test/scanner.test.ts @@ -0,0 +1,31 @@ +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; + +import { scanRuleFiles } from "../src/rules/scanner.js"; + +const tempDirectories: string[] = []; + +afterEach(() => { + for (const directory of tempDirectories.splice(0)) { + rmSync(directory, { recursive: true, force: true }); + } +}); + +describe("scanRuleFiles", () => { + it("#given more rule files than max #when scanning #then returns only capped files", () => { + // given + const root = mkdtempSync(join(tmpdir(), "codex-rules-scanner-")); + tempDirectories.push(root); + for (let index = 0; index < 5; index += 1) { + writeFileSync(join(root, `rule-${index}.md`), `Rule ${index}\n`); + } + + // when + const files = scanRuleFiles({ rootDir: root, maxFiles: 2 }); + + // then + expect(files).toHaveLength(2); + }); +}); From fa38fe0e9f2c49a2275f0fd7760843eda3a3cfc3 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 16 May 2026 20:11:28 +0900 Subject: [PATCH 03/13] chore(rules): remove runtime glob dependency Replace the external glob matcher with a small internal matcher and pin common recursive, negative, and brace glob behavior. Keep package smoke coverage pinned so clean Codex marketplace copies run without node_modules. Plan: ../plans/plugin-portability-hardening.md --- CHANGELOG.md | 1 + README.md | 4 ++- dist/rules/matcher.d.ts.map | 2 +- dist/rules/matcher.js | 54 ++++++++++++++++++++++++++++++-- dist/rules/matcher.js.map | 2 +- package-lock.json | 12 +------ package.json | 4 --- src/rules/matcher.ts | 62 +++++++++++++++++++++++++++++++++++-- test/matcher.test.ts | 50 ++++++++++++++++++++++++++++++ test/package-smoke.test.ts | 2 ++ 10 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 test/matcher.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3333e71..85c37a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Remove redundant apply_patch path scanning and stale tracked-tool constants. - Use 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. +- Replace the external glob matcher dependency with an internal matcher so clean Codex plugin installs run without `node_modules`. ## 0.1.0 - 2026-05-15 diff --git a/README.md b/README.md index 74b11f5..e3bd04e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ It ports the `pi-rules` rule injector to Codex: `PostToolUse` output is context-only: it emits `hookSpecificOutput.additionalContext` and does not rewrite tool output. +The runtime has no npm production dependencies, so a clean Codex marketplace copy can run without a follow-up `npm install`. + ## Rule Sources Project-level sources: @@ -46,7 +48,7 @@ codex plugin marketplace add /Users/yeongyu/local-workspaces/codex-plugins node /Users/yeongyu/local-workspaces/codex-plugins/scripts/install-local.mjs /Users/yeongyu/local-workspaces/codex-plugins ``` -The local installer builds the plugin, copies a clean cache entry to: +The local installer builds the plugin and copies a clean cache entry to: ```text ~/.codex/plugins/cache/code-yeongyu-codex-plugins/codex-rules/0.1.0 diff --git a/dist/rules/matcher.d.ts.map b/dist/rules/matcher.d.ts.map index 0362008..9a9c7cc 100644 --- a/dist/rules/matcher.d.ts.map +++ b/dist/rules/matcher.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAyC1D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAQrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"} \ No newline at end of file +{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAyC1D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAQrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"} \ No newline at end of file diff --git a/dist/rules/matcher.js b/dist/rules/matcher.js index 7c4ced7..66f0f6c 100644 --- a/dist/rules/matcher.js +++ b/dist/rules/matcher.js @@ -1,5 +1,4 @@ import { createHash } from "node:crypto"; -import picomatch from "picomatch"; export function matchRule(input) { if (input.isSingleFile) { return { matched: true, reason: "single-file" }; @@ -18,9 +17,9 @@ export function matchRule(input) { ].filter((pathBase) => pathBase !== undefined); const positivePatterns = patterns.filter((pattern) => !pattern.startsWith("!")); const negativePatterns = patterns.filter((pattern) => pattern.startsWith("!")); - const negativeMatchers = negativePatterns.map((pattern) => picomatch(pattern.slice(1), { bash: true, dot: true })); + const negativeMatchers = negativePatterns.map((pattern) => createGlobMatcher(pattern.slice(1))); for (const pattern of positivePatterns) { - const isMatch = picomatch(pattern, { bash: true, dot: true }); + const isMatch = createGlobMatcher(pattern); for (const pathBase of pathBases) { if (!isMatch(pathBase)) { continue; @@ -53,6 +52,55 @@ function normalizePatternList(patterns) { function normalizePath(path) { return path.replaceAll("\\", "/"); } +function createGlobMatcher(pattern) { + const expression = globToRegExp(normalizePath(pattern)); + return (path) => expression.test(path); +} +function globToRegExp(pattern) { + let source = "^"; + for (let index = 0; index < pattern.length; index += 1) { + const char = pattern[index]; + const nextChar = pattern[index + 1]; + if (char === "*" && nextChar === "*") { + const afterGlobStar = pattern[index + 2]; + if (afterGlobStar === "/") { + source += "(?:.*/)?"; + index += 2; + } + else { + source += ".*"; + index += 1; + } + continue; + } + if (char === "*") { + source += "[^/]*"; + continue; + } + if (char === "?") { + source += "[^/]"; + continue; + } + if (char === "{") { + const closeIndex = pattern.indexOf("}", index + 1); + if (closeIndex !== -1) { + const alternatives = pattern + .slice(index + 1, closeIndex) + .split(",") + .map(escapeRegExp) + .join("|"); + source += `(?:${alternatives})`; + index = closeIndex; + continue; + } + } + source += escapeRegExp(char ?? ""); + } + return new RegExp(`${source}$`); +} +function escapeRegExp(value) { + return value.replace(/[\\^$+?.()|[\]{}]/g, "\\$&"); +} function isExcluded(pathBase, negativeMatchers) { for (const isMatch of negativeMatchers) { if (isMatch(pathBase)) { diff --git a/dist/rules/matcher.js.map b/dist/rules/matcher.js.map index c0d1c50..518bf8a 100644 --- a/dist/rules/matcher.js.map +++ b/dist/rules/matcher.js.map @@ -1 +1 @@ -{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b90e452..46abb68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,12 @@ "name": "@code-yeongyu/codex-rules", "version": "0.1.0", "license": "MIT", - "dependencies": { - "picomatch": "^4.0.3" - }, "bin": { "codex-rules": "dist/cli.js" }, "devDependencies": { "@biomejs/biome": "2.4.15", "@types/node": "^25.7.0", - "@types/picomatch": "^4.0.0", "typescript": "^6.0.3", "vitest": "^4.1.5" }, @@ -605,13 +601,6 @@ "undici-types": ">=7.24.0 <7.24.7" } }, - "node_modules/@types/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", @@ -1153,6 +1142,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" diff --git a/package.json b/package.json index c29e3c8..e980f79 100644 --- a/package.json +++ b/package.json @@ -44,13 +44,9 @@ "lint:fix": "biome check --write .", "check": "tsc --noEmit && biome check . && npm run build" }, - "dependencies": { - "picomatch": "^4.0.3" - }, "devDependencies": { "@biomejs/biome": "2.4.15", "@types/node": "^25.7.0", - "@types/picomatch": "^4.0.0", "typescript": "^6.0.3", "vitest": "^4.1.5" }, diff --git a/src/rules/matcher.ts b/src/rules/matcher.ts index 40bded9..d0964d1 100644 --- a/src/rules/matcher.ts +++ b/src/rules/matcher.ts @@ -1,5 +1,4 @@ import { createHash } from "node:crypto"; -import picomatch from "picomatch"; import type { MatchReason, RuleFrontmatter } from "./types.js"; export interface MatcherInput { @@ -36,10 +35,10 @@ export function matchRule(input: MatcherInput): MatchResult { const positivePatterns = patterns.filter((pattern) => !pattern.startsWith("!")); const negativePatterns = patterns.filter((pattern) => pattern.startsWith("!")); - const negativeMatchers = negativePatterns.map((pattern) => picomatch(pattern.slice(1), { bash: true, dot: true })); + const negativeMatchers = negativePatterns.map((pattern) => createGlobMatcher(pattern.slice(1))); for (const pattern of positivePatterns) { - const isMatch = picomatch(pattern, { bash: true, dot: true }); + const isMatch = createGlobMatcher(pattern); for (const pathBase of pathBases) { if (!isMatch(pathBase)) { @@ -83,6 +82,63 @@ function normalizePath(path: string): string { return path.replaceAll("\\", "/"); } +function createGlobMatcher(pattern: string): (path: string) => boolean { + const expression = globToRegExp(normalizePath(pattern)); + return (path: string) => expression.test(path); +} + +function globToRegExp(pattern: string): RegExp { + let source = "^"; + for (let index = 0; index < pattern.length; index += 1) { + const char = pattern[index]; + const nextChar = pattern[index + 1]; + + if (char === "*" && nextChar === "*") { + const afterGlobStar = pattern[index + 2]; + if (afterGlobStar === "/") { + source += "(?:.*/)?"; + index += 2; + } else { + source += ".*"; + index += 1; + } + continue; + } + + if (char === "*") { + source += "[^/]*"; + continue; + } + + if (char === "?") { + source += "[^/]"; + continue; + } + + if (char === "{") { + const closeIndex = pattern.indexOf("}", index + 1); + if (closeIndex !== -1) { + const alternatives = pattern + .slice(index + 1, closeIndex) + .split(",") + .map(escapeRegExp) + .join("|"); + source += `(?:${alternatives})`; + index = closeIndex; + continue; + } + } + + source += escapeRegExp(char ?? ""); + } + + return new RegExp(`${source}$`); +} + +function escapeRegExp(value: string): string { + return value.replace(/[\\^$+?.()|[\]{}]/g, "\\$&"); +} + function isExcluded(pathBase: string, negativeMatchers: ReadonlyArray<(path: string) => boolean>): boolean { for (const isMatch of negativeMatchers) { if (isMatch(pathBase)) { diff --git a/test/matcher.test.ts b/test/matcher.test.ts new file mode 100644 index 0000000..de27b60 --- /dev/null +++ b/test/matcher.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from "vitest"; + +import { matchRule } from "../src/rules/matcher.js"; +import type { RuleFrontmatter } from "../src/rules/types.js"; + +function matchGlobs(globs: string | string[], projectRelative: string): boolean { + return matchRule({ + frontmatter: { globs } satisfies RuleFrontmatter, + isSingleFile: false, + pathBases: { + projectRelative, + basename: projectRelative.split("/").at(-1) ?? projectRelative, + }, + }).matched; +} + +describe("matchRule", () => { + it("#given recursive glob #when target is nested #then matches without runtime dependencies", () => { + // given + const globs = "**/*.ts"; + + // when + const matched = matchGlobs(globs, "src/features/app.ts"); + + // then + expect(matched).toBe(true); + }); + + it("#given negative glob #when target is excluded #then no match is returned", () => { + // given + const globs = ["**/*.ts", "!**/*.test.ts"]; + + // when + const matched = matchGlobs(globs, "src/features/app.test.ts"); + + // then + expect(matched).toBe(false); + }); + + it("#given brace glob #when target extension is listed #then matches", () => { + // given + const globs = "src/**/*.{ts,tsx}"; + + // when + const matched = matchGlobs(globs, "src/features/app.tsx"); + + // then + expect(matched).toBe(true); + }); +}); diff --git a/test/package-smoke.test.ts b/test/package-smoke.test.ts index aaae30f..44355bd 100644 --- a/test/package-smoke.test.ts +++ b/test/package-smoke.test.ts @@ -15,6 +15,7 @@ describe("plugin package metadata", () => { // when const bin = packageJson.bin as Record; + const dependencies = packageJson.dependencies as Record | undefined; const hookConfig = hooksJson.hooks as Record }>>; const pluginRoot = ["$", "{PLUGIN_ROOT}"].join(""); const commands = [ @@ -26,6 +27,7 @@ describe("plugin package metadata", () => { // then expect(packageJson.type).toBe("module"); expect(packageJson.packageManager).toBe("npm@11.12.1"); + expect(dependencies ?? {}).toEqual({}); expect(bin["codex-rules"]).toBe("./dist/cli.js"); expect(pluginJson.hooks).toBe("./hooks/hooks.json"); expect(cliSource.startsWith("#!/usr/bin/env node")).toBe(true); From 4d502b090aa06da42b4e469c3a4273b824c517b3 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 00:07:22 +0900 Subject: [PATCH 04/13] chore(rules): pin LF line endings for Windows CI Git on Windows defaults to core.autocrlf=true and converts LF to CRLF on checkout, which makes biome's --check fail for every TypeScript file (33 errors observed on windows-latest). Add a .gitattributes that forces LF on every checkout so the Windows CI matrix matches Linux/macOS. Plan: ../plans/plugin-portability-hardening.md --- .gitattributes | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9363fdb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +# Normalize line endings: store LF in git, check out LF on every platform. +# Required so biome's --check passes on Windows (default core.autocrlf=true). +* text=auto eol=lf + +# Explicit binary types +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.zip binary +*.tgz binary +*.gz binary From 0910045aa71a4140393e04f2d75d54e8874e5df1 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 00:14:03 +0900 Subject: [PATCH 05/13] fix(rules): normalize displayPath separators for Windows On Windows path.relative() returns backslash-separated paths, so the PostToolUse rule context emitted strings like 'src\app.ts' instead of 'src/app.ts'. Codex feeds additionalContext verbatim into the model prompt, and the rest of the engine already canonicalizes to POSIX via toPosixPath, so align displayPath with the same convention. Pin the new shape in the existing PostToolUse test by adding a negative assertion against the backslash form; the Windows CI matrix is the live regression line. Plan: ../plans/plugin-portability-hardening.md --- dist/codex-hook.js | 6 +++++- dist/codex-hook.js.map | 2 +- src/codex-hook.ts | 6 +++++- test/codex-hook.test.ts | 3 +++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dist/codex-hook.js b/dist/codex-hook.js index fba17d6..1d1bd8d 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -88,6 +88,10 @@ function formatAdditionalContextOutput(eventName, additionalContext) { })}\n`; } function displayPath(cwd, filePath) { - return isAbsolute(filePath) ? relative(cwd, filePath) : filePath; + const rel = isAbsolute(filePath) ? relative(cwd, filePath) : filePath; + // Normalize to POSIX separators so injected rule context renders the same + // path string on Linux/macOS and Windows (Codex feeds this verbatim into + // the model prompt, and the existing engine already emits POSIX paths). + return rel.replaceAll("\\", "/"); } //# sourceMappingURL=codex-hook.js.map \ No newline at end of file diff --git a/dist/codex-hook.js.map b/dist/codex-hook.js.map index 655e4e7..3083510 100644 --- a/dist/codex-hook.js.map +++ b/dist/codex-hook.js.map @@ -1 +1 @@ -{"version":3,"file":"codex-hook.js","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"codex-hook.js","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/codex-hook.ts b/src/codex-hook.ts index a442a1f..fb21b22 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -157,5 +157,9 @@ function formatAdditionalContextOutput(eventName: HookEventName, additionalConte } function displayPath(cwd: string, filePath: string): string { - return isAbsolute(filePath) ? relative(cwd, filePath) : filePath; + const rel = isAbsolute(filePath) ? relative(cwd, filePath) : filePath; + // Normalize to POSIX separators so injected rule context renders the same + // path string on Linux/macOS and Windows (Codex feeds this verbatim into + // the model prompt, and the existing engine already emits POSIX paths). + return rel.replaceAll("\\", "/"); } diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index 4c9c8e8..bf3f70b 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -142,12 +142,15 @@ describe("codex rules hooks", () => { }); // then + // The literal "src/app.ts" pins POSIX separators and acts as the Windows + // regression line: prior versions emitted "src\\app.ts" on Windows. const parsed = parseHookOutput(output); expect(parsed.hookSpecificOutput?.hookEventName).toBe("PostToolUse"); expect(parsed.hookSpecificOutput?.additionalContext).toContain( "Additional project instructions matched for src/app.ts", ); expect(parsed.hookSpecificOutput?.additionalContext).toContain("Prefer strict TypeScript"); + expect(parsed.hookSpecificOutput?.additionalContext ?? "").not.toContain("src\\app.ts"); expect(output).not.toContain("updatedMCPToolOutput"); expect(output).not.toContain("suppressOutput"); expect(output).not.toContain('"decision"'); From 7c18bd1e9c912de87bec870243626ba1b57d8dfa Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 01:29:12 +0900 Subject: [PATCH 06/13] perf(rules): cache dynamic rule discovery and matcher compilation Dynamic rule injection rebuilt glob regexes per candidate, called `findProjectRoot` and the candidate scanner for every target file, and re-read every rule file once per target. With 120 rules and 240 target paths the hook spent ~746ms median, ran 9,600 root lookups, and read files 1,152,000 times in the benchmark. Behavior-preserving changes: - Dedupe `targetPaths` before iteration and skip per-target `findProjectRoot` when the target lives under the cwd root. - Share a single `RuleDiscoveryCache` across all target iterations so `scanRuleFiles` and `existsSync`/`statSync` for single-file sources each run once per directory. - Add a per-run `loadedRuleContent` map keyed by `realPath` so the same rule file is parsed and hashed once per dynamic load. - Cache `isCandidateWithinProject` decisions per candidate/projectRoot. - Cache compiled positive/negative glob matchers per pattern set in the matcher module. Pin the new behavior with unit tests for engine counter coverage, finder source ordering, matcher pattern alternation, scanner symlink loops, and a PostToolUse multi-target hook test that asserts the matching rule is emitted exactly once. Add `scripts/bench-codex-rules.mjs` plus an `npm run bench` entry that exercises duplicate-target and distinct-target scenarios and supports `--write-baseline`/`--compare` for counter-regression gating. Benchmark vs 0910045 baseline (40 iterations, 5 warmups, 120 rules): | scenario | before | after | | ----------------- | ------------------------------- | ----------------------------- | | duplicate-targets | 746ms / 9600 roots / 1.15M reads | 4.8ms / 40 roots / 4800 reads | | distinct-targets | 227ms / 3200 roots / 384k reads | 26ms / 40 roots / 4800 reads | Plan: ../../plans/codex-rules-matching-hook-performance.md --- dist/rules/engine.d.ts | 2 + dist/rules/engine.d.ts.map | 2 +- dist/rules/engine.js | 77 ++++++++++++-- dist/rules/engine.js.map | 2 +- dist/rules/finder.d.ts | 12 +++ dist/rules/finder.d.ts.map | 2 +- dist/rules/finder.js | 68 +++++++++---- dist/rules/finder.js.map | 2 +- dist/rules/matcher.d.ts.map | 2 +- dist/rules/matcher.js | 44 ++++++-- dist/rules/matcher.js.map | 2 +- package.json | 1 + scripts/bench-codex-rules.mjs | 183 ++++++++++++++++++++++++++++++++++ src/rules/engine.ts | 112 +++++++++++++++++++-- src/rules/finder.ts | 92 +++++++++++++---- src/rules/matcher.ts | 64 +++++++++--- test/codex-hook.test.ts | 33 ++++++ test/engine.test.ts | 53 ++++++++++ test/finder.test.ts | 96 ++++++++++++++++++ test/matcher.test.ts | 144 ++++++++++++++++++++++++-- test/scanner.test.ts | 34 ++++++- 21 files changed, 936 insertions(+), 91 deletions(-) create mode 100644 scripts/bench-codex-rules.mjs create mode 100644 test/engine.test.ts create mode 100644 test/finder.test.ts diff --git a/dist/rules/engine.d.ts b/dist/rules/engine.d.ts index 878bc3f..4356223 100644 --- a/dist/rules/engine.d.ts +++ b/dist/rules/engine.d.ts @@ -1,3 +1,4 @@ +import { type RuleDiscoveryCache } from "./finder.js"; import type { LoadedRule, PiRulesConfig, RuleCandidate, RuleDiagnostic, SessionState } from "./types.js"; export interface EngineDeps { findCandidates: (options: { @@ -6,6 +7,7 @@ export interface EngineDeps { homeDir?: string; disabledSources?: ReadonlySet; skipUserHome?: boolean; + cache?: RuleDiscoveryCache; }) => RuleCandidate[]; readFile: (path: string) => string | null; findProjectRoot: (startPath: string) => string | null; diff --git a/dist/rules/engine.d.ts.map b/dist/rules/engine.d.ts.map index 4c82e41..ce2826a 100644 --- a/dist/rules/engine.d.ts.map +++ b/dist/rules/engine.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtH,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,CAAC,OAAO,EAAE;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,OAAO,CAAC;KACvB,KAAK,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACrF,gBAAgB,CACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAC1D,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACvD,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxE,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7C,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC9C,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC/C;AAID,wBAAgB,aAAa,IAAI,aAAa,CAQ7C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA4F5E"} \ No newline at end of file +{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKhF,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAWtH,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,CAAC,OAAO,EAAE;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC3B,KAAK,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACrF,gBAAgB,CACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAC1D,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACvD,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxE,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7C,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC9C,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC/C;AAID,wBAAgB,aAAa,IAAI,aAAa,CAQ7C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA0G5E"} \ No newline at end of file diff --git a/dist/rules/engine.js b/dist/rules/engine.js index 079d3be..0ab9eed 100644 --- a/dist/rules/engine.js +++ b/dist/rules/engine.js @@ -2,6 +2,7 @@ import { realpathSync } from "node:fs"; import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path"; import { clearSession, createSessionState, isDynamicInjected as isDynamicInjectedInState, isStaticInjected as isStaticInjectedInState, markDynamicInjected as markDynamicInjectedInState, markStaticInjected as markStaticInjectedInState, } from "./cache.js"; import { DEFAULT_MAX_RESULT_CHARS, DEFAULT_MAX_RULE_CHARS, PROJECT_SINGLE_FILES, SOURCE_PRIORITY, } from "./constants.js"; +import { createRuleDiscoveryCache } from "./finder.js"; import { formatDynamicBlock, formatStaticBlock } from "./formatter.js"; import { hashContent, matchRule } from "./matcher.js"; import { sortCandidates } from "./ordering.js"; @@ -41,12 +42,18 @@ export function createEngine(config, deps) { const rules = []; const diagnostics = []; const seenRules = new Set(); + const loadedRuleContent = new Map(); + const projectMembership = new Map(); const disabledSources = disabledSourcesFor(config); - for (const targetFile of targetPaths) { - const projectRoot = deps.findProjectRoot(targetFile); - const candidates = deps.findCandidates({ projectRoot, targetFile, disabledSources }); + const discoveryCache = createRuleDiscoveryCache(); + const cwdProjectRoot = deps.findProjectRoot(cwd); + for (const targetFile of uniqueStrings(targetPaths)) { + const projectRoot = cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot) + ? cwdProjectRoot + : deps.findProjectRoot(targetFile); + const candidates = deps.findCandidates({ projectRoot, targetFile, disabledSources, cache: discoveryCache }); for (const candidate of sortCandidates(candidates)) { - const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot); + const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleContent, projectMembership); if (loadedRule === null) { continue; } @@ -115,8 +122,8 @@ function loadStaticCandidates(candidates, deps, projectRoot) { } return { rules: sortCandidates(rules), diagnostics }; } -function loadCandidate(candidate, deps, diagnostics, projectRoot) { - if (!isCandidateWithinProject(candidate, projectRoot)) { +function loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleContent, projectMembership) { + if (!isCandidateWithinProjectCached(candidate, projectRoot, projectMembership)) { diagnostics.push({ severity: "warning", source: candidate.path, @@ -124,20 +131,39 @@ function loadCandidate(candidate, deps, diagnostics, projectRoot) { }); return null; } + const cachedContent = loadedRuleContent?.get(candidate.realPath); + if (cachedContent !== undefined) { + return loadedRuleFromContent(candidate, cachedContent, diagnostics); + } const content = deps.readFile(candidate.path); if (content === null) { + loadedRuleContent?.set(candidate.realPath, null); diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" }); return null; } const parsed = parseRule(content); - if (parsed.diagnostic !== undefined) { - diagnostics.push({ severity: "warning", source: candidate.path, message: parsed.diagnostic }); - } - return { - ...candidate, + const loadedContent = { frontmatter: parsed.frontmatter, body: parsed.body, contentHash: hashContent(parsed.body), + diagnostic: parsed.diagnostic, + }; + loadedRuleContent?.set(candidate.realPath, loadedContent); + return loadedRuleFromContent(candidate, loadedContent, diagnostics); +} +function loadedRuleFromContent(candidate, content, diagnostics) { + if (content === null) { + diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" }); + return null; + } + if (content.diagnostic !== undefined) { + diagnostics.push({ severity: "warning", source: candidate.path, message: content.diagnostic }); + } + return { + ...candidate, + frontmatter: content.frontmatter, + body: content.body, + contentHash: content.contentHash, matchReason: { kind: "no-match" }, }; } @@ -154,6 +180,19 @@ function isCandidateWithinProject(candidate, projectRoot) { const relativeRealPath = relative(realPathOrResolved(projectRoot), realPathOrResolved(candidate.realPath)); return relativeRealPath === "" || (!relativeRealPath.startsWith("..") && !isAbsolute(relativeRealPath)); } +function isCandidateWithinProjectCached(candidate, projectRoot, projectMembership) { + if (projectMembership === undefined) { + return isCandidateWithinProject(candidate, projectRoot); + } + const cacheKey = `${projectRoot ?? ""}\0${candidate.realPath}`; + const cached = projectMembership.get(cacheKey); + if (cached !== undefined) { + return cached; + } + const isWithinProject = isCandidateWithinProject(candidate, projectRoot); + projectMembership.set(cacheKey, isWithinProject); + return isWithinProject; +} function realPathOrResolved(path) { try { return realpathSync.native(path); @@ -162,6 +201,10 @@ function realPathOrResolved(path) { return resolve(path); } } +function isSameOrChildPath(childPath, parentPath) { + const childRelativePath = relative(parentPath, resolve(childPath)); + return childRelativePath === "" || (!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath)); +} function staticMatchReason(rule) { if (rule.frontmatter.alwaysApply === true) { return "alwaysApply"; @@ -227,4 +270,16 @@ function emptyLoadResult(state) { storeLastLoad(state, [], []); return { rules: [], diagnostics: [] }; } +function uniqueStrings(values) { + const uniqueValues = []; + const seenValues = new Set(); + for (const value of values) { + if (seenValues.has(value)) { + continue; + } + seenValues.add(value); + uniqueValues.push(value); + } + return uniqueValues; +} //# sourceMappingURL=engine.js.map \ No newline at end of file diff --git a/dist/rules/engine.js.map b/dist/rules/engine.js.map index 6b49443..7cc4e41 100644 --- a/dist/rules/engine.js.map +++ b/dist/rules/engine.js.map @@ -1 +1 @@ -{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/finder.d.ts b/dist/rules/finder.d.ts index d7b473d..63c0bee 100644 --- a/dist/rules/finder.d.ts +++ b/dist/rules/finder.d.ts @@ -1,4 +1,13 @@ +import { scanRuleFiles } from "./scanner.js"; import type { RuleCandidate } from "./types.js"; +interface SingleFileInfo { + path: string; + realPath: string; +} +export interface RuleDiscoveryCache { + scannedRuleFiles: Map>; + singleFileInfo: Map; +} export interface FinderOptions { /** Project root absolute path (use findProjectRoot to get this). */ projectRoot: string | null; @@ -10,6 +19,9 @@ export interface FinderOptions { disabledSources?: ReadonlySet; /** Whether to skip user-home rules. Default: false. */ skipUserHome?: boolean; + cache?: RuleDiscoveryCache; } +export declare function createRuleDiscoveryCache(): RuleDiscoveryCache; export declare function findRuleCandidates(options: FinderOptions): RuleCandidate[]; +export {}; //# sourceMappingURL=finder.d.ts.map \ No newline at end of file diff --git a/dist/rules/finder.d.ts.map b/dist/rules/finder.d.ts.map index aa49bb2..2a113ff 100644 --- a/dist/rules/finder.d.ts.map +++ b/dist/rules/finder.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../src/rules/finder.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC7B,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wGAAwG;IACxG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAOD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAmB1E"} \ No newline at end of file +{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../src/rules/finder.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAE5D,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IAChE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC7B,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wGAAwG;IACxG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAqB1E"} \ No newline at end of file diff --git a/dist/rules/finder.js b/dist/rules/finder.js index a07bea5..2d9ed9b 100644 --- a/dist/rules/finder.js +++ b/dist/rules/finder.js @@ -4,6 +4,9 @@ import { dirname, join, posix, relative, resolve } from "node:path"; import { GLOBAL_DISTANCE, PROJECT_RULE_SUBDIRS, PROJECT_SINGLE_FILES, USER_HOME_RULE_SUBDIRS, USER_HOME_SINGLE_FILES, } from "./constants.js"; import { UnsupportedRuleSourceError } from "./errors.js"; import { scanRuleFiles } from "./scanner.js"; +export function createRuleDiscoveryCache() { + return { scannedRuleFiles: new Map(), singleFileInfo: new Map() }; +} export function findRuleCandidates(options) { const skipUserHome = options.skipUserHome ?? false; if (options.projectRoot === null && skipUserHome) { @@ -13,14 +16,14 @@ export function findRuleCandidates(options) { const candidates = []; const homeDirectory = resolve(options.homeDir ?? homedir()); if (options.projectRoot !== null) { - candidates.push(...findProjectCandidates(options.projectRoot, options.targetFile, disabledSources)); + candidates.push(...findProjectCandidates(options.projectRoot, options.targetFile, disabledSources, options.cache)); } if (!skipUserHome) { - candidates.push(...findUserHomeCandidates(homeDirectory, disabledSources)); + candidates.push(...findUserHomeCandidates(homeDirectory, disabledSources, options.cache)); } return candidates; } -function findProjectCandidates(projectRoot, targetFile, disabledSources) { +function findProjectCandidates(projectRoot, targetFile, disabledSources, cache) { const rootDirectory = resolve(projectRoot); const walkDirectories = getWalkDirectories(rootDirectory, targetFile); const candidates = []; @@ -31,10 +34,10 @@ function findProjectCandidates(projectRoot, targetFile, disabledSources) { continue; } const ruleDirectory = join(walkDirectory.directory, parentDirectory, subDirectory); - for (const scannedFile of scanRuleFiles({ rootDir: ruleDirectory })) { + for (const scannedFile of scanRuleFilesCached(ruleDirectory, cache)) { candidates.push({ path: scannedFile.path, - realPath: resolveRealPath(scannedFile.path), + realPath: scannedFile.realPath, source, distance: targetFile === null ? 0 : walkDirectory.distance, isGlobal: false, @@ -51,12 +54,13 @@ function findProjectCandidates(projectRoot, targetFile, disabledSources) { continue; } const filePath = join(walkDirectory.directory, ruleFile); - if (!isFile(filePath)) { + const fileInfo = singleFileInfoCached(filePath, cache); + if (fileInfo === null) { continue; } candidates.push({ - path: filePath, - realPath: resolveRealPath(filePath), + path: fileInfo.path, + realPath: fileInfo.realPath, source, distance: targetFile === null ? 0 : walkDirectory.distance, isGlobal: false, @@ -67,7 +71,7 @@ function findProjectCandidates(projectRoot, targetFile, disabledSources) { } return candidates; } -function findUserHomeCandidates(homeDirectory, disabledSources) { +function findUserHomeCandidates(homeDirectory, disabledSources, cache) { const candidates = []; for (const ruleSubdir of USER_HOME_RULE_SUBDIRS) { const source = toUserHomeRuleSource(ruleSubdir); @@ -75,10 +79,10 @@ function findUserHomeCandidates(homeDirectory, disabledSources) { continue; } const ruleDirectory = join(homeDirectory, ruleSubdir); - for (const scannedFile of scanRuleFiles({ rootDir: ruleDirectory })) { + for (const scannedFile of scanRuleFilesCached(ruleDirectory, cache)) { candidates.push({ path: scannedFile.path, - realPath: resolveRealPath(scannedFile.path), + realPath: scannedFile.realPath, source, distance: GLOBAL_DISTANCE, isGlobal: true, @@ -93,12 +97,13 @@ function findUserHomeCandidates(homeDirectory, disabledSources) { continue; } const filePath = join(homeDirectory, ruleFile); - if (!isFile(filePath)) { + const fileInfo = singleFileInfoCached(filePath, cache); + if (fileInfo === null) { continue; } candidates.push({ - path: filePath, - realPath: resolveRealPath(filePath), + path: fileInfo.path, + realPath: fileInfo.realPath, source, distance: GLOBAL_DISTANCE, isGlobal: true, @@ -108,6 +113,30 @@ function findUserHomeCandidates(homeDirectory, disabledSources) { } return candidates; } +function scanRuleFilesCached(rootDir, cache) { + if (cache === undefined) { + return scanRuleFiles({ rootDir }); + } + const cached = cache.scannedRuleFiles.get(rootDir); + if (cached !== undefined) { + return cached; + } + const scannedFiles = scanRuleFiles({ rootDir }); + cache.scannedRuleFiles.set(rootDir, scannedFiles); + return scannedFiles; +} +function singleFileInfoCached(filePath, cache) { + if (cache === undefined) { + return readSingleFileInfo(filePath); + } + const cached = cache.singleFileInfo.get(filePath); + if (cached !== undefined) { + return cached; + } + const fileInfo = readSingleFileInfo(filePath); + cache.singleFileInfo.set(filePath, fileInfo); + return fileInfo; +} function getWalkDirectories(projectRoot, targetFile) { if (targetFile === null) { return [{ directory: projectRoot, distance: 0 }]; @@ -137,15 +166,18 @@ function isSameOrChildPath(childPath, parentPath) { const childRelativePath = relative(parentPath, childPath); return childRelativePath === "" || (!childRelativePath.startsWith("..") && !childRelativePath.startsWith("/")); } -function isFile(filePath) { +function readSingleFileInfo(filePath) { if (!existsSync(filePath)) { - return false; + return null; } try { - return statSync(filePath).isFile(); + if (!statSync(filePath).isFile()) { + return null; + } + return { path: filePath, realPath: resolveRealPath(filePath) }; } catch { - return false; + return null; } } function resolveRealPath(filePath) { diff --git a/dist/rules/finder.js.map b/dist/rules/finder.js.map index aba8ccc..443c0d7 100644 --- a/dist/rules/finder.js.map +++ b/dist/rules/finder.js.map @@ -1 +1 @@ -{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../src/rules/finder.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../src/rules/finder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/matcher.d.ts.map b/dist/rules/matcher.d.ts.map index 9a9c7cc..9bdb6cd 100644 --- a/dist/rules/matcher.d.ts.map +++ b/dist/rules/matcher.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAyC1D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAQrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"} \ No newline at end of file +{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACpB;AAcD,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAgC1D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAQrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"} \ No newline at end of file diff --git a/dist/rules/matcher.js b/dist/rules/matcher.js index 66f0f6c..d31e638 100644 --- a/dist/rules/matcher.js +++ b/dist/rules/matcher.js @@ -1,4 +1,5 @@ import { createHash } from "node:crypto"; +const compiledPatternSets = new Map(); export function matchRule(input) { if (input.isSingleFile) { return { matched: true, reason: "single-file" }; @@ -10,16 +11,9 @@ export function matchRule(input) { if (patterns.length === 0) { return noMatch(); } - const pathBases = [ - normalizePath(input.pathBases.projectRelative), - input.pathBases.scopeRelative ? normalizePath(input.pathBases.scopeRelative) : undefined, - normalizePath(input.pathBases.basename), - ].filter((pathBase) => pathBase !== undefined); - const positivePatterns = patterns.filter((pattern) => !pattern.startsWith("!")); - const negativePatterns = patterns.filter((pattern) => pattern.startsWith("!")); - const negativeMatchers = negativePatterns.map((pattern) => createGlobMatcher(pattern.slice(1))); - for (const pattern of positivePatterns) { - const isMatch = createGlobMatcher(pattern); + const pathBases = normalizedPathBases(input.pathBases); + const { positivePatterns, negativeMatchers } = compiledPatternSetFor(patterns); + for (const { pattern, isMatch } of positivePatterns) { for (const pathBase of pathBases) { if (!isMatch(pathBase)) { continue; @@ -52,6 +46,36 @@ function normalizePatternList(patterns) { function normalizePath(path) { return path.replaceAll("\\", "/"); } +function normalizedPathBases(pathBases) { + const normalizedBases = [normalizePath(pathBases.projectRelative)]; + if (pathBases.scopeRelative !== undefined) { + normalizedBases.push(normalizePath(pathBases.scopeRelative)); + } + normalizedBases.push(normalizePath(pathBases.basename)); + return normalizedBases; +} +function compiledPatternSetFor(patterns) { + const cacheKey = JSON.stringify(patterns); + const cached = compiledPatternSets.get(cacheKey); + if (cached !== undefined) { + return cached; + } + const compiled = compilePatternSet(patterns); + compiledPatternSets.set(cacheKey, compiled); + return compiled; +} +function compilePatternSet(patterns) { + const positivePatterns = []; + const negativeMatchers = []; + for (const pattern of patterns) { + if (pattern.startsWith("!")) { + negativeMatchers.push(createGlobMatcher(pattern.slice(1))); + continue; + } + positivePatterns.push({ pattern, isMatch: createGlobMatcher(pattern) }); + } + return { positivePatterns, negativeMatchers }; +} function createGlobMatcher(pattern) { const expression = globToRegExp(normalizePath(pattern)); return (path) => expression.test(path); diff --git a/dist/rules/matcher.js.map b/dist/rules/matcher.js.map index 518bf8a..58dbb81 100644 --- a/dist/rules/matcher.js.map +++ b/dist/rules/matcher.js.map @@ -1 +1 @@ -{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index e980f79..7614d49 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "build": "tsc -p tsconfig.build.json", "test": "vitest --run", "test:watch": "vitest", + "bench": "npm run build --silent && node scripts/bench-codex-rules.mjs", "typecheck": "tsc --noEmit", "lint": "biome check .", "lint:fix": "biome check --write .", diff --git a/scripts/bench-codex-rules.mjs b/scripts/bench-codex-rules.mjs new file mode 100644 index 0000000..5e3dd62 --- /dev/null +++ b/scripts/bench-codex-rules.mjs @@ -0,0 +1,183 @@ +#!/usr/bin/env node +import { execFileSync } from "node:child_process"; +import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { createEngine, defaultConfig } from "../dist/rules/engine.js"; + +const ITERATIONS = 40; +const WARMUP_ITERATIONS = 5; +const RULE_COUNT = 120; +const DISTINCT_TARGET_COUNT = 80; +const DUPLICATE_TARGET_COUNT = 240; + +const args = process.argv.slice(2); +const writeBaselinePath = readOption("--write-baseline"); +const comparePath = readOption("--compare"); + +const result = runBenchmark(); + +if (writeBaselinePath !== undefined) { + writeFileSync(writeBaselinePath, `${JSON.stringify(result, null, "\t")}\n`); +} + +if (comparePath !== undefined) { + const baseline = JSON.parse(readFileSync(comparePath, "utf8")); + const failures = compareResults(baseline, result); + if (failures.length > 0) { + for (const failure of failures) { + process.stderr.write(`${failure}\n`); + } + process.exitCode = 1; + } +} + +process.stdout.write(`${JSON.stringify(result, null, "\t")}\n`); + +function readOption(name) { + const index = args.indexOf(name); + if (index === -1) { + return undefined; + } + + const value = args[index + 1]; + if (value === undefined || value.startsWith("--")) { + throw new Error(`${name} requires a value`); + } + return value; +} + +function runBenchmark() { + const scenarios = [ + runScenario("duplicate-targets", duplicateTargets, DUPLICATE_TARGET_COUNT), + runScenario("distinct-targets", distinctTargets, DISTINCT_TARGET_COUNT), + ]; + return { + commit: gitCommit(), + iterations: ITERATIONS, + warmupIterations: WARMUP_ITERATIONS, + ruleCount: RULE_COUNT, + scenarios, + }; +} + +function runScenario(name, targetFactory, targetCount) { + const durations = []; + let counters = { findProjectRoot: 0, findCandidates: 0, readFile: 0 }; + + for (let iteration = 0; iteration < ITERATIONS + WARMUP_ITERATIONS; iteration += 1) { + const run = measureRun(targetFactory); + if (iteration >= WARMUP_ITERATIONS) { + durations.push(run.durationMs); + counters = addCounters(counters, run.counters); + } + } + + return { + name, + targetCount, + medianMs: median(durations), + minMs: Math.min(...durations), + maxMs: Math.max(...durations), + counters, + }; +} + +function measureRun(targetPaths) { + const projectRoot = mkdtempSync(join(tmpdir(), "codex-rules-bench-")); + try { + const candidates = makeCandidates(projectRoot); + mkdirSync(join(projectRoot, ".sisyphus", "rules"), { recursive: true }); + for (const candidate of candidates) { + writeFileSync(candidate.path, ""); + } + const counters = { findProjectRoot: 0, findCandidates: 0, readFile: 0 }; + const engine = createEngine(defaultConfig(), { + findProjectRoot: () => { + counters.findProjectRoot += 1; + return projectRoot; + }, + findCandidates: () => { + counters.findCandidates += 1; + return candidates; + }, + readFile: (path) => { + counters.readFile += 1; + return ruleContent(path); + }, + }); + const start = process.hrtime.bigint(); + engine.loadDynamicRules(projectRoot, targetPaths(projectRoot)); + const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000; + return { durationMs, counters }; + } finally { + rmSync(projectRoot, { recursive: true, force: true }); + } +} + +function duplicateTargets(projectRoot) { + const targetPath = join(projectRoot, "src", "app.ts"); + return Array.from({ length: DUPLICATE_TARGET_COUNT }, () => targetPath); +} + +function distinctTargets(projectRoot) { + return Array.from({ length: DISTINCT_TARGET_COUNT }, (_, index) => join(projectRoot, "src", `file-${index}.ts`)); +} + +function makeCandidates(projectRoot) { + return Array.from({ length: RULE_COUNT }, (_, index) => ({ + path: join(projectRoot, ".sisyphus", "rules", `rule-${index}.md`), + realPath: join(projectRoot, ".sisyphus", "rules", `rule-${index}.md`), + source: ".sisyphus/rules", + distance: 0, + isGlobal: false, + isSingleFile: false, + relativePath: `.sisyphus/rules/rule-${index}.md`, + })); +} + +function ruleContent(path) { + return ["---", "globs: **/*.ts", "---", "", `Rule from ${path}`].join("\n"); +} + +function addCounters(left, right) { + return { + findProjectRoot: left.findProjectRoot + right.findProjectRoot, + findCandidates: left.findCandidates + right.findCandidates, + readFile: left.readFile + right.readFile, + }; +} + +function median(values) { + const sorted = [...values].sort((left, right) => left - right); + const index = Math.floor(sorted.length / 2); + return sorted[index] ?? 0; +} + +function gitCommit() { + try { + return execFileSync("git", ["rev-parse", "--short", "HEAD"], { encoding: "utf8" }).trim(); + } catch { + return "unknown"; + } +} + +function compareResults(baseline, current) { + const failures = []; + for (const scenario of current.scenarios) { + const baselineScenario = baseline.scenarios.find((candidate) => candidate.name === scenario.name); + if (baselineScenario === undefined) { + failures.push(`missing baseline scenario: ${scenario.name}`); + continue; + } + + for (const counterName of ["findProjectRoot", "findCandidates", "readFile"]) { + if (scenario.counters[counterName] > baselineScenario.counters[counterName]) { + failures.push( + `${scenario.name}.${counterName} regressed: ${scenario.counters[counterName]} > ${baselineScenario.counters[counterName]}`, + ); + } + } + } + return failures; +} diff --git a/src/rules/engine.ts b/src/rules/engine.ts index 3d9f3e8..6cc15b1 100644 --- a/src/rules/engine.ts +++ b/src/rules/engine.ts @@ -15,12 +15,22 @@ import { PROJECT_SINGLE_FILES, SOURCE_PRIORITY, } from "./constants.js"; +import { createRuleDiscoveryCache, type RuleDiscoveryCache } from "./finder.js"; import { formatDynamicBlock, formatStaticBlock } from "./formatter.js"; import { hashContent, matchRule } from "./matcher.js"; import { sortCandidates } from "./ordering.js"; import { parseRule } from "./parser.js"; import type { LoadedRule, MatchReason, PiRulesConfig, RuleCandidate, RuleDiagnostic, SessionState } from "./types.js"; +interface LoadedRuleContent { + frontmatter: LoadedRule["frontmatter"]; + body: string; + contentHash: string; + diagnostic?: string; +} + +type CandidateProjectMembership = Map; + export interface EngineDeps { findCandidates: (options: { projectRoot: string | null; @@ -28,6 +38,7 @@ export interface EngineDeps { homeDir?: string; disabledSources?: ReadonlySet; skipUserHome?: boolean; + cache?: RuleDiscoveryCache; }) => RuleCandidate[]; readFile: (path: string) => string | null; findProjectRoot: (startPath: string) => string | null; @@ -94,14 +105,28 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { const rules: LoadedRule[] = []; const diagnostics: RuleDiagnostic[] = []; const seenRules = new Set(); + const loadedRuleContent = new Map(); + const projectMembership = new Map(); const disabledSources = disabledSourcesFor(config); + const discoveryCache = createRuleDiscoveryCache(); + const cwdProjectRoot = deps.findProjectRoot(cwd); - for (const targetFile of targetPaths) { - const projectRoot = deps.findProjectRoot(targetFile); - const candidates = deps.findCandidates({ projectRoot, targetFile, disabledSources }); + for (const targetFile of uniqueStrings(targetPaths)) { + const projectRoot = + cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot) + ? cwdProjectRoot + : deps.findProjectRoot(targetFile); + const candidates = deps.findCandidates({ projectRoot, targetFile, disabledSources, cache: discoveryCache }); for (const candidate of sortCandidates(candidates)) { - const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot); + const loadedRule = loadCandidate( + candidate, + deps, + diagnostics, + projectRoot, + loadedRuleContent, + projectMembership, + ); if (loadedRule === null) { continue; } @@ -191,8 +216,10 @@ function loadCandidate( deps: EngineDeps, diagnostics: RuleDiagnostic[], projectRoot: string | null, + loadedRuleContent?: Map, + projectMembership?: CandidateProjectMembership, ): (LoadedRule & { matchReason: MatchReason }) | null { - if (!isCandidateWithinProject(candidate, projectRoot)) { + if (!isCandidateWithinProjectCached(candidate, projectRoot, projectMembership)) { diagnostics.push({ severity: "warning", source: candidate.path, @@ -201,22 +228,48 @@ function loadCandidate( return null; } + const cachedContent = loadedRuleContent?.get(candidate.realPath); + if (cachedContent !== undefined) { + return loadedRuleFromContent(candidate, cachedContent, diagnostics); + } + const content = deps.readFile(candidate.path); if (content === null) { + loadedRuleContent?.set(candidate.realPath, null); diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" }); return null; } const parsed = parseRule(content); - if (parsed.diagnostic !== undefined) { - diagnostics.push({ severity: "warning", source: candidate.path, message: parsed.diagnostic }); + const loadedContent = { + frontmatter: parsed.frontmatter, + body: parsed.body, + contentHash: hashContent(parsed.body), + diagnostic: parsed.diagnostic, + } satisfies LoadedRuleContent; + loadedRuleContent?.set(candidate.realPath, loadedContent); + return loadedRuleFromContent(candidate, loadedContent, diagnostics); +} + +function loadedRuleFromContent( + candidate: RuleCandidate, + content: LoadedRuleContent | null, + diagnostics: RuleDiagnostic[], +): (LoadedRule & { matchReason: MatchReason }) | null { + if (content === null) { + diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" }); + return null; + } + + if (content.diagnostic !== undefined) { + diagnostics.push({ severity: "warning", source: candidate.path, message: content.diagnostic }); } return { ...candidate, - frontmatter: parsed.frontmatter, - body: parsed.body, - contentHash: hashContent(parsed.body), + frontmatter: content.frontmatter, + body: content.body, + contentHash: content.contentHash, matchReason: { kind: "no-match" }, }; } @@ -238,6 +291,26 @@ function isCandidateWithinProject(candidate: RuleCandidate, projectRoot: string return relativeRealPath === "" || (!relativeRealPath.startsWith("..") && !isAbsolute(relativeRealPath)); } +function isCandidateWithinProjectCached( + candidate: RuleCandidate, + projectRoot: string | null, + projectMembership: CandidateProjectMembership | undefined, +): boolean { + if (projectMembership === undefined) { + return isCandidateWithinProject(candidate, projectRoot); + } + + const cacheKey = `${projectRoot ?? ""}\0${candidate.realPath}`; + const cached = projectMembership.get(cacheKey); + if (cached !== undefined) { + return cached; + } + + const isWithinProject = isCandidateWithinProject(candidate, projectRoot); + projectMembership.set(cacheKey, isWithinProject); + return isWithinProject; +} + function realPathOrResolved(path: string): string { try { return realpathSync.native(path); @@ -246,6 +319,11 @@ function realPathOrResolved(path: string): string { } } +function isSameOrChildPath(childPath: string, parentPath: string): boolean { + const childRelativePath = relative(parentPath, resolve(childPath)); + return childRelativePath === "" || (!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath)); +} + function staticMatchReason(rule: LoadedRule): MatchReason | null { if (rule.frontmatter.alwaysApply === true) { return "alwaysApply"; @@ -335,3 +413,17 @@ function emptyLoadResult(state: SessionState): { rules: LoadedRule[]; diagnostic storeLastLoad(state, [], []); return { rules: [], diagnostics: [] }; } + +function uniqueStrings(values: ReadonlyArray): string[] { + const uniqueValues: string[] = []; + const seenValues = new Set(); + for (const value of values) { + if (seenValues.has(value)) { + continue; + } + + seenValues.add(value); + uniqueValues.push(value); + } + return uniqueValues; +} diff --git a/src/rules/finder.ts b/src/rules/finder.ts index 931c0db..f6cabd1 100644 --- a/src/rules/finder.ts +++ b/src/rules/finder.ts @@ -13,6 +13,16 @@ import { UnsupportedRuleSourceError } from "./errors.js"; import { scanRuleFiles } from "./scanner.js"; import type { RuleCandidate, RuleSource } from "./types.js"; +interface SingleFileInfo { + path: string; + realPath: string; +} + +export interface RuleDiscoveryCache { + scannedRuleFiles: Map>; + singleFileInfo: Map; +} + export interface FinderOptions { /** Project root absolute path (use findProjectRoot to get this). */ projectRoot: string | null; @@ -24,6 +34,7 @@ export interface FinderOptions { disabledSources?: ReadonlySet; /** Whether to skip user-home rules. Default: false. */ skipUserHome?: boolean; + cache?: RuleDiscoveryCache; } interface WalkDirectory { @@ -31,6 +42,10 @@ interface WalkDirectory { distance: number; } +export function createRuleDiscoveryCache(): RuleDiscoveryCache { + return { scannedRuleFiles: new Map(), singleFileInfo: new Map() }; +} + export function findRuleCandidates(options: FinderOptions): RuleCandidate[] { const skipUserHome = options.skipUserHome ?? false; if (options.projectRoot === null && skipUserHome) { @@ -42,11 +57,13 @@ export function findRuleCandidates(options: FinderOptions): RuleCandidate[] { const homeDirectory = resolve(options.homeDir ?? homedir()); if (options.projectRoot !== null) { - candidates.push(...findProjectCandidates(options.projectRoot, options.targetFile, disabledSources)); + candidates.push( + ...findProjectCandidates(options.projectRoot, options.targetFile, disabledSources, options.cache), + ); } if (!skipUserHome) { - candidates.push(...findUserHomeCandidates(homeDirectory, disabledSources)); + candidates.push(...findUserHomeCandidates(homeDirectory, disabledSources, options.cache)); } return candidates; @@ -56,6 +73,7 @@ function findProjectCandidates( projectRoot: string, targetFile: string | null, disabledSources: ReadonlySet, + cache: RuleDiscoveryCache | undefined, ): RuleCandidate[] { const rootDirectory = resolve(projectRoot); const walkDirectories = getWalkDirectories(rootDirectory, targetFile); @@ -69,10 +87,10 @@ function findProjectCandidates( } const ruleDirectory = join(walkDirectory.directory, parentDirectory, subDirectory); - for (const scannedFile of scanRuleFiles({ rootDir: ruleDirectory })) { + for (const scannedFile of scanRuleFilesCached(ruleDirectory, cache)) { candidates.push({ path: scannedFile.path, - realPath: resolveRealPath(scannedFile.path), + realPath: scannedFile.realPath, source, distance: targetFile === null ? 0 : walkDirectory.distance, isGlobal: false, @@ -91,13 +109,14 @@ function findProjectCandidates( } const filePath = join(walkDirectory.directory, ruleFile); - if (!isFile(filePath)) { + const fileInfo = singleFileInfoCached(filePath, cache); + if (fileInfo === null) { continue; } candidates.push({ - path: filePath, - realPath: resolveRealPath(filePath), + path: fileInfo.path, + realPath: fileInfo.realPath, source, distance: targetFile === null ? 0 : walkDirectory.distance, isGlobal: false, @@ -110,7 +129,11 @@ function findProjectCandidates( return candidates; } -function findUserHomeCandidates(homeDirectory: string, disabledSources: ReadonlySet): RuleCandidate[] { +function findUserHomeCandidates( + homeDirectory: string, + disabledSources: ReadonlySet, + cache: RuleDiscoveryCache | undefined, +): RuleCandidate[] { const candidates: RuleCandidate[] = []; for (const ruleSubdir of USER_HOME_RULE_SUBDIRS) { @@ -120,10 +143,10 @@ function findUserHomeCandidates(homeDirectory: string, disabledSources: Readonly } const ruleDirectory = join(homeDirectory, ruleSubdir); - for (const scannedFile of scanRuleFiles({ rootDir: ruleDirectory })) { + for (const scannedFile of scanRuleFilesCached(ruleDirectory, cache)) { candidates.push({ path: scannedFile.path, - realPath: resolveRealPath(scannedFile.path), + realPath: scannedFile.realPath, source, distance: GLOBAL_DISTANCE, isGlobal: true, @@ -140,13 +163,14 @@ function findUserHomeCandidates(homeDirectory: string, disabledSources: Readonly } const filePath = join(homeDirectory, ruleFile); - if (!isFile(filePath)) { + const fileInfo = singleFileInfoCached(filePath, cache); + if (fileInfo === null) { continue; } candidates.push({ - path: filePath, - realPath: resolveRealPath(filePath), + path: fileInfo.path, + realPath: fileInfo.realPath, source, distance: GLOBAL_DISTANCE, isGlobal: true, @@ -158,6 +182,36 @@ function findUserHomeCandidates(homeDirectory: string, disabledSources: Readonly return candidates; } +function scanRuleFilesCached(rootDir: string, cache: RuleDiscoveryCache | undefined): ReturnType { + if (cache === undefined) { + return scanRuleFiles({ rootDir }); + } + + const cached = cache.scannedRuleFiles.get(rootDir); + if (cached !== undefined) { + return cached; + } + + const scannedFiles = scanRuleFiles({ rootDir }); + cache.scannedRuleFiles.set(rootDir, scannedFiles); + return scannedFiles; +} + +function singleFileInfoCached(filePath: string, cache: RuleDiscoveryCache | undefined): SingleFileInfo | null { + if (cache === undefined) { + return readSingleFileInfo(filePath); + } + + const cached = cache.singleFileInfo.get(filePath); + if (cached !== undefined) { + return cached; + } + + const fileInfo = readSingleFileInfo(filePath); + cache.singleFileInfo.set(filePath, fileInfo); + return fileInfo; +} + function getWalkDirectories(projectRoot: string, targetFile: string | null): WalkDirectory[] { if (targetFile === null) { return [{ directory: projectRoot, distance: 0 }]; @@ -195,15 +249,19 @@ function isSameOrChildPath(childPath: string, parentPath: string): boolean { return childRelativePath === "" || (!childRelativePath.startsWith("..") && !childRelativePath.startsWith("/")); } -function isFile(filePath: string): boolean { +function readSingleFileInfo(filePath: string): SingleFileInfo | null { if (!existsSync(filePath)) { - return false; + return null; } try { - return statSync(filePath).isFile(); + if (!statSync(filePath).isFile()) { + return null; + } + + return { path: filePath, realPath: resolveRealPath(filePath) }; } catch { - return false; + return null; } } diff --git a/src/rules/matcher.ts b/src/rules/matcher.ts index d0964d1..4d69da8 100644 --- a/src/rules/matcher.ts +++ b/src/rules/matcher.ts @@ -13,6 +13,18 @@ export interface MatchResult { reason: MatchReason; } +interface CompiledPattern { + pattern: string; + isMatch: (path: string) => boolean; +} + +interface CompiledPatternSet { + positivePatterns: CompiledPattern[]; + negativeMatchers: Array<(path: string) => boolean>; +} + +const compiledPatternSets = new Map(); + export function matchRule(input: MatcherInput): MatchResult { if (input.isSingleFile) { return { matched: true, reason: "single-file" }; @@ -27,19 +39,10 @@ export function matchRule(input: MatcherInput): MatchResult { return noMatch(); } - const pathBases = [ - normalizePath(input.pathBases.projectRelative), - input.pathBases.scopeRelative ? normalizePath(input.pathBases.scopeRelative) : undefined, - normalizePath(input.pathBases.basename), - ].filter((pathBase): pathBase is string => pathBase !== undefined); - - const positivePatterns = patterns.filter((pattern) => !pattern.startsWith("!")); - const negativePatterns = patterns.filter((pattern) => pattern.startsWith("!")); - const negativeMatchers = negativePatterns.map((pattern) => createGlobMatcher(pattern.slice(1))); - - for (const pattern of positivePatterns) { - const isMatch = createGlobMatcher(pattern); + const pathBases = normalizedPathBases(input.pathBases); + const { positivePatterns, negativeMatchers } = compiledPatternSetFor(patterns); + for (const { pattern, isMatch } of positivePatterns) { for (const pathBase of pathBases) { if (!isMatch(pathBase)) { continue; @@ -82,6 +85,43 @@ function normalizePath(path: string): string { return path.replaceAll("\\", "/"); } +function normalizedPathBases(pathBases: MatcherInput["pathBases"]): string[] { + const normalizedBases = [normalizePath(pathBases.projectRelative)]; + if (pathBases.scopeRelative !== undefined) { + normalizedBases.push(normalizePath(pathBases.scopeRelative)); + } + normalizedBases.push(normalizePath(pathBases.basename)); + return normalizedBases; +} + +function compiledPatternSetFor(patterns: ReadonlyArray): CompiledPatternSet { + const cacheKey = JSON.stringify(patterns); + const cached = compiledPatternSets.get(cacheKey); + if (cached !== undefined) { + return cached; + } + + const compiled = compilePatternSet(patterns); + compiledPatternSets.set(cacheKey, compiled); + return compiled; +} + +function compilePatternSet(patterns: ReadonlyArray): CompiledPatternSet { + const positivePatterns: CompiledPattern[] = []; + const negativeMatchers: Array<(path: string) => boolean> = []; + + for (const pattern of patterns) { + if (pattern.startsWith("!")) { + negativeMatchers.push(createGlobMatcher(pattern.slice(1))); + continue; + } + + positivePatterns.push({ pattern, isMatch: createGlobMatcher(pattern) }); + } + + return { positivePatterns, negativeMatchers }; +} + function createGlobMatcher(pattern: string): (path: string) => boolean { const expression = globToRegExp(normalizePath(pattern)); return (path: string) => expression.test(path); diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index bf3f70b..d90fadd 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -42,6 +42,7 @@ function makeTempProject(): { root: string; pluginData: string } { ); mkdirSync(path.join(root, "src"), { recursive: true }); writeFileSync(path.join(root, "src", "app.ts"), "export const app = true;\n"); + writeFileSync(path.join(root, "src", "other.ts"), "export const other = true;\n"); return { root, pluginData }; } @@ -88,6 +89,10 @@ function parseHookOutput(output: string): { }; } +function occurrenceCount(value: string, search: string): number { + return value.split(search).length - 1; +} + describe("codex rules hooks", () => { it("#given project rules #when SessionStart runs #then emits static additional context", async () => { // given @@ -156,6 +161,34 @@ describe("codex rules hooks", () => { expect(output).not.toContain('"decision"'); }); + it("#given multiple target paths matching one rule #when PostToolUse runs #then emits dynamic context once for the first target", async () => { + // given + const { root, pluginData } = makeTempProject(); + const firstFilePath = path.join(root, "src", "app.ts"); + const secondFilePath = path.join(root, "src", "other.ts"); + + // when + const output = await runPostToolUseHook( + { + ...postToolUseInput(root, firstFilePath), + tool_name: "mcp__filesystem__read_multiple_files", + tool_input: { paths: [firstFilePath, secondFilePath, firstFilePath] }, + }, + { + pluginDataRoot: pluginData, + env: PROJECT_ONLY_ENV, + }, + ); + + // then + const parsed = parseHookOutput(output); + const additionalContext = parsed.hookSpecificOutput?.additionalContext ?? ""; + expect(parsed.hookSpecificOutput?.hookEventName).toBe("PostToolUse"); + expect(additionalContext).toContain("Additional project instructions matched for src/app.ts"); + expect(additionalContext).not.toContain("src\\app.ts"); + expect(occurrenceCount(additionalContext, "Prefer strict TypeScript")).toBe(1); + }); + it("#given dynamic context already injected #when PostToolUse repeats #then emits no duplicate context", async () => { // given const { root, pluginData } = makeTempProject(); diff --git a/test/engine.test.ts b/test/engine.test.ts new file mode 100644 index 0000000..d65d264 --- /dev/null +++ b/test/engine.test.ts @@ -0,0 +1,53 @@ +import { join } from "node:path"; +import { describe, expect, it } from "vitest"; + +import { createEngine, defaultConfig, type EngineDeps } from "../src/rules/engine.js"; +import type { RuleCandidate } from "../src/rules/types.js"; + +describe("rule engine dynamic matching", () => { + it("#given duplicate target paths #when loading dynamic rules #then repeated discovery and parsing work is avoided", () => { + // given + const projectRoot = "/tmp/codex-rules-engine"; + const targetPath = join(projectRoot, "src", "app.ts"); + const candidate: RuleCandidate = { + path: join(projectRoot, ".sisyphus", "rules", "typescript.md"), + realPath: join(projectRoot, ".sisyphus", "rules", "typescript.md"), + source: ".sisyphus/rules", + distance: 0, + isGlobal: false, + isSingleFile: false, + relativePath: ".sisyphus/rules/typescript.md", + }; + const counters = { + findProjectRoot: 0, + findCandidates: 0, + readFile: 0, + }; + const deps = { + findProjectRoot: () => { + counters.findProjectRoot += 1; + return projectRoot; + }, + findCandidates: () => { + counters.findCandidates += 1; + return [candidate]; + }, + readFile: () => { + counters.readFile += 1; + return ["---", "globs: **/*.ts", "---", "", "Prefer strict TypeScript."].join("\n"); + }, + } satisfies EngineDeps; + const engine = createEngine(defaultConfig(), deps); + + // when + const result = engine.loadDynamicRules(projectRoot, [targetPath, targetPath, targetPath]); + + // then + expect(result.rules).toHaveLength(1); + expect(counters).toEqual({ + findProjectRoot: 1, + findCandidates: 1, + readFile: 1, + }); + }); +}); diff --git a/test/finder.test.ts b/test/finder.test.ts new file mode 100644 index 0000000..88d5b68 --- /dev/null +++ b/test/finder.test.ts @@ -0,0 +1,96 @@ +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; + +import { findRuleCandidates } from "../src/rules/finder.js"; +import type { RuleCandidate } from "../src/rules/types.js"; + +const tempDirectories: string[] = []; + +afterEach(() => { + for (const directory of tempDirectories.splice(0)) { + rmSync(directory, { recursive: true, force: true }); + } +}); + +function makeProject(): { projectRoot: string; homeRoot: string; targetPath: string } { + const projectRoot = mkdtempSync(join(tmpdir(), "codex-rules-finder-project-")); + const homeRoot = mkdtempSync(join(tmpdir(), "codex-rules-finder-home-")); + tempDirectories.push(projectRoot, homeRoot); + mkdirSync(join(projectRoot, "src", ".sisyphus", "rules"), { recursive: true }); + mkdirSync(join(projectRoot, ".sisyphus", "rules"), { recursive: true }); + mkdirSync(join(homeRoot, ".opencode", "rules"), { recursive: true }); + mkdirSync(join(homeRoot, ".config", "opencode"), { recursive: true }); + writeFileSync(join(projectRoot, "package.json"), JSON.stringify({ name: "fixture" })); + writeFileSync(join(projectRoot, "AGENTS.md"), "Project rule\n"); + writeFileSync(join(projectRoot, "src", ".sisyphus", "rules", "local.md"), "Local rule\n"); + writeFileSync(join(projectRoot, ".sisyphus", "rules", "root.md"), "Root rule\n"); + writeFileSync(join(homeRoot, ".opencode", "rules", "global.md"), "Global rule\n"); + writeFileSync(join(homeRoot, ".config", "opencode", "AGENTS.md"), "Home rule\n"); + const targetPath = join(projectRoot, "src", "app.ts"); + writeFileSync(targetPath, "export const app = true;\n"); + return { projectRoot, homeRoot, targetPath }; +} + +function candidateSummary(candidate: RuleCandidate): string { + return `${candidate.source}:${candidate.distance}:${candidate.relativePath}`; +} + +describe("findRuleCandidates", () => { + it("#given project and user-home rules #when target file is inside project #then candidates keep source distance", () => { + // given + const { projectRoot, homeRoot, targetPath } = makeProject(); + + // when + const candidates = findRuleCandidates({ projectRoot, targetFile: targetPath, homeDir: homeRoot }); + + // then + expect(candidates.map(candidateSummary)).toEqual([ + ".sisyphus/rules:0:src/.sisyphus/rules/local.md", + ".sisyphus/rules:1:.sisyphus/rules/root.md", + "AGENTS.md:1:AGENTS.md", + "~/.opencode/rules:9999:.opencode/rules/global.md", + "~/.config/opencode/AGENTS.md:9999:.config/opencode/AGENTS.md", + ]); + }); + + it("#given disabled source #when finding candidates #then matching source is omitted", () => { + // given + const { projectRoot, homeRoot, targetPath } = makeProject(); + + // when + const candidates = findRuleCandidates({ + projectRoot, + targetFile: targetPath, + homeDir: homeRoot, + disabledSources: new Set([".sisyphus/rules", "~/.opencode/rules"]), + }); + + // then + expect(candidates.map(candidateSummary)).toEqual([ + "AGENTS.md:1:AGENTS.md", + "~/.config/opencode/AGENTS.md:9999:.config/opencode/AGENTS.md", + ]); + }); + + it("#given skip user home #when finding candidates #then only project rules are returned", () => { + // given + const { projectRoot, homeRoot, targetPath } = makeProject(); + + // when + const candidates = findRuleCandidates({ + projectRoot, + targetFile: targetPath, + homeDir: homeRoot, + skipUserHome: true, + }); + + // then + expect(candidates.map(candidateSummary)).toEqual([ + ".sisyphus/rules:0:src/.sisyphus/rules/local.md", + ".sisyphus/rules:1:.sisyphus/rules/root.md", + "AGENTS.md:1:AGENTS.md", + ]); + }); +}); diff --git a/test/matcher.test.ts b/test/matcher.test.ts index de27b60..8c35ae4 100644 --- a/test/matcher.test.ts +++ b/test/matcher.test.ts @@ -1,20 +1,69 @@ import { describe, expect, it } from "vitest"; -import { matchRule } from "../src/rules/matcher.js"; +import { matchRule, normalizeGlobs } from "../src/rules/matcher.js"; import type { RuleFrontmatter } from "../src/rules/types.js"; -function matchGlobs(globs: string | string[], projectRelative: string): boolean { +function matchFrontmatter( + frontmatter: RuleFrontmatter, + pathBases: { + projectRelative: string; + scopeRelative?: string; + basename?: string; + }, +): ReturnType { return matchRule({ - frontmatter: { globs } satisfies RuleFrontmatter, + frontmatter, isSingleFile: false, pathBases: { - projectRelative, - basename: projectRelative.split("/").at(-1) ?? projectRelative, + projectRelative: pathBases.projectRelative, + scopeRelative: pathBases.scopeRelative, + basename: pathBases.basename ?? pathBases.projectRelative.split("/").at(-1) ?? pathBases.projectRelative, }, - }).matched; + }); +} + +function matchGlobs(globs: string | string[], projectRelative: string): boolean { + return matchFrontmatter({ globs } satisfies RuleFrontmatter, { projectRelative }).matched; } describe("matchRule", () => { + it("#given single-file rule #when matching any target #then it always matches", () => { + // given + const frontmatter = {} satisfies RuleFrontmatter; + + // when + const result = matchRule({ + frontmatter, + isSingleFile: true, + pathBases: { projectRelative: "docs/readme.md", basename: "readme.md" }, + }); + + // then + expect(result).toEqual({ matched: true, reason: "single-file" }); + }); + + it("#given always apply rule #when no glob is configured #then it matches", () => { + // given + const frontmatter = { alwaysApply: true } satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { projectRelative: "src/app.ts" }); + + // then + expect(result).toEqual({ matched: true, reason: "alwaysApply" }); + }); + + it("#given rule without patterns #when target is checked #then no match is returned", () => { + // given + const frontmatter = {} satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { projectRelative: "src/app.ts" }); + + // then + expect(result).toEqual({ matched: false, reason: { kind: "no-match" } }); + }); + it("#given recursive glob #when target is nested #then matches without runtime dependencies", () => { // given const globs = "**/*.ts"; @@ -26,6 +75,64 @@ describe("matchRule", () => { expect(matched).toBe(true); }); + it("#given paths alias #when target matches #then glob match is returned", () => { + // given + const frontmatter = { paths: "src/**/*.ts" } satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { projectRelative: "src/features/app.ts" }); + + // then + expect(result).toEqual({ matched: true, reason: { kind: "glob", pattern: "src/**/*.ts" } }); + }); + + it("#given applyTo alias #when basename matches #then glob match is returned", () => { + // given + const frontmatter = { applyTo: "*.md" } satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { projectRelative: "docs/README.md" }); + + // then + expect(result).toEqual({ matched: true, reason: { kind: "glob", pattern: "*.md" } }); + }); + + it("#given scope-relative target #when scoped path matches #then glob match is returned", () => { + // given + const frontmatter = { globs: "components/**/*.tsx" } satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { + projectRelative: "packages/ui/components/button.tsx", + scopeRelative: "components/button.tsx", + }); + + // then + expect(result).toEqual({ matched: true, reason: { kind: "glob", pattern: "components/**/*.tsx" } }); + }); + + it("#given backslash glob and target #when matching #then paths are normalized", () => { + // given + const frontmatter = { globs: "src\\**\\*.ts" } satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { projectRelative: "src\\features\\app.ts" }); + + // then + expect(result).toEqual({ matched: true, reason: { kind: "glob", pattern: "src/**/*.ts" } }); + }); + + it("#given multiple positive globs #when later glob matches #then matching pattern is reported", () => { + // given + const frontmatter = { globs: ["docs/**/*.md", "src/**/*.ts"] } satisfies RuleFrontmatter; + + // when + const result = matchFrontmatter(frontmatter, { projectRelative: "src/features/app.ts" }); + + // then + expect(result).toEqual({ matched: true, reason: { kind: "glob", pattern: "src/**/*.ts" } }); + }); + it("#given negative glob #when target is excluded #then no match is returned", () => { // given const globs = ["**/*.ts", "!**/*.test.ts"]; @@ -37,6 +144,17 @@ describe("matchRule", () => { expect(matched).toBe(false); }); + it("#given question-mark glob #when one filename character differs #then target matches", () => { + // given + const globs = "src/app-?.ts"; + + // when + const matched = matchGlobs(globs, "src/app-a.ts"); + + // then + expect(matched).toBe(true); + }); + it("#given brace glob #when target extension is listed #then matches", () => { // given const globs = "src/**/*.{ts,tsx}"; @@ -47,4 +165,18 @@ describe("matchRule", () => { // then expect(matched).toBe(true); }); + + it("#given duplicate normalized patterns #when normalizing #then first unique pattern order is kept", () => { + // given + const frontmatter = { + globs: ["src\\**\\*.ts", "src/**/*.ts", "!src/**/*.test.ts"], + paths: "!src/**/*.test.ts", + } satisfies RuleFrontmatter; + + // when + const patterns = normalizeGlobs(frontmatter); + + // then + expect(patterns).toEqual(["src/**/*.ts", "!src/**/*.test.ts"]); + }); }); diff --git a/test/scanner.test.ts b/test/scanner.test.ts index 0fdf502..fb17863 100644 --- a/test/scanner.test.ts +++ b/test/scanner.test.ts @@ -1,4 +1,4 @@ -import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it } from "vitest"; @@ -28,4 +28,36 @@ describe("scanRuleFiles", () => { // then expect(files).toHaveLength(2); }); + + it("#given rule files and an excluded directory #when scanning #then returns sorted non-excluded files", () => { + // given + const root = mkdtempSync(join(tmpdir(), "codex-rules-scanner-")); + tempDirectories.push(root); + mkdirSync(join(root, "dist"), { recursive: true }); + writeFileSync(join(root, "beta.md"), "Beta\n"); + writeFileSync(join(root, "alpha.md"), "Alpha\n"); + writeFileSync(join(root, "dist", "ignored.md"), "Ignored\n"); + + // when + const files = scanRuleFiles({ rootDir: root }); + + // then + expect(files.map((file) => file.path)).toEqual([join(root, "alpha.md"), join(root, "beta.md")]); + }); + + it("#given symlink loop #when scanning #then traversal terminates without duplicate files", () => { + // given + const root = mkdtempSync(join(tmpdir(), "codex-rules-scanner-")); + tempDirectories.push(root); + const nested = join(root, "nested"); + mkdirSync(nested, { recursive: true }); + writeFileSync(join(root, "root.md"), "Root\n"); + symlinkSync(root, join(nested, "loop")); + + // when + const files = scanRuleFiles({ rootDir: root }); + + // then + expect(files.map((file) => file.path)).toEqual([join(root, "root.md")]); + }); }); From 58c7ac3ffeebf4da7cdcad58de876e0159af6cb3 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 16:29:34 +0900 Subject: [PATCH 07/13] fix(hooks): ignore malformed hook input Guard hook stdin parsing before event dispatch so malformed or wrong-shape payloads no-op instead of surfacing JSON parser failures. Plan: /Users/yeongyu/local-workspaces/codex-plugins/plans/posttooluse-hook-hardening.md --- dist/cli.js | 54 ++++++++++++++++++++++++++++++--- dist/cli.js.map | 2 +- src/cli.ts | 67 +++++++++++++++++++++++++++++++++++++---- test/codex-hook.test.ts | 64 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 176 insertions(+), 11 deletions(-) diff --git a/dist/cli.js b/dist/cli.js index 8fd1ecb..cd5942b 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -20,17 +20,63 @@ async function runHookCli(eventName) { const raw = await readStdin(); if (raw.trim().length === 0) return; - const parsed = JSON.parse(raw); + const parsed = parseHookInput(raw); + if (!parsed) + return; const options = { pluginDataRoot: process.env.PLUGIN_DATA }; - const output = eventName === "SessionStart" + const output = eventName === "SessionStart" && isCodexSessionStartInput(parsed) ? await runSessionStartHook(parsed, options) - : eventName === "UserPromptSubmit" + : eventName === "UserPromptSubmit" && isCodexUserPromptSubmitInput(parsed) ? await runUserPromptSubmitHook(parsed, options) - : await runPostToolUseHook(parsed, options); + : eventName === "PostToolUse" && isCodexPostToolUseInput(parsed) + ? await runPostToolUseHook(parsed, options) + : ""; if (output.length > 0) { processStdout.write(output); } } +function parseHookInput(raw) { + try { + const parsed = JSON.parse(raw); + return parsed; + } + catch { + return undefined; + } +} +function isCodexSessionStartInput(value) { + return (isRecord(value) && + value.hook_event_name === "SessionStart" && + typeof value.session_id === "string" && + typeof value.cwd === "string" && + typeof value.model === "string" && + typeof value.permission_mode === "string" && + typeof value.source === "string"); +} +function isCodexUserPromptSubmitInput(value) { + return (isRecord(value) && + value.hook_event_name === "UserPromptSubmit" && + typeof value.session_id === "string" && + typeof value.turn_id === "string" && + typeof value.cwd === "string" && + typeof value.model === "string" && + typeof value.permission_mode === "string" && + typeof value.prompt === "string"); +} +function isCodexPostToolUseInput(value) { + return (isRecord(value) && + value.hook_event_name === "PostToolUse" && + typeof value.session_id === "string" && + typeof value.turn_id === "string" && + typeof value.cwd === "string" && + typeof value.model === "string" && + typeof value.permission_mode === "string" && + typeof value.tool_name === "string" && + typeof value.tool_use_id === "string"); +} +function isRecord(value) { + return typeof value === "object" && value !== null && !Array.isArray(value); +} function readStdin() { return new Promise((resolve, reject) => { let data = ""; diff --git a/dist/cli.js.map b/dist/cli.js.map index 246e8bb..65988ad 100644 --- a/dist/cli.js.map +++ b/dist/cli.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAIN,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;IAC1D,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC;KAAM,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,oBAAoB,EAAE,CAAC;IACtE,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC;KAAM,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;IACjE,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC;KAAM,CAAC;IACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;IACnG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,SAA8D;IACvF,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,MAAM,GACX,SAAS,KAAK,cAAc;QAC3B,CAAC,CAAC,MAAM,mBAAmB,CAAC,MAAgC,EAAE,OAAO,CAAC;QACtE,CAAC,CAAC,SAAS,KAAK,kBAAkB;YACjC,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAoC,EAAE,OAAO,CAAC;YAC9E,CAAC,CAAC,MAAM,kBAAkB,CAAC,MAA+B,EAAE,OAAO,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC;AAED,SAAS,SAAS;IACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,IAAI,IAAI,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index 128a0ad..329af44 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -27,19 +27,74 @@ if (command === "hook" && subcommand === "session-start") { async function runHookCli(eventName: "SessionStart" | "UserPromptSubmit" | "PostToolUse"): Promise { const raw = await readStdin(); if (raw.trim().length === 0) return; - const parsed = JSON.parse(raw); + const parsed = parseHookInput(raw); + if (!parsed) return; const options = { pluginDataRoot: process.env.PLUGIN_DATA }; const output = - eventName === "SessionStart" - ? await runSessionStartHook(parsed as CodexSessionStartInput, options) - : eventName === "UserPromptSubmit" - ? await runUserPromptSubmitHook(parsed as CodexUserPromptSubmitInput, options) - : await runPostToolUseHook(parsed as CodexPostToolUseInput, options); + eventName === "SessionStart" && isCodexSessionStartInput(parsed) + ? await runSessionStartHook(parsed, options) + : eventName === "UserPromptSubmit" && isCodexUserPromptSubmitInput(parsed) + ? await runUserPromptSubmitHook(parsed, options) + : eventName === "PostToolUse" && isCodexPostToolUseInput(parsed) + ? await runPostToolUseHook(parsed, options) + : ""; if (output.length > 0) { processStdout.write(output); } } +function parseHookInput(raw: string): unknown | undefined { + try { + const parsed: unknown = JSON.parse(raw); + return parsed; + } catch { + return undefined; + } +} + +function isCodexSessionStartInput(value: unknown): value is CodexSessionStartInput { + return ( + isRecord(value) && + value.hook_event_name === "SessionStart" && + typeof value.session_id === "string" && + typeof value.cwd === "string" && + typeof value.model === "string" && + typeof value.permission_mode === "string" && + typeof value.source === "string" + ); +} + +function isCodexUserPromptSubmitInput(value: unknown): value is CodexUserPromptSubmitInput { + return ( + isRecord(value) && + value.hook_event_name === "UserPromptSubmit" && + typeof value.session_id === "string" && + typeof value.turn_id === "string" && + typeof value.cwd === "string" && + typeof value.model === "string" && + typeof value.permission_mode === "string" && + typeof value.prompt === "string" + ); +} + +function isCodexPostToolUseInput(value: unknown): value is CodexPostToolUseInput { + return ( + isRecord(value) && + value.hook_event_name === "PostToolUse" && + typeof value.session_id === "string" && + typeof value.turn_id === "string" && + typeof value.cwd === "string" && + typeof value.model === "string" && + typeof value.permission_mode === "string" && + typeof value.tool_name === "string" && + typeof value.tool_use_id === "string" + ); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + function readStdin(): Promise { return new Promise((resolve, reject) => { let data = ""; diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index d90fadd..ef06449 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -1,3 +1,4 @@ +import { spawn } from "node:child_process"; import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; @@ -11,6 +12,39 @@ import { runUserPromptSubmitHook, } from "../src/codex-hook.js"; +type CliResult = { + exitCode: number | null; + stdout: string; + stderr: string; +}; + +function runHookCli(input: string): Promise { + return new Promise((resolve, reject) => { + const child = spawn( + process.execPath, + [new URL("../dist/cli.js", import.meta.url).pathname, "hook", "post-tool-use"], + { + stdio: ["pipe", "pipe", "pipe"], + }, + ); + let stdout = ""; + let stderr = ""; + child.stdout.setEncoding("utf8"); + child.stderr.setEncoding("utf8"); + child.stdout.on("data", (chunk: string) => { + stdout += chunk; + }); + child.stderr.on("data", (chunk: string) => { + stderr += chunk; + }); + child.once("error", reject); + child.once("close", (exitCode) => { + resolve({ exitCode, stdout, stderr }); + }); + child.stdin.end(input); + }); +} + const tempDirectories: string[] = []; const PROJECT_ONLY_ENV = { CODEX_RULES_ENABLED_SOURCES: "AGENTS.md,.sisyphus/rules", @@ -273,4 +307,34 @@ describe("codex rules hooks", () => { // then expect(output).toBe(""); }); + + it("#given malformed post-tool-use stdin #when hook CLI runs #then it no-ops without stderr", async () => { + // given + const input = "break;\n"; + + // when + const result = await runHookCli(input); + + // then + expect(result).toEqual({ + exitCode: 0, + stdout: "", + stderr: "", + }); + }); + + it("#given non-object post-tool-use JSON #when hook CLI runs #then it no-ops without stderr", async () => { + // given + const input = "[]\n"; + + // when + const result = await runHookCli(input); + + // then + expect(result).toEqual({ + exitCode: 0, + stdout: "", + stderr: "", + }); + }); }); From 02faa5a3165a38ca3314cdd74684aeaf25c3435b Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 13:12:36 +0900 Subject: [PATCH 08/13] test(hooks): resolve CLI path from file URL Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- test/codex-hook.test.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index ef06449..58a3333 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -2,6 +2,7 @@ import { spawn } from "node:child_process"; import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; +import { fileURLToPath } from "node:url"; import { afterEach, describe, expect, it } from "vitest"; import { @@ -18,15 +19,13 @@ type CliResult = { stderr: string; }; +const CLI_PATH = fileURLToPath(new URL("../dist/cli.js", import.meta.url)); + function runHookCli(input: string): Promise { return new Promise((resolve, reject) => { - const child = spawn( - process.execPath, - [new URL("../dist/cli.js", import.meta.url).pathname, "hook", "post-tool-use"], - { - stdio: ["pipe", "pipe", "pipe"], - }, - ); + const child = spawn(process.execPath, [CLI_PATH, "hook", "post-tool-use"], { + stdio: ["pipe", "pipe", "pipe"], + }); let stdout = ""; let stderr = ""; child.stdout.setEncoding("utf8"); From 1b72b577d30332f32102ef07ddf4e5762687d9e2 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 13:30:23 +0900 Subject: [PATCH 09/13] perf(rules): cache dynamic match decisions Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- dist/rules/engine.d.ts | 2 + dist/rules/engine.d.ts.map | 2 +- dist/rules/engine.js | 52 +++++++++++++++--- dist/rules/engine.js.map | 2 +- src/rules/engine.ts | 78 ++++++++++++++++++++++++--- test/engine.test.ts | 106 +++++++++++++++++++++++++++++++++---- 6 files changed, 216 insertions(+), 26 deletions(-) diff --git a/dist/rules/engine.d.ts b/dist/rules/engine.d.ts index 4356223..3604594 100644 --- a/dist/rules/engine.d.ts +++ b/dist/rules/engine.d.ts @@ -1,4 +1,5 @@ import { type RuleDiscoveryCache } from "./finder.js"; +import { matchRule } from "./matcher.js"; import type { LoadedRule, PiRulesConfig, RuleCandidate, RuleDiagnostic, SessionState } from "./types.js"; export interface EngineDeps { findCandidates: (options: { @@ -11,6 +12,7 @@ export interface EngineDeps { }) => RuleCandidate[]; readFile: (path: string) => string | null; findProjectRoot: (startPath: string) => string | null; + matchRule?: typeof matchRule; } export interface Engine { state: SessionState; diff --git a/dist/rules/engine.d.ts.map b/dist/rules/engine.d.ts.map index ce2826a..c90eae7 100644 --- a/dist/rules/engine.d.ts.map +++ b/dist/rules/engine.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKhF,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAWtH,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,CAAC,OAAO,EAAE;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC3B,KAAK,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACrF,gBAAgB,CACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAC1D,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACvD,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxE,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7C,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC9C,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC/C;AAID,wBAAgB,aAAa,IAAI,aAAa,CAQ7C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA0G5E"} \ No newline at end of file +{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAe,SAAS,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AActH,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,CAAC,OAAO,EAAE;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC3B,KAAK,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACrF,gBAAgB,CACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAC1D,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACvD,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxE,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7C,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC9C,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC/C;AAID,wBAAgB,aAAa,IAAI,aAAa,CAQ7C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA+G5E"} \ No newline at end of file diff --git a/dist/rules/engine.js b/dist/rules/engine.js index 0ab9eed..b61913d 100644 --- a/dist/rules/engine.js +++ b/dist/rules/engine.js @@ -7,6 +7,7 @@ import { formatDynamicBlock, formatStaticBlock } from "./formatter.js"; import { hashContent, matchRule } from "./matcher.js"; import { sortCandidates } from "./ordering.js"; import { parseRule } from "./parser.js"; +const MAX_DYNAMIC_MATCH_CACHE_ENTRIES = 4096; const ROOT_SINGLE_FILE_SOURCES = new Set(PROJECT_SINGLE_FILES.filter((source) => !source.includes("/"))); export function defaultConfig() { return { @@ -19,6 +20,7 @@ export function defaultConfig() { } export function createEngine(config, deps) { const state = createSessionState(); + const dynamicMatchCache = new Map(); function loadStaticRules(cwd) { state.cwd = cwd; if (config.disabled || config.mode === "off" || config.mode === "dynamic") { @@ -57,12 +59,8 @@ export function createEngine(config, deps) { if (loadedRule === null) { continue; } - const matchResult = matchRule({ - frontmatter: loadedRule.frontmatter, - isSingleFile: candidate.isSingleFile, - pathBases: pathBasesForTarget(projectRoot, targetFile, candidate), - }); - if (!matchResult.matched) { + const matchReason = matchDynamicRuleCached(dynamicMatchCache, projectRoot, targetFile, candidate, loadedRule, deps.matchRule ?? matchRule); + if (matchReason === null) { continue; } const dedupKey = ruleDedupKey(loadedRule); @@ -70,7 +68,7 @@ export function createEngine(config, deps) { continue; } seenRules.add(dedupKey); - rules.push({ ...loadedRule, matchReason: matchResult.reason }); + rules.push({ ...loadedRule, matchReason }); } } const sortedRules = sortCandidates(rules); @@ -89,6 +87,7 @@ export function createEngine(config, deps) { }), resetSession: (cwd) => { clearSession(state); + dynamicMatchCache.clear(); if (cwd !== undefined) { state.cwd = cwd; } @@ -99,6 +98,45 @@ export function createEngine(config, deps) { markDynamicInjected: (rule) => markDynamicInjectedInState(state, rule), }; } +function matchDynamicRuleCached(cache, projectRoot, targetFile, candidate, loadedRule, matchRuleImpl) { + const cacheKey = dynamicMatchCacheKey(projectRoot, targetFile, candidate, loadedRule.contentHash); + if (cache.has(cacheKey)) { + const cachedReason = cache.get(cacheKey) ?? null; + cache.delete(cacheKey); + cache.set(cacheKey, cachedReason); + return cachedReason; + } + const matchResult = matchRuleImpl({ + frontmatter: loadedRule.frontmatter, + isSingleFile: candidate.isSingleFile, + pathBases: pathBasesForTarget(projectRoot, targetFile, candidate), + }); + const reason = matchResult.matched ? matchResult.reason : null; + setDynamicMatchCacheEntry(cache, cacheKey, reason); + return reason; +} +function setDynamicMatchCacheEntry(cache, cacheKey, reason) { + if (cache.size >= MAX_DYNAMIC_MATCH_CACHE_ENTRIES) { + const oldestCacheKey = cache.keys().next().value; + if (oldestCacheKey !== undefined) { + cache.delete(oldestCacheKey); + } + } + cache.set(cacheKey, reason); +} +function dynamicMatchCacheKey(projectRoot, targetFile, candidate, contentHash) { + return [ + projectRoot ?? "", + toPosixPath(resolve(targetFile)), + candidate.realPath, + candidate.relativePath, + candidate.source, + candidate.isGlobal ? "global" : "project", + candidate.isSingleFile ? "single" : "multi", + String(candidate.distance), + contentHash, + ].join("\0"); +} function loadStaticCandidates(candidates, deps, projectRoot) { const rules = []; const diagnostics = []; diff --git a/dist/rules/engine.js.map b/dist/rules/engine.js.map index 7cc4e41..72cc8e4 100644 --- a/dist/rules/engine.js.map +++ b/dist/rules/engine.js.map @@ -1 +1 @@ -{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnF,OAAO,EACN,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,IAAI,wBAAwB,EAC7C,gBAAgB,IAAI,uBAAuB,EAC3C,mBAAmB,IAAI,0BAA0B,EACjD,kBAAkB,IAAI,yBAAyB,GAC/C,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAA2B,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA0CxC,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEzG,MAAM,UAAU,aAAa;IAC5B,OAAO;QACN,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,sBAAsB;QACpC,cAAc,EAAE,wBAAwB;QACxC,cAAc,EAAE,MAAM;KACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,IAAgB;IACnE,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IAEnC,SAAS,eAAe,CAAC,GAAW;QACnC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;QAChB,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3E,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;YACtC,WAAW;YACX,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,kBAAkB,CAAC,MAAM,CAAC;SAC3C,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACnE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,SAAS,gBAAgB,CACxB,GAAW,EACX,WAAkC;QAElC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;QAChB,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtG,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoC,CAAC;QACtE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAmB,CAAC;QACrD,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,wBAAwB,EAAE,CAAC;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEjD,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAChB,cAAc,KAAK,IAAI,IAAI,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC;gBACvE,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAE5G,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpD,MAAM,UAAU,GAAG,aAAa,CAC/B,SAAS,EACT,IAAI,EACJ,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,iBAAiB,CACjB,CAAC;gBACF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACzB,SAAS;gBACV,CAAC;gBAED,MAAM,WAAW,GAAG,SAAS,CAAC;oBAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,YAAY,EAAE,SAAS,CAAC,YAAY;oBACpC,SAAS,EAAE,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC;iBACjE,CAAC,CAAC;gBAEH,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBAC1B,SAAS;gBACV,CAAC;gBAED,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,SAAS;gBACV,CAAC;gBAED,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,CAAC;QACF,CAAC;QAED,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO;QACN,KAAK;QACL,MAAM;QACN,eAAe;QACf,gBAAgB;QAChB,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACvB,iBAAiB,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;QACvG,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAChC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,cAAc,EAAE,MAAM,CAAC,cAAc;SACrC,CAAC;QACH,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACvB,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;YACjB,CAAC;QACF,CAAC;QACD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC;QAChE,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC;QAClE,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC;QACpE,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC;KACtE,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAwC,EAAE,IAAgB,EAAE,WAA0B;IACnH,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,IAAI,uBAAuB,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAE,CAAC;YAChE,SAAS;QACV,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC5E,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACzB,SAAS;QACV,CAAC;QAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAC1B,SAAS;QACV,CAAC;QAED,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,sBAAsB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CACrB,SAAwB,EACxB,IAAgB,EAChB,WAA6B,EAC7B,WAA0B,EAC1B,iBAAyD,EACzD,iBAA8C;IAE9C,IAAI,CAAC,8BAA8B,CAAC,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAChF,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,SAAS,CAAC,IAAI;YACtB,OAAO,EAAE,yCAAyC;SAClD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,qBAAqB,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACvG,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QACrC,UAAU,EAAE,MAAM,CAAC,UAAU;KACD,CAAC;IAC9B,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC1D,OAAO,qBAAqB,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,qBAAqB,CAC7B,SAAwB,EACxB,OAAiC,EACjC,WAA6B;IAE7B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACvG,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,OAAO;QACN,GAAG,SAAS;QACZ,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;KACjC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IACrC,OAAO,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,wBAAwB,CAAC,SAAwB,EAAE,WAA0B;IACrF,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3G,OAAO,gBAAgB,KAAK,EAAE,IAAI,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,SAAS,8BAA8B,CACtC,SAAwB,EACxB,WAA0B,EAC1B,iBAAyD;IAEzD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,wBAAwB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,EAAE,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,wBAAwB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzE,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACjD,OAAO,eAAe,CAAC;AACxB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACvC,IAAI,CAAC;QACJ,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,UAAkB;IAC/D,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,OAAO,iBAAiB,KAAK,EAAE,IAAI,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB;IAC1C,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqB;IAChD,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACtD,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAwB,EAAE,sBAA+B;IACzF,OAAO,sBAAsB,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAwB;IACjD,OAAO,SAAS,CAAC,QAAQ,KAAK,CAAC,IAAI,SAAS,CAAC,YAAY,IAAI,wBAAwB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,kBAAkB,CAC1B,WAA0B,EAC1B,UAAkB,EAClB,SAAwB;IAExB,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,0BAA0B,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1E,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACtD,CAAC;IAED,OAAO;QACN,eAAe;QACf,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAChE,QAAQ,EAAE,cAAc;KACxB,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,WAAmB,EAAE,SAAwB;IAChF,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrE,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,MAAM,sBAAsB,GAAG,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/F,OAAO,sBAAsB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,aAAa,CACrB,KAAmB,EACnB,KAAgC,EAChC,WAA0C;IAE1C,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACjC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB;IAC3C,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,MAA6B;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS;QACV,CAAC;QAED,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC"} \ No newline at end of file +{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/rules/engine.ts b/src/rules/engine.ts index 6cc15b1..93b3958 100644 --- a/src/rules/engine.ts +++ b/src/rules/engine.ts @@ -30,6 +30,9 @@ interface LoadedRuleContent { } type CandidateProjectMembership = Map; +type DynamicMatchCache = Map; + +const MAX_DYNAMIC_MATCH_CACHE_ENTRIES = 4096; export interface EngineDeps { findCandidates: (options: { @@ -42,6 +45,7 @@ export interface EngineDeps { }) => RuleCandidate[]; readFile: (path: string) => string | null; findProjectRoot: (startPath: string) => string | null; + matchRule?: typeof matchRule; } export interface Engine { @@ -75,6 +79,7 @@ export function defaultConfig(): PiRulesConfig { export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { const state = createSessionState(); + const dynamicMatchCache: DynamicMatchCache = new Map(); function loadStaticRules(cwd: string): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] } { state.cwd = cwd; @@ -131,13 +136,16 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { continue; } - const matchResult = matchRule({ - frontmatter: loadedRule.frontmatter, - isSingleFile: candidate.isSingleFile, - pathBases: pathBasesForTarget(projectRoot, targetFile, candidate), - }); + const matchReason = matchDynamicRuleCached( + dynamicMatchCache, + projectRoot, + targetFile, + candidate, + loadedRule, + deps.matchRule ?? matchRule, + ); - if (!matchResult.matched) { + if (matchReason === null) { continue; } @@ -147,7 +155,7 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { } seenRules.add(dedupKey); - rules.push({ ...loadedRule, matchReason: matchResult.reason }); + rules.push({ ...loadedRule, matchReason }); } } @@ -170,6 +178,7 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { }), resetSession: (cwd) => { clearSession(state); + dynamicMatchCache.clear(); if (cwd !== undefined) { state.cwd = cwd; } @@ -181,6 +190,61 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { }; } +function matchDynamicRuleCached( + cache: DynamicMatchCache, + projectRoot: string | null, + targetFile: string, + candidate: RuleCandidate, + loadedRule: LoadedRule, + matchRuleImpl: typeof matchRule, +): MatchReason | null { + const cacheKey = dynamicMatchCacheKey(projectRoot, targetFile, candidate, loadedRule.contentHash); + if (cache.has(cacheKey)) { + const cachedReason = cache.get(cacheKey) ?? null; + cache.delete(cacheKey); + cache.set(cacheKey, cachedReason); + return cachedReason; + } + + const matchResult = matchRuleImpl({ + frontmatter: loadedRule.frontmatter, + isSingleFile: candidate.isSingleFile, + pathBases: pathBasesForTarget(projectRoot, targetFile, candidate), + }); + const reason = matchResult.matched ? matchResult.reason : null; + setDynamicMatchCacheEntry(cache, cacheKey, reason); + return reason; +} + +function setDynamicMatchCacheEntry(cache: DynamicMatchCache, cacheKey: string, reason: MatchReason | null): void { + if (cache.size >= MAX_DYNAMIC_MATCH_CACHE_ENTRIES) { + const oldestCacheKey = cache.keys().next().value; + if (oldestCacheKey !== undefined) { + cache.delete(oldestCacheKey); + } + } + cache.set(cacheKey, reason); +} + +function dynamicMatchCacheKey( + projectRoot: string | null, + targetFile: string, + candidate: RuleCandidate, + contentHash: string, +): string { + return [ + projectRoot ?? "", + toPosixPath(resolve(targetFile)), + candidate.realPath, + candidate.relativePath, + candidate.source, + candidate.isGlobal ? "global" : "project", + candidate.isSingleFile ? "single" : "multi", + String(candidate.distance), + contentHash, + ].join("\0"); +} + function loadStaticCandidates(candidates: ReadonlyArray, deps: EngineDeps, projectRoot: string | null) { const rules: LoadedRule[] = []; const diagnostics: RuleDiagnostic[] = []; diff --git a/test/engine.test.ts b/test/engine.test.ts index d65d264..c152877 100644 --- a/test/engine.test.ts +++ b/test/engine.test.ts @@ -2,22 +2,28 @@ import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { createEngine, defaultConfig, type EngineDeps } from "../src/rules/engine.js"; +import { matchRule as defaultMatchRule } from "../src/rules/matcher.js"; import type { RuleCandidate } from "../src/rules/types.js"; +const projectRoot = "/tmp/codex-rules-engine"; + +function makeCandidate(): RuleCandidate { + return { + path: join(projectRoot, ".sisyphus", "rules", "typescript.md"), + realPath: join(projectRoot, ".sisyphus", "rules", "typescript.md"), + source: ".sisyphus/rules", + distance: 0, + isGlobal: false, + isSingleFile: false, + relativePath: ".sisyphus/rules/typescript.md", + }; +} + describe("rule engine dynamic matching", () => { it("#given duplicate target paths #when loading dynamic rules #then repeated discovery and parsing work is avoided", () => { // given - const projectRoot = "/tmp/codex-rules-engine"; const targetPath = join(projectRoot, "src", "app.ts"); - const candidate: RuleCandidate = { - path: join(projectRoot, ".sisyphus", "rules", "typescript.md"), - realPath: join(projectRoot, ".sisyphus", "rules", "typescript.md"), - source: ".sisyphus/rules", - distance: 0, - isGlobal: false, - isSingleFile: false, - relativePath: ".sisyphus/rules/typescript.md", - }; + const candidate = makeCandidate(); const counters = { findProjectRoot: 0, findCandidates: 0, @@ -50,4 +56,84 @@ describe("rule engine dynamic matching", () => { readFile: 1, }); }); + + it("#given same rule content and target across loads #when loading dynamic rules repeats #then cached match decision is reused", () => { + // given + const targetPath = join(projectRoot, "src", "app.ts"); + const candidate = makeCandidate(); + let matchCalls = 0; + const deps = { + findProjectRoot: () => projectRoot, + findCandidates: () => [candidate], + readFile: () => ["---", "globs: **/*.ts", "---", "", "Prefer strict TypeScript."].join("\n"), + matchRule: (input) => { + matchCalls += 1; + return defaultMatchRule(input); + }, + } satisfies EngineDeps; + const engine = createEngine(defaultConfig(), deps); + + // when + const firstResult = engine.loadDynamicRules(projectRoot, [targetPath]); + const secondResult = engine.loadDynamicRules(projectRoot, [targetPath]); + + // then + expect(firstResult.rules).toHaveLength(1); + expect(secondResult.rules).toHaveLength(1); + expect(matchCalls).toBe(1); + }); + + it("#given same rule path changes body #when loading dynamic rules repeats #then cached match decision invalidates", () => { + // given + const targetPath = join(projectRoot, "src", "app.ts"); + const candidate = makeCandidate(); + let body = "Prefer strict TypeScript."; + let matchCalls = 0; + const deps = { + findProjectRoot: () => projectRoot, + findCandidates: () => [candidate], + readFile: () => ["---", "globs: **/*.ts", "---", "", body].join("\n"), + matchRule: (input) => { + matchCalls += 1; + return defaultMatchRule(input); + }, + } satisfies EngineDeps; + const engine = createEngine(defaultConfig(), deps); + + // when + engine.loadDynamicRules(projectRoot, [targetPath]); + body = "Prefer readonly TypeScript."; + engine.loadDynamicRules(projectRoot, [targetPath]); + + // then + expect(matchCalls).toBe(2); + }); + + it("#given same rule and different targets #when loading dynamic rules repeats #then target-specific decisions do not leak", () => { + // given + const sourceTarget = join(projectRoot, "src", "app.ts"); + const testTarget = join(projectRoot, "src", "app.test.ts"); + const candidate = makeCandidate(); + let matchCalls = 0; + const deps = { + findProjectRoot: () => projectRoot, + findCandidates: () => [candidate], + readFile: () => + ["---", 'globs: ["**/*.ts", "!**/*.test.ts"]', "---", "", "Prefer strict TypeScript."].join("\n"), + matchRule: (input) => { + matchCalls += 1; + return defaultMatchRule(input); + }, + } satisfies EngineDeps; + const engine = createEngine(defaultConfig(), deps); + + // when + const sourceResult = engine.loadDynamicRules(projectRoot, [sourceTarget]); + const testResult = engine.loadDynamicRules(projectRoot, [testTarget]); + + // then + expect(sourceResult.rules).toHaveLength(1); + expect(testResult.rules).toHaveLength(0); + expect(matchCalls).toBe(2); + }); }); From 0bdc6fdb8432914db84823fe032f6eadecf30a6e Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 13:42:36 +0900 Subject: [PATCH 10/13] fix(rules): include frontmatter in match cache fingerprint --- dist/rules/engine.js | 2 +- dist/rules/engine.js.map | 2 +- scripts/bench-codex-rules.mjs | 3 ++- src/rules/engine.ts | 2 +- test/engine.test.ts | 28 ++++++++++++++++++++++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/dist/rules/engine.js b/dist/rules/engine.js index b61913d..1c4060a 100644 --- a/dist/rules/engine.js +++ b/dist/rules/engine.js @@ -183,7 +183,7 @@ function loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleCont const loadedContent = { frontmatter: parsed.frontmatter, body: parsed.body, - contentHash: hashContent(parsed.body), + contentHash: hashContent(content), diagnostic: parsed.diagnostic, }; loadedRuleContent?.set(candidate.realPath, loadedContent); diff --git a/dist/rules/engine.js.map b/dist/rules/engine.js.map index 72cc8e4..39d8ce8 100644 --- a/dist/rules/engine.js.map +++ b/dist/rules/engine.js.map @@ -1 +1 @@ -{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/scripts/bench-codex-rules.mjs b/scripts/bench-codex-rules.mjs index 5e3dd62..ab884ff 100644 --- a/scripts/bench-codex-rules.mjs +++ b/scripts/bench-codex-rules.mjs @@ -106,8 +106,9 @@ function measureRun(targetPaths) { return ruleContent(path); }, }); + const generatedTargetPaths = targetPaths(projectRoot); const start = process.hrtime.bigint(); - engine.loadDynamicRules(projectRoot, targetPaths(projectRoot)); + engine.loadDynamicRules(projectRoot, generatedTargetPaths); const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000; return { durationMs, counters }; } finally { diff --git a/src/rules/engine.ts b/src/rules/engine.ts index 93b3958..8e7fd73 100644 --- a/src/rules/engine.ts +++ b/src/rules/engine.ts @@ -308,7 +308,7 @@ function loadCandidate( const loadedContent = { frontmatter: parsed.frontmatter, body: parsed.body, - contentHash: hashContent(parsed.body), + contentHash: hashContent(content), diagnostic: parsed.diagnostic, } satisfies LoadedRuleContent; loadedRuleContent?.set(candidate.realPath, loadedContent); diff --git a/test/engine.test.ts b/test/engine.test.ts index c152877..4c04fa0 100644 --- a/test/engine.test.ts +++ b/test/engine.test.ts @@ -109,6 +109,34 @@ describe("rule engine dynamic matching", () => { expect(matchCalls).toBe(2); }); + it("#given same rule path changes frontmatter #when loading dynamic rules repeats #then cached match decision invalidates", () => { + // given + const targetPath = join(projectRoot, "src", "app.ts"); + const candidate = makeCandidate(); + let globs = "**/*.ts"; + let matchCalls = 0; + const deps = { + findProjectRoot: () => projectRoot, + findCandidates: () => [candidate], + readFile: () => ["---", `globs: ${globs}`, "---", "", "Prefer strict TypeScript."].join("\n"), + matchRule: (input) => { + matchCalls += 1; + return defaultMatchRule(input); + }, + } satisfies EngineDeps; + const engine = createEngine(defaultConfig(), deps); + + // when + const firstResult = engine.loadDynamicRules(projectRoot, [targetPath]); + globs = "**/*.tsx"; + const secondResult = engine.loadDynamicRules(projectRoot, [targetPath]); + + // then + expect(firstResult.rules).toHaveLength(1); + expect(secondResult.rules).toHaveLength(0); + expect(matchCalls).toBe(2); + }); + it("#given same rule and different targets #when loading dynamic rules repeats #then target-specific decisions do not leak", () => { // given const sourceTarget = join(projectRoot, "src", "app.ts"); From ac04990b5af149e892cee23ab80d9404a671f832 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 14:29:18 +0900 Subject: [PATCH 11/13] perf(hooks): skip repeated Codex dynamic rule matches Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- README.md | 1 + dist/cli.js | 43 +++++++-- dist/cli.js.map | 2 +- dist/codex-hook.d.ts | 10 ++ dist/codex-hook.d.ts.map | 2 +- dist/codex-hook.js | 114 +++++++++++++++++++++-- dist/codex-hook.js.map | 2 +- dist/persistent-cache.d.ts.map | 2 +- dist/persistent-cache.js | 13 ++- dist/persistent-cache.js.map | 2 +- dist/rules/cache.d.ts.map | 2 +- dist/rules/cache.js | 10 +- dist/rules/cache.js.map | 2 +- dist/rules/types.d.ts | 1 + dist/rules/types.d.ts.map | 2 +- hooks/hooks.json | 13 +++ scripts/bench-codex-rules.mjs | 72 ++++++++++++++- src/cli.ts | 52 +++++++++-- src/codex-hook.ts | 162 +++++++++++++++++++++++++++++++-- src/persistent-cache.ts | 16 +++- src/rules/cache.ts | 10 +- src/rules/types.ts | 1 + test/codex-hook.test.ts | 152 ++++++++++++++++++++++++++++++- test/package-smoke.test.ts | 2 + 24 files changed, 634 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index e3bd04e..bd4c18b 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ It ports the `pi-rules` rule injector to Codex: - `SessionStart` and `UserPromptSubmit` load static project instructions once per session. - `PostToolUse` watches supported file reads, edits, `apply_patch`, MCP filesystem payloads, and shell command file references, then injects matching file-specific rules as additional context. +- `PostCompact` clears the per-session injection cache after manual or automatic compaction so relevant rules can be reintroduced into the compacted conversation. - Session-level deduplication prevents the same rule from being repeated after it has been injected. `PostToolUse` output is context-only: it emits `hookSpecificOutput.additionalContext` and does not rewrite tool output. diff --git a/dist/cli.js b/dist/cli.js index cd5942b..23a6b76 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -1,6 +1,6 @@ #!/usr/bin/env node import { stdin as processStdin, stdout as processStdout } from "node:process"; -import { runPostToolUseHook, runSessionStartHook, runUserPromptSubmitHook, } from "./codex-hook.js"; +import { runPostCompactHook, runPostToolUseHook, runSessionStartHook, runUserPromptSubmitHook, } from "./codex-hook.js"; const command = process.argv[2]; const subcommand = process.argv[3]; if (command === "hook" && subcommand === "session-start") { @@ -12,8 +12,11 @@ else if (command === "hook" && subcommand === "user-prompt-submit") { else if (command === "hook" && subcommand === "post-tool-use") { await runHookCli("PostToolUse"); } +else if (command === "hook" && subcommand === "post-compact") { + await runHookCli("PostCompact"); +} else { - process.stderr.write("Usage: codex-rules hook [session-start|user-prompt-submit|post-tool-use]\n"); + process.stderr.write("Usage: codex-rules hook [session-start|user-prompt-submit|post-tool-use|post-compact]\n"); process.exitCode = 1; } async function runHookCli(eventName) { @@ -24,17 +27,23 @@ async function runHookCli(eventName) { if (!parsed) return; const options = { pluginDataRoot: process.env.PLUGIN_DATA }; - const output = eventName === "SessionStart" && isCodexSessionStartInput(parsed) - ? await runSessionStartHook(parsed, options) - : eventName === "UserPromptSubmit" && isCodexUserPromptSubmitInput(parsed) - ? await runUserPromptSubmitHook(parsed, options) - : eventName === "PostToolUse" && isCodexPostToolUseInput(parsed) - ? await runPostToolUseHook(parsed, options) - : ""; + const output = await runHook(eventName, parsed, options); if (output.length > 0) { processStdout.write(output); } } +async function runHook(eventName, parsed, options) { + switch (eventName) { + case "SessionStart": + return isCodexSessionStartInput(parsed) ? await runSessionStartHook(parsed, options) : ""; + case "UserPromptSubmit": + return isCodexUserPromptSubmitInput(parsed) ? await runUserPromptSubmitHook(parsed, options) : ""; + case "PostToolUse": + return isCodexPostToolUseInput(parsed) ? await runPostToolUseHook(parsed, options) : ""; + case "PostCompact": + return isCodexPostCompactInput(parsed) ? await runPostCompactHook(parsed, options) : ""; + } +} function parseHookInput(raw) { try { const parsed = JSON.parse(raw); @@ -48,6 +57,7 @@ function isCodexSessionStartInput(value) { return (isRecord(value) && value.hook_event_name === "SessionStart" && typeof value.session_id === "string" && + isStringOrNull(value.transcript_path) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && @@ -58,6 +68,7 @@ function isCodexUserPromptSubmitInput(value) { value.hook_event_name === "UserPromptSubmit" && typeof value.session_id === "string" && typeof value.turn_id === "string" && + isStringOrNull(value.transcript_path) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && @@ -68,12 +79,26 @@ function isCodexPostToolUseInput(value) { value.hook_event_name === "PostToolUse" && typeof value.session_id === "string" && typeof value.turn_id === "string" && + isStringOrNull(value.transcript_path) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && typeof value.tool_name === "string" && typeof value.tool_use_id === "string"); } +function isCodexPostCompactInput(value) { + return (isRecord(value) && + value.hook_event_name === "PostCompact" && + typeof value.session_id === "string" && + typeof value.turn_id === "string" && + isStringOrNull(value.transcript_path) && + typeof value.cwd === "string" && + typeof value.model === "string" && + (value.trigger === "manual" || value.trigger === "auto")); +} +function isStringOrNull(value) { + return typeof value === "string" || value === null; +} function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } diff --git a/dist/cli.js.map b/dist/cli.js.map index 65988ad..a505902 100644 --- a/dist/cli.js.map +++ b/dist/cli.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/codex-hook.d.ts b/dist/codex-hook.d.ts index c8420ed..c47789d 100644 --- a/dist/codex-hook.d.ts +++ b/dist/codex-hook.d.ts @@ -30,11 +30,21 @@ export type CodexPostToolUseInput = { tool_response: unknown; tool_use_id: string; }; +export type CodexPostCompactInput = { + session_id: string; + turn_id: string; + transcript_path: string | null; + cwd: string; + hook_event_name: "PostCompact"; + model: string; + trigger: "manual" | "auto"; +}; export interface CodexRulesHookOptions { env?: NodeJS.ProcessEnv; pluginDataRoot?: string; } export declare function runSessionStartHook(input: CodexSessionStartInput, options?: CodexRulesHookOptions): Promise; +export declare function runPostCompactHook(input: CodexPostCompactInput, options?: CodexRulesHookOptions): Promise; export declare function runUserPromptSubmitHook(input: CodexUserPromptSubmitInput, options?: CodexRulesHookOptions): Promise; export declare function runPostToolUseHook(input: CodexPostToolUseInput, options?: CodexRulesHookOptions): Promise; //# sourceMappingURL=codex-hook.d.ts.map \ No newline at end of file diff --git a/dist/codex-hook.d.ts.map b/dist/codex-hook.d.ts.map index b32101e..869fe76 100644 --- a/dist/codex-hook.d.ts.map +++ b/dist/codex-hook.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"codex-hook.d.ts","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,cAAc,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,kBAAkB,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED,wBAAsB,uBAAuB,CAC5C,KAAK,EAAE,0BAA0B,EACjC,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CA6BjB"} \ No newline at end of file +{"version":3,"file":"codex-hook.d.ts","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,cAAc,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,kBAAkB,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,uBAAuB,CAC5C,KAAK,EAAE,0BAA0B,EACjC,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CA4CjB"} \ No newline at end of file diff --git a/dist/codex-hook.js b/dist/codex-hook.js index 1d1bd8d..aa00db7 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -1,16 +1,25 @@ -import { readFileSync } from "node:fs"; -import { isAbsolute, relative } from "node:path"; +import { readFileSync, statSync } from "node:fs"; +import { isAbsolute, relative, resolve } from "node:path"; import { configFromEnvironment } from "./config.js"; import { clearSessionState, hydrateEngineState, persistEngineState, sessionCachePath } from "./persistent-cache.js"; +import { SOURCE_PRIORITY } from "./rules/constants.js"; import { createEngine } from "./rules/engine.js"; -import { findRuleCandidates } from "./rules/finder.js"; +import { createRuleDiscoveryCache, findRuleCandidates } from "./rules/finder.js"; +import { hashContent } from "./rules/matcher.js"; +import { sortCandidates } from "./rules/ordering.js"; import { findProjectRoot } from "./rules/project-root.js"; import { extractCodexToolPaths } from "./tool-paths.js"; export async function runSessionStartHook(input, options = {}) { const cachePath = sessionCachePath(input.session_id, options.pluginDataRoot); - clearSessionState(cachePath); + if (input.source !== "resume") { + clearSessionState(cachePath); + } return runStaticInjection(input.cwd, "SessionStart", cachePath, options); } +export async function runPostCompactHook(input, options = {}) { + clearSessionState(sessionCachePath(input.session_id, options.pluginDataRoot)); + return ""; +} export async function runUserPromptSubmitHook(input, options = {}) { const cachePath = sessionCachePath(input.session_id, options.pluginDataRoot); return runStaticInjection(input.cwd, "UserPromptSubmit", cachePath, options); @@ -28,13 +37,23 @@ export async function runPostToolUseHook(input, options = {}) { const cachePath = sessionCachePath(input.session_id, options.pluginDataRoot); const engine = createRulesEngine(options); hydrateEngineState(engine, cachePath); - const loaded = engine.loadDynamicRules(input.cwd, targetPaths); + const dynamicTargetFingerprints = fingerprintDynamicTargets(input.cwd, targetPaths, config); + const pendingTargetFingerprints = dynamicTargetFingerprints.filter((target) => engine.state.dynamicTargetFingerprints.get(target.cacheKey) !== target.fingerprint); + if (pendingTargetFingerprints.length === 0) { + persistEngineState(engine, cachePath); + return ""; + } + const loaded = engine.loadDynamicRules(input.cwd, pendingTargetFingerprints.map((target) => target.targetPath)); const rules = loaded.rules.filter((rule) => !engine.isStaticInjected(rule) && !engine.isDynamicInjected(rule)); + for (const target of pendingTargetFingerprints) { + engine.state.dynamicTargetFingerprints.set(target.cacheKey, target.fingerprint); + } if (rules.length === 0) { persistEngineState(engine, cachePath); return ""; } - const block = engine.formatDynamic(rules, displayPath(input.cwd, firstTargetPath)); + const firstPendingTargetPath = pendingTargetFingerprints[0]?.targetPath ?? firstTargetPath; + const block = engine.formatDynamic(rules, displayPath(input.cwd, firstPendingTargetPath)); for (const rule of rules) { engine.markDynamicInjected(rule); } @@ -77,6 +96,84 @@ function createRulesEngine(options) { }, }); } +function fingerprintDynamicTargets(cwd, targetPaths, config) { + const disabledSources = disabledSourcesFor(config); + const discoveryCache = createRuleDiscoveryCache(); + const cwdProjectRoot = findProjectRoot(cwd); + const fingerprints = []; + for (const targetPath of uniqueStrings(targetPaths)) { + const projectRoot = cwdProjectRoot !== null && isSameOrChildPath(targetPath, cwdProjectRoot) + ? cwdProjectRoot + : findProjectRoot(targetPath); + const candidates = findRuleCandidates({ + projectRoot, + targetFile: targetPath, + disabledSources, + cache: discoveryCache, + }); + const candidateFingerprint = sortCandidates(candidates).map(fingerprintCandidate).join("\u0001"); + const cacheKey = dynamicTargetCacheKey(targetPath); + fingerprints.push({ + targetPath, + cacheKey, + fingerprint: hashContent([ + "v1", + config.enabledSources === "auto" ? "auto" : config.enabledSources.join(","), + projectRoot ?? "", + cacheKey, + candidateFingerprint, + ].join("\u0000")), + }); + } + return fingerprints; +} +function fingerprintCandidate(candidate) { + return [ + candidate.realPath, + candidate.relativePath, + candidate.source, + candidate.isGlobal ? "global" : "project", + candidate.isSingleFile ? "single" : "multi", + String(candidate.distance), + fileFingerprint(candidate.path), + ].join("\u0000"); +} +function fileFingerprint(filePath) { + try { + const stats = statSync(filePath, { bigint: true }); + const contentHash = hashContent(readFileSync(filePath, "utf8")); + return `${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}:${contentHash}`; + } + catch { + return "missing"; + } +} +function disabledSourcesFor(config) { + if (config.enabledSources === "auto") { + return undefined; + } + const enabledSources = new Set(config.enabledSources); + return new Set([...SOURCE_PRIORITY.keys()].filter((source) => !enabledSources.has(source))); +} +function dynamicTargetCacheKey(targetPath) { + return toPosixPath(resolve(targetPath)); +} +function isSameOrChildPath(childPath, parentPath) { + const childRelativePath = relative(parentPath, resolve(childPath)); + return childRelativePath === "" || (!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath)); +} +function uniqueStrings(values) { + const uniqueValues = []; + const seenValues = new Set(); + for (const value of values) { + if (seenValues.has(value)) { + continue; + } + seenValues.add(value); + uniqueValues.push(value); + } + return uniqueValues; +} function formatAdditionalContextOutput(eventName, additionalContext) { if (additionalContext.trim().length === 0) return ""; @@ -92,6 +189,9 @@ function displayPath(cwd, filePath) { // Normalize to POSIX separators so injected rule context renders the same // path string on Linux/macOS and Windows (Codex feeds this verbatim into // the model prompt, and the existing engine already emits POSIX paths). - return rel.replaceAll("\\", "/"); + return toPosixPath(rel); +} +function toPosixPath(path) { + return path.replaceAll("\\", "/"); } //# sourceMappingURL=codex-hook.js.map \ No newline at end of file diff --git a/dist/codex-hook.js.map b/dist/codex-hook.js.map index 3083510..3617dc2 100644 --- a/dist/codex-hook.js.map +++ b/dist/codex-hook.js.map @@ -1 +1 @@ -{"version":3,"file":"codex-hook.js","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"codex-hook.js","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/persistent-cache.d.ts.map b/dist/persistent-cache.d.ts.map index 6104227..dbeabe3 100644 --- a/dist/persistent-cache.d.ts.map +++ b/dist/persistent-cache.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"persistent-cache.d.ts","sourceRoot":"","sources":["../src/persistent-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW1E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAU1E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9F"} \ No newline at end of file +{"version":3,"file":"persistent-cache.d.ts","sourceRoot":"","sources":["../src/persistent-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAQhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAe1E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW1E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9F"} \ No newline at end of file diff --git a/dist/persistent-cache.js b/dist/persistent-cache.js index f08c082..06f4164 100644 --- a/dist/persistent-cache.js +++ b/dist/persistent-cache.js @@ -5,12 +5,16 @@ export function hydrateEngineState(engine, cachePath) { const state = readSessionState(cachePath); engine.state.staticDedup.clear(); engine.state.dynamicDedup.clear(); + engine.state.dynamicTargetFingerprints.clear(); for (const key of state.staticDedup) { engine.state.staticDedup.add(key); } for (const [scope, keys] of Object.entries(state.dynamicDedup)) { engine.state.dynamicDedup.set(scope, new Set(keys)); } + for (const [targetKey, fingerprint] of Object.entries(state.dynamicTargetFingerprints ?? {})) { + engine.state.dynamicTargetFingerprints.set(targetKey, fingerprint); + } } export function persistEngineState(engine, cachePath) { const dynamicDedup = {}; @@ -20,6 +24,7 @@ export function persistEngineState(engine, cachePath) { writeSessionState(cachePath, { staticDedup: [...engine.state.staticDedup], dynamicDedup, + dynamicTargetFingerprints: Object.fromEntries(engine.state.dynamicTargetFingerprints.entries()), }); } export function clearSessionState(cachePath) { @@ -45,7 +50,7 @@ function writeSessionState(cachePath, state) { writeFileSync(cachePath, `${JSON.stringify(state)}\n`); } function emptyState() { - return { staticDedup: [], dynamicDedup: {} }; + return { staticDedup: [], dynamicDedup: {}, dynamicTargetFingerprints: {} }; } function safePathSegment(value) { return value.replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 120) || "unknown-session"; @@ -54,8 +59,12 @@ function isSerializedSessionState(value) { if (!isRecord(value) || !Array.isArray(value.staticDedup) || !isRecord(value.dynamicDedup)) { return false; } + const dynamicTargetFingerprints = value.dynamicTargetFingerprints; return (value.staticDedup.every((item) => typeof item === "string") && - Object.values(value.dynamicDedup).every((item) => Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === "string"))); + Object.values(value.dynamicDedup).every((item) => Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === "string")) && + (dynamicTargetFingerprints === undefined || + (isRecord(dynamicTargetFingerprints) && + Object.entries(dynamicTargetFingerprints).every(([targetKey, fingerprint]) => typeof targetKey === "string" && typeof fingerprint === "string")))); } function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); diff --git a/dist/persistent-cache.js.map b/dist/persistent-cache.js.map index ac87ac1..b67ea09 100644 --- a/dist/persistent-cache.js.map +++ b/dist/persistent-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"persistent-cache.js","sourceRoot":"","sources":["../src/persistent-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAS1C,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,SAAiB;IACnE,MAAM,YAAY,GAA6B,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACjE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,iBAAiB,CAAC,SAAS,EAAE;QAC5B,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAC1C,YAAY;KACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IAClD,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,cAAkC;IACrF,MAAM,IAAI,GAAG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnG,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;YAAE,OAAO,UAAU,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,UAAU,EAAE,CAAC;IACrB,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,KAA6B;IAC1E,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,UAAU;IAClB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,iBAAiB,CAAC;AAClF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5F,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,CACN,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CACtC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAC3F,CACD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC"} \ No newline at end of file +{"version":3,"file":"persistent-cache.js","sourceRoot":"","sources":["../src/persistent-cache.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/cache.d.ts.map b/dist/rules/cache.d.ts.map index 9357d1c..65effe8 100644 --- a/dist/rules/cache.d.ts.map +++ b/dist/rules/cache.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/rules/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAE7D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAQjF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAclF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAEhF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAKtD"} \ No newline at end of file +{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/rules/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAS7D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAQjF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAclF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAEhF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAMtD"} \ No newline at end of file diff --git a/dist/rules/cache.js b/dist/rules/cache.js index 2b500fe..8b6f0dc 100644 --- a/dist/rules/cache.js +++ b/dist/rules/cache.js @@ -1,6 +1,13 @@ const DYNAMIC_SESSION_KEY = "__pi-rules-session__"; export function createSessionState(cwd) { - return { cwd, staticDedup: new Set(), dynamicDedup: new Map(), loadedRules: [], diagnostics: [] }; + return { + cwd, + staticDedup: new Set(), + dynamicDedup: new Map(), + dynamicTargetFingerprints: new Map(), + loadedRules: [], + diagnostics: [], + }; } export function staticDedupKey(cwd, rulePath, contentHash) { return `${cwd}::${rulePath}::${contentHash}`; @@ -38,6 +45,7 @@ export function isDynamicInjected(state, rule) { export function clearSession(state) { state.staticDedup.clear(); state.dynamicDedup.clear(); + state.dynamicTargetFingerprints.clear(); state.loadedRules.length = 0; state.diagnostics.length = 0; } diff --git a/dist/rules/cache.js.map b/dist/rules/cache.js.map index 81a3781..6c6dfdb 100644 --- a/dist/rules/cache.js.map +++ b/dist/rules/cache.js.map @@ -1 +1 @@ -{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/rules/cache.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAmB;IAChF,OAAO,GAAG,GAAG,KAAK,QAAQ,KAAK,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAmB;IACpE,OAAO,GAAG,QAAQ,KAAK,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,IAAgB;IACvE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,IAAgB;IACxE,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAmB,EAAE,IAAgB;IACrE,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,IAAgB;IACtE,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC/C,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC3B,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,CAAC"} \ No newline at end of file +{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/rules/cache.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,OAAO;QACN,GAAG;QACH,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,yBAAyB,EAAE,IAAI,GAAG,EAAE;QACpC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;KACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAmB;IAChF,OAAO,GAAG,GAAG,KAAK,QAAQ,KAAK,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAmB;IACpE,OAAO,GAAG,QAAQ,KAAK,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,IAAgB;IACvE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,IAAgB;IACxE,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAmB,EAAE,IAAgB;IACrE,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,IAAgB;IACtE,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC/C,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC3B,KAAK,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IACxC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,CAAC"} \ No newline at end of file diff --git a/dist/rules/types.d.ts b/dist/rules/types.d.ts index 7ad65a6..5489214 100644 --- a/dist/rules/types.d.ts +++ b/dist/rules/types.d.ts @@ -109,6 +109,7 @@ export interface SessionState { cwd: string | undefined; staticDedup: Set; dynamicDedup: Map>; + dynamicTargetFingerprints: Map; loadedRules: LoadedRule[]; diagnostics: RuleDiagnostic[]; } diff --git a/dist/rules/types.d.ts.map b/dist/rules/types.d.ts.map index b1a9acb..d0d8d4d 100644 --- a/dist/rules/types.d.ts.map +++ b/dist/rules/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAChD,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GACnB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,sBAAsB,GACtB,iCAAiC,GACjC,WAAW,GACX,WAAW,GACX,YAAY,GACZ,mBAAmB,GACnB,mBAAmB,GACnB,iBAAiB,GACjB,8BAA8B,GAC9B,qBAAqB,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;CACtC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAChD,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GACnB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,sBAAsB,GACtB,iCAAiC,GACjC,WAAW,GACX,WAAW,GACX,YAAY,GACZ,mBAAmB,GACnB,mBAAmB,GACnB,iBAAiB,GACjB,8BAA8B,GAC9B,qBAAqB,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;CACtC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,yBAAyB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB"} \ No newline at end of file diff --git a/hooks/hooks.json b/hooks/hooks.json index 0421ed0..bb72c7d 100644 --- a/hooks/hooks.json +++ b/hooks/hooks.json @@ -36,6 +36,19 @@ } ] } + ], + "PostCompact": [ + { + "matcher": "manual|auto", + "hooks": [ + { + "type": "command", + "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact", + "timeout": 10, + "statusMessage": "resetting project rule cache" + } + ] + } ] } } diff --git a/scripts/bench-codex-rules.mjs b/scripts/bench-codex-rules.mjs index ab884ff..f1f8cc1 100644 --- a/scripts/bench-codex-rules.mjs +++ b/scripts/bench-codex-rules.mjs @@ -3,6 +3,7 @@ import { execFileSync } from "node:child_process"; import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; +import { runPostToolUseHook } from "../dist/codex-hook.js"; import { createEngine, defaultConfig } from "../dist/rules/engine.js"; const ITERATIONS = 40; @@ -15,7 +16,7 @@ const args = process.argv.slice(2); const writeBaselinePath = readOption("--write-baseline"); const comparePath = readOption("--compare"); -const result = runBenchmark(); +const result = await runBenchmark(); if (writeBaselinePath !== undefined) { writeFileSync(writeBaselinePath, `${JSON.stringify(result, null, "\t")}\n`); @@ -47,7 +48,7 @@ function readOption(name) { return value; } -function runBenchmark() { +async function runBenchmark() { const scenarios = [ runScenario("duplicate-targets", duplicateTargets, DUPLICATE_TARGET_COUNT), runScenario("distinct-targets", distinctTargets, DISTINCT_TARGET_COUNT), @@ -58,9 +59,76 @@ function runBenchmark() { warmupIterations: WARMUP_ITERATIONS, ruleCount: RULE_COUNT, scenarios, + hookFastPath: await runHookFastPathScenario(), }; } +async function runHookFastPathScenario() { + const durations = []; + let repeatOutputBytes = 0; + + for (let iteration = 0; iteration < ITERATIONS + WARMUP_ITERATIONS; iteration += 1) { + const run = await measureHookFastPathRun(); + if (iteration >= WARMUP_ITERATIONS) { + durations.push(run.repeatDurationMs); + repeatOutputBytes += run.repeatOutputBytes; + } + } + + return { + name: "repeat-post-tool-use", + medianRepeatMs: median(durations), + minRepeatMs: Math.min(...durations), + maxRepeatMs: Math.max(...durations), + repeatOutputBytes, + }; +} + +async function measureHookFastPathRun() { + const projectRoot = mkdtempSync(join(tmpdir(), "codex-rules-hook-bench-")); + const pluginData = mkdtempSync(join(tmpdir(), "codex-rules-hook-data-")); + try { + mkdirSync(join(projectRoot, "src"), { recursive: true }); + mkdirSync(join(projectRoot, ".sisyphus", "rules"), { recursive: true }); + writeFileSync(join(projectRoot, "package.json"), JSON.stringify({ name: "bench" })); + writeFileSync(join(projectRoot, "src", "app.ts"), "export const app = true;\n"); + for (let index = 0; index < RULE_COUNT; index += 1) { + writeFileSync(join(projectRoot, ".sisyphus", "rules", `rule-${index}.md`), ruleContent(`rule-${index}`)); + } + + const input = { + session_id: "bench-session", + turn_id: "bench-turn", + transcript_path: null, + cwd: projectRoot, + hook_event_name: "PostToolUse", + model: "gpt-5.5", + permission_mode: "default", + tool_name: "mcp__filesystem__read_file", + tool_input: { path: join(projectRoot, "src", "app.ts") }, + tool_response: { text: "file contents" }, + tool_use_id: "bench-call", + }; + + await runPostToolUseHook(input, { + pluginDataRoot: pluginData, + env: { CODEX_RULES_ENABLED_SOURCES: ".sisyphus/rules" }, + }); + const start = process.hrtime.bigint(); + const repeatOutput = await runPostToolUseHook(input, { + pluginDataRoot: pluginData, + env: { CODEX_RULES_ENABLED_SOURCES: ".sisyphus/rules" }, + }); + return { + repeatDurationMs: Number(process.hrtime.bigint() - start) / 1_000_000, + repeatOutputBytes: Buffer.byteLength(repeatOutput), + }; + } finally { + rmSync(projectRoot, { recursive: true, force: true }); + rmSync(pluginData, { recursive: true, force: true }); + } +} + function runScenario(name, targetFactory, targetCount) { const durations = []; let counters = { findProjectRoot: 0, findCandidates: 0, readFile: 0 }; diff --git a/src/cli.ts b/src/cli.ts index 329af44..6fa83ac 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -2,9 +2,11 @@ import { stdin as processStdin, stdout as processStdout } from "node:process"; import { + type CodexPostCompactInput, type CodexPostToolUseInput, type CodexSessionStartInput, type CodexUserPromptSubmitInput, + runPostCompactHook, runPostToolUseHook, runSessionStartHook, runUserPromptSubmitHook, @@ -12,6 +14,8 @@ import { const command = process.argv[2]; const subcommand = process.argv[3]; +type HookCliEventName = "SessionStart" | "UserPromptSubmit" | "PostToolUse" | "PostCompact"; +type HookCliOptions = { pluginDataRoot: string | undefined }; if (command === "hook" && subcommand === "session-start") { await runHookCli("SessionStart"); @@ -19,30 +23,38 @@ if (command === "hook" && subcommand === "session-start") { await runHookCli("UserPromptSubmit"); } else if (command === "hook" && subcommand === "post-tool-use") { await runHookCli("PostToolUse"); +} else if (command === "hook" && subcommand === "post-compact") { + await runHookCli("PostCompact"); } else { - process.stderr.write("Usage: codex-rules hook [session-start|user-prompt-submit|post-tool-use]\n"); + process.stderr.write("Usage: codex-rules hook [session-start|user-prompt-submit|post-tool-use|post-compact]\n"); process.exitCode = 1; } -async function runHookCli(eventName: "SessionStart" | "UserPromptSubmit" | "PostToolUse"): Promise { +async function runHookCli(eventName: HookCliEventName): Promise { const raw = await readStdin(); if (raw.trim().length === 0) return; const parsed = parseHookInput(raw); if (!parsed) return; const options = { pluginDataRoot: process.env.PLUGIN_DATA }; - const output = - eventName === "SessionStart" && isCodexSessionStartInput(parsed) - ? await runSessionStartHook(parsed, options) - : eventName === "UserPromptSubmit" && isCodexUserPromptSubmitInput(parsed) - ? await runUserPromptSubmitHook(parsed, options) - : eventName === "PostToolUse" && isCodexPostToolUseInput(parsed) - ? await runPostToolUseHook(parsed, options) - : ""; + const output = await runHook(eventName, parsed, options); if (output.length > 0) { processStdout.write(output); } } +async function runHook(eventName: HookCliEventName, parsed: unknown, options: HookCliOptions): Promise { + switch (eventName) { + case "SessionStart": + return isCodexSessionStartInput(parsed) ? await runSessionStartHook(parsed, options) : ""; + case "UserPromptSubmit": + return isCodexUserPromptSubmitInput(parsed) ? await runUserPromptSubmitHook(parsed, options) : ""; + case "PostToolUse": + return isCodexPostToolUseInput(parsed) ? await runPostToolUseHook(parsed, options) : ""; + case "PostCompact": + return isCodexPostCompactInput(parsed) ? await runPostCompactHook(parsed, options) : ""; + } +} + function parseHookInput(raw: string): unknown | undefined { try { const parsed: unknown = JSON.parse(raw); @@ -57,6 +69,7 @@ function isCodexSessionStartInput(value: unknown): value is CodexSessionStartInp isRecord(value) && value.hook_event_name === "SessionStart" && typeof value.session_id === "string" && + isStringOrNull(value.transcript_path) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && @@ -70,6 +83,7 @@ function isCodexUserPromptSubmitInput(value: unknown): value is CodexUserPromptS value.hook_event_name === "UserPromptSubmit" && typeof value.session_id === "string" && typeof value.turn_id === "string" && + isStringOrNull(value.transcript_path) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && @@ -83,6 +97,7 @@ function isCodexPostToolUseInput(value: unknown): value is CodexPostToolUseInput value.hook_event_name === "PostToolUse" && typeof value.session_id === "string" && typeof value.turn_id === "string" && + isStringOrNull(value.transcript_path) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && @@ -91,6 +106,23 @@ function isCodexPostToolUseInput(value: unknown): value is CodexPostToolUseInput ); } +function isCodexPostCompactInput(value: unknown): value is CodexPostCompactInput { + return ( + isRecord(value) && + value.hook_event_name === "PostCompact" && + typeof value.session_id === "string" && + typeof value.turn_id === "string" && + isStringOrNull(value.transcript_path) && + typeof value.cwd === "string" && + typeof value.model === "string" && + (value.trigger === "manual" || value.trigger === "auto") + ); +} + +function isStringOrNull(value: unknown): value is string | null { + return typeof value === "string" || value === null; +} + function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); } diff --git a/src/codex-hook.ts b/src/codex-hook.ts index fb21b22..2a20202 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -1,14 +1,18 @@ -import { readFileSync } from "node:fs"; -import { isAbsolute, relative } from "node:path"; +import { readFileSync, statSync } from "node:fs"; +import { isAbsolute, relative, resolve } from "node:path"; import { configFromEnvironment } from "./config.js"; import { clearSessionState, hydrateEngineState, persistEngineState, sessionCachePath } from "./persistent-cache.js"; +import { SOURCE_PRIORITY } from "./rules/constants.js"; import { createEngine } from "./rules/engine.js"; -import { findRuleCandidates } from "./rules/finder.js"; +import { createRuleDiscoveryCache, findRuleCandidates } from "./rules/finder.js"; +import { hashContent } from "./rules/matcher.js"; +import { sortCandidates } from "./rules/ordering.js"; import { findProjectRoot } from "./rules/project-root.js"; +import type { PiRulesConfig, RuleCandidate } from "./rules/types.js"; import { extractCodexToolPaths } from "./tool-paths.js"; -type HookEventName = "SessionStart" | "UserPromptSubmit" | "PostToolUse"; +type ContextInjectionHookEventName = "SessionStart" | "UserPromptSubmit" | "PostToolUse"; export type CodexSessionStartInput = { session_id: string; @@ -45,20 +49,46 @@ export type CodexPostToolUseInput = { tool_use_id: string; }; +export type CodexPostCompactInput = { + session_id: string; + turn_id: string; + transcript_path: string | null; + cwd: string; + hook_event_name: "PostCompact"; + model: string; + trigger: "manual" | "auto"; +}; + export interface CodexRulesHookOptions { env?: NodeJS.ProcessEnv; pluginDataRoot?: string; } +interface DynamicTargetFingerprint { + targetPath: string; + cacheKey: string; + fingerprint: string; +} + export async function runSessionStartHook( input: CodexSessionStartInput, options: CodexRulesHookOptions = {}, ): Promise { const cachePath = sessionCachePath(input.session_id, options.pluginDataRoot); - clearSessionState(cachePath); + if (input.source !== "resume") { + clearSessionState(cachePath); + } return runStaticInjection(input.cwd, "SessionStart", cachePath, options); } +export async function runPostCompactHook( + input: CodexPostCompactInput, + options: CodexRulesHookOptions = {}, +): Promise { + clearSessionState(sessionCachePath(input.session_id, options.pluginDataRoot)); + return ""; +} + export async function runUserPromptSubmitHook( input: CodexUserPromptSubmitInput, options: CodexRulesHookOptions = {}, @@ -85,15 +115,30 @@ export async function runPostToolUseHook( const cachePath = sessionCachePath(input.session_id, options.pluginDataRoot); const engine = createRulesEngine(options); hydrateEngineState(engine, cachePath); + const dynamicTargetFingerprints = fingerprintDynamicTargets(input.cwd, targetPaths, config); + const pendingTargetFingerprints = dynamicTargetFingerprints.filter( + (target) => engine.state.dynamicTargetFingerprints.get(target.cacheKey) !== target.fingerprint, + ); + if (pendingTargetFingerprints.length === 0) { + persistEngineState(engine, cachePath); + return ""; + } - const loaded = engine.loadDynamicRules(input.cwd, targetPaths); + const loaded = engine.loadDynamicRules( + input.cwd, + pendingTargetFingerprints.map((target) => target.targetPath), + ); const rules = loaded.rules.filter((rule) => !engine.isStaticInjected(rule) && !engine.isDynamicInjected(rule)); + for (const target of pendingTargetFingerprints) { + engine.state.dynamicTargetFingerprints.set(target.cacheKey, target.fingerprint); + } if (rules.length === 0) { persistEngineState(engine, cachePath); return ""; } - const block = engine.formatDynamic(rules, displayPath(input.cwd, firstTargetPath)); + const firstPendingTargetPath = pendingTargetFingerprints[0]?.targetPath ?? firstTargetPath; + const block = engine.formatDynamic(rules, displayPath(input.cwd, firstPendingTargetPath)); for (const rule of rules) { engine.markDynamicInjected(rule); } @@ -146,7 +191,102 @@ function createRulesEngine(options: CodexRulesHookOptions) { }); } -function formatAdditionalContextOutput(eventName: HookEventName, additionalContext: string): string { +function fingerprintDynamicTargets( + cwd: string, + targetPaths: ReadonlyArray, + config: PiRulesConfig, +): DynamicTargetFingerprint[] { + const disabledSources = disabledSourcesFor(config); + const discoveryCache = createRuleDiscoveryCache(); + const cwdProjectRoot = findProjectRoot(cwd); + const fingerprints: DynamicTargetFingerprint[] = []; + + for (const targetPath of uniqueStrings(targetPaths)) { + const projectRoot = + cwdProjectRoot !== null && isSameOrChildPath(targetPath, cwdProjectRoot) + ? cwdProjectRoot + : findProjectRoot(targetPath); + const candidates = findRuleCandidates({ + projectRoot, + targetFile: targetPath, + disabledSources, + cache: discoveryCache, + }); + const candidateFingerprint = sortCandidates(candidates).map(fingerprintCandidate).join("\u0001"); + const cacheKey = dynamicTargetCacheKey(targetPath); + fingerprints.push({ + targetPath, + cacheKey, + fingerprint: hashContent( + [ + "v1", + config.enabledSources === "auto" ? "auto" : config.enabledSources.join(","), + projectRoot ?? "", + cacheKey, + candidateFingerprint, + ].join("\u0000"), + ), + }); + } + + return fingerprints; +} + +function fingerprintCandidate(candidate: RuleCandidate): string { + return [ + candidate.realPath, + candidate.relativePath, + candidate.source, + candidate.isGlobal ? "global" : "project", + candidate.isSingleFile ? "single" : "multi", + String(candidate.distance), + fileFingerprint(candidate.path), + ].join("\u0000"); +} + +function fileFingerprint(filePath: string): string { + try { + const stats = statSync(filePath, { bigint: true }); + const contentHash = hashContent(readFileSync(filePath, "utf8")); + return `${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}:${contentHash}`; + } catch { + return "missing"; + } +} + +function disabledSourcesFor(config: PiRulesConfig): ReadonlySet | undefined { + if (config.enabledSources === "auto") { + return undefined; + } + + const enabledSources = new Set(config.enabledSources); + return new Set([...SOURCE_PRIORITY.keys()].filter((source) => !enabledSources.has(source))); +} + +function dynamicTargetCacheKey(targetPath: string): string { + return toPosixPath(resolve(targetPath)); +} + +function isSameOrChildPath(childPath: string, parentPath: string): boolean { + const childRelativePath = relative(parentPath, resolve(childPath)); + return childRelativePath === "" || (!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath)); +} + +function uniqueStrings(values: ReadonlyArray): string[] { + const uniqueValues: string[] = []; + const seenValues = new Set(); + for (const value of values) { + if (seenValues.has(value)) { + continue; + } + + seenValues.add(value); + uniqueValues.push(value); + } + return uniqueValues; +} + +function formatAdditionalContextOutput(eventName: ContextInjectionHookEventName, additionalContext: string): string { if (additionalContext.trim().length === 0) return ""; return `${JSON.stringify({ hookSpecificOutput: { @@ -161,5 +301,9 @@ function displayPath(cwd: string, filePath: string): string { // Normalize to POSIX separators so injected rule context renders the same // path string on Linux/macOS and Windows (Codex feeds this verbatim into // the model prompt, and the existing engine already emits POSIX paths). - return rel.replaceAll("\\", "/"); + return toPosixPath(rel); +} + +function toPosixPath(path: string): string { + return path.replaceAll("\\", "/"); } diff --git a/src/persistent-cache.ts b/src/persistent-cache.ts index 67e1c31..4d7062a 100644 --- a/src/persistent-cache.ts +++ b/src/persistent-cache.ts @@ -7,12 +7,14 @@ import type { Engine } from "./rules/engine.js"; interface SerializedSessionState { staticDedup: string[]; dynamicDedup: Record; + dynamicTargetFingerprints?: Record; } export function hydrateEngineState(engine: Engine, cachePath: string): void { const state = readSessionState(cachePath); engine.state.staticDedup.clear(); engine.state.dynamicDedup.clear(); + engine.state.dynamicTargetFingerprints.clear(); for (const key of state.staticDedup) { engine.state.staticDedup.add(key); @@ -20,6 +22,9 @@ export function hydrateEngineState(engine: Engine, cachePath: string): void { for (const [scope, keys] of Object.entries(state.dynamicDedup)) { engine.state.dynamicDedup.set(scope, new Set(keys)); } + for (const [targetKey, fingerprint] of Object.entries(state.dynamicTargetFingerprints ?? {})) { + engine.state.dynamicTargetFingerprints.set(targetKey, fingerprint); + } } export function persistEngineState(engine: Engine, cachePath: string): void { @@ -31,6 +36,7 @@ export function persistEngineState(engine: Engine, cachePath: string): void { writeSessionState(cachePath, { staticDedup: [...engine.state.staticDedup], dynamicDedup, + dynamicTargetFingerprints: Object.fromEntries(engine.state.dynamicTargetFingerprints.entries()), }); } @@ -59,7 +65,7 @@ function writeSessionState(cachePath: string, state: SerializedSessionState): vo } function emptyState(): SerializedSessionState { - return { staticDedup: [], dynamicDedup: {} }; + return { staticDedup: [], dynamicDedup: {}, dynamicTargetFingerprints: {} }; } function safePathSegment(value: string): string { @@ -70,11 +76,17 @@ function isSerializedSessionState(value: unknown): value is SerializedSessionSta if (!isRecord(value) || !Array.isArray(value.staticDedup) || !isRecord(value.dynamicDedup)) { return false; } + const dynamicTargetFingerprints = value.dynamicTargetFingerprints; return ( value.staticDedup.every((item) => typeof item === "string") && Object.values(value.dynamicDedup).every( (item) => Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === "string"), - ) + ) && + (dynamicTargetFingerprints === undefined || + (isRecord(dynamicTargetFingerprints) && + Object.entries(dynamicTargetFingerprints).every( + ([targetKey, fingerprint]) => typeof targetKey === "string" && typeof fingerprint === "string", + ))) ); } diff --git a/src/rules/cache.ts b/src/rules/cache.ts index ab8153a..2433d45 100644 --- a/src/rules/cache.ts +++ b/src/rules/cache.ts @@ -3,7 +3,14 @@ import type { LoadedRule, SessionState } from "./types.js"; const DYNAMIC_SESSION_KEY = "__pi-rules-session__"; export function createSessionState(cwd?: string): SessionState { - return { cwd, staticDedup: new Set(), dynamicDedup: new Map(), loadedRules: [], diagnostics: [] }; + return { + cwd, + staticDedup: new Set(), + dynamicDedup: new Map(), + dynamicTargetFingerprints: new Map(), + loadedRules: [], + diagnostics: [], + }; } export function staticDedupKey(cwd: string, rulePath: string, contentHash: string): string { @@ -51,6 +58,7 @@ export function isDynamicInjected(state: SessionState, rule: LoadedRule): boolea export function clearSession(state: SessionState): void { state.staticDedup.clear(); state.dynamicDedup.clear(); + state.dynamicTargetFingerprints.clear(); state.loadedRules.length = 0; state.diagnostics.length = 0; } diff --git a/src/rules/types.ts b/src/rules/types.ts index db67552..84c8929 100644 --- a/src/rules/types.ts +++ b/src/rules/types.ts @@ -126,6 +126,7 @@ export interface SessionState { cwd: string | undefined; staticDedup: Set; dynamicDedup: Map>; + dynamicTargetFingerprints: Map; loadedRules: LoadedRule[]; diagnostics: RuleDiagnostic[]; } diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index 58a3333..3222606 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -1,13 +1,15 @@ import { spawn } from "node:child_process"; -import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { afterEach, describe, expect, it } from "vitest"; import { + type CodexPostCompactInput, type CodexPostToolUseInput, type CodexSessionStartInput, + runPostCompactHook, runPostToolUseHook, runSessionStartHook, runUserPromptSubmitHook, @@ -19,11 +21,17 @@ type CliResult = { stderr: string; }; +type SessionCache = { + staticDedup?: string[]; + dynamicDedup?: Record; + dynamicTargetFingerprints?: Record; +}; + const CLI_PATH = fileURLToPath(new URL("../dist/cli.js", import.meta.url)); -function runHookCli(input: string): Promise { +function runHookCli(input: string, subcommand = "post-tool-use"): Promise { return new Promise((resolve, reject) => { - const child = spawn(process.execPath, [CLI_PATH, "hook", "post-tool-use"], { + const child = spawn(process.execPath, [CLI_PATH, "hook", subcommand], { stdio: ["pipe", "pipe", "pipe"], }); let stdout = ""; @@ -49,6 +57,10 @@ const PROJECT_ONLY_ENV = { CODEX_RULES_ENABLED_SOURCES: "AGENTS.md,.sisyphus/rules", }; +const RULES_ONLY_ENV = { + CODEX_RULES_ENABLED_SOURCES: ".sisyphus/rules", +}; + afterEach(() => { for (const directory of tempDirectories.splice(0)) { rmSync(directory, { recursive: true, force: true }); @@ -91,6 +103,18 @@ function sessionStartInput(root: string): CodexSessionStartInput { }; } +function postCompactInput(root: string): CodexPostCompactInput { + return { + session_id: "session-1", + turn_id: "turn-compact", + transcript_path: null, + cwd: root, + hook_event_name: "PostCompact", + model: "gpt-5.5", + trigger: "manual", + }; +} + function postToolUseInput(root: string, filePath: string): CodexPostToolUseInput { return { session_id: "session-1", @@ -126,6 +150,21 @@ function occurrenceCount(value: string, search: string): number { return value.split(search).length - 1; } +function sessionCacheFilePath(pluginData: string, sessionId = "session-1"): string { + return path.join(pluginData, "sessions", `${sessionId}.json`); +} + +function readSessionCache(pluginData: string): SessionCache { + return JSON.parse(readFileSync(sessionCacheFilePath(pluginData), "utf8")) as SessionCache; +} + +function writeTypeScriptRule(root: string, globExpression: string, body: string): void { + writeFileSync( + path.join(root, ".sisyphus", "rules", "typescript.md"), + ["---", "description: TypeScript", `globs: ${globExpression}`, "---", "", body].join("\n"), + ); +} + describe("codex rules hooks", () => { it("#given project rules #when SessionStart runs #then emits static additional context", async () => { // given @@ -168,6 +207,29 @@ describe("codex rules hooks", () => { expect(output).toBe(""); }); + it("#given resumed session #when SessionStart runs #then it preserves the session cache", async () => { + // given + const { root, pluginData } = makeTempProject(); + const input = sessionStartInput(root); + await runSessionStartHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + + // when + const resumeOutput = await runSessionStartHook( + { ...input, source: "resume" }, + { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }, + ); + const clearOutput = await runSessionStartHook( + { ...input, source: "clear" }, + { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }, + ); + + // then + expect(resumeOutput).toBe(""); + expect(parseHookOutput(clearOutput).hookSpecificOutput?.additionalContext).toContain( + "Always wear safety goggles", + ); + }); + it("#given read-file tool result #when PostToolUse runs #then emits matching dynamic rule context", async () => { // given const { root, pluginData } = makeTempProject(); @@ -228,12 +290,81 @@ describe("codex rules hooks", () => { const filePath = path.join(root, "src", "app.ts"); const input = postToolUseInput(root, filePath); await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + const cachedState = readSessionCache(pluginData); // when const output = await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); // then expect(output).toBe(""); + expect(Object.keys(cachedState.dynamicTargetFingerprints ?? {})).toHaveLength(1); + expect(readSessionCache(pluginData).dynamicTargetFingerprints).toEqual(cachedState.dynamicTargetFingerprints); + }); + + it("#given cached target in one session #when another session reads it #then PostToolUse rechecks independently", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + await runPostToolUseHook(postToolUseInput(root, filePath), { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + + // when + const output = await runPostToolUseHook( + { ...postToolUseInput(root, filePath), session_id: "session-2" }, + { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }, + ); + + // then + expect(parseHookOutput(output).hookSpecificOutput?.additionalContext).toContain("Prefer strict TypeScript"); + }); + + it("#given cached dynamic target #when rule frontmatter changes #then PostToolUse rechecks the target", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + const input = postToolUseInput(root, filePath); + await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: RULES_ONLY_ENV }); + writeTypeScriptRule(root, '"**/*.ts"', "Prefer readonly TypeScript after rule edits."); + + // when + const output = await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: RULES_ONLY_ENV }); + + // then + expect(parseHookOutput(output).hookSpecificOutput?.additionalContext).toContain( + "Prefer readonly TypeScript after rule edits.", + ); + }); + + it("#given cached dynamic context #when PostCompact runs #then PostToolUse can re-inject after compaction", async () => { + // given + const { root, pluginData } = makeTempProject(); + const filePath = path.join(root, "src", "app.ts"); + const input = postToolUseInput(root, filePath); + await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + expect(await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV })).toBe(""); + + // when + const compactOutput = await runPostCompactHook(postCompactInput(root), { pluginDataRoot: pluginData }); + const output = await runPostToolUseHook(input, { pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV }); + + // then + expect(compactOutput).toBe(""); + expect(parseHookOutput(output).hookSpecificOutput?.additionalContext).toContain("Prefer strict TypeScript"); + }); + + it("#given legacy session cache #when PostToolUse hydrates state #then it accepts the old shape", async () => { + // given + const { root, pluginData } = makeTempProject(); + mkdirSync(path.join(pluginData, "sessions"), { recursive: true }); + writeFileSync(sessionCacheFilePath(pluginData), `${JSON.stringify({ staticDedup: [], dynamicDedup: {} })}\n`); + + // when + const output = await runPostToolUseHook(postToolUseInput(root, path.join(root, "src", "app.ts")), { + pluginDataRoot: pluginData, + env: PROJECT_ONLY_ENV, + }); + + // then + expect(parseHookOutput(output).hookSpecificOutput?.additionalContext).toContain("Prefer strict TypeScript"); }); it("#given static-only mode #when PostToolUse runs #then emits no dynamic context", async () => { @@ -336,4 +467,19 @@ describe("codex rules hooks", () => { stderr: "", }); }); + + it("#given malformed post-compact stdin #when hook CLI runs #then it no-ops without stderr", async () => { + // given + const input = `${JSON.stringify({ hook_event_name: "PostCompact", session_id: "s", turn_id: "t" })}\n`; + + // when + const result = await runHookCli(input, "post-compact"); + + // then + expect(result).toEqual({ + exitCode: 0, + stdout: "", + stderr: "", + }); + }); }); diff --git a/test/package-smoke.test.ts b/test/package-smoke.test.ts index 44355bd..a86ac8b 100644 --- a/test/package-smoke.test.ts +++ b/test/package-smoke.test.ts @@ -22,6 +22,7 @@ describe("plugin package metadata", () => { hookConfig.SessionStart?.[0]?.hooks[0]?.command, hookConfig.UserPromptSubmit?.[0]?.hooks[0]?.command, hookConfig.PostToolUse?.[0]?.hooks[0]?.command, + hookConfig.PostCompact?.[0]?.hooks[0]?.command, ]; // then @@ -35,6 +36,7 @@ describe("plugin package metadata", () => { `node "${pluginRoot}/dist/cli.js" hook session-start`, `node "${pluginRoot}/dist/cli.js" hook user-prompt-submit`, `node "${pluginRoot}/dist/cli.js" hook post-tool-use`, + `node "${pluginRoot}/dist/cli.js" hook post-compact`, ]); }); }); From 9053412b050538be56e12074003cb71c3c0eb833 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 15:09:33 +0900 Subject: [PATCH 12/13] perf(hooks): compare hook fast-path benchmark Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- scripts/bench-codex-rules.mjs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scripts/bench-codex-rules.mjs b/scripts/bench-codex-rules.mjs index f1f8cc1..b9a3dbb 100644 --- a/scripts/bench-codex-rules.mjs +++ b/scripts/bench-codex-rules.mjs @@ -248,5 +248,21 @@ function compareResults(baseline, current) { } } } + if (baseline.hookFastPath === undefined) { + failures.push("missing baseline hookFastPath scenario"); + } else { + if (current.hookFastPath.repeatOutputBytes > baseline.hookFastPath.repeatOutputBytes) { + failures.push( + `hookFastPath.repeatOutputBytes regressed: ${current.hookFastPath.repeatOutputBytes} > ${baseline.hookFastPath.repeatOutputBytes}`, + ); + } + + const maxMedianRepeatMs = baseline.hookFastPath.medianRepeatMs * 1.5; + if (current.hookFastPath.medianRepeatMs > maxMedianRepeatMs) { + failures.push( + `hookFastPath.medianRepeatMs regressed: ${current.hookFastPath.medianRepeatMs} > ${maxMedianRepeatMs}`, + ); + } + } return failures; } From 72dbad02c03fd8e0a409701840ac574aa369a9f4 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 16:16:13 +0900 Subject: [PATCH 13/13] refactor(types): harden codex rules plugin --- biome.json | 25 +++++++- dist/cli.d.ts | 1 - dist/cli.d.ts.map | 1 - dist/cli.js | 66 ++++++++++---------- dist/cli.js.map | 1 - dist/codex-hook.d.ts | 1 - dist/codex-hook.d.ts.map | 1 - dist/codex-hook.js | 10 +-- dist/codex-hook.js.map | 1 - dist/config.d.ts | 1 - dist/config.d.ts.map | 1 - dist/config.js | 1 - dist/config.js.map | 1 - dist/persistent-cache.d.ts | 1 - dist/persistent-cache.d.ts.map | 1 - dist/persistent-cache.js | 13 ++-- dist/persistent-cache.js.map | 1 - dist/rules/cache.d.ts | 1 - dist/rules/cache.d.ts.map | 1 - dist/rules/cache.js | 1 - dist/rules/cache.js.map | 1 - dist/rules/constants.d.ts | 1 - dist/rules/constants.d.ts.map | 1 - dist/rules/constants.js | 1 - dist/rules/constants.js.map | 1 - dist/rules/engine.d.ts | 1 - dist/rules/engine.d.ts.map | 1 - dist/rules/engine.js | 23 +++++-- dist/rules/engine.js.map | 1 - dist/rules/errors.d.ts | 1 - dist/rules/errors.d.ts.map | 1 - dist/rules/errors.js | 1 - dist/rules/errors.js.map | 1 - dist/rules/finder.d.ts | 1 - dist/rules/finder.d.ts.map | 1 - dist/rules/finder.js | 1 - dist/rules/finder.js.map | 1 - dist/rules/formatter.d.ts | 1 - dist/rules/formatter.d.ts.map | 1 - dist/rules/formatter.js | 1 - dist/rules/formatter.js.map | 1 - dist/rules/matcher.d.ts | 1 - dist/rules/matcher.d.ts.map | 1 - dist/rules/matcher.js | 1 - dist/rules/matcher.js.map | 1 - dist/rules/ordering.d.ts | 1 - dist/rules/ordering.d.ts.map | 1 - dist/rules/ordering.js | 1 - dist/rules/ordering.js.map | 1 - dist/rules/parser.d.ts | 1 - dist/rules/parser.d.ts.map | 1 - dist/rules/parser.js | 6 +- dist/rules/parser.js.map | 1 - dist/rules/project-root.d.ts | 1 - dist/rules/project-root.d.ts.map | 1 - dist/rules/project-root.js | 1 - dist/rules/project-root.js.map | 1 - dist/rules/scanner.d.ts | 1 - dist/rules/scanner.d.ts.map | 1 - dist/rules/scanner.js | 1 - dist/rules/scanner.js.map | 1 - dist/rules/truncator.d.ts | 1 - dist/rules/truncator.d.ts.map | 1 - dist/rules/truncator.js | 1 - dist/rules/truncator.js.map | 1 - dist/rules/types.d.ts | 1 - dist/rules/types.d.ts.map | 1 - dist/rules/types.js | 1 - dist/rules/types.js.map | 1 - dist/tool-paths.d.ts | 1 - dist/tool-paths.d.ts.map | 1 - dist/tool-paths.js | 7 +-- dist/tool-paths.js.map | 1 - src/cli.ts | 69 +++++++++++---------- src/codex-hook.ts | 14 ++++- src/persistent-cache.ts | 12 ++-- src/rules/engine.ts | 22 +++++-- src/rules/parser.ts | 5 +- src/tool-paths.ts | 8 ++- test/matcher.test.ts | 12 ++-- test/package-smoke.test.ts | 103 ++++++++++++++++++++++++++----- tsconfig.build.json | 2 - tsconfig.json | 3 + vitest.config.ts | 1 + 84 files changed, 269 insertions(+), 198 deletions(-) delete mode 100644 dist/cli.d.ts.map delete mode 100644 dist/cli.js.map delete mode 100644 dist/codex-hook.d.ts.map delete mode 100644 dist/codex-hook.js.map delete mode 100644 dist/config.d.ts.map delete mode 100644 dist/config.js.map delete mode 100644 dist/persistent-cache.d.ts.map delete mode 100644 dist/persistent-cache.js.map delete mode 100644 dist/rules/cache.d.ts.map delete mode 100644 dist/rules/cache.js.map delete mode 100644 dist/rules/constants.d.ts.map delete mode 100644 dist/rules/constants.js.map delete mode 100644 dist/rules/engine.d.ts.map delete mode 100644 dist/rules/engine.js.map delete mode 100644 dist/rules/errors.d.ts.map delete mode 100644 dist/rules/errors.js.map delete mode 100644 dist/rules/finder.d.ts.map delete mode 100644 dist/rules/finder.js.map delete mode 100644 dist/rules/formatter.d.ts.map delete mode 100644 dist/rules/formatter.js.map delete mode 100644 dist/rules/matcher.d.ts.map delete mode 100644 dist/rules/matcher.js.map delete mode 100644 dist/rules/ordering.d.ts.map delete mode 100644 dist/rules/ordering.js.map delete mode 100644 dist/rules/parser.d.ts.map delete mode 100644 dist/rules/parser.js.map delete mode 100644 dist/rules/project-root.d.ts.map delete mode 100644 dist/rules/project-root.js.map delete mode 100644 dist/rules/scanner.d.ts.map delete mode 100644 dist/rules/scanner.js.map delete mode 100644 dist/rules/truncator.d.ts.map delete mode 100644 dist/rules/truncator.js.map delete mode 100644 dist/rules/types.d.ts.map delete mode 100644 dist/rules/types.js.map delete mode 100644 dist/tool-paths.d.ts.map delete mode 100644 dist/tool-paths.js.map diff --git a/biome.json b/biome.json index 792c0b3..5aa1a0d 100644 --- a/biome.json +++ b/biome.json @@ -5,12 +5,19 @@ "rules": { "recommended": true, "style": { - "noNonNullAssertion": "off", + "noDefaultExport": "error", + "noEnum": "error", + "noNonNullAssertion": "error", + "useImportType": "error", "useConst": "error", "useNodejsImportProtocol": "off" }, + "complexity": { + "useLiteralKeys": "off" + }, "suspicious": { "noExplicitAny": "error", + "noTsIgnore": "error", "noControlCharactersInRegex": "off", "noEmptyInterface": "off" } @@ -24,6 +31,18 @@ "lineWidth": 120 }, "files": { - "includes": ["src/**/*.ts", "test/**/*.ts", "!**/node_modules/**/*", "!**/dist/**/*"] - } + "includes": ["src/**/*.ts", "test/**/*.ts", "vitest.config.ts", "!**/node_modules/**/*", "!**/dist/**/*"] + }, + "overrides": [ + { + "includes": ["vitest.config.ts"], + "linter": { + "rules": { + "style": { + "noDefaultExport": "off" + } + } + } + } + ] } diff --git a/dist/cli.d.ts b/dist/cli.d.ts index faaadd5..b798801 100644 --- a/dist/cli.d.ts +++ b/dist/cli.d.ts @@ -1,3 +1,2 @@ #!/usr/bin/env node export {}; -//# sourceMappingURL=cli.d.ts.map \ No newline at end of file diff --git a/dist/cli.d.ts.map b/dist/cli.d.ts.map deleted file mode 100644 index f022439..0000000 --- a/dist/cli.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/cli.js b/dist/cli.js index 23a6b76..e44c3e7 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -26,7 +26,8 @@ async function runHookCli(eventName) { const parsed = parseHookInput(raw); if (!parsed) return; - const options = { pluginDataRoot: process.env.PLUGIN_DATA }; + const pluginDataRoot = process.env["PLUGIN_DATA"]; + const options = pluginDataRoot === undefined ? {} : { pluginDataRoot }; const output = await runHook(eventName, parsed, options); if (output.length > 0) { processStdout.write(output); @@ -55,46 +56,46 @@ function parseHookInput(raw) { } function isCodexSessionStartInput(value) { return (isRecord(value) && - value.hook_event_name === "SessionStart" && - typeof value.session_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.source === "string"); + value["hook_event_name"] === "SessionStart" && + typeof value["session_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["source"] === "string"); } function isCodexUserPromptSubmitInput(value) { return (isRecord(value) && - value.hook_event_name === "UserPromptSubmit" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.prompt === "string"); + value["hook_event_name"] === "UserPromptSubmit" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["prompt"] === "string"); } function isCodexPostToolUseInput(value) { return (isRecord(value) && - value.hook_event_name === "PostToolUse" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.tool_name === "string" && - typeof value.tool_use_id === "string"); + value["hook_event_name"] === "PostToolUse" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["tool_name"] === "string" && + typeof value["tool_use_id"] === "string"); } function isCodexPostCompactInput(value) { return (isRecord(value) && - value.hook_event_name === "PostCompact" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - (value.trigger === "manual" || value.trigger === "auto")); + value["hook_event_name"] === "PostCompact" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + (value["trigger"] === "manual" || value["trigger"] === "auto")); } function isStringOrNull(value) { return typeof value === "string" || value === null; @@ -115,4 +116,3 @@ function readStdin() { }); }); } -//# sourceMappingURL=cli.js.map \ No newline at end of file diff --git a/dist/cli.js.map b/dist/cli.js.map deleted file mode 100644 index a505902..0000000 --- a/dist/cli.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/codex-hook.d.ts b/dist/codex-hook.d.ts index c47789d..aa451a1 100644 --- a/dist/codex-hook.d.ts +++ b/dist/codex-hook.d.ts @@ -47,4 +47,3 @@ export declare function runSessionStartHook(input: CodexSessionStartInput, optio export declare function runPostCompactHook(input: CodexPostCompactInput, options?: CodexRulesHookOptions): Promise; export declare function runUserPromptSubmitHook(input: CodexUserPromptSubmitInput, options?: CodexRulesHookOptions): Promise; export declare function runPostToolUseHook(input: CodexPostToolUseInput, options?: CodexRulesHookOptions): Promise; -//# sourceMappingURL=codex-hook.d.ts.map \ No newline at end of file diff --git a/dist/codex-hook.d.ts.map b/dist/codex-hook.d.ts.map deleted file mode 100644 index 869fe76..0000000 --- a/dist/codex-hook.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"codex-hook.d.ts","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,cAAc,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,kBAAkB,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,uBAAuB,CAC5C,KAAK,EAAE,0BAA0B,EACjC,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CA4CjB"} \ No newline at end of file diff --git a/dist/codex-hook.js b/dist/codex-hook.js index aa00db7..be55e8a 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -105,12 +105,15 @@ function fingerprintDynamicTargets(cwd, targetPaths, config) { const projectRoot = cwdProjectRoot !== null && isSameOrChildPath(targetPath, cwdProjectRoot) ? cwdProjectRoot : findProjectRoot(targetPath); - const candidates = findRuleCandidates({ + const findOptions = { projectRoot, targetFile: targetPath, - disabledSources, cache: discoveryCache, - }); + }; + if (disabledSources !== undefined) { + findOptions.disabledSources = disabledSources; + } + const candidates = findRuleCandidates(findOptions); const candidateFingerprint = sortCandidates(candidates).map(fingerprintCandidate).join("\u0001"); const cacheKey = dynamicTargetCacheKey(targetPath); fingerprints.push({ @@ -194,4 +197,3 @@ function displayPath(cwd, filePath) { function toPosixPath(path) { return path.replaceAll("\\", "/"); } -//# sourceMappingURL=codex-hook.js.map \ No newline at end of file diff --git a/dist/codex-hook.js.map b/dist/codex-hook.js.map deleted file mode 100644 index 3617dc2..0000000 --- a/dist/codex-hook.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"codex-hook.js","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/config.d.ts b/dist/config.d.ts index 9ca38ef..ef07d08 100644 --- a/dist/config.d.ts +++ b/dist/config.d.ts @@ -1,3 +1,2 @@ import type { PiRulesConfig } from "./rules/types.js"; export declare function configFromEnvironment(env?: NodeJS.ProcessEnv): PiRulesConfig; -//# sourceMappingURL=config.d.ts.map \ No newline at end of file diff --git a/dist/config.d.ts.map b/dist/config.d.ts.map deleted file mode 100644 index e24c711..0000000 --- a/dist/config.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,kBAAkB,CAAC;AAIlE,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,CAczF"} \ No newline at end of file diff --git a/dist/config.js b/dist/config.js index c5aae24..61163c7 100644 --- a/dist/config.js +++ b/dist/config.js @@ -55,4 +55,3 @@ function parseEnabledSources(value) { } return sources.length > 0 ? sources : "auto"; } -//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/dist/config.js.map b/dist/config.js.map deleted file mode 100644 index 70ebfb8..0000000 --- a/dist/config.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/persistent-cache.d.ts b/dist/persistent-cache.d.ts index 61ab7d3..2337103 100644 --- a/dist/persistent-cache.d.ts +++ b/dist/persistent-cache.d.ts @@ -3,4 +3,3 @@ export declare function hydrateEngineState(engine: Engine, cachePath: string): v export declare function persistEngineState(engine: Engine, cachePath: string): void; export declare function clearSessionState(cachePath: string): void; export declare function sessionCachePath(sessionId: string, pluginDataRoot: string | undefined): string; -//# sourceMappingURL=persistent-cache.d.ts.map \ No newline at end of file diff --git a/dist/persistent-cache.d.ts.map b/dist/persistent-cache.d.ts.map deleted file mode 100644 index dbeabe3..0000000 --- a/dist/persistent-cache.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"persistent-cache.d.ts","sourceRoot":"","sources":["../src/persistent-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAQhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAe1E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW1E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9F"} \ No newline at end of file diff --git a/dist/persistent-cache.js b/dist/persistent-cache.js index 06f4164..b16823f 100644 --- a/dist/persistent-cache.js +++ b/dist/persistent-cache.js @@ -31,7 +31,7 @@ export function clearSessionState(cachePath) { rmSync(cachePath, { force: true }); } export function sessionCachePath(sessionId, pluginDataRoot) { - const root = pluginDataRoot ?? process.env.PLUGIN_DATA ?? join(homedir(), ".codex", "codex-rules"); + const root = pluginDataRoot ?? process.env["PLUGIN_DATA"] ?? join(homedir(), ".codex", "codex-rules"); return join(root, "sessions", `${safePathSegment(sessionId)}.json`); } function readSessionState(cachePath) { @@ -56,12 +56,14 @@ function safePathSegment(value) { return value.replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 120) || "unknown-session"; } function isSerializedSessionState(value) { - if (!isRecord(value) || !Array.isArray(value.staticDedup) || !isRecord(value.dynamicDedup)) { + if (!isRecord(value) || !Array.isArray(value["staticDedup"]) || !isRecord(value["dynamicDedup"])) { return false; } - const dynamicTargetFingerprints = value.dynamicTargetFingerprints; - return (value.staticDedup.every((item) => typeof item === "string") && - Object.values(value.dynamicDedup).every((item) => Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === "string")) && + const staticDedup = value["staticDedup"]; + const dynamicDedup = value["dynamicDedup"]; + const dynamicTargetFingerprints = value["dynamicTargetFingerprints"]; + return (staticDedup.every((item) => typeof item === "string") && + Object.values(dynamicDedup).every((item) => Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === "string")) && (dynamicTargetFingerprints === undefined || (isRecord(dynamicTargetFingerprints) && Object.entries(dynamicTargetFingerprints).every(([targetKey, fingerprint]) => typeof targetKey === "string" && typeof fingerprint === "string")))); @@ -69,4 +71,3 @@ function isSerializedSessionState(value) { function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } -//# sourceMappingURL=persistent-cache.js.map \ No newline at end of file diff --git a/dist/persistent-cache.js.map b/dist/persistent-cache.js.map deleted file mode 100644 index b67ea09..0000000 --- a/dist/persistent-cache.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"persistent-cache.js","sourceRoot":"","sources":["../src/persistent-cache.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/cache.d.ts b/dist/rules/cache.d.ts index be40aa8..03c922e 100644 --- a/dist/rules/cache.d.ts +++ b/dist/rules/cache.d.ts @@ -7,4 +7,3 @@ export declare function markDynamicInjected(state: SessionState, rule: LoadedRul export declare function isStaticInjected(state: SessionState, rule: LoadedRule): boolean; export declare function isDynamicInjected(state: SessionState, rule: LoadedRule): boolean; export declare function clearSession(state: SessionState): void; -//# sourceMappingURL=cache.d.ts.map \ No newline at end of file diff --git a/dist/rules/cache.d.ts.map b/dist/rules/cache.d.ts.map deleted file mode 100644 index 65effe8..0000000 --- a/dist/rules/cache.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/rules/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAS7D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAQjF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAclF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAEhF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAMtD"} \ No newline at end of file diff --git a/dist/rules/cache.js b/dist/rules/cache.js index 8b6f0dc..459b78c 100644 --- a/dist/rules/cache.js +++ b/dist/rules/cache.js @@ -49,4 +49,3 @@ export function clearSession(state) { state.loadedRules.length = 0; state.diagnostics.length = 0; } -//# sourceMappingURL=cache.js.map \ No newline at end of file diff --git a/dist/rules/cache.js.map b/dist/rules/cache.js.map deleted file mode 100644 index 6c6dfdb..0000000 --- a/dist/rules/cache.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/rules/cache.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,OAAO;QACN,GAAG;QACH,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,yBAAyB,EAAE,IAAI,GAAG,EAAE;QACpC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;KACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAmB;IAChF,OAAO,GAAG,GAAG,KAAK,QAAQ,KAAK,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAmB;IACpE,OAAO,GAAG,QAAQ,KAAK,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,IAAgB;IACvE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,IAAgB;IACxE,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAmB,EAAE,IAAgB;IACrE,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,IAAgB;IACtE,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC/C,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC3B,KAAK,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IACxC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,CAAC"} \ No newline at end of file diff --git a/dist/rules/constants.d.ts b/dist/rules/constants.d.ts index 4578725..fc1de66 100644 --- a/dist/rules/constants.d.ts +++ b/dist/rules/constants.d.ts @@ -50,4 +50,3 @@ export declare const TRUNCATION_NOTICE = "\n\n[Rule truncated. Read full rule: { * Directories excluded by the recursive scanner regardless of glob settings. */ export declare const SCANNER_EXCLUDED_DIRS: readonly string[]; -//# sourceMappingURL=constants.d.ts.map \ No newline at end of file diff --git a/dist/rules/constants.d.ts.map b/dist/rules/constants.d.ts.map deleted file mode 100644 index b92af79..0000000 --- a/dist/rules/constants.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAA4D,CAAC;AAEjH;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAwD,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAc1D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC"} \ No newline at end of file diff --git a/dist/rules/constants.js b/dist/rules/constants.js index a737faa..1019e06 100644 --- a/dist/rules/constants.js +++ b/dist/rules/constants.js @@ -89,4 +89,3 @@ export const SCANNER_EXCLUDED_DIRS = [ ".next", "coverage", ]; -//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/dist/rules/constants.js.map b/dist/rules/constants.js.map deleted file mode 100644 index 8b7f7c8..0000000 --- a/dist/rules/constants.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rules/constants.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,MAAM;IACN,qBAAqB;IACrB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6C;IAC7E,CAAC,WAAW,EAAE,OAAO,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACtD,iCAAiC;IACjC,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAEjH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACvE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3B,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACvD,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC"} \ No newline at end of file diff --git a/dist/rules/engine.d.ts b/dist/rules/engine.d.ts index 3604594..a2ba7c0 100644 --- a/dist/rules/engine.d.ts +++ b/dist/rules/engine.d.ts @@ -35,4 +35,3 @@ export interface Engine { } export declare function defaultConfig(): PiRulesConfig; export declare function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine; -//# sourceMappingURL=engine.d.ts.map \ No newline at end of file diff --git a/dist/rules/engine.d.ts.map b/dist/rules/engine.d.ts.map deleted file mode 100644 index c90eae7..0000000 --- a/dist/rules/engine.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAe,SAAS,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AActH,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,CAAC,OAAO,EAAE;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;KAC3B,KAAK,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACrF,gBAAgB,CACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAChC;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAC1D,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACvD,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxE,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5C,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7C,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC9C,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC/C;AAID,wBAAgB,aAAa,IAAI,aAAa,CAQ7C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA+G5E"} \ No newline at end of file diff --git a/dist/rules/engine.js b/dist/rules/engine.js index 1c4060a..463db4f 100644 --- a/dist/rules/engine.js +++ b/dist/rules/engine.js @@ -27,11 +27,15 @@ export function createEngine(config, deps) { return emptyLoadResult(state); } const projectRoot = deps.findProjectRoot(cwd); - const candidates = deps.findCandidates({ + const findOptions = { projectRoot, targetFile: null, - disabledSources: disabledSourcesFor(config), - }); + }; + const disabledSources = disabledSourcesFor(config); + if (disabledSources !== undefined) { + findOptions.disabledSources = disabledSources; + } + const candidates = deps.findCandidates(findOptions); const result = loadStaticCandidates(candidates, deps, projectRoot); storeLastLoad(state, result.rules, result.diagnostics); return result; @@ -53,7 +57,15 @@ export function createEngine(config, deps) { const projectRoot = cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot) ? cwdProjectRoot : deps.findProjectRoot(targetFile); - const candidates = deps.findCandidates({ projectRoot, targetFile, disabledSources, cache: discoveryCache }); + const findOptions = { + projectRoot, + targetFile, + cache: discoveryCache, + }; + if (disabledSources !== undefined) { + findOptions.disabledSources = disabledSources; + } + const candidates = deps.findCandidates(findOptions); for (const candidate of sortCandidates(candidates)) { const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleContent, projectMembership); if (loadedRule === null) { @@ -184,7 +196,7 @@ function loadCandidate(candidate, deps, diagnostics, projectRoot, loadedRuleCont frontmatter: parsed.frontmatter, body: parsed.body, contentHash: hashContent(content), - diagnostic: parsed.diagnostic, + ...(parsed.diagnostic === undefined ? {} : { diagnostic: parsed.diagnostic }), }; loadedRuleContent?.set(candidate.realPath, loadedContent); return loadedRuleFromContent(candidate, loadedContent, diagnostics); @@ -320,4 +332,3 @@ function uniqueStrings(values) { } return uniqueValues; } -//# sourceMappingURL=engine.js.map \ No newline at end of file diff --git a/dist/rules/engine.js.map b/dist/rules/engine.js.map deleted file mode 100644 index 39d8ce8..0000000 --- a/dist/rules/engine.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/rules/engine.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/errors.d.ts b/dist/rules/errors.d.ts index 6aa74d3..cc98d46 100644 --- a/dist/rules/errors.d.ts +++ b/dist/rules/errors.d.ts @@ -4,4 +4,3 @@ export declare class UnsupportedRuleSourceError extends Error { export declare class RuleFrontmatterParseError extends Error { constructor(message: string); } -//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/dist/rules/errors.d.ts.map b/dist/rules/errors.d.ts.map deleted file mode 100644 index 5d7d1e3..0000000 --- a/dist/rules/errors.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/rules/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,0BAA2B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI3B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI3B"} \ No newline at end of file diff --git a/dist/rules/errors.js b/dist/rules/errors.js index 4896939..0fb83e8 100644 --- a/dist/rules/errors.js +++ b/dist/rules/errors.js @@ -10,4 +10,3 @@ export class RuleFrontmatterParseError extends Error { this.name = "RuleFrontmatterParseError"; } } -//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/dist/rules/errors.js.map b/dist/rules/errors.js.map deleted file mode 100644 index 6c33c54..0000000 --- a/dist/rules/errors.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/rules/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACpD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACnD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IACzC,CAAC;CACD"} \ No newline at end of file diff --git a/dist/rules/finder.d.ts b/dist/rules/finder.d.ts index 63c0bee..ee2a5f6 100644 --- a/dist/rules/finder.d.ts +++ b/dist/rules/finder.d.ts @@ -24,4 +24,3 @@ export interface FinderOptions { export declare function createRuleDiscoveryCache(): RuleDiscoveryCache; export declare function findRuleCandidates(options: FinderOptions): RuleCandidate[]; export {}; -//# sourceMappingURL=finder.d.ts.map \ No newline at end of file diff --git a/dist/rules/finder.d.ts.map b/dist/rules/finder.d.ts.map deleted file mode 100644 index 2a113ff..0000000 --- a/dist/rules/finder.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../src/rules/finder.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAE5D,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IAChE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC7B,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wGAAwG;IACxG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAqB1E"} \ No newline at end of file diff --git a/dist/rules/finder.js b/dist/rules/finder.js index 2d9ed9b..f8637b0 100644 --- a/dist/rules/finder.js +++ b/dist/rules/finder.js @@ -235,4 +235,3 @@ function toUserHomeSingleFileSource(ruleFile) { throw new UnsupportedRuleSourceError(`Unsupported user-home single-file source: ${source}`); } } -//# sourceMappingURL=finder.js.map \ No newline at end of file diff --git a/dist/rules/finder.js.map b/dist/rules/finder.js.map deleted file mode 100644 index 443c0d7..0000000 --- a/dist/rules/finder.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../src/rules/finder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/formatter.d.ts b/dist/rules/formatter.d.ts index d514539..b4bd384 100644 --- a/dist/rules/formatter.d.ts +++ b/dist/rules/formatter.d.ts @@ -5,4 +5,3 @@ export interface FormatOptions { } export declare function formatStaticBlock(rules: ReadonlyArray, options: FormatOptions): string; export declare function formatDynamicBlock(rules: ReadonlyArray, targetRelativePath: string, options: FormatOptions): string; -//# sourceMappingURL=formatter.d.ts.map \ No newline at end of file diff --git a/dist/rules/formatter.d.ts.map b/dist/rules/formatter.d.ts.map deleted file mode 100644 index 17f2b41..0000000 --- a/dist/rules/formatter.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/rules/formatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACvB;AAyCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAMlG;AAED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAChC,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,aAAa,GACpB,MAAM,CAQR"} \ No newline at end of file diff --git a/dist/rules/formatter.js b/dist/rules/formatter.js index 47ef5ed..e1d446f 100644 --- a/dist/rules/formatter.js +++ b/dist/rules/formatter.js @@ -41,4 +41,3 @@ export function formatDynamicBlock(rules, targetRelativePath, options) { .map(formatRule) .join("\n\n")}`; } -//# sourceMappingURL=formatter.js.map \ No newline at end of file diff --git a/dist/rules/formatter.js.map b/dist/rules/formatter.js.map deleted file mode 100644 index 34c3c59..0000000 --- a/dist/rules/formatter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/rules/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9D,SAAS,UAAU,CAAC,IAAmB;IACtC,OAAO,sBAAsB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,aAAa,CAAC,KAAgC,EAAE,OAAsB;IAC9E,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI;KACvG,CAAC,CAAC,CAAC;IACJ,MAAM,aAAa,GAAG,cAAc,CAAC;QACpC,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7F,cAAc,EAAE,OAAO,CAAC,cAAc;KACtC,CAAC,CAAC;IACH,MAAM,cAAc,GAAoB,EAAE,CAAC;IAE3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,UAAU,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC5D,SAAS;QACV,CAAC;QAED,cAAc,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,IAAI,EAAE,YAAY,CAAC,IAAI;SACvB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAgC,EAAE,OAAsB;IACzF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,gCAAgC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,KAAgC,EAChC,kBAA0B,EAC1B,OAAsB;IAEtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,mDAAmD,kBAAkB,QAAQ,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC;SAC/G,GAAG,CAAC,UAAU,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAClB,CAAC"} \ No newline at end of file diff --git a/dist/rules/matcher.d.ts b/dist/rules/matcher.d.ts index 68bffb6..1aee611 100644 --- a/dist/rules/matcher.d.ts +++ b/dist/rules/matcher.d.ts @@ -16,4 +16,3 @@ export interface MatchResult { export declare function matchRule(input: MatcherInput): MatchResult; export declare function normalizeGlobs(frontmatter: RuleFrontmatter): string[]; export declare function hashContent(body: string): string; -//# sourceMappingURL=matcher.d.ts.map \ No newline at end of file diff --git a/dist/rules/matcher.d.ts.map b/dist/rules/matcher.d.ts.map deleted file mode 100644 index 9bdb6cd..0000000 --- a/dist/rules/matcher.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACpB;AAcD,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAgC1D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAQrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"} \ No newline at end of file diff --git a/dist/rules/matcher.js b/dist/rules/matcher.js index d31e638..7e2e2f6 100644 --- a/dist/rules/matcher.js +++ b/dist/rules/matcher.js @@ -136,4 +136,3 @@ function isExcluded(pathBase, negativeMatchers) { function noMatch() { return { matched: false, reason: { kind: "no-match" } }; } -//# sourceMappingURL=matcher.js.map \ No newline at end of file diff --git a/dist/rules/matcher.js.map b/dist/rules/matcher.js.map deleted file mode 100644 index 58dbb81..0000000 --- a/dist/rules/matcher.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/rules/matcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/ordering.d.ts b/dist/rules/ordering.d.ts index 2d42759..f30d972 100644 --- a/dist/rules/ordering.d.ts +++ b/dist/rules/ordering.d.ts @@ -1,4 +1,3 @@ import type { RuleCandidate } from "./types.js"; export declare function sortCandidates(candidates: ReadonlyArray): T[]; export declare function compareCandidates(a: RuleCandidate, b: RuleCandidate): number; -//# sourceMappingURL=ordering.d.ts.map \ No newline at end of file diff --git a/dist/rules/ordering.d.ts.map b/dist/rules/ordering.d.ts.map deleted file mode 100644 index e2d51e9..0000000 --- a/dist/rules/ordering.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ordering.d.ts","sourceRoot":"","sources":["../../src/rules/ordering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,cAAc,CAAC,CAAC,SAAS,aAAa,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAKzF;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAQ5E"} \ No newline at end of file diff --git a/dist/rules/ordering.js b/dist/rules/ordering.js index d4e91ef..5308e48 100644 --- a/dist/rules/ordering.js +++ b/dist/rules/ordering.js @@ -25,4 +25,3 @@ function compareString(a, b) { return 1; return 0; } -//# sourceMappingURL=ordering.js.map \ No newline at end of file diff --git a/dist/rules/ordering.js.map b/dist/rules/ordering.js.map deleted file mode 100644 index a3b617e..0000000 --- a/dist/rules/ordering.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ordering.js","sourceRoot":"","sources":["../../src/rules/ordering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,UAAU,cAAc,CAA0B,UAA4B;IACnF,OAAO,UAAU;SACf,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;SACjD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;SACrG,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAgB,EAAE,CAAgB;IACnE,OAAO,CACN,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;QACtC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;QACrC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;QACnG,aAAa,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;QAC7C,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CACrC,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,CAAU,EAAE,CAAU;IAC7C,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IAC1C,OAAO,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IAC1C,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,CAAC,CAAC;AACV,CAAC"} \ No newline at end of file diff --git a/dist/rules/parser.d.ts b/dist/rules/parser.d.ts index 8096ce0..cb945a5 100644 --- a/dist/rules/parser.d.ts +++ b/dist/rules/parser.d.ts @@ -1,4 +1,3 @@ import type { ParsedRule } from "./types.js"; /** Parse markdown rule content and extract the supported YAML frontmatter subset. */ export declare function parseRule(content: string): ParsedRule; -//# sourceMappingURL=parser.d.ts.map \ No newline at end of file diff --git a/dist/rules/parser.d.ts.map b/dist/rules/parser.d.ts.map deleted file mode 100644 index b3b1a89..0000000 --- a/dist/rules/parser.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/rules/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AAK9D,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA6BrD"} \ No newline at end of file diff --git a/dist/rules/parser.js b/dist/rules/parser.js index 1ef5b27..3e2e3fe 100644 --- a/dist/rules/parser.js +++ b/dist/rules/parser.js @@ -99,8 +99,9 @@ function parseYamlFrontmatter(yamlContent) { } lineIndex += 1; } - if (globValues.length === 1) { - frontmatter.globs = globValues[0]; + const singleGlob = globValues[0]; + if (globValues.length === 1 && singleGlob !== undefined) { + frontmatter.globs = singleGlob; } else if (globValues.length > 1) { frontmatter.globs = globValues; @@ -285,4 +286,3 @@ function stripComment(line) { } return line; } -//# sourceMappingURL=parser.js.map \ No newline at end of file diff --git a/dist/rules/parser.js.map b/dist/rules/parser.js.map deleted file mode 100644 index 5ca93f9..0000000 --- a/dist/rules/parser.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/rules/parser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/project-root.d.ts b/dist/rules/project-root.d.ts index 51fc133..079a718 100644 --- a/dist/rules/project-root.d.ts +++ b/dist/rules/project-root.d.ts @@ -1,2 +1 @@ export declare function findProjectRoot(startPath: string, markers?: ReadonlyArray): string | null; -//# sourceMappingURL=project-root.d.ts.map \ No newline at end of file diff --git a/dist/rules/project-root.d.ts.map b/dist/rules/project-root.d.ts.map deleted file mode 100644 index 3621faa..0000000 --- a/dist/rules/project-root.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/rules/project-root.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAa,CAAC,MAAM,CAAmB,GAAG,MAAM,GAAG,IAAI,CAwBlH"} \ No newline at end of file diff --git a/dist/rules/project-root.js b/dist/rules/project-root.js index 1a65817..d9b4b5d 100644 --- a/dist/rules/project-root.js +++ b/dist/rules/project-root.js @@ -21,4 +21,3 @@ export function findProjectRoot(startPath, markers = PROJECT_MARKERS) { currentDirectory = dirname(currentDirectory); } } -//# sourceMappingURL=project-root.js.map \ No newline at end of file diff --git a/dist/rules/project-root.js.map b/dist/rules/project-root.js.map deleted file mode 100644 index 039df98..0000000 --- a/dist/rules/project-root.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/rules/project-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,UAAiC,eAAe;IAClG,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,gBAAgB,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjG,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEpC,OAAO,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAChD,OAAO,gBAAgB,CAAC;YACzB,CAAC;QACF,CAAC;QAED,IAAI,gBAAgB,KAAK,cAAc,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;AACF,CAAC"} \ No newline at end of file diff --git a/dist/rules/scanner.d.ts b/dist/rules/scanner.d.ts index 3bc07e4..7a66748 100644 --- a/dist/rules/scanner.d.ts +++ b/dist/rules/scanner.d.ts @@ -12,4 +12,3 @@ export interface ScannedFile { realPath: string; } export declare function scanRuleFiles(options: ScanOptions): ScannedFile[]; -//# sourceMappingURL=scanner.d.ts.map \ No newline at end of file diff --git a/dist/rules/scanner.d.ts.map b/dist/rules/scanner.d.ts.map deleted file mode 100644 index c7909d7..0000000 --- a/dist/rules/scanner.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/rules/scanner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,EAAE,CAyBjE"} \ No newline at end of file diff --git a/dist/rules/scanner.js b/dist/rules/scanner.js index a2985d7..6d35993 100644 --- a/dist/rules/scanner.js +++ b/dist/rules/scanner.js @@ -109,4 +109,3 @@ function resolveRealPath(filePath) { return filePath; } } -//# sourceMappingURL=scanner.js.map \ No newline at end of file diff --git a/dist/rules/scanner.js.map b/dist/rules/scanner.js.map deleted file mode 100644 index cbfdc32..0000000 --- a/dist/rules/scanner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/rules/scanner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/rules/truncator.d.ts b/dist/rules/truncator.d.ts index beba866..86a2634 100644 --- a/dist/rules/truncator.d.ts +++ b/dist/rules/truncator.d.ts @@ -15,4 +15,3 @@ export declare function truncateBudget(input: { maxResultChars: number; }): BudgetResult[]; export {}; -//# sourceMappingURL=truncator.d.ts.map \ No newline at end of file diff --git a/dist/rules/truncator.d.ts.map b/dist/rules/truncator.d.ts.map deleted file mode 100644 index 38be2bb..0000000 --- a/dist/rules/truncator.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"truncator.d.ts","sourceRoot":"","sources":["../../src/rules/truncator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,KAAK,UAAU,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,YAAY,GAAG,UAAU,GAAG;IAChC,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC;AAmBF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAYhH;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,EAAE,CAuBlH"} \ No newline at end of file diff --git a/dist/rules/truncator.js b/dist/rules/truncator.js index 603815f..7ee0f78 100644 --- a/dist/rules/truncator.js +++ b/dist/rules/truncator.js @@ -43,4 +43,3 @@ export function truncateBudget(input) { } return results; } -//# sourceMappingURL=truncator.js.map \ No newline at end of file diff --git a/dist/rules/truncator.js.map b/dist/rules/truncator.js.map deleted file mode 100644 index 6e4bb82..0000000 --- a/dist/rules/truncator.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"truncator.js","sourceRoot":"","sources":["../../src/rules/truncator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYnD,SAAS,gBAAgB,CAAC,YAAoB;IAC7C,OAAO,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,GAAW;IAC9C,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,YAAY,IAAI,MAAM,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;QACtD,OAAO,GAAG,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAmD;IAC7F,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAmE;IACjG,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACrF,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACpC,SAAS;QACV,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM;QACP,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,EAAE,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC"} \ No newline at end of file diff --git a/dist/rules/types.d.ts b/dist/rules/types.d.ts index 5489214..9f8e8c3 100644 --- a/dist/rules/types.d.ts +++ b/dist/rules/types.d.ts @@ -118,4 +118,3 @@ export interface RuleDiagnostic { source: string; message: string; } -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/rules/types.d.ts.map b/dist/rules/types.d.ts.map deleted file mode 100644 index d0d8d4d..0000000 --- a/dist/rules/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAChD,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GACnB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,sBAAsB,GACtB,iCAAiC,GACjC,WAAW,GACX,WAAW,GACX,YAAY,GACZ,mBAAmB,GACnB,mBAAmB,GACnB,iBAAiB,GACjB,8BAA8B,GAC9B,qBAAqB,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;CACtC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,yBAAyB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB"} \ No newline at end of file diff --git a/dist/rules/types.js b/dist/rules/types.js index 31f8fd1..4244d3b 100644 --- a/dist/rules/types.js +++ b/dist/rules/types.js @@ -6,4 +6,3 @@ * aliases that are normalized into `globs` internally. */ export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/rules/types.js.map b/dist/rules/types.js.map deleted file mode 100644 index b9dda41..0000000 --- a/dist/rules/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"} \ No newline at end of file diff --git a/dist/tool-paths.d.ts b/dist/tool-paths.d.ts index 8bb9a32..c4aa2f5 100644 --- a/dist/tool-paths.d.ts +++ b/dist/tool-paths.d.ts @@ -4,4 +4,3 @@ export interface CodexPostToolUseLike { tool_response: unknown; } export declare function extractCodexToolPaths(input: CodexPostToolUseLike, cwd: string): string[]; -//# sourceMappingURL=tool-paths.d.ts.map \ No newline at end of file diff --git a/dist/tool-paths.d.ts.map b/dist/tool-paths.d.ts.map deleted file mode 100644 index 66f4a6c..0000000 --- a/dist/tool-paths.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"tool-paths.d.ts","sourceRoot":"","sources":["../src/tool-paths.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACvB;AAoBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxF"} \ No newline at end of file diff --git a/dist/tool-paths.js b/dist/tool-paths.js index 70491d5..2cd742e 100644 --- a/dist/tool-paths.js +++ b/dist/tool-paths.js @@ -26,8 +26,8 @@ export function extractCodexToolPaths(input, cwd) { const toolInput = isRecord(input.tool_input) ? input.tool_input : {}; addCommonPathFields(paths, toolInput, cwd); addPatchPayloadPaths(paths, toolInput, cwd); - addPatchRecordPaths(paths, toolInput.files, cwd); - addPatchRecordPaths(paths, toolInput.changes, cwd); + addPatchRecordPaths(paths, toolInput["files"], cwd); + addPatchRecordPaths(paths, toolInput["changes"], cwd); if (COMMAND_TOOL_NAMES.has(toolName)) { const command = stringProperty(toolInput, "command") ?? stringProperty(toolInput, "cmd"); const workdir = stringProperty(toolInput, "workdir") ?? stringProperty(toolInput, "cwd"); @@ -164,6 +164,5 @@ function isRecord(value) { function isFailedToolResponse(value) { if (!isRecord(value)) return false; - return value.isError === true || value.is_error === true || value.error === true || value.status === "error"; + return (value["isError"] === true || value["is_error"] === true || value["error"] === true || value["status"] === "error"); } -//# sourceMappingURL=tool-paths.js.map \ No newline at end of file diff --git a/dist/tool-paths.js.map b/dist/tool-paths.js.map deleted file mode 100644 index c2a3a41..0000000 --- a/dist/tool-paths.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"tool-paths.js","sourceRoot":"","sources":["../src/tool-paths.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index 6fa83ac..64fa4dd 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -4,6 +4,7 @@ import { stdin as processStdin, stdout as processStdout } from "node:process"; import { type CodexPostCompactInput, type CodexPostToolUseInput, + type CodexRulesHookOptions, type CodexSessionStartInput, type CodexUserPromptSubmitInput, runPostCompactHook, @@ -15,7 +16,6 @@ import { const command = process.argv[2]; const subcommand = process.argv[3]; type HookCliEventName = "SessionStart" | "UserPromptSubmit" | "PostToolUse" | "PostCompact"; -type HookCliOptions = { pluginDataRoot: string | undefined }; if (command === "hook" && subcommand === "session-start") { await runHookCli("SessionStart"); @@ -35,14 +35,15 @@ async function runHookCli(eventName: HookCliEventName): Promise { if (raw.trim().length === 0) return; const parsed = parseHookInput(raw); if (!parsed) return; - const options = { pluginDataRoot: process.env.PLUGIN_DATA }; + const pluginDataRoot = process.env["PLUGIN_DATA"]; + const options: CodexRulesHookOptions = pluginDataRoot === undefined ? {} : { pluginDataRoot }; const output = await runHook(eventName, parsed, options); if (output.length > 0) { processStdout.write(output); } } -async function runHook(eventName: HookCliEventName, parsed: unknown, options: HookCliOptions): Promise { +async function runHook(eventName: HookCliEventName, parsed: unknown, options: CodexRulesHookOptions): Promise { switch (eventName) { case "SessionStart": return isCodexSessionStartInput(parsed) ? await runSessionStartHook(parsed, options) : ""; @@ -67,55 +68,55 @@ function parseHookInput(raw: string): unknown | undefined { function isCodexSessionStartInput(value: unknown): value is CodexSessionStartInput { return ( isRecord(value) && - value.hook_event_name === "SessionStart" && - typeof value.session_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.source === "string" + value["hook_event_name"] === "SessionStart" && + typeof value["session_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["source"] === "string" ); } function isCodexUserPromptSubmitInput(value: unknown): value is CodexUserPromptSubmitInput { return ( isRecord(value) && - value.hook_event_name === "UserPromptSubmit" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.prompt === "string" + value["hook_event_name"] === "UserPromptSubmit" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["prompt"] === "string" ); } function isCodexPostToolUseInput(value: unknown): value is CodexPostToolUseInput { return ( isRecord(value) && - value.hook_event_name === "PostToolUse" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.tool_name === "string" && - typeof value.tool_use_id === "string" + value["hook_event_name"] === "PostToolUse" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["tool_name"] === "string" && + typeof value["tool_use_id"] === "string" ); } function isCodexPostCompactInput(value: unknown): value is CodexPostCompactInput { return ( isRecord(value) && - value.hook_event_name === "PostCompact" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - isStringOrNull(value.transcript_path) && - typeof value.cwd === "string" && - typeof value.model === "string" && - (value.trigger === "manual" || value.trigger === "auto") + value["hook_event_name"] === "PostCompact" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + isStringOrNull(value["transcript_path"]) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + (value["trigger"] === "manual" || value["trigger"] === "auto") ); } diff --git a/src/codex-hook.ts b/src/codex-hook.ts index 2a20202..0941e9b 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -206,12 +206,20 @@ function fingerprintDynamicTargets( cwdProjectRoot !== null && isSameOrChildPath(targetPath, cwdProjectRoot) ? cwdProjectRoot : findProjectRoot(targetPath); - const candidates = findRuleCandidates({ + const findOptions: { + projectRoot: string | null; + targetFile: string; + disabledSources?: ReadonlySet; + cache: ReturnType; + } = { projectRoot, targetFile: targetPath, - disabledSources, cache: discoveryCache, - }); + }; + if (disabledSources !== undefined) { + findOptions.disabledSources = disabledSources; + } + const candidates = findRuleCandidates(findOptions); const candidateFingerprint = sortCandidates(candidates).map(fingerprintCandidate).join("\u0001"); const cacheKey = dynamicTargetCacheKey(targetPath); fingerprints.push({ diff --git a/src/persistent-cache.ts b/src/persistent-cache.ts index 4d7062a..a7d8d5d 100644 --- a/src/persistent-cache.ts +++ b/src/persistent-cache.ts @@ -45,7 +45,7 @@ export function clearSessionState(cachePath: string): void { } export function sessionCachePath(sessionId: string, pluginDataRoot: string | undefined): string { - const root = pluginDataRoot ?? process.env.PLUGIN_DATA ?? join(homedir(), ".codex", "codex-rules"); + const root = pluginDataRoot ?? process.env["PLUGIN_DATA"] ?? join(homedir(), ".codex", "codex-rules"); return join(root, "sessions", `${safePathSegment(sessionId)}.json`); } @@ -73,13 +73,15 @@ function safePathSegment(value: string): string { } function isSerializedSessionState(value: unknown): value is SerializedSessionState { - if (!isRecord(value) || !Array.isArray(value.staticDedup) || !isRecord(value.dynamicDedup)) { + if (!isRecord(value) || !Array.isArray(value["staticDedup"]) || !isRecord(value["dynamicDedup"])) { return false; } - const dynamicTargetFingerprints = value.dynamicTargetFingerprints; + const staticDedup = value["staticDedup"]; + const dynamicDedup = value["dynamicDedup"]; + const dynamicTargetFingerprints = value["dynamicTargetFingerprints"]; return ( - value.staticDedup.every((item) => typeof item === "string") && - Object.values(value.dynamicDedup).every( + staticDedup.every((item) => typeof item === "string") && + Object.values(dynamicDedup).every( (item) => Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === "string"), ) && (dynamicTargetFingerprints === undefined || diff --git a/src/rules/engine.ts b/src/rules/engine.ts index 8e7fd73..d7d27f9 100644 --- a/src/rules/engine.ts +++ b/src/rules/engine.ts @@ -88,11 +88,15 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { } const projectRoot = deps.findProjectRoot(cwd); - const candidates = deps.findCandidates({ + const findOptions: Parameters[0] = { projectRoot, targetFile: null, - disabledSources: disabledSourcesFor(config), - }); + }; + const disabledSources = disabledSourcesFor(config); + if (disabledSources !== undefined) { + findOptions.disabledSources = disabledSources; + } + const candidates = deps.findCandidates(findOptions); const result = loadStaticCandidates(candidates, deps, projectRoot); storeLastLoad(state, result.rules, result.diagnostics); return result; @@ -121,7 +125,15 @@ export function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine { cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot) ? cwdProjectRoot : deps.findProjectRoot(targetFile); - const candidates = deps.findCandidates({ projectRoot, targetFile, disabledSources, cache: discoveryCache }); + const findOptions: Parameters[0] = { + projectRoot, + targetFile, + cache: discoveryCache, + }; + if (disabledSources !== undefined) { + findOptions.disabledSources = disabledSources; + } + const candidates = deps.findCandidates(findOptions); for (const candidate of sortCandidates(candidates)) { const loadedRule = loadCandidate( @@ -309,7 +321,7 @@ function loadCandidate( frontmatter: parsed.frontmatter, body: parsed.body, contentHash: hashContent(content), - diagnostic: parsed.diagnostic, + ...(parsed.diagnostic === undefined ? {} : { diagnostic: parsed.diagnostic }), } satisfies LoadedRuleContent; loadedRuleContent?.set(candidate.realPath, loadedContent); return loadedRuleFromContent(candidate, loadedContent, diagnostics); diff --git a/src/rules/parser.ts b/src/rules/parser.ts index eb03579..34f13d0 100644 --- a/src/rules/parser.ts +++ b/src/rules/parser.ts @@ -116,8 +116,9 @@ function parseYamlFrontmatter(yamlContent: string): RuleFrontmatter { lineIndex += 1; } - if (globValues.length === 1) { - frontmatter.globs = globValues[0]; + const singleGlob = globValues[0]; + if (globValues.length === 1 && singleGlob !== undefined) { + frontmatter.globs = singleGlob; } else if (globValues.length > 1) { frontmatter.globs = globValues; } diff --git a/src/tool-paths.ts b/src/tool-paths.ts index f6d7175..5974c4a 100644 --- a/src/tool-paths.ts +++ b/src/tool-paths.ts @@ -35,8 +35,8 @@ export function extractCodexToolPaths(input: CodexPostToolUseLike, cwd: string): const toolInput = isRecord(input.tool_input) ? input.tool_input : {}; addCommonPathFields(paths, toolInput, cwd); addPatchPayloadPaths(paths, toolInput, cwd); - addPatchRecordPaths(paths, toolInput.files, cwd); - addPatchRecordPaths(paths, toolInput.changes, cwd); + addPatchRecordPaths(paths, toolInput["files"], cwd); + addPatchRecordPaths(paths, toolInput["changes"], cwd); if (COMMAND_TOOL_NAMES.has(toolName)) { const command = stringProperty(toolInput, "command") ?? stringProperty(toolInput, "cmd"); @@ -186,5 +186,7 @@ function isRecord(value: unknown): value is Record { function isFailedToolResponse(value: unknown): boolean { if (!isRecord(value)) return false; - return value.isError === true || value.is_error === true || value.error === true || value.status === "error"; + return ( + value["isError"] === true || value["is_error"] === true || value["error"] === true || value["status"] === "error" + ); } diff --git a/test/matcher.test.ts b/test/matcher.test.ts index 8c35ae4..a4e7150 100644 --- a/test/matcher.test.ts +++ b/test/matcher.test.ts @@ -11,14 +11,16 @@ function matchFrontmatter( basename?: string; }, ): ReturnType { + const scopeRelative = pathBases.scopeRelative; + const pathBase = { + projectRelative: pathBases.projectRelative, + basename: pathBases.basename ?? pathBases.projectRelative.split("/").at(-1) ?? pathBases.projectRelative, + ...(scopeRelative === undefined ? {} : { scopeRelative }), + }; return matchRule({ frontmatter, isSingleFile: false, - pathBases: { - projectRelative: pathBases.projectRelative, - scopeRelative: pathBases.scopeRelative, - basename: pathBases.basename ?? pathBases.projectRelative.split("/").at(-1) ?? pathBases.projectRelative, - }, + pathBases: pathBase, }); } diff --git a/test/package-smoke.test.ts b/test/package-smoke.test.ts index a86ac8b..97e5b03 100644 --- a/test/package-smoke.test.ts +++ b/test/package-smoke.test.ts @@ -1,35 +1,70 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; -function readJson(path: string): Record { - return JSON.parse(readFileSync(path, "utf8")) as Record; +type PackageJson = { + readonly type: string; + readonly packageManager: string; + readonly bin: Record; + readonly dependencies?: Record; +}; + +type PluginJson = { + readonly hooks: string; +}; + +type HookCommand = { + readonly command: string; +}; + +type HookEntry = { + readonly hooks: readonly HookCommand[]; +}; + +type HooksJson = { + readonly hooks: Record; +}; + +function readPackageJson(path: string): PackageJson { + const parsed: unknown = JSON.parse(readFileSync(path, "utf8")); + if (!isPackageJson(parsed)) throw new TypeError(`Invalid package metadata: ${path}`); + return parsed; +} + +function readPluginJson(path: string): PluginJson { + const parsed: unknown = JSON.parse(readFileSync(path, "utf8")); + if (!isPluginJson(parsed)) throw new TypeError(`Invalid plugin metadata: ${path}`); + return parsed; +} + +function readHooksJson(path: string): HooksJson { + const parsed: unknown = JSON.parse(readFileSync(path, "utf8")); + if (!isHooksJson(parsed)) throw new TypeError(`Invalid hooks metadata: ${path}`); + return parsed; } describe("plugin package metadata", () => { it("#given packaged plugin files #when validating entrypoints #then hook commands use portable plugin root interpolation", () => { // given - const packageJson = readJson("package.json"); - const pluginJson = readJson(".codex-plugin/plugin.json"); - const hooksJson = readJson("hooks/hooks.json"); + const packageJson = readPackageJson("package.json"); + const pluginJson = readPluginJson(".codex-plugin/plugin.json"); + const hooksJson = readHooksJson("hooks/hooks.json"); const cliSource = readFileSync("src/cli.ts", "utf8"); // when - const bin = packageJson.bin as Record; - const dependencies = packageJson.dependencies as Record | undefined; - const hookConfig = hooksJson.hooks as Record }>>; + const hookConfig = hooksJson.hooks; const pluginRoot = ["$", "{PLUGIN_ROOT}"].join(""); const commands = [ - hookConfig.SessionStart?.[0]?.hooks[0]?.command, - hookConfig.UserPromptSubmit?.[0]?.hooks[0]?.command, - hookConfig.PostToolUse?.[0]?.hooks[0]?.command, - hookConfig.PostCompact?.[0]?.hooks[0]?.command, + hookConfig["SessionStart"]?.[0]?.hooks[0]?.command, + hookConfig["UserPromptSubmit"]?.[0]?.hooks[0]?.command, + hookConfig["PostToolUse"]?.[0]?.hooks[0]?.command, + hookConfig["PostCompact"]?.[0]?.hooks[0]?.command, ]; // then expect(packageJson.type).toBe("module"); expect(packageJson.packageManager).toBe("npm@11.12.1"); - expect(dependencies ?? {}).toEqual({}); - expect(bin["codex-rules"]).toBe("./dist/cli.js"); + expect(packageJson.dependencies ?? {}).toEqual({}); + expect(packageJson.bin["codex-rules"]).toBe("./dist/cli.js"); expect(pluginJson.hooks).toBe("./hooks/hooks.json"); expect(cliSource.startsWith("#!/usr/bin/env node")).toBe(true); expect(commands).toEqual([ @@ -40,3 +75,43 @@ describe("plugin package metadata", () => { ]); }); }); + +function isPackageJson(value: unknown): value is PackageJson { + if (!isRecord(value)) return false; + const dependencies = value["dependencies"]; + return ( + value["type"] === "module" && + value["packageManager"] === "npm@11.12.1" && + isStringRecord(value["bin"]) && + (dependencies === undefined || isRecord(dependencies)) + ); +} + +function isPluginJson(value: unknown): value is PluginJson { + return isRecord(value) && typeof value["hooks"] === "string"; +} + +function isHooksJson(value: unknown): value is HooksJson { + if (!isRecord(value) || !isRecord(value["hooks"])) return false; + return Object.values(value["hooks"]).every(isHookEntries); +} + +function isHookEntries(value: unknown): value is readonly HookEntry[] { + return Array.isArray(value) && value.every(isHookEntry); +} + +function isHookEntry(value: unknown): value is HookEntry { + return isRecord(value) && Array.isArray(value["hooks"]) && value["hooks"].every(isHookCommand); +} + +function isHookCommand(value: unknown): value is HookCommand { + return isRecord(value) && typeof value["command"] === "string"; +} + +function isStringRecord(value: unknown): value is Record { + return isRecord(value) && Object.values(value).every((item) => typeof item === "string"); +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} diff --git a/tsconfig.build.json b/tsconfig.build.json index 4d6121e..5b5bbca 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -3,8 +3,6 @@ "compilerOptions": { "allowImportingTsExtensions": false, "declaration": true, - "declarationMap": true, - "sourceMap": true, "outDir": "dist", "rootDir": "src", "noEmit": false diff --git a/tsconfig.json b/tsconfig.json index dae035d..342229c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,10 @@ "moduleResolution": "Node16", "lib": ["ES2022"], "strict": true, + "exactOptionalPropertyTypes": true, "noUncheckedIndexedAccess": true, + "noPropertyAccessFromIndexSignature": true, + "verbatimModuleSyntax": true, "noImplicitOverride": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, diff --git a/vitest.config.ts b/vitest.config.ts index e92f387..c4fddb4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -3,5 +3,6 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { environment: "node", + pool: "threads", }, });