@reneturcios/hookcheck 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,29 +15,43 @@ Reports in October 2026 described AI agents orchestrating attacks and a self-pro
15
15
  | surface | what it looks for |
16
16
  | --- | --- |
17
17
  | `package.json` | preinstall, install, postinstall, prepare scripts |
18
- | `.claude/settings.json` and `settings.local.json` | SessionStart, PreToolUse, and other hook commands |
18
+ | `.claude/settings.json` and `settings.local.json` | SessionStart, PreToolUse, and other hook commands. Also discovered: the GNU stow layout (`claude/settings.json`, no dot) and settings nested one level under a config dir (for example `config/.claude/settings.json`). A settings path that exists as a directory is reported as a warning, not silently skipped |
19
19
  | `.vscode/tasks.json` | tasks with runOn folderOpen, plus task inventory |
20
20
  | `.husky/` | every hook file and its full command content |
21
21
  | `lefthook.yml` | run commands |
22
22
  | `.pre-commit-config.yaml` | entry commands and remote repo URLs |
23
23
  | `.cursor/` and `.codex/` | config commands and files |
24
24
  | MCP configs | `.mcp.json`, `mcp.json`, `.vscode/mcp.json`, `.cursor/mcp.json` servers that autostart |
25
- | `.github/workflows/` | run steps, as inventory |
25
+ | `.github/workflows/` | run steps, as inventory, including block scalar bodies (`run: |` and `run: >`, with chomping variants). Every workflow finding carries the line number of its `run:` key |
26
26
  | `.githooks/` | hook files |
27
27
 
28
28
  Classification per hook:
29
29
 
30
30
  - **SAFE**: matches known safe dev patterns such as test, lint, build, typecheck, husky, or lint-staged, and matches no risky rule.
31
- - **RISKY**: matches at least one risky rule: network fetch, curl piped to a shell, credential store paths such as ~/.ssh or ~/.aws, environment secret access, base64 decoding or eval style obfuscation, shell spawning, inline code execution, or a remote URL.
32
- - **UNKNOWN**: matches neither safe nor risky patterns. A local script name alone is UNKNOWN until a human reads it. When a hook runs a local file such as `node setup.mjs`, hookcheck reads that file and escalates the finding if the file itself matches risky rules.
31
+ - **RISKY**: matches at least one risky rule: network fetch, curl piped to an interpreter, base64 decode piped to an interpreter, credential store paths or credential files (matched on content and paths, never on a script filename that merely contains the word credentials), credential shaped environment names (token, secret, password, api key) or bulk environment access, base64 decoding or eval style obfuscation, inline code execution, or a remote URL. Ordinary single named environment reads (NODE_ENV, HOME, RUNNER_DEBUG) are not flagged. A hook whose target is a shell script is classified by that script's contents, not by the fact that it is a shell script. Comments are stripped before classification, so a docs URL inside a comment is not a fetch, and a fetch whose every URL is loopback (a localhost health check) is not treated as network behavior.
32
+ - **UNKNOWN**: matches neither safe nor risky patterns. A local script name alone is UNKNOWN until a human reads it. When a hook runs a local file such as `node setup.mjs`, hookcheck reads that file and escalates the finding if the file itself matches risky rules. The same one hop following applies to direct script execution (`./setup.sh`), `node --require ./setup.mjs`, and package.json script chains (`postinstall: npm run other-script`).
33
33
 
34
34
  Verdict rules:
35
35
 
36
36
  - **CLEAN**: every finding is SAFE, or no hooks were found. Exit code 0.
37
- - **REVIEW**: at least one UNKNOWN finding, or a RISKY finding without a remote fetch or credential rule. Exit code 1.
38
- - **COMPROMISED-PATTERN**: at least one RISKY finding that fetches remote code or touches credential stores. This is the Shai-Hulud persistence shape. Treat the repo as untrusted until proven otherwise. Exit code 1.
37
+ - **REVIEW**: at least one UNKNOWN finding, or a RISKY finding whose evidence is weak on its own (a remote URL alone, a download by itself, credential access with no network behavior). Exit code 1.
38
+ - **COMPROMISED-PATTERN**: at least one RISKY finding with strong evidence: fetched or decoded content executed directly as code (curl piped to an interpreter, base64 decode piped to an interpreter, eval of fetched content), or credential access combined with network behavior in the same finding. This is the Shai-Hulud persistence shape. Treat the repo as untrusted until proven otherwise. Exit code 1. Canonical legitimate installers that download their own binary (esbuild, puppeteer) verdict REVIEW under this calibration, not COMPROMISED-PATTERN; the download is reported as a RISKY finding with its evidence, and the top verdict no longer over-claims it.
39
39
 
40
- Every finding reports file, hook id, command text, classification, rule ids, and evidence. Malformed JSON is reported as a warning, never silently ignored.
40
+ Every finding reports file, hook id, command text, classification, rule ids, and evidence. Malformed JSON is reported as a warning, never silently ignored. Scanning a path that does not exist, or that is a file instead of a directory, is a clean error with exit code 2.
41
+
42
+ ## Limits
43
+
44
+ Honest boundaries, pinned by tests in test/hardening.test.ts:
45
+
46
+ - One hop only. hookcheck follows a hook into the local file or package.json script it directly invokes, and classifies that target. It does not follow a second hop, and it does not trace data flow inside a script. A payload assembled at runtime from pieces that never appear as a recognizable pattern in any single file will not be named; the hook that runs it will usually still land in UNKNOWN or REVIEW, which is the signal to read it by hand.
47
+ - Pattern based, not execution based. hookcheck never runs the hooks it finds. A RISKY verdict means the command text matches a known bad shape, not that the payload was observed doing harm. A CLEAN verdict means no known shape matched, not that the repo is proven safe.
48
+ - Remote pre-commit repos and remote MCP servers are inventoried, not verified. hookcheck cannot see inside a remote pre-commit repo, so those entries are UNKNOWN with a note to review the pinned rev. A remote MCP server URL is RISKY by construction, because the server autostarts and is remote.
49
+ - Duplicate JSON keys resolve last-wins, exactly as JSON.parse, Node, and npm resolve them, so the scanner sees the same value that would actually run.
50
+ - Non-string package.json script values are skipped: npm only executes string script values, so an array or number in scripts cannot auto-run.
51
+ - Classification reads up to 200,000 characters of a hook file or a referenced local file. Beyond that depth a payload can hide; the cap exists so a hostile file cannot make the scan unbounded.
52
+ - GitHub workflow run steps in block scalars (`run: |`, `run: >`, and chomping variants) are parsed and classified like one line commands. Plain multi-line scalars without a block header are not joined, and YAML anchors and reusable workflow internals are not resolved.
53
+ - Agent config coverage boundaries: `.gemini/settings.json` is not scanned yet. Template configs (for example `templates/settings.json.template`) are not scanned: they are inert until copied into place, at which point the copied file is scanned under its real name.
54
+ - UNKNOWN is the dominant classification on large real repos (measured at roughly 80 percent of findings on langfuse and cli/cli in Round 1 validation). The classifications are inventory, not suspicion: a REVIEW verdict on a large estate means the auto-exec surface is mapped and needs human triage, and the per finding evidence says exactly what each hook runs. More workflow step patterns will be classified over time; until then hookcheck does not guess.
41
55
 
