From 124b5d07433a08dd2f65a36d6d85ce5cbe9b47e2 Mon Sep 17 00:00:00 2001 From: SSgumS Date: Thu, 25 Jun 2026 10:15:38 +0400 Subject: [PATCH 1/3] fix(hooks): load ~/.agentmemory/.env before reading process.env All hook scripts read AGENTMEMORY_* vars at module level (const declarations before main()). If those vars live only in ~/.agentmemory/.env and not in the shell environment or settings.json, they were silently ignored. Fix: - Add src/hooks/_env.ts: synchronous .env parser that populates process.env for keys not already set (explicit env takes priority). - Import side-effect in src/hooks/_project.ts (already inlined first by the bundler into every hook that imports _project). - Direct import in the four hooks that bypass _project.ts: pre-tool-use, session-end, post-commit, stop. - Patch all 14 compiled plugin/scripts/*.mjs with an inline equivalent so the installed plugin works without a rebuild. --- plugin/scripts/notification.mjs | 26 +++++++++++++++++++----- plugin/scripts/post-commit.mjs | 24 +++++++++++++++++++--- plugin/scripts/post-tool-failure.mjs | 26 +++++++++++++++++++----- plugin/scripts/post-tool-use.mjs | 26 +++++++++++++++++++----- plugin/scripts/pre-compact.mjs | 26 +++++++++++++++++++----- plugin/scripts/pre-tool-use.mjs | 23 +++++++++++++++++++-- plugin/scripts/prompt-submit.mjs | 26 +++++++++++++++++++----- plugin/scripts/session-end.mjs | 23 +++++++++++++++++++-- plugin/scripts/session-start.mjs | 26 +++++++++++++++++++----- plugin/scripts/stop.mjs | 23 +++++++++++++++++++-- plugin/scripts/subagent-start.mjs | 26 +++++++++++++++++++----- plugin/scripts/subagent-stop.mjs | 26 +++++++++++++++++++----- plugin/scripts/task-completed.mjs | 26 +++++++++++++++++++----- src/hooks/_env.ts | 30 ++++++++++++++++++++++++++++ src/hooks/_project.ts | 1 + src/hooks/post-commit.ts | 1 + src/hooks/pre-tool-use.ts | 1 + src/hooks/session-end.ts | 1 + src/hooks/stop.ts | 1 + 19 files changed, 308 insertions(+), 54 deletions(-) create mode 100644 src/hooks/_env.ts diff --git a/plugin/scripts/notification.mjs b/plugin/scripts/notification.mjs index 3967158c9..d7a9e859b 100755 --- a/plugin/scripts/notification.mjs +++ b/plugin/scripts/notification.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/notification.ts function isSdkChildContext(payload) { @@ -70,7 +86,7 @@ async function main() { setTimeout(() => process.exit(0), 500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=notification.mjs.map \ No newline at end of file diff --git a/plugin/scripts/post-commit.mjs b/plugin/scripts/post-commit.mjs index 8552cd614..90f335ea3 100755 --- a/plugin/scripts/post-commit.mjs +++ b/plugin/scripts/post-commit.mjs @@ -1,7 +1,25 @@ #!/usr/bin/env node +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; import { execFile } from "node:child_process"; import { promisify } from "node:util"; - +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/post-commit.ts const exec = promisify(execFile); function isSdkChildContext(payload) { @@ -96,7 +114,7 @@ async function main() { } catch {} } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=post-commit.mjs.map \ No newline at end of file diff --git a/plugin/scripts/post-tool-failure.mjs b/plugin/scripts/post-tool-failure.mjs index 6fdad8d9d..11df4dc0f 100755 --- a/plugin/scripts/post-tool-failure.mjs +++ b/plugin/scripts/post-tool-failure.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/post-tool-failure.ts function isSdkChildContext(payload) { @@ -71,7 +87,7 @@ async function main() { setTimeout(() => process.exit(0), 500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=post-tool-failure.mjs.map \ No newline at end of file diff --git a/plugin/scripts/post-tool-use.mjs b/plugin/scripts/post-tool-use.mjs index b4aef9c94..414071c62 100755 --- a/plugin/scripts/post-tool-use.mjs +++ b/plugin/scripts/post-tool-use.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/post-tool-use.ts function isSdkChildContext(payload) { @@ -116,7 +132,7 @@ function truncate(value, max) { return value; } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=post-tool-use.mjs.map \ No newline at end of file diff --git a/plugin/scripts/pre-compact.mjs b/plugin/scripts/pre-compact.mjs index 0afdcb0b4..ab1d29085 100755 --- a/plugin/scripts/pre-compact.mjs +++ b/plugin/scripts/pre-compact.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/pre-compact.ts function isSdkChildContext(payload) { @@ -74,7 +90,7 @@ async function main() { } catch {} } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=pre-compact.mjs.map \ No newline at end of file diff --git a/plugin/scripts/pre-tool-use.mjs b/plugin/scripts/pre-tool-use.mjs index d70c166ed..3cea7bf65 100755 --- a/plugin/scripts/pre-tool-use.mjs +++ b/plugin/scripts/pre-tool-use.mjs @@ -1,4 +1,23 @@ #!/usr/bin/env node +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/pre-tool-use.ts function isSdkChildContext(payload) { if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true; @@ -78,7 +97,7 @@ async function main() { } catch {} } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=pre-tool-use.mjs.map \ No newline at end of file diff --git a/plugin/scripts/prompt-submit.mjs b/plugin/scripts/prompt-submit.mjs index 1a4147e6a..60d95e5d5 100755 --- a/plugin/scripts/prompt-submit.mjs +++ b/plugin/scripts/prompt-submit.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/prompt-submit.ts function isSdkChildContext(payload) { @@ -63,7 +79,7 @@ async function main() { setTimeout(() => process.exit(0), 500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=prompt-submit.mjs.map \ No newline at end of file diff --git a/plugin/scripts/session-end.mjs b/plugin/scripts/session-end.mjs index 019149c30..0174e4e61 100755 --- a/plugin/scripts/session-end.mjs +++ b/plugin/scripts/session-end.mjs @@ -1,4 +1,23 @@ #!/usr/bin/env node +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/session-end.ts function isSdkChildContext(payload) { if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true; @@ -54,7 +73,7 @@ async function main() { setTimeout(() => process.exit(0), 1500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=session-end.mjs.map \ No newline at end of file diff --git a/plugin/scripts/session-start.mjs b/plugin/scripts/session-start.mjs index 51b70eb4c..1dd1882e9 100755 --- a/plugin/scripts/session-start.mjs +++ b/plugin/scripts/session-start.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/session-start.ts function isSdkChildContext(payload) { @@ -81,7 +97,7 @@ async function main() { } catch {} } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=session-start.mjs.map \ No newline at end of file diff --git a/plugin/scripts/stop.mjs b/plugin/scripts/stop.mjs index 03d30c64f..afcaac84a 100755 --- a/plugin/scripts/stop.mjs +++ b/plugin/scripts/stop.mjs @@ -1,4 +1,23 @@ #!/usr/bin/env node +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/stop.ts function isSdkChildContext(payload) { if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true; @@ -38,7 +57,7 @@ async function main() { setTimeout(() => process.exit(0), 1500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=stop.mjs.map \ No newline at end of file diff --git a/plugin/scripts/subagent-start.mjs b/plugin/scripts/subagent-start.mjs index 2359a1c62..2dc339fb0 100755 --- a/plugin/scripts/subagent-start.mjs +++ b/plugin/scripts/subagent-start.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/subagent-start.ts function isSdkChildContext(payload) { @@ -69,7 +85,7 @@ async function main() { setTimeout(() => process.exit(0), 500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=subagent-start.mjs.map \ No newline at end of file diff --git a/plugin/scripts/subagent-stop.mjs b/plugin/scripts/subagent-stop.mjs index 2ba1b002c..123851b90 100755 --- a/plugin/scripts/subagent-stop.mjs +++ b/plugin/scripts/subagent-stop.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/subagent-stop.ts function isSdkChildContext(payload) { @@ -70,7 +86,7 @@ async function main() { setTimeout(() => process.exit(0), 500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=subagent-stop.mjs.map \ No newline at end of file diff --git a/plugin/scripts/task-completed.mjs b/plugin/scripts/task-completed.mjs index 478f0688e..f7f7d3afa 100755 --- a/plugin/scripts/task-completed.mjs +++ b/plugin/scripts/task-completed.mjs @@ -1,7 +1,24 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; -import { basename } from "node:path"; - +import { basename, join } from "node:path"; +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +//#region src/hooks/_env.ts +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); + if (!(key in process.env)) process.env[key] = val; + } +} catch {} +//#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { const explicit = process.env["AGENTMEMORY_PROJECT_NAME"]; @@ -21,7 +38,6 @@ function resolveProject(cwd) { } catch {} return basename(dir); } - //#endregion //#region src/hooks/task-completed.ts function isSdkChildContext(payload) { @@ -69,7 +85,7 @@ async function main() { setTimeout(() => process.exit(0), 500).unref(); } main(); - //#endregion -export { }; +export {}; + //# sourceMappingURL=task-completed.mjs.map \ No newline at end of file diff --git a/src/hooks/_env.ts b/src/hooks/_env.ts new file mode 100644 index 000000000..805823db4 --- /dev/null +++ b/src/hooks/_env.ts @@ -0,0 +1,30 @@ +import { readFileSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; + +// Load ~/.agentmemory/.env into process.env before any hook reads env vars. +// Keys already set in the environment (e.g. via Claude Code settings.json or +// the shell) take priority — this only fills gaps. +const envPath = join(homedir(), ".agentmemory", ".env"); +try { + const raw = readFileSync(envPath, "utf8"); + for (const line of raw.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq < 1) continue; + const key = trimmed.slice(0, eq).trim(); + let val = trimmed.slice(eq + 1).trim(); + if ( + (val.startsWith('"') && val.endsWith('"')) || + (val.startsWith("'") && val.endsWith("'")) + ) { + val = val.slice(1, -1); + } + if (!(key in process.env)) { + process.env[key] = val; + } + } +} catch { + // file absent or unreadable — skip silently +} diff --git a/src/hooks/_project.ts b/src/hooks/_project.ts index 35364ea3b..66f1c46d5 100644 --- a/src/hooks/_project.ts +++ b/src/hooks/_project.ts @@ -1,5 +1,6 @@ import { execSync } from "node:child_process"; import { basename } from "node:path"; +import "./_env.js"; // Resolution order: AGENTMEMORY_PROJECT_NAME env → git toplevel basename → cwd basename. export function resolveProject(cwd?: string): string { diff --git a/src/hooks/post-commit.ts b/src/hooks/post-commit.ts index 30c54a9ac..a7cdf6d12 100644 --- a/src/hooks/post-commit.ts +++ b/src/hooks/post-commit.ts @@ -1,4 +1,5 @@ #!/usr/bin/env node +import "./_env.js"; import { execFile } from "node:child_process"; import { promisify } from "node:util"; diff --git a/src/hooks/pre-tool-use.ts b/src/hooks/pre-tool-use.ts index 277d7799b..6aff4a7dc 100644 --- a/src/hooks/pre-tool-use.ts +++ b/src/hooks/pre-tool-use.ts @@ -1,4 +1,5 @@ #!/usr/bin/env node +import "./_env.js"; function isSdkChildContext(payload: unknown): boolean { if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true; diff --git a/src/hooks/session-end.ts b/src/hooks/session-end.ts index 6a9fc429c..76cfb4166 100644 --- a/src/hooks/session-end.ts +++ b/src/hooks/session-end.ts @@ -1,4 +1,5 @@ #!/usr/bin/env node +import "./_env.js"; function isSdkChildContext(payload: unknown): boolean { if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true; diff --git a/src/hooks/stop.ts b/src/hooks/stop.ts index 4103796e0..d4d2d2a1e 100644 --- a/src/hooks/stop.ts +++ b/src/hooks/stop.ts @@ -1,4 +1,5 @@ #!/usr/bin/env node +import "./_env.js"; // Inlined — see src/hooks/sdk-guard.ts for canonical version. Kept local // per-hook so tsdown does not emit a shared hashed chunk that would churn From 5fe8d5af660aeec621737e13b506324f919e0e51 Mon Sep 17 00:00:00 2001 From: SSgumS Date: Thu, 25 Jun 2026 12:00:39 +0400 Subject: [PATCH 2/3] refactor(hooks/_env): replace custom .env parser with dotenv dotenv is already a project dependency (^17.4.2) and provides the same non-override behavior (dotenv.config() does not overwrite existing keys) with no custom parsing or error handling needed. --- plugin/scripts/notification.mjs | 17 ++--------------- plugin/scripts/post-commit.mjs | 17 ++--------------- plugin/scripts/post-tool-failure.mjs | 17 ++--------------- plugin/scripts/post-tool-use.mjs | 17 ++--------------- plugin/scripts/pre-compact.mjs | 17 ++--------------- plugin/scripts/pre-tool-use.mjs | 17 ++--------------- plugin/scripts/prompt-submit.mjs | 17 ++--------------- plugin/scripts/session-end.mjs | 17 ++--------------- plugin/scripts/session-start.mjs | 17 ++--------------- plugin/scripts/stop.mjs | 17 ++--------------- plugin/scripts/subagent-start.mjs | 17 ++--------------- plugin/scripts/subagent-stop.mjs | 17 ++--------------- plugin/scripts/task-completed.mjs | 17 ++--------------- src/hooks/_env.ts | 28 +++------------------------- 14 files changed, 29 insertions(+), 220 deletions(-) diff --git a/plugin/scripts/notification.mjs b/plugin/scripts/notification.mjs index d7a9e859b..a25244e43 100755 --- a/plugin/scripts/notification.mjs +++ b/plugin/scripts/notification.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/post-commit.mjs b/plugin/scripts/post-commit.mjs index 90f335ea3..38df567af 100755 --- a/plugin/scripts/post-commit.mjs +++ b/plugin/scripts/post-commit.mjs @@ -1,24 +1,11 @@ #!/usr/bin/env node -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; import { execFile } from "node:child_process"; import { promisify } from "node:util"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/post-commit.ts const exec = promisify(execFile); diff --git a/plugin/scripts/post-tool-failure.mjs b/plugin/scripts/post-tool-failure.mjs index 11df4dc0f..f9435974c 100755 --- a/plugin/scripts/post-tool-failure.mjs +++ b/plugin/scripts/post-tool-failure.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/post-tool-use.mjs b/plugin/scripts/post-tool-use.mjs index 414071c62..f090299f1 100755 --- a/plugin/scripts/post-tool-use.mjs +++ b/plugin/scripts/post-tool-use.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/pre-compact.mjs b/plugin/scripts/pre-compact.mjs index ab1d29085..66f925920 100755 --- a/plugin/scripts/pre-compact.mjs +++ b/plugin/scripts/pre-compact.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/pre-tool-use.mjs b/plugin/scripts/pre-tool-use.mjs index 3cea7bf65..6f9b99009 100755 --- a/plugin/scripts/pre-tool-use.mjs +++ b/plugin/scripts/pre-tool-use.mjs @@ -1,22 +1,9 @@ #!/usr/bin/env node -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/pre-tool-use.ts function isSdkChildContext(payload) { diff --git a/plugin/scripts/prompt-submit.mjs b/plugin/scripts/prompt-submit.mjs index 60d95e5d5..950704d0c 100755 --- a/plugin/scripts/prompt-submit.mjs +++ b/plugin/scripts/prompt-submit.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/session-end.mjs b/plugin/scripts/session-end.mjs index 0174e4e61..9e1e3e256 100755 --- a/plugin/scripts/session-end.mjs +++ b/plugin/scripts/session-end.mjs @@ -1,22 +1,9 @@ #!/usr/bin/env node -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/session-end.ts function isSdkChildContext(payload) { diff --git a/plugin/scripts/session-start.mjs b/plugin/scripts/session-start.mjs index 1dd1882e9..7bc75aa44 100755 --- a/plugin/scripts/session-start.mjs +++ b/plugin/scripts/session-start.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/stop.mjs b/plugin/scripts/stop.mjs index afcaac84a..ee9ff3589 100755 --- a/plugin/scripts/stop.mjs +++ b/plugin/scripts/stop.mjs @@ -1,22 +1,9 @@ #!/usr/bin/env node -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/stop.ts function isSdkChildContext(payload) { diff --git a/plugin/scripts/subagent-start.mjs b/plugin/scripts/subagent-start.mjs index 2dc339fb0..c69a6561c 100755 --- a/plugin/scripts/subagent-start.mjs +++ b/plugin/scripts/subagent-start.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/subagent-stop.mjs b/plugin/scripts/subagent-stop.mjs index 123851b90..de81d890b 100755 --- a/plugin/scripts/subagent-stop.mjs +++ b/plugin/scripts/subagent-stop.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/task-completed.mjs b/plugin/scripts/task-completed.mjs index f7f7d3afa..7599046d0 100755 --- a/plugin/scripts/task-completed.mjs +++ b/plugin/scripts/task-completed.mjs @@ -1,23 +1,10 @@ #!/usr/bin/env node import { execSync } from "node:child_process"; import { basename, join } from "node:path"; -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if (val.startsWith("\"") && val.endsWith("\"") || val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1); - if (!(key in process.env)) process.env[key] = val; - } -} catch {} +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/src/hooks/_env.ts b/src/hooks/_env.ts index 805823db4..42e2dd544 100644 --- a/src/hooks/_env.ts +++ b/src/hooks/_env.ts @@ -1,30 +1,8 @@ -import { readFileSync } from "node:fs"; +import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; // Load ~/.agentmemory/.env into process.env before any hook reads env vars. // Keys already set in the environment (e.g. via Claude Code settings.json or -// the shell) take priority — this only fills gaps. -const envPath = join(homedir(), ".agentmemory", ".env"); -try { - const raw = readFileSync(envPath, "utf8"); - for (const line of raw.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq < 1) continue; - const key = trimmed.slice(0, eq).trim(); - let val = trimmed.slice(eq + 1).trim(); - if ( - (val.startsWith('"') && val.endsWith('"')) || - (val.startsWith("'") && val.endsWith("'")) - ) { - val = val.slice(1, -1); - } - if (!(key in process.env)) { - process.env[key] = val; - } - } -} catch { - // file absent or unreadable — skip silently -} +// the shell) take priority — dotenv.config() does not override by default. +dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); From 0f8ede1fa006fea5a25570ee39a755a548153630 Mon Sep 17 00:00:00 2001 From: SSgumS Date: Thu, 25 Jun 2026 12:30:24 +0400 Subject: [PATCH 3/3] fix(hooks/_env): suppress dotenv stdout banner with quiet: true MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dotenv v17 logs "◇ injected env (N) from ..." to stdout by default. Hooks use stdout for protocol output (session-start writes context there), so this banner corrupts the payload. quiet: true silences it. --- plugin/scripts/notification.mjs | 5 ++++- plugin/scripts/post-commit.mjs | 5 ++++- plugin/scripts/post-tool-failure.mjs | 5 ++++- plugin/scripts/post-tool-use.mjs | 5 ++++- plugin/scripts/pre-compact.mjs | 5 ++++- plugin/scripts/pre-tool-use.mjs | 5 ++++- plugin/scripts/prompt-submit.mjs | 5 ++++- plugin/scripts/session-end.mjs | 5 ++++- plugin/scripts/session-start.mjs | 5 ++++- plugin/scripts/stop.mjs | 5 ++++- plugin/scripts/subagent-start.mjs | 5 ++++- plugin/scripts/subagent-stop.mjs | 5 ++++- plugin/scripts/task-completed.mjs | 5 ++++- src/hooks/_env.ts | 2 +- 14 files changed, 53 insertions(+), 14 deletions(-) diff --git a/plugin/scripts/notification.mjs b/plugin/scripts/notification.mjs index a25244e43..33cc55959 100755 --- a/plugin/scripts/notification.mjs +++ b/plugin/scripts/notification.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/post-commit.mjs b/plugin/scripts/post-commit.mjs index 38df567af..256b575c3 100755 --- a/plugin/scripts/post-commit.mjs +++ b/plugin/scripts/post-commit.mjs @@ -5,7 +5,10 @@ import { join } from "node:path"; import { execFile } from "node:child_process"; import { promisify } from "node:util"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/post-commit.ts const exec = promisify(execFile); diff --git a/plugin/scripts/post-tool-failure.mjs b/plugin/scripts/post-tool-failure.mjs index f9435974c..5be4a3c5d 100755 --- a/plugin/scripts/post-tool-failure.mjs +++ b/plugin/scripts/post-tool-failure.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/post-tool-use.mjs b/plugin/scripts/post-tool-use.mjs index f090299f1..4ca76af3d 100755 --- a/plugin/scripts/post-tool-use.mjs +++ b/plugin/scripts/post-tool-use.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/pre-compact.mjs b/plugin/scripts/pre-compact.mjs index 66f925920..2d8a524ee 100755 --- a/plugin/scripts/pre-compact.mjs +++ b/plugin/scripts/pre-compact.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/pre-tool-use.mjs b/plugin/scripts/pre-tool-use.mjs index 6f9b99009..19e210580 100755 --- a/plugin/scripts/pre-tool-use.mjs +++ b/plugin/scripts/pre-tool-use.mjs @@ -3,7 +3,10 @@ import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/pre-tool-use.ts function isSdkChildContext(payload) { diff --git a/plugin/scripts/prompt-submit.mjs b/plugin/scripts/prompt-submit.mjs index 950704d0c..56874ea92 100755 --- a/plugin/scripts/prompt-submit.mjs +++ b/plugin/scripts/prompt-submit.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/session-end.mjs b/plugin/scripts/session-end.mjs index 9e1e3e256..0295ef8aa 100755 --- a/plugin/scripts/session-end.mjs +++ b/plugin/scripts/session-end.mjs @@ -3,7 +3,10 @@ import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/session-end.ts function isSdkChildContext(payload) { diff --git a/plugin/scripts/session-start.mjs b/plugin/scripts/session-start.mjs index 7bc75aa44..dbd59a435 100755 --- a/plugin/scripts/session-start.mjs +++ b/plugin/scripts/session-start.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/stop.mjs b/plugin/scripts/stop.mjs index ee9ff3589..abd10f78e 100755 --- a/plugin/scripts/stop.mjs +++ b/plugin/scripts/stop.mjs @@ -3,7 +3,10 @@ import dotenv from "dotenv"; import { homedir } from "node:os"; import { join } from "node:path"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/stop.ts function isSdkChildContext(payload) { diff --git a/plugin/scripts/subagent-start.mjs b/plugin/scripts/subagent-start.mjs index c69a6561c..eeb0c6916 100755 --- a/plugin/scripts/subagent-start.mjs +++ b/plugin/scripts/subagent-start.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/subagent-stop.mjs b/plugin/scripts/subagent-stop.mjs index de81d890b..9ecaf3444 100755 --- a/plugin/scripts/subagent-stop.mjs +++ b/plugin/scripts/subagent-stop.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/plugin/scripts/task-completed.mjs b/plugin/scripts/task-completed.mjs index 7599046d0..c32019f4e 100755 --- a/plugin/scripts/task-completed.mjs +++ b/plugin/scripts/task-completed.mjs @@ -4,7 +4,10 @@ import { basename, join } from "node:path"; import dotenv from "dotenv"; import { homedir } from "node:os"; //#region src/hooks/_env.ts -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ + path: join(homedir(), ".agentmemory", ".env"), + quiet: true +}); //#endregion //#region src/hooks/_project.ts function resolveProject(cwd) { diff --git a/src/hooks/_env.ts b/src/hooks/_env.ts index 42e2dd544..d66f91154 100644 --- a/src/hooks/_env.ts +++ b/src/hooks/_env.ts @@ -5,4 +5,4 @@ import { join } from "node:path"; // Load ~/.agentmemory/.env into process.env before any hook reads env vars. // Keys already set in the environment (e.g. via Claude Code settings.json or // the shell) take priority — dotenv.config() does not override by default. -dotenv.config({ path: join(homedir(), ".agentmemory", ".env") }); +dotenv.config({ path: join(homedir(), ".agentmemory", ".env"), quiet: true });