@monoes/monomindcli 2.16.1 → 2.16.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/.claude/helpers/handlers/edit-handler.cjs +14 -12
- package/.claude/helpers/handlers/route-handler.cjs +6 -0
- package/.claude/helpers/monograph-freshen.cjs +31 -113
- package/.claude/helpers/utils/monograph-resolve.cjs +497 -0
- package/.claude/helpers/utils/monograph.cjs +8 -51
- package/README.md +1 -1
- package/dist/src/commands/doctor-hook-monograph-checks.d.ts +8 -0
- package/dist/src/commands/doctor-hook-monograph-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-hook-monograph-checks.js +79 -0
- package/dist/src/commands/doctor-hook-monograph-checks.js.map +1 -0
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +4 -1
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +16 -1
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/orgrt/bash-timeout.d.ts +14 -0
- package/dist/src/orgrt/bash-timeout.d.ts.map +1 -0
- package/dist/src/orgrt/bash-timeout.js +18 -0
- package/dist/src/orgrt/bash-timeout.js.map +1 -0
- package/dist/src/orgrt/block-recheck.d.ts +30 -0
- package/dist/src/orgrt/block-recheck.d.ts.map +1 -0
- package/dist/src/orgrt/block-recheck.js +81 -0
- package/dist/src/orgrt/block-recheck.js.map +1 -0
- package/dist/src/orgrt/completion-gate.d.ts +4 -0
- package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
- package/dist/src/orgrt/completion-gate.js +22 -2
- package/dist/src/orgrt/completion-gate.js.map +1 -1
- package/dist/src/orgrt/daemon.d.ts.map +1 -1
- package/dist/src/orgrt/daemon.js +6 -4
- package/dist/src/orgrt/daemon.js.map +1 -1
- package/dist/src/orgrt/decisions.d.ts +1 -1
- package/dist/src/orgrt/decisions.d.ts.map +1 -1
- package/dist/src/orgrt/decisions.js +14 -6
- package/dist/src/orgrt/decisions.js.map +1 -1
- package/dist/src/orgrt/mailbox.d.ts +14 -0
- package/dist/src/orgrt/mailbox.d.ts.map +1 -1
- package/dist/src/orgrt/mailbox.js +31 -1
- package/dist/src/orgrt/mailbox.js.map +1 -1
- package/dist/src/orgrt/sandbox-fault.d.ts +16 -6
- package/dist/src/orgrt/sandbox-fault.d.ts.map +1 -1
- package/dist/src/orgrt/sandbox-fault.js +78 -33
- package/dist/src/orgrt/sandbox-fault.js.map +1 -1
- package/dist/src/orgrt/session.d.ts +4 -3
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +24 -13
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/task-dag.d.ts +8 -2
- package/dist/src/orgrt/task-dag.d.ts.map +1 -1
- package/dist/src/orgrt/task-dag.js +10 -4
- package/dist/src/orgrt/task-dag.js.map +1 -1
- package/dist/src/orgrt/types.d.ts +11 -0
- package/dist/src/orgrt/types.d.ts.map +1 -1
- package/dist/src/orgrt/types.js +18 -0
- package/dist/src/orgrt/types.js.map +1 -1
- package/dist/src/utils/resource-governor.d.ts.map +1 -1
- package/dist/src/utils/resource-governor.js +35 -2
- package/dist/src/utils/resource-governor.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/.claude/skills/monodesign/SKILL.md +0 -257
- package/.claude/skills/monodesign/adapt.md +0 -53
- package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +0 -100
- package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +0 -103
- package/.claude/skills/monodesign/animate.md +0 -65
- package/.claude/skills/monodesign/audit.md +0 -89
- package/.claude/skills/monodesign/bolder.md +0 -50
- package/.claude/skills/monodesign/clarify.md +0 -64
- package/.claude/skills/monodesign/colorize.md +0 -68
- package/.claude/skills/monodesign/craft.md +0 -51
- package/.claude/skills/monodesign/critique.md +0 -66
- package/.claude/skills/monodesign/delight.md +0 -47
- package/.claude/skills/monodesign/distill.md +0 -56
- package/.claude/skills/monodesign/document.md +0 -83
- package/.claude/skills/monodesign/extract.md +0 -74
- package/.claude/skills/monodesign/harden.md +0 -65
- package/.claude/skills/monodesign/init.md +0 -30
- package/.claude/skills/monodesign/layout.md +0 -36
- package/.claude/skills/monodesign/live.md +0 -34
- package/.claude/skills/monodesign/onboard.md +0 -50
- package/.claude/skills/monodesign/optimize.md +0 -64
- package/.claude/skills/monodesign/overdrive.md +0 -56
- package/.claude/skills/monodesign/polish.md +0 -68
- package/.claude/skills/monodesign/quieter.md +0 -57
- package/.claude/skills/monodesign/reference/adapt.md +0 -312
- package/.claude/skills/monodesign/reference/adapt.native.md +0 -58
- package/.claude/skills/monodesign/reference/android.md +0 -40
- package/.claude/skills/monodesign/reference/animate.md +0 -203
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +0 -410
- package/.claude/skills/monodesign/reference/audit.md +0 -135
- package/.claude/skills/monodesign/reference/audit.native.md +0 -139
- package/.claude/skills/monodesign/reference/bolder.md +0 -120
- package/.claude/skills/monodesign/reference/brand-workflow.md +0 -180
- package/.claude/skills/monodesign/reference/brand.md +0 -108
- package/.claude/skills/monodesign/reference/clarify.md +0 -288
- package/.claude/skills/monodesign/reference/codex.md +0 -105
- package/.claude/skills/monodesign/reference/cognitive-load.md +0 -106
- package/.claude/skills/monodesign/reference/color-and-contrast.md +0 -105
- package/.claude/skills/monodesign/reference/colorize.md +0 -257
- package/.claude/skills/monodesign/reference/component-specs.md +0 -260
- package/.claude/skills/monodesign/reference/component-states.md +0 -274
- package/.claude/skills/monodesign/reference/component-system.md +0 -358
- package/.claude/skills/monodesign/reference/copy-formulas.md +0 -160
- package/.claude/skills/monodesign/reference/craft.md +0 -123
- package/.claude/skills/monodesign/reference/critique.md +0 -780
- package/.claude/skills/monodesign/reference/delight.md +0 -302
- package/.claude/skills/monodesign/reference/design-principles.md +0 -246
- package/.claude/skills/monodesign/reference/distill.md +0 -111
- package/.claude/skills/monodesign/reference/document.md +0 -429
- package/.claude/skills/monodesign/reference/extract.md +0 -69
- package/.claude/skills/monodesign/reference/harden.md +0 -347
- package/.claude/skills/monodesign/reference/heuristics-scoring.md +0 -234
- package/.claude/skills/monodesign/reference/hooks.md +0 -92
- package/.claude/skills/monodesign/reference/image-prompts.md +0 -130
- package/.claude/skills/monodesign/reference/init.md +0 -221
- package/.claude/skills/monodesign/reference/interaction-design.md +0 -189
- package/.claude/skills/monodesign/reference/ios.md +0 -45
- package/.claude/skills/monodesign/reference/layout.md +0 -185
- package/.claude/skills/monodesign/reference/live.md +0 -710
- package/.claude/skills/monodesign/reference/motion-design.md +0 -109
- package/.claude/skills/monodesign/reference/onboard.md +0 -234
- package/.claude/skills/monodesign/reference/optimize.md +0 -258
- package/.claude/skills/monodesign/reference/overdrive.md +0 -130
- package/.claude/skills/monodesign/reference/personas.md +0 -179
- package/.claude/skills/monodesign/reference/polish.md +0 -241
- package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +0 -108
- package/.claude/skills/monodesign/reference/product.md +0 -60
- package/.claude/skills/monodesign/reference/quieter.md +0 -99
- package/.claude/skills/monodesign/reference/responsive-design.md +0 -114
- package/.claude/skills/monodesign/reference/shape.md +0 -165
- package/.claude/skills/monodesign/reference/spatial-design.md +0 -100
- package/.claude/skills/monodesign/reference/teach.md +0 -10
- package/.claude/skills/monodesign/reference/token-architecture.md +0 -222
- package/.claude/skills/monodesign/reference/typeset.md +0 -301
- package/.claude/skills/monodesign/reference/typography.md +0 -159
- package/.claude/skills/monodesign/reference/ux-research.md +0 -143
- package/.claude/skills/monodesign/reference/ux-rules.md +0 -211
- package/.claude/skills/monodesign/reference/ux-writing.md +0 -107
- package/.claude/skills/monodesign/scripts/command-metadata.json +0 -94
- package/.claude/skills/monodesign/scripts/context-signals.mjs +0 -260
- package/.claude/skills/monodesign/scripts/context.mjs +0 -1065
- package/.claude/skills/monodesign/scripts/critique-storage.mjs +0 -416
- package/.claude/skills/monodesign/scripts/detect-csp.mjs +0 -193
- package/.claude/skills/monodesign/scripts/detect.mjs +0 -33
- package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +0 -1960
- package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +0 -321
- package/.claude/skills/monodesign/scripts/detector/design-system.mjs +0 -814
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +0 -5628
- package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +0 -50
- package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +0 -259
- package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +0 -339
- package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +0 -636
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +0 -1016
- package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +0 -253
- package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -198
- package/.claude/skills/monodesign/scripts/detector/findings.mjs +0 -12
- package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +0 -181
- package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +0 -373
- package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +0 -426
- package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +0 -198
- package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +0 -166
- package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +0 -563
- package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +0 -3024
- package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +0 -124
- package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +0 -101
- package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +0 -30
- package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +0 -148
- package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +0 -7
- package/.claude/skills/monodesign/scripts/hook-admin.mjs +0 -694
- package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +0 -516
- package/.claude/skills/monodesign/scripts/hook-lib.mjs +0 -1785
- package/.claude/skills/monodesign/scripts/hook.mjs +0 -61
- package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +0 -809
- package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +0 -69
- package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +0 -640
- package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +0 -129
- package/.claude/skills/monodesign/scripts/lib/provider.mjs +0 -4
- package/.claude/skills/monodesign/scripts/lib/target-args.mjs +0 -42
- package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +0 -50
- package/.claude/skills/monodesign/scripts/live/completion.mjs +0 -19
- package/.claude/skills/monodesign/scripts/live/event-validation.mjs +0 -137
- package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +0 -458
- package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +0 -939
- package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +0 -357
- package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +0 -152
- package/.claude/skills/monodesign/scripts/live/session-store.mjs +0 -293
- package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +0 -826
- package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +0 -279
- package/.claude/skills/monodesign/scripts/live/ui-core.mjs +0 -180
- package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +0 -36
- package/.claude/skills/monodesign/scripts/live-accept.mjs +0 -812
- package/.claude/skills/monodesign/scripts/live-browser-dom.js +0 -147
- package/.claude/skills/monodesign/scripts/live-browser-session.js +0 -124
- package/.claude/skills/monodesign/scripts/live-browser.js +0 -11213
- package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +0 -1241
- package/.claude/skills/monodesign/scripts/live-complete.mjs +0 -75
- package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +0 -683
- package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +0 -51
- package/.claude/skills/monodesign/scripts/live-inject.mjs +0 -596
- package/.claude/skills/monodesign/scripts/live-insert.mjs +0 -272
- package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +0 -363
- package/.claude/skills/monodesign/scripts/live-poll.mjs +0 -384
- package/.claude/skills/monodesign/scripts/live-resume.mjs +0 -94
- package/.claude/skills/monodesign/scripts/live-server.mjs +0 -1210
- package/.claude/skills/monodesign/scripts/live-status.mjs +0 -61
- package/.claude/skills/monodesign/scripts/live-target.mjs +0 -30
- package/.claude/skills/monodesign/scripts/live-wrap.mjs +0 -884
- package/.claude/skills/monodesign/scripts/live.mjs +0 -297
- package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +0 -14
- package/.claude/skills/monodesign/scripts/palette.mjs +0 -635
- package/.claude/skills/monodesign/scripts/pin.mjs +0 -221
- package/.claude/skills/monodesign/shape.md +0 -71
- package/.claude/skills/monodesign/teach.md +0 -18
- package/.claude/skills/monodesign/typeset.md +0 -59
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
7
|
const fs = require('fs');
|
|
8
|
-
const {
|
|
8
|
+
const { claimRebuildLock, startRebuild } = require('../utils/monograph-resolve.cjs');
|
|
9
9
|
|
|
10
10
|
module.exports = {
|
|
11
11
|
handle: async function(hCtx) {
|
|
@@ -102,18 +102,20 @@ module.exports = {
|
|
|
102
102
|
// check and spawns its own rebuild + ua-enrich child (see the
|
|
103
103
|
// 896-orphan-process incident fixed in control-start.cjs). claimLock
|
|
104
104
|
// mirrors that same TOCTOU-safe stale-lock-breaking pattern.
|
|
105
|
-
|
|
105
|
+
// #328: the rebuild child now owns the lock (its PID replaces ours)
|
|
106
|
+
// and removes it when done, so a running rebuild blocks a second one
|
|
107
|
+
// and a lock left by an exited process is stale after the cooldown.
|
|
108
|
+
if (claimRebuildLock(lockFile, COOLDOWN_MS, 10 * 60 * 1000)) {
|
|
106
109
|
var { spawn: spawnRebuild } = require('child_process');
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
var
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
console.log('[MONOGRAPH] Incremental rebuild triggered for ' + path.basename(editedFile2));
|
|
110
|
+
// Resolves @monoes/monograph to an absolute path (project, global
|
|
111
|
+
// npm, npx cache) and imports it by file URL — a bare-specifier
|
|
112
|
+
// import only finds a project-local install. Falls back to
|
|
113
|
+
// `monomind monograph build`; with neither, it records one deduped
|
|
114
|
+
// failure line instead of an ERR_MODULE_NOT_FOUND per edit.
|
|
115
|
+
var rebuild = startRebuild(CWD, { lockPath: lockFile });
|
|
116
|
+
if (rebuild.mode !== 'none') {
|
|
117
|
+
console.log('[MONOGRAPH] Incremental rebuild triggered for ' + path.basename(editedFile2));
|
|
118
|
+
}
|
|
117
119
|
|
|
118
120
|
// Option C: fire ua-enrich.mjs in background after monograph rebuild
|
|
119
121
|
var uaEnrichScript = path.join(CWD, 'scripts', 'ua-enrich.mjs');
|
|
@@ -978,6 +978,12 @@ module.exports = {
|
|
|
978
978
|
advisoryLog('[MONOGRAPH] ' + nodeCount + ' nodes. Call mcp__monomind__monograph_suggest to find relevant files.');
|
|
979
979
|
hCtx._recordGraphTelemetry('preresolve_miss');
|
|
980
980
|
}
|
|
981
|
+
} else if (!hintDb || nodeCount > 100) {
|
|
982
|
+
// #328: the gate and these hints switch off when the hooks can't
|
|
983
|
+
// open the graph or it is past the 50-commit limit. Say so once per
|
|
984
|
+
// cause (not per prompt), even under MONOMIND_HOOK_QUIET.
|
|
985
|
+
var offNotice = require('../utils/monograph-resolve.cjs').graphOffNoticeOnce(CWD, hintDb || null);
|
|
986
|
+
if (offNotice) console.log(offNotice);
|
|
981
987
|
}
|
|
982
988
|
} catch(e) {}
|
|
983
989
|
|
|
@@ -5,91 +5,38 @@
|
|
|
5
5
|
if (String(process.env.MONOMIND_SDK_AGENT || '') === '1') process.exit(0);
|
|
6
6
|
const path = require('path');
|
|
7
7
|
const fs = require('fs');
|
|
8
|
-
const
|
|
9
|
-
const { pathToFileURL } = require('url');
|
|
10
|
-
const { claimLock } = require('./utils/fs-helpers.cjs');
|
|
8
|
+
const mg = require('./utils/monograph-resolve.cjs');
|
|
11
9
|
|
|
12
10
|
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
13
11
|
const graphDir = path.join(projectDir, '.monomind', 'graph');
|
|
14
12
|
fs.mkdirSync(graphDir, { recursive: true });
|
|
13
|
+
const quiet = String(process.env.MONOMIND_HOOK_QUIET || '') === '1';
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
for (const e of entries.sort().reverse()) { // newest version first
|
|
29
|
-
const p = path.join(storeBase, e, 'node_modules', '@monoes', 'monograph', 'dist', 'src', 'index.js');
|
|
30
|
-
if (fs.existsSync(p)) return p;
|
|
31
|
-
}
|
|
32
|
-
} catch {}
|
|
33
|
-
return null;
|
|
34
|
-
})();
|
|
35
|
-
|
|
36
|
-
const candidates = [
|
|
37
|
-
// Monorepo workspace build FIRST — it carries unpublished fixes; the pnpm store
|
|
38
|
-
// holds registry tarballs that can lag behind the workspace source.
|
|
39
|
-
path.join(dir, 'packages', '@monomind', 'monograph', 'dist', 'src', 'index.js'),
|
|
40
|
-
// Installed as a flat dependency (follows workspace symlinks when linked)
|
|
41
|
-
path.join(dir, 'node_modules', '@monoes', 'monograph', 'dist', 'src', 'index.js'),
|
|
42
|
-
path.join(dir, 'node_modules', '@monomind', 'monograph', 'dist', 'src', 'index.js'),
|
|
43
|
-
// Monorepo: monomind root is the monograph package
|
|
44
|
-
path.join(dir, 'dist', 'src', 'index.js'),
|
|
45
|
-
// pnpm store registry copy
|
|
46
|
-
pnpmStore,
|
|
47
|
-
].filter(Boolean);
|
|
48
|
-
for (const c of candidates) {
|
|
49
|
-
if (fs.existsSync(c)) return c;
|
|
15
|
+
// Same resolution as the post-edit rebuild and every other hook consumer:
|
|
16
|
+
// project install, global npm root, then the copy bundled with the monomind
|
|
17
|
+
// CLI in the npx cache (#328).
|
|
18
|
+
const resolved = mg.resolveMonographEntry(projectDir);
|
|
19
|
+
const native = resolved ? mg.checkNative(resolved, projectDir) : null;
|
|
20
|
+
const canRebuild = resolved ? native.ok : !!mg.findMonomindBin(projectDir);
|
|
21
|
+
if (!canRebuild) {
|
|
22
|
+
if (!resolved) {
|
|
23
|
+
mg.recordRebuildFailure(projectDir, 'unresolvable',
|
|
24
|
+
'@monoes/monograph not found in the project, the global npm root or the npx cache', mg.GLOBAL_FIX);
|
|
25
|
+
} else {
|
|
26
|
+
mg.recordRebuildFailure(projectDir, 'native', 'better-sqlite3 failed to load: ' + native.error, native.fix);
|
|
50
27
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
const { execSync } = require('child_process');
|
|
57
|
-
const globalRoot = execSync('npm root -g', { encoding: 'utf-8', timeout: 5000 }).trim();
|
|
58
|
-
const p = path.join(globalRoot, '@monoes', 'monograph', 'dist', 'src', 'index.js');
|
|
59
|
-
if (fs.existsSync(p)) return p;
|
|
60
|
-
} catch {}
|
|
61
|
-
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const entryPoint = resolveMonographEntry(projectDir);
|
|
66
|
-
if (!entryPoint) {
|
|
67
|
-
console.error('[graph] @monoes/monograph not found — skipping build');
|
|
28
|
+
// SessionStart stdout reaches the session; stderr of this hook does not.
|
|
29
|
+
const warning = mg.sessionWarning(mg.diagnose(projectDir));
|
|
30
|
+
if (warning) console.log(warning);
|
|
31
|
+
else if (!resolved) console.error('[graph] @monoes/monograph not found — skipping build');
|
|
68
32
|
process.exit(0);
|
|
69
33
|
}
|
|
70
34
|
|
|
71
35
|
// Skip if index is already fresh — don't waste CPU on every session start
|
|
72
36
|
const dbPath = path.join(projectDir, '.monomind', 'monograph.db');
|
|
73
|
-
if (fs.existsSync(dbPath)) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const db = new Database(dbPath, { readonly: true, timeout: 5000 });
|
|
77
|
-
try {
|
|
78
|
-
const row = db.prepare("SELECT value FROM index_meta WHERE key='last_commit_hash'").get();
|
|
79
|
-
if (row && row.value && /^[0-9a-f]{7,40}$/i.test(row.value)) {
|
|
80
|
-
const { execFileSync } = require('child_process');
|
|
81
|
-
const out = execFileSync('git', ['rev-list', '--count', row.value + '..HEAD'], {
|
|
82
|
-
cwd: projectDir, encoding: 'utf-8', timeout: 2000, stdio: ['pipe', 'pipe', 'pipe']
|
|
83
|
-
}).trim();
|
|
84
|
-
const behind = parseInt(out, 10);
|
|
85
|
-
if (behind === 0) {
|
|
86
|
-
if (String(process.env.MONOMIND_HOOK_QUIET || '') !== '1') console.log('[graph] index is fresh — skipping rebuild');
|
|
87
|
-
db.close();
|
|
88
|
-
process.exit(0);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
} finally { try { db.close(); } catch {} }
|
|
92
|
-
} catch { /* can't check — proceed with build */ }
|
|
37
|
+
if (fs.existsSync(dbPath) && mg.commitsBehind(projectDir, mg.readIndexedCommit(dbPath)) === 0) {
|
|
38
|
+
if (!quiet) console.log('[graph] index is fresh — skipping rebuild');
|
|
39
|
+
process.exit(0);
|
|
93
40
|
}
|
|
94
41
|
|
|
95
42
|
// Skip if another build is already in progress (avoids SQLite BUSY on concurrent init + session-start)
|
|
@@ -99,51 +46,22 @@ if (fs.existsSync(dbPath)) {
|
|
|
99
46
|
// both pass the check and both spawn a detached rebuild child. claimLock
|
|
100
47
|
// uses the same TOCTOU-safe stale-lock-break (atomic rename-to-claim) as
|
|
101
48
|
// control-start.cjs's spawn lock (see P2-25) — a lock older than 5 minutes
|
|
102
|
-
// is treated as abandoned and safely reclaimed
|
|
49
|
+
// is treated as abandoned and safely reclaimed, and so is one whose build
|
|
50
|
+
// process has exited.
|
|
103
51
|
const lockPath = path.join(graphDir, 'build.lock');
|
|
104
|
-
if (!
|
|
105
|
-
if (
|
|
52
|
+
if (!mg.claimRebuildLock(lockPath, 0, 5 * 60 * 1000)) {
|
|
53
|
+
if (!quiet) console.log('[graph] build already in progress — skipping');
|
|
106
54
|
process.exit(0);
|
|
107
55
|
}
|
|
108
56
|
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
const script = `
|
|
114
|
-
import { buildAsync } from ${JSON.stringify(pathToFileURL(entryPoint).href)};
|
|
115
|
-
import { unlinkSync, statSync } from 'fs';
|
|
116
|
-
import { execFileSync } from 'child_process';
|
|
117
|
-
try {
|
|
118
|
-
await buildAsync(${JSON.stringify(projectDir)});
|
|
119
|
-
// Vacuum if bloat ratio is high — keeps openDb fast over time.
|
|
120
|
-
try {
|
|
121
|
-
const dbPath = ${dbPathStr};
|
|
122
|
-
const fileMB = statSync(dbPath).size / 1024 / 1024;
|
|
123
|
-
// execFileSync with array argv — no shell involved, so a project
|
|
124
|
-
// directory name containing '"' or '$(...)' cannot break out and
|
|
125
|
-
// execute arbitrary commands (P3-8).
|
|
126
|
-
const liveMB = parseInt(
|
|
127
|
-
execFileSync('sqlite3', [dbPath, 'SELECT SUM(pgsize)/1024/1024 FROM dbstat;'],
|
|
128
|
-
{ encoding: 'utf-8', timeout: 30000 }).trim(), 10);
|
|
129
|
-
if (fileMB > 100 && liveMB / fileMB < 0.5) {
|
|
130
|
-
execFileSync('sqlite3', [dbPath, 'VACUUM;'], { timeout: 120000 });
|
|
131
|
-
}
|
|
132
|
-
} catch (_) {}
|
|
133
|
-
} finally {
|
|
134
|
-
try { unlinkSync(${JSON.stringify(lockPath)}); } catch {}
|
|
135
|
-
try { unlinkSync(${JSON.stringify(path.join(graphDir, 'build.pid'))}); } catch {}
|
|
136
|
-
}`;
|
|
137
|
-
const child = spawn(process.execPath, ['--input-type=module', '--eval', script], {
|
|
138
|
-
detached: true,
|
|
139
|
-
stdio: ['ignore', logFd, logFd],
|
|
140
|
-
cwd: projectDir,
|
|
141
|
-
});
|
|
142
|
-
child.unref();
|
|
57
|
+
// Detached rebuild; after the build, VACUUM the DB if it has >50% bloat
|
|
58
|
+
// (reclaim space from delete/insert churn; opens are ~5x faster on a tight DB).
|
|
59
|
+
const pidPath = path.join(graphDir, 'build.pid');
|
|
60
|
+
const started = mg.startRebuild(projectDir, { resolved, lockPath, cleanup: [pidPath], vacuum: true });
|
|
143
61
|
|
|
144
62
|
// Track PID so control-stop.cjs can kill it on session exit
|
|
145
63
|
try {
|
|
146
|
-
fs.writeFileSync(
|
|
64
|
+
if (started.pid) fs.writeFileSync(pidPath, String(started.pid), 'utf-8');
|
|
147
65
|
} catch { /* best-effort */ }
|
|
148
66
|
|
|
149
|
-
if (
|
|
67
|
+
if (!quiet) console.log('[graph] background build started for ' + projectDir);
|