42
56
  ## Usage
43
57
 
@@ -57,9 +71,9 @@ hookcheck ./some-repo: COMPROMISED-PATTERN
57
71
  2 hook(s): 0 SAFE, 2 RISKY, 0 UNKNOWN
58
72
  [RISKY] package.json:postinstall (package.json)
59
73
  command: node setup.mjs
60
- rules: NET-FETCH, ENV-ACCESS
74
+ rules: NET-FETCH, REMOTE-URL, ENV-BULK, ENV-EXFIL
61
75
  evidence: referenced local file setup.mjs is RISKY: NET-FETCH: performs a network fetch
62
- COMPROMISED-PATTERN: at least one risky hook fetches remote code or touches credential stores.
76
+ COMPROMISED-PATTERN: at least one risky hook shows strong evidence: fetched or decoded content executed as code, or credential access combined with network behavior.
63
77
  ```
64
78
 
65
79
  ### MCP server
package/dist/cli.js CHANGED
@@ -6,7 +6,26 @@
6
6
  * hookcheck --version
7
7
  * Exit codes: 0 CLEAN, 1 REVIEW or COMPROMISED-PATTERN, 2 usage error.
8
8
  */
9
+ import { existsSync, statSync } from "node:fs";
9
10
  import { explainHook, renderReport, scanHooks, VERSION } from "./core.js";
11
+ /** A scan target must be an existing directory; anything else is a usage error (exit 2). */
12
+ function requireDirectory(target) {
13
+ if (!existsSync(target)) {
14
+ console.error(`error: path does not exist: ${target}`);
15
+ process.exit(2);
16
+ }
17
+ let isDir = false;
18
+ try {
19
+ isDir = statSync(target).isDirectory();
20
+ }
21
+ catch {
22
+ isDir = false;
23
+ }
24
+ if (!isDir) {
25
+ console.error(`error: path is not a directory: ${target}`);
26
+ process.exit(2);
27
+ }
28
+ }
10
29
  function usage() {
11
30
  console.error(`Usage:
12
31
  hookcheck scan [path] [--json]
