From 7eb59b7111047e1eafceb4041720c5cd7cdcfe92 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 16 May 2026 16:34:22 +0900 Subject: [PATCH 1/9] feat(comment-checker): support codex edit post hooks Restore edit-like PostToolUse matching and extraction for Write, Edit, MultiEdit, and apply_patch. Forward Codex transcript_path into the native checker while preserving no-op behavior when checker execution fails or has no finding. Plan: plans/post-hook-support-codex-plugins.md --- .codex-plugin/plugin.json | 10 +-- CHANGELOG.md | 7 ++ README.md | 11 ++- dist/codex-hook.d.ts.map | 2 +- dist/codex-hook.js | 6 +- dist/codex-hook.js.map | 2 +- dist/core.d.ts | 8 +- dist/core.d.ts.map | 2 +- dist/core.js | 80 ++++++++++++++++++- dist/core.js.map | 2 +- hooks/hooks.json | 2 +- package.json | 2 +- skills/comment-checker/SKILL.md | 6 +- src/codex-hook.ts | 8 +- src/core.ts | 82 ++++++++++++++++++- test/codex-hook.test.ts | 134 +++++++++++++++++++++++++++++++- 16 files changed, 340 insertions(+), 24 deletions(-) diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 96c0a4a..9e86638 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "codex-comment-checker", "version": "0.1.1", - "description": "Run comment-checker after Codex apply_patch edits.", + "description": "Run comment-checker after Codex edit hooks.", "author": { "name": "Yeongyu Kim", "email": "yeongyu@users.noreply.github.com", @@ -15,8 +15,8 @@ "hooks": "./hooks/hooks.json", "interface": { "displayName": "Codex Comment Checker", - "shortDescription": "Checks comments after apply_patch", - "longDescription": "Codex Comment Checker runs the native comment-checker after successful apply_patch tool calls and feeds warnings back to Codex through PostToolUse hook feedback.", + "shortDescription": "Checks comments after edits", + "longDescription": "Codex Comment Checker runs the native comment-checker after successful edit-like PostToolUse hook calls and feeds warnings back to Codex through blocking hook feedback.", "developerName": "Yeongyu Kim", "category": "Developer Tools", "capabilities": ["Hooks", "Code Review"], @@ -24,9 +24,9 @@ "privacyPolicyURL": "https://github.com/code-yeongyu/codex-comment-checker#privacy", "termsOfServiceURL": "https://github.com/code-yeongyu/codex-comment-checker#license", "defaultPrompt": [ - "Explain the comment warning from the apply_patch hook.", + "Explain the comment warning from the edit hook.", "Fix the comment-checker warning from my last patch.", - "Show why the apply_patch comment check blocked." + "Show why the comment check blocked." ], "brandColor": "#2563EB", "screenshots": [] diff --git a/CHANGELOG.md b/CHANGELOG.md index c9fb20b..06ad24b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## Unreleased + +### Added + +- Restore `write`, `edit`, `multi_edit`, and `multiedit` PostToolUse coverage alongside `apply_patch`. +- Forward Codex `transcript_path` into native comment-checker hook input when available. + ## [0.1.1] - 2026-05-15 ### Changed diff --git a/README.md b/README.md index db6a410..153cfca 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,15 @@ [![ci](https://github.com/code-yeongyu/codex-comment-checker/actions/workflows/ci.yml/badge.svg)](https://github.com/code-yeongyu/codex-comment-checker/actions/workflows/ci.yml) [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) -Codex plugin that runs [`@code-yeongyu/comment-checker`](https://github.com/code-yeongyu/go-claude-code-comment-checker) after successful `apply_patch` tool calls. +Codex plugin that runs [`@code-yeongyu/comment-checker`](https://github.com/code-yeongyu/go-claude-code-comment-checker) after successful edit-like `PostToolUse` hook calls. ## Behavior | Case | Result | |------|--------| | `apply_patch` succeeds | parses `tool_input.command` and checks added/updated files | -| non-`apply_patch` edit tool succeeds | ignored | +| `write`, `edit`, `multi_edit`, or `multiedit` succeeds | maps the Codex payload to the native checker hook input | +| non-edit tool succeeds | ignored | | checker exits `2` | returns Codex `PostToolUse` blocking feedback so the model fixes or explains the warning | | checker binary missing | emits no hook output | | checker exits unexpectedly | leaves hook output unchanged | @@ -57,9 +58,13 @@ codex plugin marketplace add /path/to/codex-plugins node /path/to/codex-plugins/scripts/install-local.mjs /path/to/codex-plugins ``` -If your local Codex build exposes plugin install commands, you can install from the UI or CLI instead. For older local builds, the marketplace installer builds and copies the plugin into `~/.codex/plugins/cache//codex-comment-checker/0.1.0`, installs runtime dependencies there, and enables: +If your local Codex build exposes plugin install commands, you can install from the UI or CLI instead. For older local builds, the marketplace installer builds and copies the plugin into `~/.codex/plugins/cache//codex-comment-checker/0.1.1`, installs runtime dependencies there, and enables: ```toml +[features] +plugins = true +plugin_hooks = true + [plugins."codex-comment-checker@code-yeongyu-codex-plugins"] enabled = true ``` diff --git a/dist/codex-hook.d.ts.map b/dist/codex-hook.d.ts.map index 0a7f175..9641425 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":"AAEA,OAAO,EACN,KAAK,mBAAmB,EAMxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,oBAAoB,EAAqB,MAAM,aAAa,CAAC;AAE3E,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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,CAAC,EAAE,oBAAoB,CAAC;CAC3B,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAEpG;AAED,wBAAsB,4BAA4B,CACjD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD"} \ No newline at end of file +{"version":3,"file":"codex-hook.d.ts","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,mBAAmB,EAMxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,oBAAoB,EAAqB,MAAM,aAAa,CAAC;AAE3E,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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,CAAC,EAAE,oBAAoB,CAAC;CAC3B,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAEpG;AAED,wBAAsB,4BAA4B,CACjD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD"} \ No newline at end of file diff --git a/dist/codex-hook.js b/dist/codex-hook.js index abea9e9..ef6ae65 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -11,7 +11,11 @@ export async function runCommentCheckerPostToolUse(input, options = {}) { const runner = options.run ?? runCommentChecker; const warnings = []; for (const request of requests) { - const result = await runner(toHookInput(request, { sessionId: input.session_id, cwd: input.cwd })); + const result = await runner(toHookInput(request, { + sessionId: input.session_id, + cwd: input.cwd, + transcriptPath: input.transcript_path ?? undefined, + })); if (result.status === "missing" || result.status === "pass") continue; if (result.status === "error") diff --git a/dist/codex-hook.js.map b/dist/codex-hook.js.map index a42e7c3..162cbaa 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":"AAAA,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAEN,2BAA2B,EAC3B,QAAQ,EAGR,WAAW,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAA6B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoB3E,MAAM,UAAU,gCAAgC,CAAC,KAA4B;IAC5E,OAAO,2BAA2B,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CACjD,KAA4B,EAC5B,UAA4B,EAAE;IAE9B,MAAM,QAAQ,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,iBAAiB,CAAC;IAChD,MAAM,QAAQ,GAAiD,EAAE,CAAC;IAElE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAC1B,WAAW,CAAC,OAAO,EAAE;YACpB,SAAS,EAAE,KAAK,CAAC,UAAU;YAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,cAAc,EAAE,KAAK,CAAC,eAAe,IAAI,SAAS;SAClD,CAAC,CACF,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QACtE,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,IAAI,CAAC,SAAS,CAAC;QACrB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;KAChC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;QAAE,OAAO;IAC7C,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA4B;IACrD,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,SAAS;QACzB,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC;QAC5D,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,aAAa,CAAC;QACnD,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC;QAC7C,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,SAAkC;IAC/E,IAAI,QAAQ,KAAK,aAAa,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzE,OAAO;YACN,GAAG,SAAS;YACZ,KAAK,EAAE,SAAS,CAAC,OAAO;YACxB,KAAK,EAAE,SAAS,CAAC,OAAO;SACxB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAqB;IACnD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,YAAqB;IAC7C,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,KAAK,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,QAAsD;IAC7E,OAAO,QAAQ;SACb,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,mCAAmC,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5F,IAAI,CAAC,MAAM,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC9C,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,eAAe,KAAK,aAAa;QACvC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;QACzC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CACrC,CAAC;AACH,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,OAAO,CAAC,CAAC;QAClC,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 diff --git a/dist/core.d.ts b/dist/core.d.ts index b09c02f..86291d7 100644 --- a/dist/core.d.ts +++ b/dist/core.d.ts @@ -7,12 +7,17 @@ export type ImageContent = { data: string; mimeType: string; }; -export type CheckerToolName = "Write" | "Edit"; +export type CheckerToolName = "Write" | "Edit" | "MultiEdit"; +export type CheckerEdit = { + old_string: string; + new_string: string; +}; export type CheckerToolInput = { file_path: string; content?: string; old_string?: string; new_string?: string; + edits?: CheckerEdit[]; }; export type CommentCheckRequest = { sourceToolName: string; @@ -40,6 +45,7 @@ export declare function extractCommentCheckRequests(event: ToolResultLike): Comm export declare function toHookInput(request: CommentCheckRequest, context: { sessionId: string; cwd: string; + transcriptPath?: string; }): CommentCheckerHookInput; export declare function isToolFailureOutput(text: string): boolean; export declare function parseApplyPatchRequests(patch: string, sourceToolName?: string): CommentCheckRequest[]; diff --git a/dist/core.d.ts.map b/dist/core.d.ts.map index 4a14645..6390c4f 100644 --- a/dist/core.d.ts.map +++ b/dist/core.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,UAAU,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAkBF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAOxF;AAED,wBAAgB,WAAW,CAC1B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ,GACC,uBAAuB,CASzB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQzD;AA6ED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,SAAgB,GAAG,mBAAmB,EAAE,CA0E5G;AA+BD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"} \ No newline at end of file +{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,UAAU,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAkBF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAUxF;AAED,wBAAgB,WAAW,CAC1B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GACC,uBAAuB,CASzB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQzD;AAiID,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,SAAgB,GAAG,mBAAmB,EAAE,CA0E5G;AA+CD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"} \ No newline at end of file diff --git a/dist/core.js b/dist/core.js index c333de8..8a05f62 100644 --- a/dist/core.js +++ b/dist/core.js @@ -4,6 +4,12 @@ export function extractCommentCheckRequests(event) { if (isToolFailureOutput(getContentText(event.content))) return []; const toolName = event.toolName.toLowerCase(); + if (toolName === "write") + return extractWriteRequest(event); + if (toolName === "edit") + return extractEditRequest(event); + if (toolName === "multiedit" || toolName === "multi_edit") + return extractMultiEditRequest(event); if (toolName === "apply_patch") return extractApplyPatchRequests(event); return []; @@ -12,7 +18,7 @@ export function toHookInput(request, context) { return { session_id: context.sessionId, tool_name: request.toolName, - transcript_path: "", + transcript_path: context.transcriptPath ?? "", cwd: context.cwd, hook_event_name: "PostToolUse", tool_input: request.toolInput, @@ -25,6 +31,60 @@ export function isToolFailureOutput(text) { lower.includes("failed to") || lower.includes("could not")); } +function extractWriteRequest(event) { + const filePath = getString(event.input, ["filePath", "file_path", "path"]); + const content = getString(event.input, ["content"]); + if (!filePath || content === undefined) + return []; + return [ + { + sourceToolName: event.toolName, + toolName: "Write", + filePath, + toolInput: { + file_path: filePath, + content, + }, + }, + ]; +} +function extractEditRequest(event) { + const filePath = getString(event.input, ["filePath", "file_path", "path"]); + const oldString = getString(event.input, ["oldString", "old_string"]); + const newString = getString(event.input, ["newString", "new_string"]); + if (!filePath || (oldString === undefined && newString === undefined)) + return []; + const toolInput = { file_path: filePath }; + if (oldString !== undefined) + toolInput.old_string = oldString; + if (newString !== undefined) + toolInput.new_string = newString; + return [ + { + sourceToolName: event.toolName, + toolName: "Edit", + filePath, + toolInput, + }, + ]; +} +function extractMultiEditRequest(event) { + const filePath = getString(event.input, ["filePath", "file_path", "path"]); + const edits = getEdits(event.input.edits); + if (!filePath || edits.length === 0) + return []; + return [ + { + sourceToolName: event.toolName, + toolName: "MultiEdit", + filePath, + toolInput: { + file_path: filePath, + edits, + }, + }, + ]; +} function extractApplyPatchRequests(event) { const metadataRequests = extractApplyPatchMetadataRequests(event.details, event.toolName); if (metadataRequests.length > 0) @@ -192,6 +252,24 @@ function makeAccumulator(operation, filePath) { newLines: [], }; } +function getEdits(value) { + if (!Array.isArray(value)) + return []; + const edits = []; + for (const item of value) { + if (!isRecord(item)) + continue; + const oldString = getString(item, ["oldString", "old_string"]); + const newString = getString(item, ["newString", "new_string"]); + if (oldString === undefined || newString === undefined) + continue; + edits.push({ + old_string: oldString, + new_string: newString, + }); + } + return edits; +} function getContentText(content) { if (!content) return ""; diff --git a/dist/core.js.map b/dist/core.js.map index a9ded29..06d2b89 100644 --- a/dist/core.js.map +++ b/dist/core.js.map @@ -1 +1 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/hooks/hooks.json b/hooks/hooks.json index c10e803..3be651f 100644 --- a/hooks/hooks.json +++ b/hooks/hooks.json @@ -2,7 +2,7 @@ "hooks": { "PostToolUse": [ { - "matcher": "^apply_patch$", + "matcher": "^(apply_patch|write|Write|edit|Edit|multi_edit|multiedit|MultiEdit)$", "hooks": [ { "type": "command", diff --git a/package.json b/package.json index de6e7a3..8e5dc6b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@code-yeongyu/codex-comment-checker", "version": "0.1.1", - "description": "Codex plugin that runs comment-checker after apply_patch edits.", + "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.", "type": "module", "license": "MIT", "homepage": "https://github.com/code-yeongyu/codex-comment-checker", diff --git a/skills/comment-checker/SKILL.md b/skills/comment-checker/SKILL.md index 5f9d6ff..7ce7710 100644 --- a/skills/comment-checker/SKILL.md +++ b/skills/comment-checker/SKILL.md @@ -1,16 +1,16 @@ --- name: comment-checker -description: Use when Codex needs to understand or respond to automatic comment-checker feedback emitted after an apply_patch edit. +description: Use when Codex needs to understand or respond to automatic comment-checker feedback emitted after an edit-like PostToolUse hook. --- # Codex Comment Checker -The plugin registers a `PostToolUse` hook for successful `apply_patch` calls. +The plugin registers a `PostToolUse` hook for successful `apply_patch`, `write`, `edit`, `multi_edit`, and `multiedit` calls. When comment-checker reports a warning after a patch, Codex receives blocking feedback and should fix or explain the flagged comment before moving on. ## Scope - No MCP tool is exposed. -- Non-`apply_patch` editing tools are ignored by this plugin. +- Non-edit tools are ignored by this plugin. - Missing checker binaries emit no hook output so normal Codex work can continue. diff --git a/src/codex-hook.ts b/src/codex-hook.ts index 8ab4ce7..2ed2482 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -43,7 +43,13 @@ export async function runCommentCheckerPostToolUse( const warnings: Array<{ filePath: string; message: string }> = []; for (const request of requests) { - const result = await runner(toHookInput(request, { sessionId: input.session_id, cwd: input.cwd })); + const result = await runner( + toHookInput(request, { + sessionId: input.session_id, + cwd: input.cwd, + transcriptPath: input.transcript_path ?? undefined, + }), + ); if (result.status === "missing" || result.status === "pass") continue; if (result.status === "error") continue; const message = result.message.trim(); diff --git a/src/core.ts b/src/core.ts index 3f77c69..374d616 100644 --- a/src/core.ts +++ b/src/core.ts @@ -9,13 +9,19 @@ export type ImageContent = { mimeType: string; }; -export type CheckerToolName = "Write" | "Edit"; +export type CheckerToolName = "Write" | "Edit" | "MultiEdit"; + +export type CheckerEdit = { + old_string: string; + new_string: string; +}; export type CheckerToolInput = { file_path: string; content?: string; old_string?: string; new_string?: string; + edits?: CheckerEdit[]; }; export type CommentCheckRequest = { @@ -65,6 +71,9 @@ export function extractCommentCheckRequests(event: ToolResultLike): CommentCheck if (isToolFailureOutput(getContentText(event.content))) return []; const toolName = event.toolName.toLowerCase(); + if (toolName === "write") return extractWriteRequest(event); + if (toolName === "edit") return extractEditRequest(event); + if (toolName === "multiedit" || toolName === "multi_edit") return extractMultiEditRequest(event); if (toolName === "apply_patch") return extractApplyPatchRequests(event); return []; } @@ -74,12 +83,13 @@ export function toHookInput( context: { sessionId: string; cwd: string; + transcriptPath?: string; }, ): CommentCheckerHookInput { return { session_id: context.sessionId, tool_name: request.toolName, - transcript_path: "", + transcript_path: context.transcriptPath ?? "", cwd: context.cwd, hook_event_name: "PostToolUse", tool_input: request.toolInput, @@ -96,6 +106,58 @@ export function isToolFailureOutput(text: string): boolean { ); } +function extractWriteRequest(event: ToolResultLike): CommentCheckRequest[] { + const filePath = getString(event.input, ["filePath", "file_path", "path"]); + const content = getString(event.input, ["content"]); + if (!filePath || content === undefined) return []; + return [ + { + sourceToolName: event.toolName, + toolName: "Write", + filePath, + toolInput: { + file_path: filePath, + content, + }, + }, + ]; +} + +function extractEditRequest(event: ToolResultLike): CommentCheckRequest[] { + const filePath = getString(event.input, ["filePath", "file_path", "path"]); + const oldString = getString(event.input, ["oldString", "old_string"]); + const newString = getString(event.input, ["newString", "new_string"]); + if (!filePath || (oldString === undefined && newString === undefined)) return []; + const toolInput: CheckerToolInput = { file_path: filePath }; + if (oldString !== undefined) toolInput.old_string = oldString; + if (newString !== undefined) toolInput.new_string = newString; + return [ + { + sourceToolName: event.toolName, + toolName: "Edit", + filePath, + toolInput, + }, + ]; +} + +function extractMultiEditRequest(event: ToolResultLike): CommentCheckRequest[] { + const filePath = getString(event.input, ["filePath", "file_path", "path"]); + const edits = getEdits(event.input.edits); + if (!filePath || edits.length === 0) return []; + return [ + { + sourceToolName: event.toolName, + toolName: "MultiEdit", + filePath, + toolInput: { + file_path: filePath, + edits, + }, + }, + ]; +} + function extractApplyPatchRequests(event: ToolResultLike): CommentCheckRequest[] { const metadataRequests = extractApplyPatchMetadataRequests(event.details, event.toolName); if (metadataRequests.length > 0) return metadataRequests; @@ -256,6 +318,22 @@ function makeAccumulator(operation: ApplyPatchAccumulator["operation"], filePath }; } +function getEdits(value: unknown): CheckerEdit[] { + if (!Array.isArray(value)) return []; + const edits: CheckerEdit[] = []; + for (const item of value) { + if (!isRecord(item)) continue; + const oldString = getString(item, ["oldString", "old_string"]); + const newString = getString(item, ["newString", "new_string"]); + if (oldString === undefined || newString === undefined) continue; + edits.push({ + old_string: oldString, + new_string: newString, + }); + } + return edits; +} + function getContentText(content: ToolResultContent[] | undefined): string { if (!content) return ""; return content diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index 61f683b..d5196a2 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -54,13 +54,93 @@ describe("extractCodexCommentCheckRequests", () => { it("#given unsupported post tool event #when extracting #then returns no requests", () => { const requests = extractCodexCommentCheckRequests( postToolUseInput({ - tool_name: "Write", + tool_name: "read", tool_input: { file_path: "src/example.ts", content: "// hi\nconst value = 1;\n" }, }), ); expect(requests).toEqual([]); }); + + it("#given codex write payload #when extracting #then returns write request", () => { + const requests = extractCodexCommentCheckRequests( + postToolUseInput({ + tool_name: "write", + tool_input: { + file_path: "src/example.ts", + content: "// explains value\nconst value = 1;\n", + }, + }), + ); + + expect(requests).toEqual([ + { + sourceToolName: "write", + toolName: "Write", + filePath: "src/example.ts", + toolInput: { + file_path: "src/example.ts", + content: "// explains value\nconst value = 1;\n", + }, + }, + ]); + }); + + it("#given codex edit payload #when extracting #then returns edit request", () => { + const requests = extractCodexCommentCheckRequests( + postToolUseInput({ + tool_name: "edit", + tool_input: { + path: "src/example.ts", + oldString: "const value = 1;\n", + newString: "// explains value\nconst value = 2;\n", + }, + }), + ); + + expect(requests).toEqual([ + { + sourceToolName: "edit", + toolName: "Edit", + filePath: "src/example.ts", + toolInput: { + file_path: "src/example.ts", + old_string: "const value = 1;\n", + new_string: "// explains value\nconst value = 2;\n", + }, + }, + ]); + }); + + it("#given codex multi_edit payload #when extracting #then returns multiedit request", () => { + const requests = extractCodexCommentCheckRequests( + postToolUseInput({ + tool_name: "multi_edit", + tool_input: { + filePath: "src/example.ts", + edits: [ + { old_string: "const a = 1;\n", new_string: "// explains a\nconst a = 2;\n" }, + { oldString: "const b = 1;\n", newString: "// explains b\nconst b = 2;\n" }, + ], + }, + }), + ); + + expect(requests).toEqual([ + { + sourceToolName: "multi_edit", + toolName: "MultiEdit", + filePath: "src/example.ts", + toolInput: { + file_path: "src/example.ts", + edits: [ + { old_string: "const a = 1;\n", new_string: "// explains a\nconst a = 2;\n" }, + { old_string: "const b = 1;\n", new_string: "// explains b\nconst b = 2;\n" }, + ], + }, + }, + ]); + }); }); describe("runCommentCheckerPostToolUse", () => { @@ -88,4 +168,56 @@ describe("runCommentCheckerPostToolUse", () => { expect(output).toBe(""); }); + + it("#given transcript path #when hook runs #then forwards it to checker input", async () => { + let transcriptPath = ""; + + await runCommentCheckerPostToolUse( + postToolUseInput({ + transcript_path: "/tmp/codex-comment-checker-transcript.jsonl", + tool_name: "write", + tool_input: { + file_path: "src/example.ts", + content: "// explains value\nconst value = 1;\n", + }, + }), + { + run: async (input) => { + transcriptPath = input.transcript_path; + return { + status: "pass", + message: "", + }; + }, + }, + ); + + expect(transcriptPath).toBe("/tmp/codex-comment-checker-transcript.jsonl"); + }); + + it("#given null transcript path #when hook runs #then forwards empty string fallback", async () => { + let transcriptPath = "unset"; + + await runCommentCheckerPostToolUse( + postToolUseInput({ + transcript_path: null, + tool_name: "write", + tool_input: { + file_path: "src/example.ts", + content: "// explains value\nconst value = 1;\n", + }, + }), + { + run: async (input) => { + transcriptPath = input.transcript_path; + return { + status: "pass", + message: "", + }; + }, + }, + ); + + expect(transcriptPath).toBe(""); + }); }); From 6dd2b5ab0fd3f7a4ee4a01735a7ddd77e4461104 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 16 May 2026 19:34:57 +0900 Subject: [PATCH 2/9] chore(comment-checker): harden portable install Make the native checker optional, cap child process output, pin plugin metadata, and use Codex-managed plugin-root interpolation. Add package/resource regression tests and Windows CI coverage. Plan: ../plans/plugin-portability-hardening.md --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 7 +++++ README.md | 8 +++--- dist/runner.d.ts | 2 ++ dist/runner.d.ts.map | 2 +- dist/runner.js | 44 +++++++++++++++++++++++------ dist/runner.js.map | 2 +- hooks/hooks.json | 2 +- package-lock.json | 7 +++-- package.json | 3 +- src/runner.ts | 58 ++++++++++++++++++++++++++++++++------ test/package-smoke.test.ts | 33 ++++++++++++++++++++++ test/runner.test.ts | 23 +++++++++++++++ 13 files changed, 165 insertions(+), 28 deletions(-) create mode 100644 test/package-smoke.test.ts create mode 100644 test/runner.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 06ad24b..c5b9152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ - Restore `write`, `edit`, `multi_edit`, and `multiedit` PostToolUse coverage alongside `apply_patch`. - Forward Codex `transcript_path` into native comment-checker hook input when available. +- Add package smoke coverage for portable hook entrypoints. + +### Changed + +- Treat the native checker binary as an optional dependency for unsupported platforms. +- Cap child process stdout/stderr captured from the native checker. +- Run CI on Windows in addition to Ubuntu and macOS. ## [0.1.1] - 2026-05-15 diff --git a/README.md b/README.md index 153cfca..e03bbd3 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Codex plugin that runs [`@code-yeongyu/comment-checker`](https://github.com/code | `write`, `edit`, `multi_edit`, or `multiedit` succeeds | maps the Codex payload to the native checker hook input | | non-edit tool succeeds | ignored | | checker exits `2` | returns Codex `PostToolUse` blocking feedback so the model fixes or explains the warning | -| checker binary missing | emits no hook output | +| checker binary missing or unavailable on the current platform | emits no hook output | | checker exits unexpectedly | leaves hook output unchanged | Deletes are ignored because they cannot introduce new comments. @@ -28,7 +28,7 @@ The plugin ships: The hook command is: ```bash -node "$PLUGIN_ROOT/dist/cli.js" hook post-tool-use +node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use ``` No MCP server or `comment_check` tool is exposed. @@ -72,13 +72,13 @@ enabled = true ## Branch Rules and Releases - `main` is protected by `.github/branch-ruleset.json`. -- CI runs Node 20 and 22 on Ubuntu and macOS. +- CI runs Node 20 and 22 on Ubuntu, macOS, and Windows. - Releases are GitHub Releases tagged as `v`. - Publishing runs from the `publish` workflow after a GitHub Release is published. ## Privacy -This plugin runs locally. It sends hook input to the local `comment-checker` binary and does not call a network service by itself. +This plugin runs locally. It sends hook input to the optional local `comment-checker` binary when available and does not call a network service by itself. ## License diff --git a/dist/runner.d.ts b/dist/runner.d.ts index 056def2..80f832e 100644 --- a/dist/runner.d.ts +++ b/dist/runner.d.ts @@ -4,6 +4,7 @@ export type ProcessResult = { stdout: string; stderr: string; }; +export declare const MAX_PROCESS_OUTPUT_BYTES: number; export type ProcessExecutor = (command: string, args: string[], stdin: string) => Promise; export type RunCommentCheckerOptions = { binaryPath?: string; @@ -22,4 +23,5 @@ export type CommentCheckerRunResult = { export type CommentCheckerRunner = (input: CommentCheckerHookInput) => Promise; export declare function runCommentChecker(input: CommentCheckerHookInput, options?: RunCommentCheckerOptions): Promise; export declare function resolveCommentCheckerBinary(): string | undefined; +export declare function spawnProcess(command: string, args: string[], stdin: string, maxOutputBytes?: number): Promise; //# sourceMappingURL=runner.d.ts.map \ No newline at end of file diff --git a/dist/runner.d.ts.map b/dist/runner.d.ts.map index 0fc840d..bee38cf 100644 --- a/dist/runner.d.ts.map +++ b/dist/runner.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzG,MAAM,MAAM,wBAAwB,GAAG;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAExG,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA8ClC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAKhE"} \ No newline at end of file +{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzG,MAAM,MAAM,wBAAwB,GAAG;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAExG,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA8ClC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAKhE;AA0CD,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,MAAiC,GAC/C,OAAO,CAAC,aAAa,CAAC,CAkCxB"} \ No newline at end of file diff --git a/dist/runner.js b/dist/runner.js index 5ee7cc2..f3a8092 100644 --- a/dist/runner.js +++ b/dist/runner.js @@ -2,6 +2,7 @@ import { spawn } from "node:child_process"; import { existsSync } from "node:fs"; import { createRequire } from "node:module"; import { dirname, join } from "node:path"; +export const MAX_PROCESS_OUTPUT_BYTES = 64 * 1024; export async function runCommentChecker(input, options = {}) { const binaryPath = options.binaryPath ?? (options.resolveBinary ? options.resolveBinary() : resolveCommentCheckerBinary()); if (!binaryPath) { @@ -64,30 +65,57 @@ function resolvePackageBinary(binaryName) { return undefined; } } -function spawnProcess(command, args, stdin) { +function appendOutput(output, chunk, maxOutputBytes) { + if (output.truncated) + return; + const remainingBytes = maxOutputBytes - output.bytes; + const chunkBytes = Buffer.byteLength(chunk, "utf8"); + if (chunkBytes <= remainingBytes) { + output.text += chunk; + output.bytes += chunkBytes; + return; + } + if (remainingBytes > 0) { + output.text += Buffer.from(chunk, "utf8").subarray(0, remainingBytes).toString("utf8"); + output.bytes += remainingBytes; + } + output.truncated = true; +} +function formatOutput(output, streamName, maxOutputBytes) { + if (!output.truncated) + return output.text; + return `${output.text}\n[${streamName} truncated after ${maxOutputBytes} bytes]`; +} +export function spawnProcess(command, args, stdin, maxOutputBytes = MAX_PROCESS_OUTPUT_BYTES) { return new Promise((resolve) => { + const outputByteLimit = Number.isFinite(maxOutputBytes) && maxOutputBytes > 0 ? Math.floor(maxOutputBytes) : 0; const proc = spawn(command, args, { stdio: ["pipe", "pipe", "pipe"], }); - let stdout = ""; - let stderr = ""; + const stdout = { text: "", bytes: 0, truncated: false }; + const stderr = { text: "", bytes: 0, truncated: false }; proc.stdout.setEncoding("utf-8"); proc.stderr.setEncoding("utf-8"); proc.stdout.on("data", (chunk) => { - stdout += chunk; + appendOutput(stdout, chunk, outputByteLimit); }); proc.stderr.on("data", (chunk) => { - stderr += chunk; + appendOutput(stderr, chunk, outputByteLimit); }); proc.once("error", (error) => { + appendOutput(stderr, error.message, outputByteLimit); resolve({ exitCode: null, - stdout, - stderr: `${stderr}${error.message}`, + stdout: formatOutput(stdout, "stdout", outputByteLimit), + stderr: formatOutput(stderr, "stderr", outputByteLimit), }); }); proc.once("close", (exitCode) => { - resolve({ exitCode, stdout, stderr }); + resolve({ + exitCode, + stdout: formatOutput(stdout, "stdout", outputByteLimit), + stderr: formatOutput(stderr, "stderr", outputByteLimit), + }); }); proc.stdin.end(stdin); }); diff --git a/dist/runner.js.map b/dist/runner.js.map index abef75b..71127c2 100644 --- a/dist/runner.js.map +++ b/dist/runner.js.map @@ -1 +1 @@ -{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/hooks/hooks.json b/hooks/hooks.json index 3be651f..96fc964 100644 --- a/hooks/hooks.json +++ b/hooks/hooks.json @@ -6,7 +6,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": 30, "statusMessage": "checking comments" } diff --git a/package-lock.json b/package-lock.json index bea95fd..a8a307d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,6 @@ "name": "@code-yeongyu/codex-comment-checker", "version": "0.1.1", "license": "MIT", - "dependencies": { - "@code-yeongyu/comment-checker": "^0.7.0" - }, "bin": { "codex-comment-checker": "dist/cli.js" }, @@ -22,6 +19,9 @@ }, "engines": { "node": ">=20.0.0" + }, + "optionalDependencies": { + "@code-yeongyu/comment-checker": "^0.7.0" } }, "node_modules/@biomejs/biome": { @@ -209,6 +209,7 @@ ], "hasInstallScript": true, "license": "MIT", + "optional": true, "os": [ "darwin", "linux", diff --git a/package.json b/package.json index 8e5dc6b..55c4b24 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.1", "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.", "type": "module", + "packageManager": "npm@11.12.1", "license": "MIT", "homepage": "https://github.com/code-yeongyu/codex-comment-checker", "repository": { @@ -41,7 +42,7 @@ "lint:fix": "biome check --write .", "check": "tsc --noEmit && biome check . && npm run build" }, - "dependencies": { + "optionalDependencies": { "@code-yeongyu/comment-checker": "^0.7.0" }, "devDependencies": { diff --git a/src/runner.ts b/src/runner.ts index e28c31f..f4c64a3 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -11,6 +11,8 @@ export type ProcessResult = { stderr: string; }; +export const MAX_PROCESS_OUTPUT_BYTES = 64 * 1024; + export type ProcessExecutor = (command: string, args: string[], stdin: string) => Promise; export type RunCommentCheckerOptions = { @@ -100,31 +102,71 @@ function resolvePackageBinary(binaryName: string): string | undefined { } } -function spawnProcess(command: string, args: string[], stdin: string): Promise { +interface OutputAccumulator { + text: string; + bytes: number; + truncated: boolean; +} + +function appendOutput(output: OutputAccumulator, chunk: string, maxOutputBytes: number): void { + if (output.truncated) return; + + const remainingBytes = maxOutputBytes - output.bytes; + const chunkBytes = Buffer.byteLength(chunk, "utf8"); + if (chunkBytes <= remainingBytes) { + output.text += chunk; + output.bytes += chunkBytes; + return; + } + + if (remainingBytes > 0) { + output.text += Buffer.from(chunk, "utf8").subarray(0, remainingBytes).toString("utf8"); + output.bytes += remainingBytes; + } + output.truncated = true; +} + +function formatOutput(output: OutputAccumulator, streamName: "stdout" | "stderr", maxOutputBytes: number): string { + if (!output.truncated) return output.text; + return `${output.text}\n[${streamName} truncated after ${maxOutputBytes} bytes]`; +} + +export function spawnProcess( + command: string, + args: string[], + stdin: string, + maxOutputBytes: number = MAX_PROCESS_OUTPUT_BYTES, +): Promise { return new Promise((resolve) => { + const outputByteLimit = Number.isFinite(maxOutputBytes) && maxOutputBytes > 0 ? Math.floor(maxOutputBytes) : 0; const proc = spawn(command, args, { stdio: ["pipe", "pipe", "pipe"], }); - let stdout = ""; - let stderr = ""; + const stdout: OutputAccumulator = { text: "", bytes: 0, truncated: false }; + const stderr: OutputAccumulator = { text: "", bytes: 0, truncated: false }; proc.stdout.setEncoding("utf-8"); proc.stderr.setEncoding("utf-8"); proc.stdout.on("data", (chunk: string) => { - stdout += chunk; + appendOutput(stdout, chunk, outputByteLimit); }); proc.stderr.on("data", (chunk: string) => { - stderr += chunk; + appendOutput(stderr, chunk, outputByteLimit); }); proc.once("error", (error) => { + appendOutput(stderr, error.message, outputByteLimit); resolve({ exitCode: null, - stdout, - stderr: `${stderr}${error.message}`, + stdout: formatOutput(stdout, "stdout", outputByteLimit), + stderr: formatOutput(stderr, "stderr", outputByteLimit), }); }); proc.once("close", (exitCode) => { - resolve({ exitCode, stdout, stderr }); + resolve({ + exitCode, + stdout: formatOutput(stdout, "stdout", outputByteLimit), + stderr: formatOutput(stderr, "stderr", outputByteLimit), + }); }); proc.stdin.end(stdin); }); diff --git a/test/package-smoke.test.ts b/test/package-smoke.test.ts new file mode 100644 index 0000000..c6855f7 --- /dev/null +++ b/test/package-smoke.test.ts @@ -0,0 +1,33 @@ +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 command uses 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 dependencies = packageJson.dependencies as Record | undefined; + const hookConfig = hooksJson.hooks as Record }>>; + const command = hookConfig.PostToolUse?.[0]?.hooks[0]?.command; + const pluginRoot = ["$", "{PLUGIN_ROOT}"].join(""); + + // then + expect(packageJson.type).toBe("module"); + expect(packageJson.packageManager).toBe("npm@11.12.1"); + expect(dependencies ?? {}).not.toHaveProperty("@code-yeongyu/comment-checker"); + expect(packageJson.optionalDependencies).toHaveProperty("@code-yeongyu/comment-checker"); + expect(bin["codex-comment-checker"]).toBe("./dist/cli.js"); + expect(pluginJson.hooks).toBe("./hooks/hooks.json"); + expect(cliSource.startsWith("#!/usr/bin/env node")).toBe(true); + expect(command).toBe(`node "${pluginRoot}/dist/cli.js" hook post-tool-use`); + }); +}); diff --git a/test/runner.test.ts b/test/runner.test.ts new file mode 100644 index 0000000..1a163c9 --- /dev/null +++ b/test/runner.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from "vitest"; + +import { MAX_PROCESS_OUTPUT_BYTES, spawnProcess } from "../src/runner.js"; + +describe("spawnProcess", () => { + it("#given noisy checker process #when output exceeds cap #then stderr is bounded", async () => { + // given + const maxOutputBytes = 16; + + // when + const result = await spawnProcess( + process.execPath, + ["-e", "process.stderr.write('x'.repeat(40)); process.exit(2);"], + "", + maxOutputBytes, + ); + + // then + expect(MAX_PROCESS_OUTPUT_BYTES).toBeGreaterThan(maxOutputBytes); + expect(result.exitCode).toBe(2); + expect(result.stderr).toBe(`${"x".repeat(maxOutputBytes)}\n[stderr truncated after 16 bytes]`); + }); +}); From 22ae5ef7d9bb53e99e75122edcc77aa41c41c0a5 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 00:07:26 +0900 Subject: [PATCH 3/9] chore(comment-checker): 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 on every TypeScript file. 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 483974c8e299528fdabcfed6be273dbc542943f5 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 00:51:50 +0900 Subject: [PATCH 4/9] bump comment-checker to 0.7.1 --- package-lock.json | 19 +++++-------------- package.json | 2 +- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8a307d..fe0b73b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "node": ">=20.0.0" }, "optionalDependencies": { - "@code-yeongyu/comment-checker": "^0.7.0" + "@code-yeongyu/comment-checker": "^0.7.1" } }, "node_modules/@biomejs/biome": { @@ -200,23 +200,14 @@ } }, "node_modules/@code-yeongyu/comment-checker": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@code-yeongyu/comment-checker/-/comment-checker-0.7.0.tgz", - "integrity": "sha512-AOic1jPHY3CpNraOuO87YZHO3uRzm9eLd0wyYYN89/76Ugk2TfdUYJ6El/Oe8fzOnHKiOF0IfBeWRo0IUjrHHg==", - "cpu": [ - "x64", - "arm64" - ], + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@code-yeongyu/comment-checker/-/comment-checker-0.7.1.tgz", + "integrity": "sha512-xIYG3IIjyjnMNyMBJlUDmk9uaYfw+8tPoatnnauOKqNn8jbtjHPfA0fE1Yh55jPD6to+2Iinz6RmTn0LjWxbPg==", "hasInstallScript": true, "license": "MIT", "optional": true, - "os": [ - "darwin", - "linux", - "win32" - ], "bin": { - "comment-checker": "bin/comment-checker" + "comment-checker": "cli.js" }, "engines": { "node": ">=18" diff --git a/package.json b/package.json index 55c4b24..f81242c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "check": "tsc --noEmit && biome check . && npm run build" }, "optionalDependencies": { - "@code-yeongyu/comment-checker": "^0.7.0" + "@code-yeongyu/comment-checker": "^0.7.1" }, "devDependencies": { "@biomejs/biome": "2.4.15", From d39f53274b2b39a162209c997637b8e9a1444278 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 16:29:22 +0900 Subject: [PATCH 5/9] fix(hooks): ignore malformed post-tool-use input Treat malformed or non-object hook stdin as irrelevant input so Codex does not surface a PostToolUse hook failure for stray source text. Plan: /Users/yeongyu/local-workspaces/codex-plugins/plans/posttooluse-hook-hardening.md --- dist/codex-hook.d.ts | 1 + dist/codex-hook.d.ts.map | 2 +- dist/codex-hook.js | 14 +++++++-- dist/codex-hook.js.map | 2 +- src/codex-hook.ts | 14 +++++++-- test/codex-hook.test.ts | 66 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 6 deletions(-) diff --git a/dist/codex-hook.d.ts b/dist/codex-hook.d.ts index d1c43fe..ad6902e 100644 --- a/dist/codex-hook.d.ts +++ b/dist/codex-hook.d.ts @@ -19,4 +19,5 @@ export type CodexHookOptions = { export declare function extractCodexCommentCheckRequests(input: CodexPostToolUseInput): CommentCheckRequest[]; export declare function runCommentCheckerPostToolUse(input: CodexPostToolUseInput, options?: CodexHookOptions): Promise; export declare function runCodexHookCli(): Promise; +export declare function parseCodexPostToolUseInput(input: string): CodexPostToolUseInput | undefined; //# 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 9641425..211afe2 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":"AAEA,OAAO,EACN,KAAK,mBAAmB,EAMxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,oBAAoB,EAAqB,MAAM,aAAa,CAAC;AAE3E,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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,CAAC,EAAE,oBAAoB,CAAC;CAC3B,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAEpG;AAED,wBAAsB,4BAA4B,CACjD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD"} \ No newline at end of file +{"version":3,"file":"codex-hook.d.ts","sourceRoot":"","sources":["../src/codex-hook.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,mBAAmB,EAMxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,oBAAoB,EAAqB,MAAM,aAAa,CAAC;AAE3E,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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,CAAC,EAAE,oBAAoB,CAAC;CAC3B,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAEpG;AAED,wBAAsB,4BAA4B,CACjD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAQ3F"} \ No newline at end of file diff --git a/dist/codex-hook.js b/dist/codex-hook.js index ef6ae65..9448c2f 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -36,8 +36,8 @@ export async function runCodexHookCli() { const input = await readStdin(); if (input.trim().length === 0) return; - const parsed = JSON.parse(input); - if (!isCodexPostToolUseInput(parsed)) + const parsed = parseCodexPostToolUseInput(input); + if (!parsed) return; const output = await runCommentCheckerPostToolUse(parsed); if (output.length > 0) { @@ -45,6 +45,16 @@ export async function runCodexHookCli() { processStdout.write("\n"); } } +export function parseCodexPostToolUseInput(input) { + let parsed; + try { + parsed = JSON.parse(input); + } + catch { + return undefined; + } + return isCodexPostToolUseInput(parsed) ? parsed : undefined; +} function toToolResultLike(input) { return { toolName: input.tool_name, diff --git a/dist/codex-hook.js.map b/dist/codex-hook.js.map index 162cbaa..e44ad3f 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":"AAAA,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAEN,2BAA2B,EAC3B,QAAQ,EAGR,WAAW,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAA6B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoB3E,MAAM,UAAU,gCAAgC,CAAC,KAA4B;IAC5E,OAAO,2BAA2B,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CACjD,KAA4B,EAC5B,UAA4B,EAAE;IAE9B,MAAM,QAAQ,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,iBAAiB,CAAC;IAChD,MAAM,QAAQ,GAAiD,EAAE,CAAC;IAElE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAC1B,WAAW,CAAC,OAAO,EAAE;YACpB,SAAS,EAAE,KAAK,CAAC,UAAU;YAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,cAAc,EAAE,KAAK,CAAC,eAAe,IAAI,SAAS;SAClD,CAAC,CACF,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QACtE,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,IAAI,CAAC,SAAS,CAAC;QACrB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;KAChC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACtC,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACvD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA4B;IACrD,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,SAAS;QACzB,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC;QAC5D,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,aAAa,CAAC;QACnD,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC;QAC7C,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,SAAkC;IAC/E,IAAI,QAAQ,KAAK,aAAa,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzE,OAAO;YACN,GAAG,SAAS;YACZ,KAAK,EAAE,SAAS,CAAC,OAAO;YACxB,KAAK,EAAE,SAAS,CAAC,OAAO;SACxB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAqB;IACnD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,YAAqB;IAC7C,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,KAAK,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,QAAsD;IAC7E,OAAO,QAAQ;SACb,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,mCAAmC,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5F,IAAI,CAAC,MAAM,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC9C,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,eAAe,KAAK,aAAa;QACvC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;QACzC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CACrC,CAAC;AACH,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,OAAO,CAAC,CAAC;QAClC,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 diff --git a/src/codex-hook.ts b/src/codex-hook.ts index 2ed2482..3ae2520 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -69,8 +69,8 @@ export async function runCommentCheckerPostToolUse( export async function runCodexHookCli(): Promise { const input = await readStdin(); if (input.trim().length === 0) return; - const parsed = JSON.parse(input); - if (!isCodexPostToolUseInput(parsed)) return; + const parsed = parseCodexPostToolUseInput(input); + if (!parsed) return; const output = await runCommentCheckerPostToolUse(parsed); if (output.length > 0) { processStdout.write(output); @@ -78,6 +78,16 @@ export async function runCodexHookCli(): Promise { } } +export function parseCodexPostToolUseInput(input: string): CodexPostToolUseInput | undefined { + let parsed: unknown; + try { + parsed = JSON.parse(input); + } catch { + return undefined; + } + return isCodexPostToolUseInput(parsed) ? parsed : undefined; +} + function toToolResultLike(input: CodexPostToolUseInput): ToolResultLike { return { toolName: input.tool_name, diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index d5196a2..58a4d5a 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -1,3 +1,4 @@ +import { spawn } from "node:child_process"; import { describe, expect, it } from "vitest"; import { @@ -6,6 +7,39 @@ import { runCommentCheckerPostToolUse, } from "../src/codex-hook.ts"; +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); + }); +} + function postToolUseInput(overrides: Partial = {}): CodexPostToolUseInput { return { session_id: "thread-1", @@ -221,3 +255,35 @@ describe("runCommentCheckerPostToolUse", () => { expect(transcriptPath).toBe(""); }); }); + +describe("runCodexHookCli", () => { + 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 = '"break;"\n'; + + // when + const result = await runHookCli(input); + + // then + expect(result).toEqual({ + exitCode: 0, + stdout: "", + stderr: "", + }); + }); +}); From 8f445196ea40c701b4273ce591c60fe5ebfe9045 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 16:29:28 +0900 Subject: [PATCH 6/9] fix(runner): resolve bundled checker binary Use the optional checker package API before the legacy bin-path fallback so the vendored 0.7.1 binary is discovered in local plugin installs. Plan: /Users/yeongyu/local-workspaces/codex-plugins/plans/posttooluse-hook-hardening.md --- dist/runner.d.ts.map | 2 +- dist/runner.js | 22 +++++++++++++++++++++ dist/runner.js.map | 2 +- src/runner.ts | 22 +++++++++++++++++++++ test/runner.test.ts | 46 +++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 91 insertions(+), 3 deletions(-) diff --git a/dist/runner.d.ts.map b/dist/runner.d.ts.map index bee38cf..773ff75 100644 --- a/dist/runner.d.ts.map +++ b/dist/runner.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzG,MAAM,MAAM,wBAAwB,GAAG;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAExG,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA8ClC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAKhE;AA0CD,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,MAAiC,GAC/C,OAAO,CAAC,aAAa,CAAC,CAkCxB"} \ No newline at end of file +{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzG,MAAM,MAAM,wBAAwB,GAAG;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAExG,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA8ClC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAOhE;AA8DD,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,MAAiC,GAC/C,OAAO,CAAC,aAAa,CAAC,CAkCxB"} \ No newline at end of file diff --git a/dist/runner.js b/dist/runner.js index f3a8092..16d4687 100644 --- a/dist/runner.js +++ b/dist/runner.js @@ -49,11 +49,27 @@ export async function runCommentChecker(input, options = {}) { } export function resolveCommentCheckerBinary() { const binaryName = process.platform === "win32" ? "comment-checker.exe" : "comment-checker"; + const fromPackageApi = resolvePackageApiBinary(); + if (fromPackageApi) + return fromPackageApi; const fromPackage = resolvePackageBinary(binaryName); if (fromPackage) return fromPackage; return undefined; } +function resolvePackageApiBinary() { + try { + const require = createRequire(import.meta.url); + const packageExports = require("@code-yeongyu/comment-checker"); + if (!isCommentCheckerPackage(packageExports)) + return undefined; + const binaryPath = packageExports.getBinaryPath(); + return existsSync(binaryPath) ? binaryPath : undefined; + } + catch { + return undefined; + } +} function resolvePackageBinary(binaryName) { try { const require = createRequire(import.meta.url); @@ -65,6 +81,12 @@ function resolvePackageBinary(binaryName) { return undefined; } } +function isCommentCheckerPackage(value) { + return isRecord(value) && typeof value.getBinaryPath === "function"; +} +function isRecord(value) { + return typeof value === "object" && value !== null; +} function appendOutput(output, chunk, maxOutputBytes) { if (output.truncated) return; diff --git a/dist/runner.js.map b/dist/runner.js.map index 71127c2..2b445e5 100644 --- a/dist/runner.js.map +++ b/dist/runner.js.map @@ -1 +1 @@ -{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/runner.ts b/src/runner.ts index f4c64a3..e1658cb 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -86,11 +86,25 @@ export async function runCommentChecker( export function resolveCommentCheckerBinary(): string | undefined { const binaryName = process.platform === "win32" ? "comment-checker.exe" : "comment-checker"; + const fromPackageApi = resolvePackageApiBinary(); + if (fromPackageApi) return fromPackageApi; const fromPackage = resolvePackageBinary(binaryName); if (fromPackage) return fromPackage; return undefined; } +function resolvePackageApiBinary(): string | undefined { + try { + const require = createRequire(import.meta.url); + const packageExports: unknown = require("@code-yeongyu/comment-checker"); + if (!isCommentCheckerPackage(packageExports)) return undefined; + const binaryPath = packageExports.getBinaryPath(); + return existsSync(binaryPath) ? binaryPath : undefined; + } catch { + return undefined; + } +} + function resolvePackageBinary(binaryName: string): string | undefined { try { const require = createRequire(import.meta.url); @@ -102,6 +116,14 @@ function resolvePackageBinary(binaryName: string): string | undefined { } } +function isCommentCheckerPackage(value: unknown): value is { getBinaryPath: () => string } { + return isRecord(value) && typeof value.getBinaryPath === "function"; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null; +} + interface OutputAccumulator { text: string; bytes: number; diff --git a/test/runner.test.ts b/test/runner.test.ts index 1a163c9..6abc2af 100644 --- a/test/runner.test.ts +++ b/test/runner.test.ts @@ -1,6 +1,12 @@ +import { existsSync } from "node:fs"; import { describe, expect, it } from "vitest"; -import { MAX_PROCESS_OUTPUT_BYTES, spawnProcess } from "../src/runner.js"; +import { + MAX_PROCESS_OUTPUT_BYTES, + resolveCommentCheckerBinary, + runCommentChecker, + spawnProcess, +} from "../src/runner.js"; describe("spawnProcess", () => { it("#given noisy checker process #when output exceeds cap #then stderr is bounded", async () => { @@ -21,3 +27,41 @@ describe("spawnProcess", () => { expect(result.stderr).toBe(`${"x".repeat(maxOutputBytes)}\n[stderr truncated after 16 bytes]`); }); }); + +describe("resolveCommentCheckerBinary", () => { + it("#given installed checker package #when resolving binary #then returns bundled vendor binary", () => { + // given / when + const binaryPath = resolveCommentCheckerBinary(); + + // then + expect(binaryPath).toBeDefined(); + expect(binaryPath ?? "").toContain("vendor"); + expect(binaryPath ?? "").toContain("comment-checker"); + expect(existsSync(binaryPath ?? "")).toBe(true); + }); +}); + +describe("runCommentChecker", () => { + it("#given missing checker binary #when runner starts #then returns missing result", async () => { + // given / when + const result = await runCommentChecker( + { + session_id: "session-1", + tool_name: "Write", + transcript_path: "", + cwd: "/repo", + hook_event_name: "PostToolUse", + tool_input: { + file_path: "src/example.ts", + content: "const value = 1;\n", + }, + }, + { + resolveBinary: () => undefined, + }, + ); + + // then + expect(result.status).toBe("missing"); + }); +}); From dee81e068eb7d90fcc724ba0fa4e456cc648b5e3 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 13:12:36 +0900 Subject: [PATCH 7/9] 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 58a4d5a..81c5877 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -1,4 +1,5 @@ import { spawn } from "node:child_process"; +import { fileURLToPath } from "node:url"; import { describe, expect, it } from "vitest"; import { @@ -13,15 +14,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 3f1348f175983aebd3b1089b79a0ab1905cc885a Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 13:42:36 +0900 Subject: [PATCH 8/9] fix(hooks): reject malformed codex edit input --- dist/codex-hook.js | 1 + dist/codex-hook.js.map | 2 +- dist/core.js | 8 +++----- dist/core.js.map | 2 +- src/codex-hook.ts | 1 + src/core.ts | 6 +++--- test/codex-hook.test.ts | 29 +++++++++++++++++++++++++++++ test/runner.test.ts | 3 +-- 8 files changed, 40 insertions(+), 12 deletions(-) diff --git a/dist/codex-hook.js b/dist/codex-hook.js index 9448c2f..5307ad3 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -96,6 +96,7 @@ function isCodexPostToolUseInput(value) { value.hook_event_name === "PostToolUse" && typeof value.session_id === "string" && typeof value.turn_id === "string" && + (typeof value.transcript_path === "string" || value.transcript_path === null) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && diff --git a/dist/codex-hook.js.map b/dist/codex-hook.js.map index e44ad3f..b758bd9 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/core.js b/dist/core.js index 8a05f62..a14fa62 100644 --- a/dist/core.js +++ b/dist/core.js @@ -52,13 +52,11 @@ function extractEditRequest(event) { const filePath = getString(event.input, ["filePath", "file_path", "path"]); const oldString = getString(event.input, ["oldString", "old_string"]); const newString = getString(event.input, ["newString", "new_string"]); - if (!filePath || (oldString === undefined && newString === undefined)) + if (!filePath || oldString === undefined || newString === undefined) return []; const toolInput = { file_path: filePath }; - if (oldString !== undefined) - toolInput.old_string = oldString; - if (newString !== undefined) - toolInput.new_string = newString; + toolInput.old_string = oldString; + toolInput.new_string = newString; return [ { sourceToolName: event.toolName, diff --git a/dist/core.js.map b/dist/core.js.map index 06d2b89..260994f 100644 --- a/dist/core.js.map +++ b/dist/core.js.map @@ -1 +1 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.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 3ae2520..ba44827 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -135,6 +135,7 @@ function isCodexPostToolUseInput(value: unknown): value is CodexPostToolUseInput value.hook_event_name === "PostToolUse" && typeof value.session_id === "string" && typeof value.turn_id === "string" && + (typeof value.transcript_path === "string" || value.transcript_path === null) && typeof value.cwd === "string" && typeof value.model === "string" && typeof value.permission_mode === "string" && diff --git a/src/core.ts b/src/core.ts index 374d616..2a9c5e1 100644 --- a/src/core.ts +++ b/src/core.ts @@ -127,10 +127,10 @@ function extractEditRequest(event: ToolResultLike): CommentCheckRequest[] { const filePath = getString(event.input, ["filePath", "file_path", "path"]); const oldString = getString(event.input, ["oldString", "old_string"]); const newString = getString(event.input, ["newString", "new_string"]); - if (!filePath || (oldString === undefined && newString === undefined)) return []; + if (!filePath || oldString === undefined || newString === undefined) return []; const toolInput: CheckerToolInput = { file_path: filePath }; - if (oldString !== undefined) toolInput.old_string = oldString; - if (newString !== undefined) toolInput.new_string = newString; + toolInput.old_string = oldString; + toolInput.new_string = newString; return [ { sourceToolName: event.toolName, diff --git a/test/codex-hook.test.ts b/test/codex-hook.test.ts index 81c5877..7d12f7b 100644 --- a/test/codex-hook.test.ts +++ b/test/codex-hook.test.ts @@ -145,6 +145,20 @@ describe("extractCodexCommentCheckRequests", () => { ]); }); + it("#given one-sided codex edit payload #when extracting #then returns no requests", () => { + const requests = extractCodexCommentCheckRequests( + postToolUseInput({ + tool_name: "edit", + tool_input: { + path: "src/example.ts", + oldString: "const value = 1;\n", + }, + }), + ); + + expect(requests).toEqual([]); + }); + it("#given codex multi_edit payload #when extracting #then returns multiedit request", () => { const requests = extractCodexCommentCheckRequests( postToolUseInput({ @@ -285,4 +299,19 @@ describe("runCodexHookCli", () => { stderr: "", }); }); + + it("#given non-string transcript path #when hook CLI runs #then it no-ops without stderr", async () => { + // given + const input = `${JSON.stringify({ ...postToolUseInput(), transcript_path: 42 })}\n`; + + // when + const result = await runHookCli(input); + + // then + expect(result).toEqual({ + exitCode: 0, + stdout: "", + stderr: "", + }); + }); }); diff --git a/test/runner.test.ts b/test/runner.test.ts index 6abc2af..39a375b 100644 --- a/test/runner.test.ts +++ b/test/runner.test.ts @@ -29,13 +29,12 @@ describe("spawnProcess", () => { }); describe("resolveCommentCheckerBinary", () => { - it("#given installed checker package #when resolving binary #then returns bundled vendor binary", () => { + it("#given installed checker package #when resolving binary #then returns existing checker binary", () => { // given / when const binaryPath = resolveCommentCheckerBinary(); // then expect(binaryPath).toBeDefined(); - expect(binaryPath ?? "").toContain("vendor"); expect(binaryPath ?? "").toContain("comment-checker"); expect(existsSync(binaryPath ?? "")).toBe(true); }); From 0b47e64f742bfef2b6152b683deac5a936ed4cac Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 18 May 2026 16:15:45 +0900 Subject: [PATCH 9/9] refactor(types): harden comment checker plugin --- biome.json | 25 ++++++++-- dist/cli.d.ts | 1 - dist/cli.d.ts.map | 1 - dist/cli.js | 1 - dist/cli.js.map | 1 - dist/codex-hook.d.ts | 1 - dist/codex-hook.d.ts.map | 1 - dist/codex-hook.js | 40 ++++++++-------- dist/codex-hook.js.map | 1 - dist/core.d.ts | 1 - dist/core.d.ts.map | 1 - dist/core.js | 15 +++--- dist/core.js.map | 1 - dist/runner.d.ts | 1 - dist/runner.d.ts.map | 1 - dist/runner.js | 3 +- dist/runner.js.map | 1 - src/codex-hook.ts | 45 +++++++++-------- src/core.ts | 14 +++--- src/runner.ts | 2 +- test/package-smoke.test.ts | 98 +++++++++++++++++++++++++++++++++----- tsconfig.build.json | 2 - tsconfig.json | 3 ++ vitest.config.ts | 1 + 24 files changed, 173 insertions(+), 88 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/core.d.ts.map delete mode 100644 dist/core.js.map delete mode 100644 dist/runner.d.ts.map delete mode 100644 dist/runner.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 a85f583..6047731 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -8,4 +8,3 @@ else { process.stderr.write("Usage: codex-comment-checker hook post-tool-use\n"); process.exitCode = 2; } -//# 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 d53af4f..0000000 --- a/dist/cli.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEpD,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;IAC1D,MAAM,eAAe,EAAE,CAAC;AACzB,CAAC;KAAM,CAAC;IACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC1E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC"} \ No newline at end of file diff --git a/dist/codex-hook.d.ts b/dist/codex-hook.d.ts index ad6902e..79ec554 100644 --- a/dist/codex-hook.d.ts +++ b/dist/codex-hook.d.ts @@ -20,4 +20,3 @@ export declare function extractCodexCommentCheckRequests(input: CodexPostToolUse export declare function runCommentCheckerPostToolUse(input: CodexPostToolUseInput, options?: CodexHookOptions): Promise; export declare function runCodexHookCli(): Promise; export declare function parseCodexPostToolUseInput(input: string): CodexPostToolUseInput | undefined; -//# 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 211afe2..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":"AAEA,OAAO,EACN,KAAK,mBAAmB,EAMxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,oBAAoB,EAAqB,MAAM,aAAa,CAAC;AAE3E,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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,CAAC,EAAE,oBAAoB,CAAC;CAC3B,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAEpG;AAED,wBAAsB,4BAA4B,CACjD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAQ3F"} \ No newline at end of file diff --git a/dist/codex-hook.js b/dist/codex-hook.js index 5307ad3..c5e7973 100644 --- a/dist/codex-hook.js +++ b/dist/codex-hook.js @@ -11,11 +11,12 @@ export async function runCommentCheckerPostToolUse(input, options = {}) { const runner = options.run ?? runCommentChecker; const warnings = []; for (const request of requests) { - const result = await runner(toHookInput(request, { + const context = { sessionId: input.session_id, cwd: input.cwd, - transcriptPath: input.transcript_path ?? undefined, - })); + ...(input.transcript_path === null ? {} : { transcriptPath: input.transcript_path }), + }; + const result = await runner(toHookInput(request, context)); if (result.status === "missing" || result.status === "pass") continue; if (result.status === "error") @@ -65,11 +66,11 @@ function toToolResultLike(input) { }; } function normalizeToolInput(toolName, toolInput) { - if (toolName === "apply_patch" && typeof toolInput.command === "string") { + if (toolName === "apply_patch" && typeof toolInput["command"] === "string") { return { ...toolInput, - input: toolInput.command, - patch: toolInput.command, + input: toolInput["command"], + patch: toolInput["command"], }; } return toolInput; @@ -78,13 +79,13 @@ function normalizeToolResponse(toolResponse) { if (typeof toolResponse === "string") { return [{ type: "text", text: toolResponse }]; } - if (isRecord(toolResponse) && typeof toolResponse.text === "string") { - return [{ type: "text", text: toolResponse.text }]; + if (isRecord(toolResponse) && typeof toolResponse["text"] === "string") { + return [{ type: "text", text: toolResponse["text"] }]; } return []; } function isErrorResponse(toolResponse) { - return isRecord(toolResponse) && toolResponse.is_error === true; + return isRecord(toolResponse) && toolResponse["is_error"] === true; } function formatWarnings(warnings) { return warnings @@ -93,16 +94,16 @@ function formatWarnings(warnings) { } function isCodexPostToolUseInput(value) { return (isRecord(value) && - value.hook_event_name === "PostToolUse" && - typeof value.session_id === "string" && - typeof value.turn_id === "string" && - (typeof value.transcript_path === "string" || value.transcript_path === null) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.tool_name === "string" && - isRecord(value.tool_input) && - typeof value.tool_use_id === "string"); + value["hook_event_name"] === "PostToolUse" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + (typeof value["transcript_path"] === "string" || value["transcript_path"] === null) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["tool_name"] === "string" && + isRecord(value["tool_input"]) && + typeof value["tool_use_id"] === "string"); } function readStdin() { return new Promise((resolve, reject) => { @@ -117,4 +118,3 @@ function readStdin() { }); }); } -//# 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 b758bd9..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/core.d.ts b/dist/core.d.ts index 86291d7..de6b7c0 100644 --- a/dist/core.d.ts +++ b/dist/core.d.ts @@ -50,4 +50,3 @@ export declare function toHookInput(request: CommentCheckRequest, context: { export declare function isToolFailureOutput(text: string): boolean; export declare function parseApplyPatchRequests(patch: string, sourceToolName?: string): CommentCheckRequest[]; export declare function isRecord(value: unknown): value is Record; -//# sourceMappingURL=core.d.ts.map \ No newline at end of file diff --git a/dist/core.d.ts.map b/dist/core.d.ts.map deleted file mode 100644 index 6390c4f..0000000 --- a/dist/core.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,aAAa,CAAC;IAC/B,UAAU,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAkBF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAUxF;AAED,wBAAgB,WAAW,CAC1B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GACC,uBAAuB,CASzB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQzD;AAiID,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,SAAgB,GAAG,mBAAmB,EAAE,CA0E5G;AA+CD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"} \ No newline at end of file diff --git a/dist/core.js b/dist/core.js index a14fa62..8a7cdde 100644 --- a/dist/core.js +++ b/dist/core.js @@ -68,7 +68,7 @@ function extractEditRequest(event) { } function extractMultiEditRequest(event) { const filePath = getString(event.input, ["filePath", "file_path", "path"]); - const edits = getEdits(event.input.edits); + const edits = getEdits(event.input["edits"]); if (!filePath || edits.length === 0) return []; return [ @@ -129,13 +129,15 @@ function extractApplyPatchMetadataRequests(details, sourceToolName) { function getApplyPatchMetadataFiles(details) { if (!isRecord(details)) return []; - const direct = readApplyPatchMetadataFiles(details.files); + const direct = readApplyPatchMetadataFiles(details["files"]); if (direct.length > 0) return direct; - const result = isRecord(details.result) ? readApplyPatchMetadataFiles(details.result.files) : []; + const resultDetails = details["result"]; + const result = isRecord(resultDetails) ? readApplyPatchMetadataFiles(resultDetails["files"]) : []; if (result.length > 0) return result; - const metadata = isRecord(details.metadata) ? readApplyPatchMetadataFiles(details.metadata.files) : []; + const metadataDetails = details["metadata"]; + const metadata = isRecord(metadataDetails) ? readApplyPatchMetadataFiles(metadataDetails["files"]) : []; return metadata; } function readApplyPatchMetadataFiles(value) { @@ -154,10 +156,10 @@ function readApplyPatchMetadataFiles(value) { continue; files.push({ filePath, - movePath, before, after, - type, + ...(movePath === undefined ? {} : { movePath }), + ...(type === undefined ? {} : { type }), }); } return files; @@ -290,4 +292,3 @@ function joinPatchLines(lines) { export function isRecord(value) { return typeof value === "object" && value !== null; } -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/dist/core.js.map b/dist/core.js.map deleted file mode 100644 index 260994f..0000000 --- a/dist/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAoEA,MAAM,UAAU,2BAA2B,CAAC,KAAqB;IAChE,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAElE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACjG,IAAI,QAAQ,KAAK,aAAa;QAAE,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAC1B,OAA4B,EAC5B,OAIC;IAED,OAAO;QACN,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,eAAe,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;QAC7C,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe,EAAE,aAAa;QAC9B,UAAU,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,CACN,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC3B,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAqB;IACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClD,OAAO;QACN;YACC,cAAc,EAAE,KAAK,CAAC,QAAQ;YAC9B,QAAQ,EAAE,OAAO;YACjB,QAAQ;YACR,SAAS,EAAE;gBACV,SAAS,EAAE,QAAQ;gBACnB,OAAO;aACP;SACD;KACD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAqB;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/E,MAAM,SAAS,GAAqB,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC5D,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC;IACjC,OAAO;QACN;YACC,cAAc,EAAE,KAAK,CAAC,QAAQ;YAC9B,QAAQ,EAAE,MAAM;YAChB,QAAQ;YACR,SAAS;SACT;KACD,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAqB;IACrD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO;QACN;YACC,cAAc,EAAE,KAAK,CAAC,QAAQ;YAC9B,QAAQ,EAAE,WAAW;YACrB,QAAQ;YACR,SAAS,EAAE;gBACV,SAAS,EAAE,QAAQ;gBACnB,KAAK;aACL;SACD;KACD,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAqB;IACvD,MAAM,gBAAgB,GAAG,iCAAiC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAEzD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,iCAAiC,CAAC,OAAgB,EAAE,cAAsB;IAClF,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC;gBACb,cAAc;gBACd,QAAQ,EAAE,OAAO;gBACjB,QAAQ;gBACR,SAAS,EAAE;oBACV,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,IAAI,CAAC,KAAK;iBACnB;aACD,CAAC,CAAC;YACH,SAAS;QACV,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACb,cAAc;YACd,QAAQ,EAAE,MAAM;YAChB,QAAQ;YACR,SAAS,EAAE;gBACV,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,UAAU,EAAE,IAAI,CAAC,KAAK;aACtB;SACD,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAgB;IACnD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,2BAA2B,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvG,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAA6B,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACvE,KAAK,CAAC,IAAI,CAAC;YACV,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,KAAK;YACL,IAAI;SACJ,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,cAAc,GAAG,aAAa;IACpF,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,IAAI,OAA0C,CAAC;IAE/C,MAAM,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC;oBACb,cAAc;oBACd,QAAQ,EAAE,OAAO;oBACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,SAAS,EAAE;wBACV,SAAS,EAAE,OAAO,CAAC,QAAQ;wBAC3B,OAAO;qBACP;iBACD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;gBACtD,QAAQ,CAAC,IAAI,CAAC;oBACb,cAAc;oBACd,QAAQ,EAAE,MAAM;oBAChB,QAAQ;oBACR,SAAS,EAAE;wBACV,SAAS,EAAE,QAAQ;wBACnB,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAC5C,UAAU,EAAE,SAAS;qBACrB;iBACD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,OAAO,GAAG,SAAS,CAAC;IACrB,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,eAAe;YAAE,SAAS;QACrE,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7E,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnF,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnF,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,IAAI,OAAO,EAAE,SAAS,KAAK,QAAQ;gBAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAClG,SAAS;QACV,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACpC,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,SAAS;QACV,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;IAED,KAAK,EAAE,CAAC;IACR,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,SAA6C,EAAE,QAAgB;IACvF,OAAO;QACN,SAAS;QACT,QAAQ;QACR,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;KACZ,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC/D,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YAAE,SAAS;QACjE,KAAK,CAAC,IAAI,CAAC;YACV,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;SACrB,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,OAAwC;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B,EAAE,IAAc;IAChE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACtC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC"} \ No newline at end of file diff --git a/dist/runner.d.ts b/dist/runner.d.ts index 80f832e..285c5ca 100644 --- a/dist/runner.d.ts +++ b/dist/runner.d.ts @@ -24,4 +24,3 @@ export type CommentCheckerRunner = (input: CommentCheckerHookInput) => Promise; export declare function resolveCommentCheckerBinary(): string | undefined; export declare function spawnProcess(command: string, args: string[], stdin: string, maxOutputBytes?: number): Promise; -//# sourceMappingURL=runner.d.ts.map \ No newline at end of file diff --git a/dist/runner.d.ts.map b/dist/runner.d.ts.map deleted file mode 100644 index 773ff75..0000000 --- a/dist/runner.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzG,MAAM,MAAM,wBAAwB,GAAG;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAExG,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA8ClC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAOhE;AA8DD,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,MAAiC,GAC/C,OAAO,CAAC,aAAa,CAAC,CAkCxB"} \ No newline at end of file diff --git a/dist/runner.js b/dist/runner.js index 16d4687..bc5f354 100644 --- a/dist/runner.js +++ b/dist/runner.js @@ -82,7 +82,7 @@ function resolvePackageBinary(binaryName) { } } function isCommentCheckerPackage(value) { - return isRecord(value) && typeof value.getBinaryPath === "function"; + return isRecord(value) && typeof value["getBinaryPath"] === "function"; } function isRecord(value) { return typeof value === "object" && value !== null; @@ -142,4 +142,3 @@ export function spawnProcess(command, args, stdin, maxOutputBytes = MAX_PROCESS_ proc.stdin.end(stdin); }); } -//# sourceMappingURL=runner.js.map \ No newline at end of file diff --git a/dist/runner.js.map b/dist/runner.js.map deleted file mode 100644 index 2b445e5..0000000 --- a/dist/runner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.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 ba44827..ae76cea 100644 --- a/src/codex-hook.ts +++ b/src/codex-hook.ts @@ -43,13 +43,12 @@ export async function runCommentCheckerPostToolUse( const warnings: Array<{ filePath: string; message: string }> = []; for (const request of requests) { - const result = await runner( - toHookInput(request, { - sessionId: input.session_id, - cwd: input.cwd, - transcriptPath: input.transcript_path ?? undefined, - }), - ); + const context = { + sessionId: input.session_id, + cwd: input.cwd, + ...(input.transcript_path === null ? {} : { transcriptPath: input.transcript_path }), + }; + const result = await runner(toHookInput(request, context)); if (result.status === "missing" || result.status === "pass") continue; if (result.status === "error") continue; const message = result.message.trim(); @@ -99,11 +98,11 @@ function toToolResultLike(input: CodexPostToolUseInput): ToolResultLike { } function normalizeToolInput(toolName: string, toolInput: Record): Record { - if (toolName === "apply_patch" && typeof toolInput.command === "string") { + if (toolName === "apply_patch" && typeof toolInput["command"] === "string") { return { ...toolInput, - input: toolInput.command, - patch: toolInput.command, + input: toolInput["command"], + patch: toolInput["command"], }; } return toolInput; @@ -113,14 +112,14 @@ function normalizeToolResponse(toolResponse: unknown): ToolResultContent[] { if (typeof toolResponse === "string") { return [{ type: "text", text: toolResponse }]; } - if (isRecord(toolResponse) && typeof toolResponse.text === "string") { - return [{ type: "text", text: toolResponse.text }]; + if (isRecord(toolResponse) && typeof toolResponse["text"] === "string") { + return [{ type: "text", text: toolResponse["text"] }]; } return []; } function isErrorResponse(toolResponse: unknown): boolean { - return isRecord(toolResponse) && toolResponse.is_error === true; + return isRecord(toolResponse) && toolResponse["is_error"] === true; } function formatWarnings(warnings: Array<{ filePath: string; message: string }>): string { @@ -132,16 +131,16 @@ function formatWarnings(warnings: Array<{ filePath: string; message: 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.transcript_path === "string" || value.transcript_path === null) && - typeof value.cwd === "string" && - typeof value.model === "string" && - typeof value.permission_mode === "string" && - typeof value.tool_name === "string" && - isRecord(value.tool_input) && - typeof value.tool_use_id === "string" + value["hook_event_name"] === "PostToolUse" && + typeof value["session_id"] === "string" && + typeof value["turn_id"] === "string" && + (typeof value["transcript_path"] === "string" || value["transcript_path"] === null) && + typeof value["cwd"] === "string" && + typeof value["model"] === "string" && + typeof value["permission_mode"] === "string" && + typeof value["tool_name"] === "string" && + isRecord(value["tool_input"]) && + typeof value["tool_use_id"] === "string" ); } diff --git a/src/core.ts b/src/core.ts index 2a9c5e1..d8506d6 100644 --- a/src/core.ts +++ b/src/core.ts @@ -143,7 +143,7 @@ function extractEditRequest(event: ToolResultLike): CommentCheckRequest[] { function extractMultiEditRequest(event: ToolResultLike): CommentCheckRequest[] { const filePath = getString(event.input, ["filePath", "file_path", "path"]); - const edits = getEdits(event.input.edits); + const edits = getEdits(event.input["edits"]); if (!filePath || edits.length === 0) return []; return [ { @@ -203,11 +203,13 @@ function extractApplyPatchMetadataRequests(details: unknown, sourceToolName: str function getApplyPatchMetadataFiles(details: unknown): ApplyPatchFileMetadata[] { if (!isRecord(details)) return []; - const direct = readApplyPatchMetadataFiles(details.files); + const direct = readApplyPatchMetadataFiles(details["files"]); if (direct.length > 0) return direct; - const result = isRecord(details.result) ? readApplyPatchMetadataFiles(details.result.files) : []; + const resultDetails = details["result"]; + const result = isRecord(resultDetails) ? readApplyPatchMetadataFiles(resultDetails["files"]) : []; if (result.length > 0) return result; - const metadata = isRecord(details.metadata) ? readApplyPatchMetadataFiles(details.metadata.files) : []; + const metadataDetails = details["metadata"]; + const metadata = isRecord(metadataDetails) ? readApplyPatchMetadataFiles(metadataDetails["files"]) : []; return metadata; } @@ -224,10 +226,10 @@ function readApplyPatchMetadataFiles(value: unknown): ApplyPatchFileMetadata[] { if (!filePath || before === undefined || after === undefined) continue; files.push({ filePath, - movePath, before, after, - type, + ...(movePath === undefined ? {} : { movePath }), + ...(type === undefined ? {} : { type }), }); } return files; diff --git a/src/runner.ts b/src/runner.ts index e1658cb..7d6ce28 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -117,7 +117,7 @@ function resolvePackageBinary(binaryName: string): string | undefined { } function isCommentCheckerPackage(value: unknown): value is { getBinaryPath: () => string } { - return isRecord(value) && typeof value.getBinaryPath === "function"; + return isRecord(value) && typeof value["getBinaryPath"] === "function"; } function isRecord(value: unknown): value is Record { diff --git a/test/package-smoke.test.ts b/test/package-smoke.test.ts index c6855f7..650cc58 100644 --- a/test/package-smoke.test.ts +++ b/test/package-smoke.test.ts @@ -1,33 +1,109 @@ 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; + readonly optionalDependencies: 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 command uses 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 command = hookConfig.PostToolUse?.[0]?.hooks[0]?.command; + const command = hooksJson.hooks["PostToolUse"]?.[0]?.hooks[0]?.command; const pluginRoot = ["$", "{PLUGIN_ROOT}"].join(""); // then expect(packageJson.type).toBe("module"); expect(packageJson.packageManager).toBe("npm@11.12.1"); - expect(dependencies ?? {}).not.toHaveProperty("@code-yeongyu/comment-checker"); + expect(packageJson.dependencies ?? {}).not.toHaveProperty("@code-yeongyu/comment-checker"); expect(packageJson.optionalDependencies).toHaveProperty("@code-yeongyu/comment-checker"); - expect(bin["codex-comment-checker"]).toBe("./dist/cli.js"); + expect(packageJson.bin["codex-comment-checker"]).toBe("./dist/cli.js"); expect(pluginJson.hooks).toBe("./hooks/hooks.json"); expect(cliSource.startsWith("#!/usr/bin/env node")).toBe(true); expect(command).toBe(`node "${pluginRoot}/dist/cli.js" hook post-tool-use`); }); }); + +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"]) && + isStringRecord(value["optionalDependencies"]) && + (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 e893f72..57bd8f1 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,5 +4,6 @@ export default defineConfig({ test: { include: ["test/**/*.test.ts"], environment: "node", + pool: "threads", }, });