Lines 8-48javascript
9// Composes on weeklyCurate() per design §8.7.1. Always exits 0 — a
10// crashed cron job rotates noise into the scheduler logs without any
11// recovery affordance for the user; the kit's curate.log NDJSON +
12// cooldown marker are the load-bearing observability surfaces.
14import { dirname, join } from 'node:path';
15import { homedir } from 'node:os';
16import { fileURLToPath, pathToFileURL } from 'node:url';
18const __filename = fileURLToPath(import.meta.url);
19const __dirname = dirname(__filename);
21const weeklyCurateModulePath = join(__dirname, '..', 'src', 'weekly-curate.mjs');
22const makeBackendModulePath = join(__dirname, '..', 'src', 'make-backend.mjs');
23const compactionStateModulePath = join(__dirname, '..', 'src', 'compaction-state.mjs');
27let recordCronHeartbeat;
29 ({ weeklyCurate } = await import(pathToFileURL(weeklyCurateModulePath).href));
30 ({ makeBackend } = await import(pathToFileURL(makeBackendModulePath).href));
MediumDynamic Require
Package source references dynamic require/import behavior.
bin/cmk-weekly-curate.mjsView on unpkg · L28 31 ({ recordCronHeartbeat } = await import(pathToFileURL(compactionStateModulePath).href));
34 `cmk-weekly-curate: failed to load modules: ${err?.message ?? err}\n`,
39// Task 36 B1 fix: accept projectRoot via argv[2] (the registered cron
40// emits an absolute path here). Env var + cwd remain as fallbacks.
41// See cmk-daily-distill.mjs for rationale.
42const argvRoot = process.argv[2] && process.argv[2].length > 0 ? process.argv[2] : null;
43const envRoot = process.env.CMK_PROJECT_DIR && process.env.CMK_PROJECT_DIR.length > 0
44 ? process.env.CMK_PROJECT_DIR
46const projectRoot = argvRoot ?? envRoot ?? process.cwd();
48// User tier (cross-project) lives at ~/.claude-memory-kit. Passing it