@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.
Files changed (214) hide show
  1. package/.claude/helpers/handlers/edit-handler.cjs +14 -12
  2. package/.claude/helpers/handlers/route-handler.cjs +6 -0
  3. package/.claude/helpers/monograph-freshen.cjs +31 -113
  4. package/.claude/helpers/utils/monograph-resolve.cjs +497 -0
  5. package/.claude/helpers/utils/monograph.cjs +8 -51
  6. package/README.md +1 -1
  7. package/dist/src/commands/doctor-hook-monograph-checks.d.ts +8 -0
  8. package/dist/src/commands/doctor-hook-monograph-checks.d.ts.map +1 -0
  9. package/dist/src/commands/doctor-hook-monograph-checks.js +79 -0
  10. package/dist/src/commands/doctor-hook-monograph-checks.js.map +1 -0
  11. package/dist/src/commands/doctor.d.ts.map +1 -1
  12. package/dist/src/commands/doctor.js +4 -1
  13. package/dist/src/commands/doctor.js.map +1 -1
  14. package/dist/src/commands/monograph.d.ts.map +1 -1
  15. package/dist/src/commands/monograph.js +16 -1
  16. package/dist/src/commands/monograph.js.map +1 -1
  17. package/dist/src/orgrt/bash-timeout.d.ts +14 -0
  18. package/dist/src/orgrt/bash-timeout.d.ts.map +1 -0
  19. package/dist/src/orgrt/bash-timeout.js +18 -0
  20. package/dist/src/orgrt/bash-timeout.js.map +1 -0
  21. package/dist/src/orgrt/block-recheck.d.ts +30 -0
  22. package/dist/src/orgrt/block-recheck.d.ts.map +1 -0
  23. package/dist/src/orgrt/block-recheck.js +81 -0
  24. package/dist/src/orgrt/block-recheck.js.map +1 -0
  25. package/dist/src/orgrt/completion-gate.d.ts +4 -0
  26. package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
  27. package/dist/src/orgrt/completion-gate.js +22 -2
  28. package/dist/src/orgrt/completion-gate.js.map +1 -1
  29. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  30. package/dist/src/orgrt/daemon.js +6 -4
  31. package/dist/src/orgrt/daemon.js.map +1 -1
  32. package/dist/src/orgrt/decisions.d.ts +1 -1
  33. package/dist/src/orgrt/decisions.d.ts.map +1 -1
  34. package/dist/src/orgrt/decisions.js +14 -6
  35. package/dist/src/orgrt/decisions.js.map +1 -1
  36. package/dist/src/orgrt/mailbox.d.ts +14 -0
  37. package/dist/src/orgrt/mailbox.d.ts.map +1 -1
  38. package/dist/src/orgrt/mailbox.js +31 -1
  39. package/dist/src/orgrt/mailbox.js.map +1 -1
  40. package/dist/src/orgrt/sandbox-fault.d.ts +16 -6
  41. package/dist/src/orgrt/sandbox-fault.d.ts.map +1 -1
  42. package/dist/src/orgrt/sandbox-fault.js +78 -33
  43. package/dist/src/orgrt/sandbox-fault.js.map +1 -1
  44. package/dist/src/orgrt/session.d.ts +4 -3
  45. package/dist/src/orgrt/session.d.ts.map +1 -1
  46. package/dist/src/orgrt/session.js +24 -13
  47. package/dist/src/orgrt/session.js.map +1 -1
  48. package/dist/src/orgrt/task-dag.d.ts +8 -2
  49. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  50. package/dist/src/orgrt/task-dag.js +10 -4
  51. package/dist/src/orgrt/task-dag.js.map +1 -1
  52. package/dist/src/orgrt/types.d.ts +11 -0
  53. package/dist/src/orgrt/types.d.ts.map +1 -1
  54. package/dist/src/orgrt/types.js +18 -0
  55. package/dist/src/orgrt/types.js.map +1 -1
  56. package/dist/src/utils/resource-governor.d.ts.map +1 -1
  57. package/dist/src/utils/resource-governor.js +35 -2
  58. package/dist/src/utils/resource-governor.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +6 -6
  61. package/.claude/skills/monodesign/SKILL.md +0 -257
  62. package/.claude/skills/monodesign/adapt.md +0 -53
  63. package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +0 -100
  64. package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +0 -103
  65. package/.claude/skills/monodesign/animate.md +0 -65
  66. package/.claude/skills/monodesign/audit.md +0 -89
  67. package/.claude/skills/monodesign/bolder.md +0 -50
  68. package/.claude/skills/monodesign/clarify.md +0 -64
  69. package/.claude/skills/monodesign/colorize.md +0 -68
  70. package/.claude/skills/monodesign/craft.md +0 -51
  71. package/.claude/skills/monodesign/critique.md +0 -66
  72. package/.claude/skills/monodesign/delight.md +0 -47
  73. package/.claude/skills/monodesign/distill.md +0 -56
  74. package/.claude/skills/monodesign/document.md +0 -83
  75. package/.claude/skills/monodesign/extract.md +0 -74
  76. package/.claude/skills/monodesign/harden.md +0 -65
  77. package/.claude/skills/monodesign/init.md +0 -30
  78. package/.claude/skills/monodesign/layout.md +0 -36
  79. package/.claude/skills/monodesign/live.md +0 -34
  80. package/.claude/skills/monodesign/onboard.md +0 -50
  81. package/.claude/skills/monodesign/optimize.md +0 -64
  82. package/.claude/skills/monodesign/overdrive.md +0 -56
  83. package/.claude/skills/monodesign/polish.md +0 -68
  84. package/.claude/skills/monodesign/quieter.md +0 -57
  85. package/.claude/skills/monodesign/reference/adapt.md +0 -312
  86. package/.claude/skills/monodesign/reference/adapt.native.md +0 -58
  87. package/.claude/skills/monodesign/reference/android.md +0 -40
  88. package/.claude/skills/monodesign/reference/animate.md +0 -203
  89. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +0 -410
  90. package/.claude/skills/monodesign/reference/audit.md +0 -135
  91. package/.claude/skills/monodesign/reference/audit.native.md +0 -139
  92. package/.claude/skills/monodesign/reference/bolder.md +0 -120
  93. package/.claude/skills/monodesign/reference/brand-workflow.md +0 -180
  94. package/.claude/skills/monodesign/reference/brand.md +0 -108
  95. package/.claude/skills/monodesign/reference/clarify.md +0 -288
  96. package/.claude/skills/monodesign/reference/codex.md +0 -105
  97. package/.claude/skills/monodesign/reference/cognitive-load.md +0 -106
  98. package/.claude/skills/monodesign/reference/color-and-contrast.md +0 -105
  99. package/.claude/skills/monodesign/reference/colorize.md +0 -257
  100. package/.claude/skills/monodesign/reference/component-specs.md +0 -260
  101. package/.claude/skills/monodesign/reference/component-states.md +0 -274
  102. package/.claude/skills/monodesign/reference/component-system.md +0 -358
  103. package/.claude/skills/monodesign/reference/copy-formulas.md +0 -160
  104. package/.claude/skills/monodesign/reference/craft.md +0 -123
  105. package/.claude/skills/monodesign/reference/critique.md +0 -780
  106. package/.claude/skills/monodesign/reference/delight.md +0 -302
  107. package/.claude/skills/monodesign/reference/design-principles.md +0 -246
  108. package/.claude/skills/monodesign/reference/distill.md +0 -111
  109. package/.claude/skills/monodesign/reference/document.md +0 -429
  110. package/.claude/skills/monodesign/reference/extract.md +0 -69
  111. package/.claude/skills/monodesign/reference/harden.md +0 -347
  112. package/.claude/skills/monodesign/reference/heuristics-scoring.md +0 -234
  113. package/.claude/skills/monodesign/reference/hooks.md +0 -92
  114. package/.claude/skills/monodesign/reference/image-prompts.md +0 -130
  115. package/.claude/skills/monodesign/reference/init.md +0 -221
  116. package/.claude/skills/monodesign/reference/interaction-design.md +0 -189
  117. package/.claude/skills/monodesign/reference/ios.md +0 -45
  118. package/.claude/skills/monodesign/reference/layout.md +0 -185
  119. package/.claude/skills/monodesign/reference/live.md +0 -710
  120. package/.claude/skills/monodesign/reference/motion-design.md +0 -109
  121. package/.claude/skills/monodesign/reference/onboard.md +0 -234
  122. package/.claude/skills/monodesign/reference/optimize.md +0 -258
  123. package/.claude/skills/monodesign/reference/overdrive.md +0 -130
  124. package/.claude/skills/monodesign/reference/personas.md +0 -179
  125. package/.claude/skills/monodesign/reference/polish.md +0 -241
  126. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +0 -108
  127. package/.claude/skills/monodesign/reference/product.md +0 -60
  128. package/.claude/skills/monodesign/reference/quieter.md +0 -99
  129. package/.claude/skills/monodesign/reference/responsive-design.md +0 -114
  130. package/.claude/skills/monodesign/reference/shape.md +0 -165
  131. package/.claude/skills/monodesign/reference/spatial-design.md +0 -100
  132. package/.claude/skills/monodesign/reference/teach.md +0 -10
  133. package/.claude/skills/monodesign/reference/token-architecture.md +0 -222
  134. package/.claude/skills/monodesign/reference/typeset.md +0 -301
  135. package/.claude/skills/monodesign/reference/typography.md +0 -159
  136. package/.claude/skills/monodesign/reference/ux-research.md +0 -143
  137. package/.claude/skills/monodesign/reference/ux-rules.md +0 -211
  138. package/.claude/skills/monodesign/reference/ux-writing.md +0 -107
  139. package/.claude/skills/monodesign/scripts/command-metadata.json +0 -94
  140. package/.claude/skills/monodesign/scripts/context-signals.mjs +0 -260
  141. package/.claude/skills/monodesign/scripts/context.mjs +0 -1065
  142. package/.claude/skills/monodesign/scripts/critique-storage.mjs +0 -416
  143. package/.claude/skills/monodesign/scripts/detect-csp.mjs +0 -193
  144. package/.claude/skills/monodesign/scripts/detect.mjs +0 -33
  145. package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +0 -1960
  146. package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +0 -321
  147. package/.claude/skills/monodesign/scripts/detector/design-system.mjs +0 -814
  148. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +0 -5628
  149. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +0 -50
  150. package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +0 -259
  151. package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +0 -339
  152. package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +0 -636
  153. package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +0 -1016
  154. package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +0 -253
  155. package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -198
  156. package/.claude/skills/monodesign/scripts/detector/findings.mjs +0 -12
  157. package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +0 -181
  158. package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +0 -373
  159. package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +0 -426
  160. package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +0 -198
  161. package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +0 -166
  162. package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +0 -563
  163. package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +0 -3024
  164. package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +0 -124
  165. package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +0 -101
  166. package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +0 -30
  167. package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +0 -148
  168. package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +0 -7
  169. package/.claude/skills/monodesign/scripts/hook-admin.mjs +0 -694
  170. package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +0 -516
  171. package/.claude/skills/monodesign/scripts/hook-lib.mjs +0 -1785
  172. package/.claude/skills/monodesign/scripts/hook.mjs +0 -61
  173. package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +0 -809
  174. package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +0 -69
  175. package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +0 -640
  176. package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +0 -129
  177. package/.claude/skills/monodesign/scripts/lib/provider.mjs +0 -4
  178. package/.claude/skills/monodesign/scripts/lib/target-args.mjs +0 -42
  179. package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +0 -50
  180. package/.claude/skills/monodesign/scripts/live/completion.mjs +0 -19
  181. package/.claude/skills/monodesign/scripts/live/event-validation.mjs +0 -137
  182. package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +0 -458
  183. package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +0 -939
  184. package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +0 -357
  185. package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +0 -152
  186. package/.claude/skills/monodesign/scripts/live/session-store.mjs +0 -293
  187. package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +0 -826
  188. package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +0 -279
  189. package/.claude/skills/monodesign/scripts/live/ui-core.mjs +0 -180
  190. package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +0 -36
  191. package/.claude/skills/monodesign/scripts/live-accept.mjs +0 -812
  192. package/.claude/skills/monodesign/scripts/live-browser-dom.js +0 -147
  193. package/.claude/skills/monodesign/scripts/live-browser-session.js +0 -124
  194. package/.claude/skills/monodesign/scripts/live-browser.js +0 -11213
  195. package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +0 -1241
  196. package/.claude/skills/monodesign/scripts/live-complete.mjs +0 -75
  197. package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +0 -683
  198. package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +0 -51
  199. package/.claude/skills/monodesign/scripts/live-inject.mjs +0 -596
  200. package/.claude/skills/monodesign/scripts/live-insert.mjs +0 -272
  201. package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +0 -363
  202. package/.claude/skills/monodesign/scripts/live-poll.mjs +0 -384
  203. package/.claude/skills/monodesign/scripts/live-resume.mjs +0 -94
  204. package/.claude/skills/monodesign/scripts/live-server.mjs +0 -1210
  205. package/.claude/skills/monodesign/scripts/live-status.mjs +0 -61
  206. package/.claude/skills/monodesign/scripts/live-target.mjs +0 -30
  207. package/.claude/skills/monodesign/scripts/live-wrap.mjs +0 -884
  208. package/.claude/skills/monodesign/scripts/live.mjs +0 -297
  209. package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +0 -14
  210. package/.claude/skills/monodesign/scripts/palette.mjs +0 -635
  211. package/.claude/skills/monodesign/scripts/pin.mjs +0 -221
  212. package/.claude/skills/monodesign/shape.md +0 -71
  213. package/.claude/skills/monodesign/teach.md +0 -18
  214. 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 { claimLock } = require('../utils/fs-helpers.cjs');
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
- if (claimLock(lockFile, COOLDOWN_MS)) {
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
- var rebuildScript = "import { buildAsync } from '@monoes/monograph'; await buildAsync(" + JSON.stringify(CWD) + ");";
108
- var graphDir = path.join(CWD, '.monomind', 'graph');
109
- var logPath = path.join(graphDir, 'build.log');
110
- var logFd;
111
- try { logFd = fs.openSync(logPath, 'a'); } catch(e) { logFd = 'ignore'; }
112
- var child = spawnRebuild(process.execPath, ['--input-type=module', '--eval', rebuildScript], {
113
- detached: true, stdio: ['ignore', logFd, logFd], cwd: CWD,
114
- });
115
- child.unref();
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 { spawn } = require('child_process');
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
- const logPath = path.join(graphDir, 'build.log');
17
- let logFd;
18
- try { logFd = fs.openSync(logPath, 'a'); } catch { logFd = 'ignore'; }
19
-
20
- // Resolve the monograph entry point — searches several common layouts
21
- function resolveMonographEntry(dir) {
22
- // pnpm virtual store — the reliable pre-built copy not affected by workspace symlinks
23
- const pnpmStore = (() => {
24
- try {
25
- const storeBase = path.join(dir, 'node_modules', '.pnpm');
26
- if (!fs.existsSync(storeBase)) return null;
27
- const entries = fs.readdirSync(storeBase).filter(e => e.startsWith('@monoes+monograph@'));
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
- // Global npm / homebrew install of @monomind/cli (most common for npx/global users).
53
- // Resolved lazily — shells out to `npm root -g` (~65ms) — so that cost is only paid
54
- // when none of the faster candidates above matched.
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
- try {
75
- const Database = require(require.resolve('better-sqlite3', { paths: [path.dirname(entryPoint)] }));
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 (!claimLock(lockPath, 5 * 60 * 1000)) {
105
- if (String(process.env.MONOMIND_HOOK_QUIET || '') !== '1') console.log('[graph] build already in progress — skipping');
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
- // Spawn a detached node process to run buildAsync from @monoes/monograph (ESM).
110
- // After the build, VACUUM the DB if it has >50% bloat (reclaim space from
111
- // delete/insert churn; opens are ~5x faster on a tight DB).
112
- const dbPathStr = JSON.stringify(path.join(projectDir, '.monomind', 'monograph.db'));
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(path.join(graphDir, 'build.pid'), String(child.pid), 'utf-8');
64
+ if (started.pid) fs.writeFileSync(pidPath, String(started.pid), 'utf-8');
147
65
  } catch { /* best-effort */ }
148
66
 
149
- if (String(process.env.MONOMIND_HOOK_QUIET || '') !== '1') console.log('[graph] background build started for ' + projectDir);
67
+ if (!quiet) console.log('[graph] background build started for ' + projectDir);