@@ -31,6 +50,7 @@ async function main() {
31
50
  if (cmd === "scan") {
32
51
  const asJson = rest.includes("--json");
33
52
  const target = rest.find((a) => !a.startsWith("--")) ?? ".";
53
+ requireDirectory(target);
34
54
  const report = scanHooks(target);
35
55
  if (asJson)
36
56
  console.log(JSON.stringify(report, null, 2));
@@ -51,6 +71,7 @@ async function main() {
51
71
  }
52
72
  else
53
73
  usage();
74
+ requireDirectory(target);
54
75
  const result = explainHook(target, id);
55
76
  if (asJson)
56
77
  console.log(JSON.stringify(result, null, 2));
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -1,21 +1,50 @@
1
1
  import { relative } from "node:path";
2
2
  import type { Classification, HookFinding, ScanReport, Verdict } from "./types.js";
3
- export declare const VERSION = "0.1.0";
3
+ export declare const VERSION = "0.1.2";
4
4
  interface RuleDef {
5
5
  id: string;
6
6
  pattern: RegExp;
7
7
  evidence: string;
8
- /** True when this rule alone indicates remote code fetch. */
8
+ /** True when this rule indicates outbound network behavior. */
9
9
  remote?: boolean;
10
- /** True when this rule indicates credential store access. */
10
+ /** True when this rule indicates credential store or credential shaped access. */
11
11
  credential?: boolean;
12
+ /**
13
+ * True when this rule is strong evidence on its own: fetched or decoded
14
+ * content executed directly as code. Round 1 calibration (P-003, P-004):
15
+ * COMPROMISED-PATTERN requires strong evidence, either a severe rule, or
16
+ * credential access combined with network behavior in the same finding.
17
+ * A pile of weak signals (a URL alone, a localhost curl, an ordinary env
18
+ * read) is RISKY at most and verdicts REVIEW.
19
+ */
20
+ severe?: boolean;
12
21
  }
13
22
  export declare const RISKY_RULES: RuleDef[];
23
+ /**
24
+ * Strip comments before classification: block comments anywhere, and full
25
+ * line comments (// or #) in shell, JS, and Python style files. A docs URL
26
+ * inside a comment is not a fetch (P-003, puppeteer), and shell comments do
27
+ * not execute. String literals containing comment markers on a code line
28
+ * are untouched.
29
+ */
30
+ export declare function stripComments(text: string): string;
14
31
  export declare function classifyCommand(command: string): {
15
32
  classification: Classification;
16
33
  rules: string[];
17
34
  evidence: string;
18
35
  };
36
+ /**
37
+ * Verdict calibration (Round 1, P-003 and P-004). COMPROMISED-PATTERN
38
+ * requires strong evidence inside a single finding:
39
+ * (a) a severe rule: fetched or decoded content executed directly as
40
+ * code (curl piped to an interpreter, base64 decode piped to an
41
+ * interpreter, eval of fetched content), or
42
+ * (b) credential evidence (credential store access, a credential shaped
43
+ * env name, or bulk env access) combined with network behavior.
44
+ * Weak signals alone (a remote URL, a localhost fetch, an ordinary env
45
+ * read, a download by itself) classify RISKY at most, and a RISKY-only
46
+ * estate verdicts REVIEW, never COMPROMISED-PATTERN.
47
+ */
19
48
  export declare function computeVerdict(findings: HookFinding[]): Verdict;
20
49
  export declare function scanHooks(root: string): ScanReport;
21
50
  export declare function explainHook(root: string, idOrFile: string): {
package/dist/core.js CHANGED
@@ -5,20 +5,121 @@
5
5
  * rules so the same repo always produces the same report.
6
6
  */
7
7
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
8
- import { join, relative } from "node:path";
9
- export const VERSION = "0.1.0";
8
+ import { join, relative, resolve, sep } from "node:path";
9
+ export const VERSION = "0.1.2";
10
10
  export const RISKY_RULES = [
11
- { id: "CURL-PIPE-SH", pattern: /\b(curl|wget)\b[^|]*\|\s*(sudo\s+)?(sh|bash|zsh)\b/, evidence: "pipes a network download straight into a shell", remote: true },
11
+ { id: "DECODE-PIPE-SH", pattern: /\bbase64\s+(-d|--decode|-D)\b[^|]*\|\s*(sudo\s+)?(sh|bash|zsh|node|python3?|perl|ruby)\b/, evidence: "decodes a base64 payload and pipes it straight into an interpreter", severe: true, remote: true },
12
+ { id: "CURL-PIPE-SH", pattern: /\b(curl|wget)\b[^|]*\|\s*(sudo\s+)?(sh|bash|zsh|node|python3?|perl|ruby)\b/, evidence: "pipes a network download straight into an interpreter", severe: true, remote: true },
13
+ { id: "REMOTE-EVAL", pattern: /\beval\b[^;]{0,80}\b(curl|wget)\b|\beval\b[^;]{0,80}\$\(\s*(curl|wget)|\bFunction\s*\([^)]{0,80}(curl|wget|fetch)/, evidence: "evaluates content fetched from the network as code", severe: true, remote: true },
12
14
  { id: "NET-FETCH", pattern: /\b(curl|wget)\b|\bfetch\s*\(|https?\s*\.get\s*\(|requests\.(get|post)\b|Invoke-WebRequest\b|Invoke-RestMethod\b/, evidence: "performs a network fetch", remote: true },
13
15
  { id: "REMOTE-URL", pattern: /https?:\/\/[^\s"'`]+/, evidence: "references a remote URL", remote: true },
14
- { id: "CRED-ACCESS", pattern: /~\/\.ssh|\$HOME\/\.ssh|\.aws\/|~\/\.aws|\.gnupg|id_rsa|id_ed25519|\.npmrc\b|\.netrc\b|credentials(\.json)?\b|\.config\/gh|keychain/i, evidence: "touches a credential store path", credential: true },
15
- { id: "ENV-ACCESS", pattern: /process\.env|os\.environ|getenv\s*\(|\benv\b.*\b(print|export)|\$\{?\s*(AWS_SECRET|AWS_ACCESS|GITHUB_TOKEN|GH_TOKEN|NPM_TOKEN|OPENAI_API_KEY|ANTHROPIC_API_KEY)/, evidence: "reads environment variables that commonly hold secrets" },
16
- { id: "ENV-EXFIL", pattern: /(process\.env|os\.environ)[\s\S]{0,80}(fetch|https?|request|post|send|upload)/i, evidence: "combines environment access with an outbound send pattern", credential: true, remote: true },
17
- { id: "OBFUSCATION", pattern: /base64\s+(-d|--decode)|atob\s*\(|Buffer\.from\s*\([^)]*base64|\\x[0-9a-fA-F]{2}|eval\s*\(|Function\s*\(/, evidence: "uses decoding or dynamic evaluation often used to hide payloads" },
18
- { id: "SHELL-EXEC", pattern: /\b(child_process|execSync|spawnSync|exec\s*\()\b|\/bin\/(sh|bash)\b|powershell(\.exe)?\b|cmd\.exe\b/, evidence: "spawns a shell or child process" },
16
+ { id: "OBFUSCATION", pattern: /base64\s+(-d|--decode)|atob\s*\(|Buffer\.from\s*\([^)]*base64|\\x[0-9a-fA-F]{2}|\beval\b\s*\(|\beval\b\s+["'$(]|Function\s*\(/, evidence: "uses decoding or dynamic evaluation often used to hide payloads" },
19
17
  { id: "WRITE-OUTSIDE", pattern: /(>>?|tee)\s+~\/|(>>?|tee)\s+\$HOME\/|chmod\s+\+x/, evidence: "writes outside the repo or changes executable bits" },
20
18
  { id: "DOWNLOAD-EXEC", pattern: /\bnode\s+-e\b|\bpython3?\s+-c\b|\bdeno\s+eval\b|\bbun\s+-e\b/, evidence: "executes inline code supplied on the command line" },
21
19
  ];
20
+ /**
21
+ * Rule metadata for procedurally detected rules (credential access and env
22
+ * access are computed, not regex matched, so they are not in RISKY_RULES).
23
+ * SHELL-EXEC is deliberately absent since v0.1.2 (P-006): spawning a child
24
+ * process or being a shell script is the normal state of a hook and is not
25
+ * a risky signal on its own; the target script contents are classified
26
+ * instead, one hop.
27
+ */
28
+ const EXTRA_RULE_META = {
29
+ "CRED-ACCESS": { credential: true },
30
+ "ENV-ACCESS": { credential: true },
31
+ "ENV-BULK": { credential: true },
32
+ "ENV-EXFIL": { credential: true, remote: true },
33
+ };
34
+ function ruleMeta(id) {
35
+ const r = RISKY_RULES.find((x) => x.id === id);
36
+ if (r)
37
+ return r;
38
+ return EXTRA_RULE_META[id] ?? {};
39
+ }
40
+ /**
41
+ * Strip comments before classification: block comments anywhere, and full
42
+ * line comments (// or #) in shell, JS, and Python style files. A docs URL
43
+ * inside a comment is not a fetch (P-003, puppeteer), and shell comments do
44
+ * not execute. String literals containing comment markers on a code line
45
+ * are untouched.
46
+ */
47
+ export function stripComments(text) {
48
+ return text
49
+ .replace(/\/\*[\s\S]*?\*\//g, " ")
50
+ .split("\n")
51
+ .filter((l) => {
52
+ const t = l.trim();
53
+ return !t.startsWith("//") && !t.startsWith("#");
54
+ })
55
+ .join("\n");
56
+ }
57
+ const CRED_FILE_PATTERNS = [
58
+ /~\/\.ssh(\/|\s|$|["'])/, /\$HOME\/\.ssh(\/|\s|$|["'])/, /(^|[\s"'(=])\.ssh\//,
59
+ /\.aws\/credentials\b/, /\.aws\/config\b/,
60
+ /~\/\.gnupg(\/|\s|$|["'])/, /\$HOME\/\.gnupg(\/|\s|$|["'])/, /\/\.gnupg\//,
61
+ /(^|[\s"'(=\/])(id_rsa|id_ed25519|id_ecdsa|id_dsa)(\.pub)?\b/,
62
+ /\.npmrc\b/, /\.netrc\b/,
63
+ /credentials\.(json|ya?ml|toml|ini|xml|env)\b/,
64
+ /(^|[\s"'(=\/])credentials(?=$|[\s;|&)"'])/,
65
+ /\/\.config\/gh\//,
66
+ /find-generic-password|find-internet-password/,
67
+ /(homedir\(\)|Path\.home\(\)|expanduser\()\s*[,+]\s*["'][^"']*\.(ssh|aws|gnupg)/,
68
+ ];
69
+ /**
70
+ * Credential store access, matched on content and paths (P-004). Script
71
+ * filenames are scrubbed first: a hook that runs a script named like
72
+ * configure_git_credentials.sh is classified by that script's contents
73
+ * (one hop), never by the word credentials inside its filename.
74
+ */
75
+ function detectCredAccess(cmd) {
76
+ const scrubbed = cmd.replace(/[A-Za-z0-9_.\/-]+\.(?:sh|bash|zsh|mjs|cjs|js|ts|py|ps1)\b/g, " ");
77
+ return CRED_FILE_PATTERNS.some((p) => p.test(scrubbed));
78
+ }
79
+ const CRED_ENV_NAME = /(SECRET|TOKEN|PASSWORD|PASSWD|API_?KEY|PRIVATE_?KEY|ACCESS_?KEY|CREDENTIAL|AUTH_?KEY|SESSION_?KEY)/i;
80
+ /**
81
+ * Env access calibration (P-005). Ordinary single named reads
82
+ * (process.env.NODE_ENV, os.environ.get("HOME")) are not flagged at all.
83
+ * Only credential shaped names (token, secret, password, api key, and
84
+ * friends, in any access syntax) and bulk access (whole object
85
+ * serialization, printenv, bare env dumps, whole os.environ use) count.
86
+ */
87
+ function detectEnvAccess(cmd) {
88
+ let cred = false;
89
+ let bulk = false;
90
+ const nameRes = [
91
+ /process\.env\.([A-Za-z_][A-Za-z0-9_]*)/g,
92
+ /process\.env\[["']([A-Za-z_][A-Za-z0-9_]*)["']\]/g,
93
+ /os\.environ\.get\(["']([A-Za-z_][A-Za-z0-9_]*)["']/g,
94
+ /os\.environ\[["']([A-Za-z_][A-Za-z0-9_]*)["']\]/g,
95
+ /getenv\(["']([A-Za-z_][A-Za-z0-9_]*)["']/g,
96
+ /Deno\.env\.get\(["']([A-Za-z_][A-Za-z0-9_]*)["']/g,
97
+ /import\.meta\.env\.([A-Za-z_][A-Za-z0-9_]*)/g,
98
+ /\$\{?([A-Z][A-Z0-9_]{2,})\}?/g,
99
+ ];
100
+ for (const re of nameRes) {
101
+ let m;
102
+ while ((m = re.exec(cmd)) !== null) {
103
+ if (CRED_ENV_NAME.test(m[1]))
104
+ cred = true;
105
+ }
106
+ }
107
+ if (/(JSON\.stringify|Object\.(keys|values|entries|assign)|util\.inspect)\s*\([^)]*process\.env/.test(cmd))
108
+ bulk = true;
109
+ if (/\bprintenv\b/.test(cmd))
110
+ bulk = true;
111
+ if (/(^|[;&|]\s*)env\s*($|[|>;])/.test(cmd))
112
+ bulk = true;
113
+ if (/\b(str|dict|list)\s*\(\s*os\.environ\s*\)/.test(cmd))
114
+ bulk = true;
115
+ if (/\bos\.environ\b(?!\s*(\.get\s*\(|\[))/.test(cmd))
116
+ bulk = true;
117
+ return { cred, bulk };
118
+ }
119
+ function isLoopbackHost(host) {
120
+ const h = host.toLowerCase();
121
+ return h === "localhost" || h === "127.0.0.1" || h === "0.0.0.0" || h === "::1" || h === "[::1]";
122
+ }
22
123
  const SAFE_PATTERNS = [
23
124
  /^(npm|npx|yarn|pnpm|bun)\s+(run\s+)?(test|lint|build|dev|start|typecheck|check|format|prepare:.*|prepublishOnly.*)$/i,
24
125
  /^(npx\s+)?(tsc|eslint|prettier|vitest|jest|mocha|husky|lint-staged|lefthook|pre-commit)(\s|$)/i,
@@ -29,11 +130,40 @@ const SAFE_PATTERNS = [
29
130
  /^simple-git-hooks$/i,
30
131
  ];
31
132
  export function classifyCommand(command) {
32
- const cmd = command.trim();
133
+ // Strip comments first (a docs URL in a comment is not a fetch), then
134
+ // normalize shell line continuations and stray carriage returns, so a
135
+ // payload split as `curl ... \` + newline + `| sh` classifies the same as
136
+ // the one line form.
137
+ const cmd = stripComments(command).replace(/\\\r?\n/g, " ").replace(/\r/g, " ").replace(/\n/g, " ").trim();
33
138
  const fired = [];
34
139
  for (const rule of RISKY_RULES) {
35
140
  if (rule.pattern.test(cmd))
36
- fired.push(rule);
141
+ fired.push({ id: rule.id, evidence: rule.evidence });
142
+ }
143
+ // Loopback downgrade (P-004): a fetch whose every URL is loopback is a
144
+ // local health check shape, not a network exfil shape. Downgrade only
145
+ // when no severe rule fired.
146
+ const hosts = Array.from(cmd.matchAll(/https?:\/\/([^\s"'`\/:?#]+)/g)).map((m) => m[1]);
147
+ if (hosts.length > 0 && hosts.every(isLoopbackHost) && !fired.some((f) => ruleMeta(f.id).severe)) {
148
+ for (let i = fired.length - 1; i >= 0; i--) {
149
+ if (fired[i].id === "NET-FETCH" || fired[i].id === "REMOTE-URL")
150
+ fired.splice(i, 1);
151
+ }
152
+ }
153
+ // Credential store access, content and path based (P-004).
154
+ if (detectCredAccess(cmd)) {
155
+ fired.push({ id: "CRED-ACCESS", evidence: "touches a credential store path or credential file" });
156
+ }
157
+ // Env access, credential shaped names or bulk only (P-005).
158
+ const env = detectEnvAccess(cmd);
159
+ if (env.cred) {
160
+ fired.push({ id: "ENV-ACCESS", evidence: "reads an environment variable whose name is credential shaped (token, secret, password, api key)" });
161
+ }
162
+ if (env.bulk) {
163
+ fired.push({ id: "ENV-BULK", evidence: "accesses the whole environment at once (serialization, printenv, or env dump)" });
164
+ }
165
+ if ((env.cred || env.bulk) && (fired.some((f) => f.id === "NET-FETCH" || f.id === "REMOTE-URL") || /\b(nc|netcat)\b/.test(cmd))) {
166
+ fired.push({ id: "ENV-EXFIL", evidence: "combines credential shaped or bulk environment access with an outbound send pattern" });
37
167
  }
38
168
  if (fired.length > 0) {
39
169
  return {
@@ -52,41 +182,116 @@ export function classifyCommand(command) {
52
182
  // referenced local file itself contains risky patterns we escalate below.
53
183
  return { classification: "UNKNOWN", rules: [], evidence: "no known safe pattern and no risky pattern matched; manual review needed" };
54
184
  }
55
- /** If a command runs a local file, inspect that file for risky patterns too. */
185
+ /**
186
+ * If a command references local script files, inspect those files for risky
187
+ * patterns too (one hop). References are found by token, not only after an
188
+ * interpreter name, so `node setup.mjs`, `./setup.sh`, `node --require
189
+ * ./setup.mjs`, and `bash setup.sh` all resolve. References that escape the
190
+ * scanned root are never followed.
191
+ */
56
192
  function escalateWithLocalFile(root, finding) {
57
- const m = /\b(?:node|bash|sh|python3?|deno run|bun run)\s+([^\s;&|]+\.(?:mjs|cjs|js|ts|sh|py))\b/.exec(finding.command);
58
- if (!m)
59
- return finding;
60
- const rel = m[1].replace(/^\.\//, "");
61
- const abs = join(root, rel);
62
- if (!existsSync(abs))
63
- return finding;
64
- let content = "";
65
- try {
66
- content = readFileSync(abs, "utf8").slice(0, 20000);
67
- }
68
- catch {
193
+ const tokenRe = /[A-Za-z0-9_.\/-]+\.(?:mjs|cjs|js|ts|sh|py)\b/g;
194
+ const tokens = Array.from(new Set(finding.command.match(tokenRe) ?? [])).slice(0, 5);
195
+ if (tokens.length === 0)
69
196
  return finding;
197
+ const rootAbs = resolve(root);
198
+ let out = finding;
199
+ for (const token of tokens) {
200
+ const rel = token.replace(/^\.\//, "");
201
+ if (rel.includes("://"))
202
+ continue;
203
+ const abs = resolve(rootAbs, rel);
204
+ if (abs !== rootAbs && !abs.startsWith(rootAbs + sep))
205
+ continue;
206
+ if (!existsSync(abs))
207
+ continue;
208
+ let st;
209
+ try {
210
+ st = statSync(abs);
211
+ }
212
+ catch {
213
+ continue;
214
+ }
215
+ if (!st.isFile())
216
+ continue;
217
+ let content = "";
218
+ try {
219
+ content = readFileSync(abs, "utf8").slice(0, 200000);
220
+ }
221
+ catch {
222
+ continue;
223
+ }
224
+ const inner = classifyCommand(content);
225
+ if (inner.classification === "RISKY") {
226
+ const rules = Array.from(new Set([...out.rules, ...inner.rules]));
227
+ out = {
228
+ ...out,
229
+ classification: "RISKY",
230
+ rules,
231
+ evidence: `${out.evidence === "" ? "" : out.evidence + "; "}referenced local file ${rel} is RISKY: ${inner.evidence}`,
232
+ };
233
+ }
70
234
  }
71
- const inner = classifyCommand(content.replace(/\n/g, " "));
72
- if (inner.classification === "RISKY") {
73
- const rules = Array.from(new Set([...finding.rules, ...inner.rules]));
74
- return {
75
- ...finding,
76
- classification: "RISKY",
77
- rules,
78
- evidence: `${finding.evidence === "" ? "" : finding.evidence + "; "}referenced local file ${rel} is RISKY: ${inner.evidence}`,
79
- };
235
+ return out;
236
+ }
237
+ /** Classify a command string, including one hop into local files it runs. */
238
+ function classifyWithLocalFile(root, source, command) {
239
+ const c = classifyCommand(command);
240
+ const temp = { id: "", file: "", source, hook: "", command, classification: c.classification, rules: c.rules, evidence: c.evidence };
241
+ const escalated = escalateWithLocalFile(root, temp);
242
+ return { classification: escalated.classification, rules: escalated.rules, evidence: escalated.evidence };
243
+ }
244
+ /**
245
+ * A watched install script may chain to another package.json script
246
+ * (`postinstall: npm run evil`). Follow that chain one hop: if the target
247
+ * script is RISKY (directly or through a local file it runs), the install
248
+ * hook inherits the classification.
249
+ */
250
+ function escalateWithScriptChain(root, scripts, currentName, finding) {
251
+ const chainRe = /\b(?:npm|yarn|pnpm|bun)\s+(?:run\s+)?([A-Za-z0-9:_-]+)/g;
252
+ let out = finding;
253
+ let m;
254
+ while ((m = chainRe.exec(finding.command)) !== null) {
255
+ const name = m[1];
256
+ if (name === currentName)
257
+ continue;
258
+ const chained = scripts[name];
259
+ if (typeof chained !== "string" || !chained.trim())
260
+ continue;
261
+ const inner = classifyWithLocalFile(root, "package.json", chained);
262
+ if (inner.classification === "RISKY") {
263
+ const rules = Array.from(new Set([...out.rules, ...inner.rules]));
264
+ out = {
265
+ ...out,
266
+ classification: "RISKY",
267
+ rules,
268
+ evidence: `${out.evidence === "" ? "" : out.evidence + "; "}via script chain to "${name}": ${inner.evidence}`,
269
+ };
270
+ }
80
271
  }
81
- return finding;
272
+ return out;
82
273
  }
274
+ /**
275
+ * Verdict calibration (Round 1, P-003 and P-004). COMPROMISED-PATTERN
276
+ * requires strong evidence inside a single finding:
277
+ * (a) a severe rule: fetched or decoded content executed directly as
278
+ * code (curl piped to an interpreter, base64 decode piped to an
279
+ * interpreter, eval of fetched content), or
280
+ * (b) credential evidence (credential store access, a credential shaped
281
+ * env name, or bulk env access) combined with network behavior.
282
+ * Weak signals alone (a remote URL, a localhost fetch, an ordinary env
283
+ * read, a download by itself) classify RISKY at most, and a RISKY-only
284
+ * estate verdicts REVIEW, never COMPROMISED-PATTERN.
285
+ */
83
286
  export function computeVerdict(findings) {
84
287
  let review = false;
85
288
  for (const f of findings) {
86
289
  if (f.classification === "RISKY") {
87
- const hasRemote = f.rules.some((id) => RISKY_RULES.find((r) => r.id === id)?.remote);
88
- const hasCred = f.rules.some((id) => RISKY_RULES.find((r) => r.id === id)?.credential);
89
- if (hasRemote || hasCred)
290
+ const metas = f.rules.map(ruleMeta);
291
+ const hasSevere = metas.some((x) => x.severe);
292
+ const hasCred = metas.some((x) => x.credential);
293
+ const hasNet = metas.some((x) => x.remote);
294
+ if (hasSevere || (hasCred && hasNet))
90
295
  return "COMPROMISED-PATTERN";
91
296
  review = true;
92
297
  }
@@ -96,11 +301,12 @@ export function computeVerdict(findings) {
96
301
  }
97
302
  return review ? "REVIEW" : "CLEAN";
98
303
  }
99
- function makeFinding(root, file, source, hook, command, idSuffix) {
304
+ function makeFinding(root, file, source, hook, command, idSuffix, line) {
100
305
  const c = classifyCommand(command);
101
306
  const id = `${file}:${hook}${idSuffix !== undefined ? `:${idSuffix}` : ""}`;
102
307
  const base = {
103
308
  id, file, source, hook, command,
309
+ ...(line !== undefined ? { line } : {}),
104
310
  classification: c.classification, rules: c.rules,
105
311
  evidence: c.evidence,
106
312
  };
@@ -118,8 +324,11 @@ function readJson(root, rel, warnings) {
118
324
  const raw = readText(join(root, rel));
119
325
  if (raw === null)
120
326
  return null;
327
+ // Strip a UTF-8 BOM first: Windows editors add one, JSON.parse rejects it,
328
+ // and skipping the file would hide every hook inside it.
121
329
  // Strip simple JSONC comments and trailing commas for VS Code style files.
122
330
  const cleaned = raw
331
+ .replace(/^\uFEFF/, "")
123
332
  .replace(/^\s*\/\/.*$/gm, "")
124
333
  .replace(/,\s*([}\]])/g, "$1");
125
334
  try {
@@ -143,11 +352,21 @@ function scanPackageJson(root, findings, warnings) {
143
352
  }
144
353
  return;
145
354
  }
355
+ if (typeof data !== "object" || Array.isArray(data)) {
356
+ warnings.push(`${rel} root is not a JSON object: file skipped for structured parsing`);
357
+ return;
358
+ }
359
+ if (data.scripts !== undefined && (typeof data.scripts !== "object" || data.scripts === null || Array.isArray(data.scripts))) {
360
+ warnings.push(`scripts key in ${rel} is not an object: install hooks skipped`);
361
+ return;
362
+ }
363
+ const scripts = (data.scripts ?? {});
146
364
  const watched = ["preinstall", "install", "postinstall", "prepare", "prepublish", "prepublishOnly"];
147
365
  for (const name of watched) {
148
- const cmd = data.scripts?.[name];
366
+ const cmd = scripts[name];
149
367
  if (typeof cmd === "string" && cmd.trim()) {
150
- findings.push(makeFinding(root, rel, "package.json", name, cmd));
368
+ const finding = makeFinding(root, rel, "package.json", name, cmd);
369
+ findings.push(escalateWithScriptChain(root, scripts, name, finding));
151
370
  }
152
371
  }
153
372
  }
@@ -168,46 +387,114 @@ function collectClaudeHooks(node, file, root, findings, prefix) {
168
387
  }
169
388
  }
170
389
  }
390
+ /**
391
+ * Claude settings locations (P-007). Beyond the standard .claude dir:
392
+ * the GNU stow layout used by real dotfiles repos (claude/settings.json,
393
+ * no dot), and a settings file nested one level under a config dir
394
+ * (config/.claude/settings.json). A settings path that exists as a
395
+ * directory is reported as a warning, never silently skipped.
396
+ */
397
+ function claudeSettingsCandidates(root) {
398
+ const rels = [
399
+ ".claude/settings.json", ".claude/settings.local.json",
400
+ "claude/settings.json", "claude/settings.local.json",
401
+ ];
402
+ let entries = [];
403
+ try {
404
+ entries = readdirSync(root);
405
+ }
406
+ catch {
407
+ entries = [];
408
+ }
409
+ for (const name of entries.sort()) {
410
+ if (name === "node_modules" || name === ".git")
411
+ continue;
412
+ let st;
413
+ try {
414
+ st = statSync(join(root, name));
415
+ }
416
+ catch {
417
+ continue;
418
+ }
419
+ if (!st.isDirectory())
420
+ continue;
421
+ for (const f of ["settings.json", "settings.local.json"]) {
422
+ rels.push(`${name}/.claude/${f}`);
423
+ }
424
+ }
425
+ return Array.from(new Set(rels));
426
+ }
171
427
  function scanClaude(root, findings, warnings) {
172
- for (const rel of [".claude/settings.json", ".claude/settings.local.json"]) {
173
- if (!existsSync(join(root, rel)))
428
+ for (const rel of claudeSettingsCandidates(root)) {
429
+ const abs = join(root, rel);
430
+ if (!existsSync(abs))
431
+ continue;
432
+ let st;
433
+ try {
434
+ st = statSync(abs);
435
+ }
436
+ catch {
437
+ continue;
438
+ }
439
+ if (st.isDirectory()) {
440
+ warnings.push(`${rel} is a directory, not a settings file: any hooks inside it cannot be parsed as Claude settings`);
441
+ continue;
442
+ }
443
+ if (!st.isFile())
174
444
  continue;
175
445
  const data = readJson(root, rel, warnings);
176
- if (!data)
446
+ if (!data || typeof data !== "object")
177
447
  continue;
178
- if (data.hooks)
179
- collectClaudeHooks(data.hooks, rel, root, findings, "");
180
- else
448
+ if (!("hooks" in data)) {
181
449
  warnings.push(`No hooks key in ${rel}`);
450
+ continue;
451
+ }
452
+ const hooks = data.hooks;
453
+ if (!hooks || typeof hooks !== "object") {
454
+ warnings.push(`hooks key in ${rel} is not an object: hooks skipped`);
455
+ continue;
456
+ }
457
+ collectClaudeHooks(hooks, rel, root, findings, "");
182
458
  }
183
459
  }
184
460
  function scanVscode(root, findings, warnings) {
185
461
  const rel = ".vscode/tasks.json";
186
- if (!existsSync(join(root, rel)))
187
- return;
188
- const data = readJson(root, rel, warnings);
189
- if (!data?.tasks)
190
- return;
191
- data.tasks.forEach((task, idx) => {
192
- const runOptions = (task.runOptions ?? {});
193
- const runOn = runOptions.runOn;
194
- const isFolderOpen = runOn === "folderOpen" || (Array.isArray(runOn) && runOn.includes("folderOpen"));
195
- const command = typeof task.command === "string" ? task.command : "";
196
- const args = Array.isArray(task.args) ? task.args.filter((a) => typeof a === "string").join(" ") : "";
197
- const full = [command, args].filter(Boolean).join(" ").trim();
198
- if (!full)
199
- return;
200
- const label = typeof task.label === "string" ? task.label : `task-${idx}`;
201
- if (isFolderOpen) {
202
- findings.push(makeFinding(root, rel, "vscode-tasks", `folderOpen:${label}`, full, String(idx)));
203
- }
204
- else {
205
- // Inventory non auto-run tasks at lower weight: still record them so
206
- // explain can find them, classified by their command.
207
- const f = makeFinding(root, rel, "vscode-tasks", label, full, String(idx));
208
- findings.push(f);
462
+ if (existsSync(join(root, rel))) {
463
+ const data = readJson(root, rel, warnings);
464
+ if (data && data.tasks !== undefined && !Array.isArray(data.tasks)) {
465
+ warnings.push(`tasks key in ${rel} is not an array: tasks skipped`);
209
466
  }
210
- });
467
+ const tasks = Array.isArray(data?.tasks) ? data.tasks : [];
468
+ tasks.forEach((rawTask, idx) => {
469
+ // Malformed entries (null, strings, numbers) are skipped, never fatal:
470
+ // one bad task must not hide every other surface in the repo.
471
+ if (!rawTask || typeof rawTask !== "object")
472
+ return;
473
+ const task = rawTask;
474
+ const runOptions = (task.runOptions ?? {});
475
+ const options = (task.options ?? {});
476
+ const optionsRunOptions = (options.runOptions ?? {});
477
+ // folderOpen lives in runOptions in the standard schema, but real
478
+ // world files also nest it under options or put runOn on the task.
479
+ const runOn = runOptions.runOn ?? optionsRunOptions.runOn ?? task.runOn;
480
+ const isFolderOpen = runOn === "folderOpen" || (Array.isArray(runOn) && runOn.includes("folderOpen"));
481
+ const command = typeof task.command === "string" ? task.command : "";
482
+ const args = Array.isArray(task.args) ? task.args.filter((a) => typeof a === "string").join(" ") : "";
483
+ const full = [command, args].filter(Boolean).join(" ").trim();
484
+ if (!full)
485
+ return;
486
+ const label = typeof task.label === "string" ? task.label : `task-${idx}`;
487
+ if (isFolderOpen) {
488
+ findings.push(makeFinding(root, rel, "vscode-tasks", `folderOpen:${label}`, full, String(idx)));
489
+ }
490
+ else {
491
+ // Inventory non auto-run tasks at lower weight: still record them so
492
+ // explain can find them, classified by their command.
493
+ const f = makeFinding(root, rel, "vscode-tasks", label, full, String(idx));
494
+ findings.push(f);
495
+ }
496
+ });
497
+ }
211
498
  // MCP config inside .vscode
212
499
  scanMcpFile(root, ".vscode/mcp.json", findings, warnings);
213
500
  }
@@ -241,7 +528,9 @@ function scanDirFiles(root, dirRel, source, findings) {
241
528
  const firstMeaningful = content.split("\n").map((l) => l.trim()).filter((l) => l && !l.startsWith("#") && !l.startsWith("set -")).join(" ");
242
529
  const fileRel = `${dirRel}/${name}`;
243
530
  // Entire file content is the command surface for husky style hooks.
244
- findings.push(makeFinding(root, fileRel, source, name, content.trim().slice(0, 500)));
531
+ // Classify generously deep into the file: a payload hidden behind
532
+ // padding must still be seen. Display code truncates separately.
533
+ findings.push(makeFinding(root, fileRel, source, name, content.trim().slice(0, 200000)));
245
534
  void firstMeaningful;
246
535
  }
247
536
  }
@@ -271,7 +560,20 @@ function scanPreCommit(root, findings) {
271
560
  }
272
561
  const repoRe = /^\s*-\s*repo:\s*(https?:\/\/\S+)$/gm;
273
562
  while ((m = repoRe.exec(raw)) !== null) {
274
- findings.push(makeFinding(root, rel, "pre-commit", "remote-repo", m[1].trim(), String(i++)));
563
+ // A remote hook repo is the standard pre-commit pattern, not a finding
564
+ // of compromise: the URL alone is inventoried as UNKNOWN so a human can
565
+ // review the pinned rev. Classifying the bare URL with the command
566
+ // rules would verdict every normal pre-commit config COMPROMISED.
567
+ findings.push({
568
+ id: `${rel}:remote-repo:${i++}`,
569
+ file: rel,
570
+ source: "pre-commit",
571
+ hook: "remote-repo",
572
+ command: m[1].trim(),
573
+ classification: "UNKNOWN",
574
+ rules: [],
575
+ evidence: "remote pre-commit hook repo (standard pattern): its hooks run locally at commit time; hookcheck cannot verify remote contents, review the pinned rev",
576
+ });
275
577
  }
276
578
  }
277
579
  function scanAgentDirs(root, findings, warnings) {
@@ -306,7 +608,7 @@ function scanAgentDirs(root, findings, warnings) {
306
608
  else {
307
609
  const content = readText(fileAbs);
308
610
  if (content && content.trim()) {
309
- findings.push(makeFinding(root, rel, source, name, content.trim().slice(0, 500)));
611
+ findings.push(makeFinding(root, rel, source, name, content.trim().slice(0, 200000)));
310
612
  }
311
613
  }
312
614
  if (name === "mcp.json")
@@ -350,6 +652,14 @@ function scanMcpFile(root, rel, findings, warnings) {
350
652
  }
351
653
  }
352
654
  }
655
+ /**
656
+ * Workflow run steps (P-002). Both single line run values and block
657
+ * scalars are inventoried. Block scalars (run: |, run: >, with the |-
658
+ * and >- and |+ chomping variants) are the dominant style for real
659
+ * multi-line steps; their bodies are collected by indentation, dedented,
660
+ * and classified exactly like the same commands on one line. Every
661
+ * finding carries the 1-based line number of its run: key.
662
+ */
353
663
  function scanWorkflows(root, findings) {
354
664
  const dir = ".github/workflows";
355
665
  const abs = join(root, dir);
@@ -367,14 +677,46 @@ function scanWorkflows(root, findings) {
367
677
  continue;
368
678
  const rel = `${dir}/${name}`;
369
679
  const raw = readText(join(root, rel)) ?? "";
370
- const runRe = /^\s*-?\s*run:\s*(.+)$/gm;
371
- let m;
680
+ const lines = raw.split("\n");
372
681
  let i = 0;
373
- while ((m = runRe.exec(raw)) !== null) {
374
- const cmd = m[1].trim();
375
- if (cmd === "|" || cmd === ">" || cmd === "")
682
+ for (let idx = 0; idx < lines.length; idx++) {
683
+ const m = lines[idx].match(/^(\s*)-?\s*run:\s*(.*)$/);
684
+ if (!m)
685
+ continue;
686
+ const runIndent = m[1].length;
687
+ const rest = m[2].trim();
688
+ const lineNo = idx + 1;
689
+ const blockHeader = rest.match(/^([|>])([+-]?)\s*(#.*)?$/);
690
+ if (blockHeader) {
691
+ // Collect body lines: blank lines belong to the block; the block
692
+ // ends at the first non-blank line indented at or below run:.
693
+ const body = [];
694
+ let j = idx + 1;
695
+ for (; j < lines.length; j++) {
696
+ const l = lines[j];
697
+ if (l.trim() === "") {
698
+ body.push("");
699
+ continue;
700
+ }
701
+ const indent = l.length - l.trimStart().length;
702
+ if (indent <= runIndent)
703
+ break;
704
+ body.push(l);
705
+ }
706
+ const nonBlank = body.filter((l) => l.trim() !== "");
707
+ if (nonBlank.length > 0) {
708
+ const minIndent = Math.min(...nonBlank.map((l) => l.length - l.trimStart().length));
709
+ const dedented = body.map((l) => (l.trim() === "" ? "" : l.slice(minIndent))).join("\n").trim();
710
+ if (dedented) {
711
+ findings.push(makeFinding(root, rel, "github-workflow", "run", dedented, String(i++), lineNo));
712
+ }
713
+ }
714
+ idx = j - 1;
376
715
  continue;
377
- findings.push(makeFinding(root, rel, "github-workflow", "run", cmd, String(i++)));
716
+ }
717
+ if (rest === "")
718
+ continue;
719
+ findings.push(makeFinding(root, rel, "github-workflow", "run", rest, String(i++), lineNo));
378
720
  }
379
721
  }
380
722
  }
@@ -384,7 +726,14 @@ function scanGitHooks(root, findings) {
384
726
  export function scanHooks(root) {
385
727
  const findings = [];
386
728
  const warnings = [];
387
- if (!existsSync(root)) {
729
+ let rootStat = null;
730
+ try {
731
+ rootStat = statSync(root);
732
+ }
733
+ catch {
734
+ rootStat = null;
735
+ }
736
+ if (!rootStat) {
388
737
  warnings.push(`Path does not exist: ${root}`);
389
738
  return {
390
739
  path: root, verdict: "REVIEW", findings, warnings,
@@ -392,6 +741,14 @@ export function scanHooks(root) {
392
741
  scannedAt: new Date().toISOString(),
393
742
  };
394
743
  }
744
+ if (!rootStat.isDirectory()) {
745
+ warnings.push(`Path is not a directory: ${root}`);
746
+ return {
747
+ path: root, verdict: "REVIEW", findings, warnings,
748
+ counts: { total: 0, safe: 0, risky: 0, unknown: 0 },
749
+ scannedAt: new Date().toISOString(),
750
+ };
751
+ }
395
752
  scanPackageJson(root, findings, warnings);
396
753
  scanClaude(root, findings, warnings);
397
754
  scanVscode(root, findings, warnings);
@@ -451,7 +808,7 @@ export function renderReport(report) {
451
808
  lines.push(`hookcheck ${report.path}: ${report.verdict}`);
452
809
  lines.push(` ${report.counts.total} hook(s): ${report.counts.safe} SAFE, ${report.counts.risky} RISKY, ${report.counts.unknown} UNKNOWN`);
453
810
  for (const f of report.findings) {
454
- lines.push(` [${f.classification}] ${f.id} (${f.source})`);
811
+ lines.push(` [${f.classification}] ${f.id} (${f.source}${f.line !== undefined ? `, line ${f.line}` : ""})`);
455
812
  lines.push(` command: ${f.command.slice(0, 200)}`);
456
813
  if (f.rules.length)
457
814
  lines.push(` rules: ${f.rules.join(", ")}`);
@@ -464,7 +821,7 @@ export function renderReport(report) {
464
821
  else if (report.verdict === "REVIEW")
465
822
  lines.push("REVIEW: at least one hook needs manual review.");
466
823
  else
467
- lines.push("COMPROMISED-PATTERN: at least one risky hook fetches remote code or touches credential stores. Treat as a Shai-Hulud style persistence pattern until proven otherwise.");
824
+ lines.push("COMPROMISED-PATTERN: at least one risky hook shows strong evidence: fetched or decoded content executed as code, or credential access combined with network behavior. Treat as a Shai-Hulud style persistence pattern until proven otherwise.");
468
825
  return lines.join("\n");
469
826
  }
470
827
  export { relative };
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -18,6 +18,8 @@ export interface HookFinding {
18
18
  hook: string;
19
19
  /** Exact command text that would auto-execute. */
20
20
  command: string;
21
+ /** 1-based line number of the hook inside its file, when known (workflow run steps). */
22
+ line?: number;
21
23
  classification: Classification;
22
24
  /** Rule ids that fired, e.g. ["NET-FETCH", "CRED-ACCESS"]. Empty for SAFE. */
23
25
  rules: string[];
package/package.json CHANGED
@@ -1 +1 @@
1
- {"bin":{"hookcheck":"dist/cli.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1","zod":"^3"},"description":"AI persistence hook auditor: scan a repo for auto-exec hooks (npm install scripts, Claude Code hooks, VS Code folderOpen tasks, husky, MCP autostart) and flag Shai-Hulud style persistence patterns.","devDependencies":{"@types/node":"^20","tsx":"^4","typescript":"^5"},"engines":{"node":">=20"},"files":["dist","server.json"],"homepage":"https://github.com/CloudCorpRecords/hookcheck#readme","license":"MIT","mcpName":"io.github.CloudCorpRecords/hookcheck","name":"@reneturcios/hookcheck","private":false,"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/CloudCorpRecords/hookcheck.git"},"scripts":{"build":"tsc","dev":"tsx src/cli.ts","test":"tsx --test test/*.test.ts"},"type":"module","version":"0.1.0"}
1
+ {"bin":{"hookcheck":"dist/cli.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1","zod":"^3"},"description":"AI persistence hook auditor: scan a repo for auto-exec hooks (npm install scripts, Claude Code hooks, VS Code folderOpen tasks, husky, MCP autostart) and flag Shai-Hulud style persistence patterns.","devDependencies":{"@types/node":"^20","tsx":"^4","typescript":"^5"},"engines":{"node":">=20"},"files":["dist","server.json"],"homepage":"https://github.com/CloudCorpRecords/hookcheck#readme","license":"MIT","mcpName":"io.github.CloudCorpRecords/hookcheck","name":"@reneturcios/hookcheck","private":false,"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/CloudCorpRecords/hookcheck.git"},"scripts":{"build":"tsc","dev":"tsx src/cli.ts","test":"tsx --test test/*.test.ts"},"type":"module","version":"0.1.2"}
package/server.json CHANGED
@@ -1 +1,52 @@
1
- {"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","description":"AI persistence hook auditor: scan a repo for auto-exec hooks and flag Shai-Hulud style persistence patterns.","name":"io.github.CloudCorpRecords/hookcheck","packages":[{"identifier":"@reneturcios/hookcheck","packageArguments":[{"type":"positional","value":"mcp"}],"registryBaseUrl":"https://registry.npmjs.org","registryType":"npm","runtimeHint":"npx","transport":{"type":"stdio"},"version":"0.1.0"},{"identifier":"ghcr.io/cloudcorprecords/hookcheck:0.1.0","packageArguments":[{"type":"positional","value":"mcp"}],"registryType":"oci","runtimeArguments":[{"name":"--rm","type":"named"},{"name":"-i","type":"named"}],"runtimeHint":"docker","transport":{"type":"stdio"}}],"repository":{"source":"github","url":"https://github.com/CloudCorpRecords/hookcheck"},"version":"0.1.0"}
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "description": "Persistence hook auditor: scan repos for auto-exec hooks, flag Shai-Hulud patterns.",
4
+ "name": "io.github.CloudCorpRecords/hookcheck",
5
+ "packages": [
6
+ {
7
+ "identifier": "@reneturcios/hookcheck",
8
+ "packageArguments": [
9
+ {
10
+ "type": "positional",
11
+ "value": "mcp"
12
+ }
13
+ ],
14
+ "registryBaseUrl": "https://registry.npmjs.org",
15
+ "registryType": "npm",
16
+ "runtimeHint": "npx",
17
+ "transport": {
18
+ "type": "stdio"
19
+ },
20
+ "version": "0.1.2"
21
+ },
22
+ {
23
+ "identifier": "ghcr.io/cloudcorprecords/hookcheck:0.1.2",
24
+ "packageArguments": [
25
+ {
26
+ "type": "positional",
27
+ "value": "mcp"
28
+ }
29
+ ],
30
+ "registryType": "oci",
31
+ "runtimeArguments": [
32
+ {
33
+ "name": "--rm",
34
+ "type": "named"
35
+ },
36
+ {
37
+ "name": "-i",
38
+ "type": "named"
39
+ }
40
+ ],
41
+ "runtimeHint": "docker",
42
+ "transport": {
43
+ "type": "stdio"
44
+ }
45
+ }
46
+ ],
47
+ "repository": {
48
+ "source": "github",
49
+ "url": "https://github.com/CloudCorpRecords/hookcheck"
50
+ },
51
+ "version": "0.1.2"
52
+ }