@monoes/monomindcli 2.16.0 → 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 (233) hide show
  1. package/.claude/helpers/handlers/edit-handler.cjs +14 -12
  2. package/.claude/helpers/handlers/route-handler.cjs +22 -3
  3. package/.claude/helpers/hook-handler.cjs +17 -2
  4. package/.claude/helpers/jev-picker.cjs +1 -1
  5. package/.claude/helpers/monograph-freshen.cjs +31 -113
  6. package/.claude/helpers/utils/monograph-resolve.cjs +497 -0
  7. package/.claude/helpers/utils/monograph.cjs +8 -51
  8. package/dist/src/capabilities/cap-code.d.ts.map +1 -1
  9. package/dist/src/capabilities/cap-code.js +10 -5
  10. package/dist/src/capabilities/cap-code.js.map +1 -1
  11. package/dist/src/capabilities/manager.d.ts +2 -1
  12. package/dist/src/capabilities/manager.d.ts.map +1 -1
  13. package/dist/src/capabilities/manager.js +4 -1
  14. package/dist/src/capabilities/manager.js.map +1 -1
  15. package/dist/src/commands/doctor-hook-monograph-checks.d.ts +8 -0
  16. package/dist/src/commands/doctor-hook-monograph-checks.d.ts.map +1 -0
  17. package/dist/src/commands/doctor-hook-monograph-checks.js +79 -0
  18. package/dist/src/commands/doctor-hook-monograph-checks.js.map +1 -0
  19. package/dist/src/commands/doctor-project-checks.js +1 -1
  20. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  21. package/dist/src/commands/doctor.d.ts.map +1 -1
  22. package/dist/src/commands/doctor.js +4 -1
  23. package/dist/src/commands/doctor.js.map +1 -1
  24. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  25. package/dist/src/commands/init-wizard.js +2 -0
  26. package/dist/src/commands/init-wizard.js.map +1 -1
  27. package/dist/src/commands/init.d.ts.map +1 -1
  28. package/dist/src/commands/init.js +25 -26
  29. package/dist/src/commands/init.js.map +1 -1
  30. package/dist/src/commands/monograph.d.ts.map +1 -1
  31. package/dist/src/commands/monograph.js +16 -1
  32. package/dist/src/commands/monograph.js.map +1 -1
  33. package/dist/src/commands/org-observe.d.ts.map +1 -1
  34. package/dist/src/commands/org-observe.js +5 -9
  35. package/dist/src/commands/org-observe.js.map +1 -1
  36. package/dist/src/commands/org-run-end.d.ts +26 -0
  37. package/dist/src/commands/org-run-end.d.ts.map +1 -0
  38. package/dist/src/commands/org-run-end.js +40 -0
  39. package/dist/src/commands/org-run-end.js.map +1 -0
  40. package/dist/src/commands/org.d.ts +2 -1
  41. package/dist/src/commands/org.d.ts.map +1 -1
  42. package/dist/src/commands/org.js +36 -15
  43. package/dist/src/commands/org.js.map +1 -1
  44. package/dist/src/commands/search-universal.d.ts.map +1 -1
  45. package/dist/src/commands/search-universal.js +1 -2
  46. package/dist/src/commands/search-universal.js.map +1 -1
  47. package/dist/src/init/executor.d.ts.map +1 -1
  48. package/dist/src/init/executor.js +7 -0
  49. package/dist/src/init/executor.js.map +1 -1
  50. package/dist/src/init/init-memory.d.ts +14 -0
  51. package/dist/src/init/init-memory.d.ts.map +1 -0
  52. package/dist/src/init/init-memory.js +44 -0
  53. package/dist/src/init/init-memory.js.map +1 -0
  54. package/dist/src/init/types.d.ts +13 -0
  55. package/dist/src/init/types.d.ts.map +1 -1
  56. package/dist/src/init/types.js.map +1 -1
  57. package/dist/src/init/upgrade.d.ts.map +1 -1
  58. package/dist/src/init/upgrade.js +9 -0
  59. package/dist/src/init/upgrade.js.map +1 -1
  60. package/dist/src/orgrt/agent-runner.d.ts +7 -0
  61. package/dist/src/orgrt/agent-runner.d.ts.map +1 -1
  62. package/dist/src/orgrt/agent-runner.js +5 -1
  63. package/dist/src/orgrt/agent-runner.js.map +1 -1
  64. package/dist/src/orgrt/antigravity-runner.d.ts.map +1 -1
  65. package/dist/src/orgrt/antigravity-runner.js +8 -14
  66. package/dist/src/orgrt/antigravity-runner.js.map +1 -1
  67. package/dist/src/orgrt/bash-timeout.d.ts +14 -0
  68. package/dist/src/orgrt/bash-timeout.d.ts.map +1 -0
  69. package/dist/src/orgrt/bash-timeout.js +18 -0
  70. package/dist/src/orgrt/bash-timeout.js.map +1 -0
  71. package/dist/src/orgrt/block-recheck.d.ts +30 -0
  72. package/dist/src/orgrt/block-recheck.d.ts.map +1 -0
  73. package/dist/src/orgrt/block-recheck.js +81 -0
  74. package/dist/src/orgrt/block-recheck.js.map +1 -0
  75. package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -1
  76. package/dist/src/orgrt/checkpoint-ops.js +2 -1
  77. package/dist/src/orgrt/checkpoint-ops.js.map +1 -1
  78. package/dist/src/orgrt/checkpoint.d.ts +10 -2
  79. package/dist/src/orgrt/checkpoint.d.ts.map +1 -1
  80. package/dist/src/orgrt/checkpoint.js +8 -2
  81. package/dist/src/orgrt/checkpoint.js.map +1 -1
  82. package/dist/src/orgrt/codex-runner.d.ts.map +1 -1
  83. package/dist/src/orgrt/codex-runner.js +8 -14
  84. package/dist/src/orgrt/codex-runner.js.map +1 -1
  85. package/dist/src/orgrt/completion-gate.d.ts +10 -0
  86. package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
  87. package/dist/src/orgrt/completion-gate.js +40 -2
  88. package/dist/src/orgrt/completion-gate.js.map +1 -1
  89. package/dist/src/orgrt/copilot-runner.d.ts.map +1 -1
  90. package/dist/src/orgrt/copilot-runner.js +7 -10
  91. package/dist/src/orgrt/copilot-runner.js.map +1 -1
  92. package/dist/src/orgrt/crush-runner.d.ts.map +1 -1
  93. package/dist/src/orgrt/crush-runner.js +7 -10
  94. package/dist/src/orgrt/crush-runner.js.map +1 -1
  95. package/dist/src/orgrt/cumulative-meter.d.ts +26 -0
  96. package/dist/src/orgrt/cumulative-meter.d.ts.map +1 -0
  97. package/dist/src/orgrt/cumulative-meter.js +46 -0
  98. package/dist/src/orgrt/cumulative-meter.js.map +1 -0
  99. package/dist/src/orgrt/daemon.d.ts +6 -2
  100. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  101. package/dist/src/orgrt/daemon.js +31 -31
  102. package/dist/src/orgrt/daemon.js.map +1 -1
  103. package/dist/src/orgrt/dashboard-health.d.ts +54 -0
  104. package/dist/src/orgrt/dashboard-health.d.ts.map +1 -0
  105. package/dist/src/orgrt/dashboard-health.js +143 -0
  106. package/dist/src/orgrt/dashboard-health.js.map +1 -0
  107. package/dist/src/orgrt/decisions.d.ts +7 -2
  108. package/dist/src/orgrt/decisions.d.ts.map +1 -1
  109. package/dist/src/orgrt/decisions.js +47 -11
  110. package/dist/src/orgrt/decisions.js.map +1 -1
  111. package/dist/src/orgrt/forwarder.d.ts +2 -1
  112. package/dist/src/orgrt/forwarder.d.ts.map +1 -1
  113. package/dist/src/orgrt/forwarder.js +87 -27
  114. package/dist/src/orgrt/forwarder.js.map +1 -1
  115. package/dist/src/orgrt/grok-runner.d.ts.map +1 -1
  116. package/dist/src/orgrt/grok-runner.js +7 -12
  117. package/dist/src/orgrt/grok-runner.js.map +1 -1
  118. package/dist/src/orgrt/hermes-runner.d.ts.map +1 -1
  119. package/dist/src/orgrt/hermes-runner.js +9 -15
  120. package/dist/src/orgrt/hermes-runner.js.map +1 -1
  121. package/dist/src/orgrt/kimicode-runner.d.ts +1 -1
  122. package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
  123. package/dist/src/orgrt/kimicode-runner.js +9 -15
  124. package/dist/src/orgrt/kimicode-runner.js.map +1 -1
  125. package/dist/src/orgrt/mailbox.d.ts +14 -0
  126. package/dist/src/orgrt/mailbox.d.ts.map +1 -1
  127. package/dist/src/orgrt/mailbox.js +31 -1
  128. package/dist/src/orgrt/mailbox.js.map +1 -1
  129. package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
  130. package/dist/src/orgrt/opencode-runner.js +7 -13
  131. package/dist/src/orgrt/opencode-runner.js.map +1 -1
  132. package/dist/src/orgrt/org-harness-tools.d.ts +8 -0
  133. package/dist/src/orgrt/org-harness-tools.d.ts.map +1 -0
  134. package/dist/src/orgrt/org-harness-tools.js +21 -0
  135. package/dist/src/orgrt/org-harness-tools.js.map +1 -0
  136. package/dist/src/orgrt/pi-rpc-runner.d.ts.map +1 -1
  137. package/dist/src/orgrt/pi-rpc-runner.js +9 -13
  138. package/dist/src/orgrt/pi-rpc-runner.js.map +1 -1
  139. package/dist/src/orgrt/pi-runner.d.ts.map +1 -1
  140. package/dist/src/orgrt/pi-runner.js +7 -11
  141. package/dist/src/orgrt/pi-runner.js.map +1 -1
  142. package/dist/src/orgrt/policy-git.d.ts +5 -1
  143. package/dist/src/orgrt/policy-git.d.ts.map +1 -1
  144. package/dist/src/orgrt/policy-git.js +56 -29
  145. package/dist/src/orgrt/policy-git.js.map +1 -1
  146. package/dist/src/orgrt/policy.d.ts +7 -0
  147. package/dist/src/orgrt/policy.d.ts.map +1 -1
  148. package/dist/src/orgrt/policy.js +10 -1
  149. package/dist/src/orgrt/policy.js.map +1 -1
  150. package/dist/src/orgrt/prompt-vars.d.ts +8 -1
  151. package/dist/src/orgrt/prompt-vars.d.ts.map +1 -1
  152. package/dist/src/orgrt/prompt-vars.js +60 -11
  153. package/dist/src/orgrt/prompt-vars.js.map +1 -1
  154. package/dist/src/orgrt/qwen-rpc-runner.d.ts.map +1 -1
  155. package/dist/src/orgrt/qwen-rpc-runner.js +9 -14
  156. package/dist/src/orgrt/qwen-rpc-runner.js.map +1 -1
  157. package/dist/src/orgrt/qwen-runner.d.ts.map +1 -1
  158. package/dist/src/orgrt/qwen-runner.js +7 -12
  159. package/dist/src/orgrt/qwen-runner.js.map +1 -1
  160. package/dist/src/orgrt/report-budget.d.ts +4 -0
  161. package/dist/src/orgrt/report-budget.d.ts.map +1 -0
  162. package/dist/src/orgrt/report-budget.js +12 -0
  163. package/dist/src/orgrt/report-budget.js.map +1 -0
  164. package/dist/src/orgrt/reporting.d.ts +4 -0
  165. package/dist/src/orgrt/reporting.d.ts.map +1 -1
  166. package/dist/src/orgrt/reporting.js +8 -2
  167. package/dist/src/orgrt/reporting.js.map +1 -1
  168. package/dist/src/orgrt/role-sandbox.d.ts +4 -1
  169. package/dist/src/orgrt/role-sandbox.d.ts.map +1 -1
  170. package/dist/src/orgrt/role-sandbox.js +24 -10
  171. package/dist/src/orgrt/role-sandbox.js.map +1 -1
  172. package/dist/src/orgrt/role-trace.d.ts +27 -0
  173. package/dist/src/orgrt/role-trace.d.ts.map +1 -0
  174. package/dist/src/orgrt/role-trace.js +28 -0
  175. package/dist/src/orgrt/role-trace.js.map +1 -0
  176. package/dist/src/orgrt/sandbox-deny-write.d.ts +52 -0
  177. package/dist/src/orgrt/sandbox-deny-write.d.ts.map +1 -0
  178. package/dist/src/orgrt/sandbox-deny-write.js +89 -0
  179. package/dist/src/orgrt/sandbox-deny-write.js.map +1 -0
  180. package/dist/src/orgrt/sandbox-fault.d.ts +50 -0
  181. package/dist/src/orgrt/sandbox-fault.d.ts.map +1 -0
  182. package/dist/src/orgrt/sandbox-fault.js +139 -0
  183. package/dist/src/orgrt/sandbox-fault.js.map +1 -0
  184. package/dist/src/orgrt/session.d.ts +8 -6
  185. package/dist/src/orgrt/session.d.ts.map +1 -1
  186. package/dist/src/orgrt/session.js +121 -67
  187. package/dist/src/orgrt/session.js.map +1 -1
  188. package/dist/src/orgrt/task-dag.d.ts +17 -3
  189. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  190. package/dist/src/orgrt/task-dag.js +16 -5
  191. package/dist/src/orgrt/task-dag.js.map +1 -1
  192. package/dist/src/orgrt/tool-fence.d.ts +21 -3
  193. package/dist/src/orgrt/tool-fence.d.ts.map +1 -1
  194. package/dist/src/orgrt/tool-fence.js +45 -7
  195. package/dist/src/orgrt/tool-fence.js.map +1 -1
  196. package/dist/src/orgrt/tool-providers.d.ts +4 -0
  197. package/dist/src/orgrt/tool-providers.d.ts.map +1 -1
  198. package/dist/src/orgrt/tool-providers.js +10 -0
  199. package/dist/src/orgrt/tool-providers.js.map +1 -1
  200. package/dist/src/orgrt/types.d.ts +19 -0
  201. package/dist/src/orgrt/types.d.ts.map +1 -1
  202. package/dist/src/orgrt/types.js +29 -0
  203. package/dist/src/orgrt/types.js.map +1 -1
  204. package/dist/src/orgrt/vercel-runner.d.ts +23 -0
  205. package/dist/src/orgrt/vercel-runner.d.ts.map +1 -1
  206. package/dist/src/orgrt/vercel-runner.js +2 -26
  207. package/dist/src/orgrt/vercel-runner.js.map +1 -1
  208. package/dist/src/platform-adapters/merge.d.ts +11 -0
  209. package/dist/src/platform-adapters/merge.d.ts.map +1 -1
  210. package/dist/src/platform-adapters/merge.js +28 -0
  211. package/dist/src/platform-adapters/merge.js.map +1 -1
  212. package/dist/src/platform-adapters/mutation.d.ts +3 -0
  213. package/dist/src/platform-adapters/mutation.d.ts.map +1 -1
  214. package/dist/src/platform-adapters/mutation.js +43 -0
  215. package/dist/src/platform-adapters/mutation.js.map +1 -1
  216. package/dist/src/platform-adapters/operations.d.ts +1 -0
  217. package/dist/src/platform-adapters/operations.d.ts.map +1 -1
  218. package/dist/src/platform-adapters/operations.js +25 -9
  219. package/dist/src/platform-adapters/operations.js.map +1 -1
  220. package/dist/src/platform-adapters/renderers/skills.d.ts.map +1 -1
  221. package/dist/src/platform-adapters/renderers/skills.js +11 -2
  222. package/dist/src/platform-adapters/renderers/skills.js.map +1 -1
  223. package/dist/src/platform-adapters/shared-surface.d.ts +34 -0
  224. package/dist/src/platform-adapters/shared-surface.d.ts.map +1 -0
  225. package/dist/src/platform-adapters/shared-surface.js +89 -0
  226. package/dist/src/platform-adapters/shared-surface.js.map +1 -0
  227. package/dist/src/platform-adapters/types.d.ts +7 -0
  228. package/dist/src/platform-adapters/types.d.ts.map +1 -1
  229. package/dist/src/utils/resource-governor.d.ts.map +1 -1
  230. package/dist/src/utils/resource-governor.js +35 -2
  231. package/dist/src/utils/resource-governor.js.map +1 -1
  232. package/dist/tsconfig.tsbuildinfo +1 -1
  233. package/package.json +3 -3
@@ -0,0 +1,497 @@
1
+ 'use strict';
2
+ // Where the hooks find @monoes/monograph, and how they rebuild the graph with
3
+ // it (#328). monograph-freshen.cjs, the post-edit rebuild in
4
+ // handlers/edit-handler.cjs and utils/monograph.cjs all resolve through here
5
+ // so they agree on one copy. A bare `import '@monoes/monograph'` only walks
6
+ // the project's node_modules, which misses the default npx setup entirely:
7
+ // there the only copy is the one bundled with the monomind CLI in npm's npx
8
+ // cache, or a global install.
9
+ //
10
+ // Resolution happens at hook time rather than being recorded by `init`: the
11
+ // npx cache directory changes with every CLI version and npm prunes it, so a
12
+ // recorded path goes stale, while scanning costs one readdir.
13
+
14
+ const path = require('path');
15
+ const fs = require('fs');
16
+ const os = require('os');
17
+ const { execFileSync, execSync, spawn } = require('child_process');
18
+ const { pathToFileURL } = require('url');
19
+ const { claimLock } = require('./fs-helpers.cjs');
20
+
21
+ const GLOBAL_FIX = 'npm i -g --allow-scripts=better-sqlite3 @monoes/monograph';
22
+ const STALE_LIMIT = 50;
23
+ const BUILD_LOG_MAX_BYTES = 1024 * 1024;
24
+ // Matched against an error's message and code only: a stack through
25
+ // better-sqlite3's JS (SQLITE_BUSY, say) is not a native-load failure.
26
+ const NATIVE_ERROR_RE = /NODE_MODULE_VERSION|bindings file|better_sqlite3\.node|compiled against a different Node|ERR_DLOPEN_FAILED/i;
27
+
28
+ function _readJson(p) {
29
+ try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch (_) { return null; }
30
+ }
31
+
32
+ // The package's ESM entry file, read from its own package.json (its exports
33
+ // map has no "require" condition, so require.resolve can't find it).
34
+ function entryFromPkgDir(pkgDir) {
35
+ var pkg = _readJson(path.join(pkgDir, 'package.json'));
36
+ if (!pkg || pkg.name !== '@monoes/monograph') return null;
37
+ var dot = pkg.exports && pkg.exports['.'];
38
+ var rel = (typeof dot === 'string' ? dot : dot && (dot.import || dot.default)) || pkg.main;
39
+ if (!rel) return null;
40
+ var full = path.join(pkgDir, rel);
41
+ return fs.existsSync(full) ? { entry: full, pkgDir: pkgDir, version: String(pkg.version || '0') } : null;
42
+ }
43
+
44
+ function compareVersions(a, b) {
45
+ var pa = String(a).split(/[.-]/).map(function (x) { return parseInt(x, 10) || 0; });
46
+ var pb = String(b).split(/[.-]/).map(function (x) { return parseInt(x, 10) || 0; });
47
+ for (var i = 0; i < Math.max(pa.length, pb.length); i++) {
48
+ if ((pa[i] || 0) !== (pb[i] || 0)) return (pa[i] || 0) - (pb[i] || 0);
49
+ }
50
+ return 0;
51
+ }
52
+
53
+ function _newest(found) {
54
+ found = found.filter(Boolean);
55
+ if (found.length === 0) return null;
56
+ found.sort(function (x, y) { return compareVersions(y.version, x.version); });
57
+ return found[0];
58
+ }
59
+
60
+ function _localCandidates(dir) {
61
+ return [
62
+ // Monorepo workspace build first: it carries unpublished fixes.
63
+ path.join(dir, 'packages', '@monomind', 'monograph'),
64
+ // The project IS the monograph package.
65
+ dir,
66
+ path.join(dir, 'node_modules', '@monoes', 'monograph'),
67
+ path.join(dir, 'node_modules', '@monomind', 'monograph'),
68
+ path.join(dir, 'node_modules', '.pnpm', 'node_modules', '@monoes', 'monograph'),
69
+ path.join(dir, 'packages', 'node_modules', '.pnpm', 'node_modules', '@monoes', 'monograph'),
70
+ // The copy nested under a local, unhoisted monomind CLI install.
71
+ path.join(dir, 'node_modules', '@monoes', 'monomindcli', 'node_modules', '@monoes', 'monograph'),
72
+ path.join(dir, 'node_modules', 'monomind', 'node_modules', '@monoes', 'monograph'),
73
+ ];
74
+ }
75
+
76
+ function _pnpmStore(dir) {
77
+ var base = path.join(dir, 'node_modules', '.pnpm');
78
+ var names;
79
+ try { names = fs.readdirSync(base).filter(function (e) { return e.indexOf('@monoes+monograph@') === 0; }); }
80
+ catch (_) { return null; }
81
+ return _newest(names.map(function (e) {
82
+ return entryFromPkgDir(path.join(base, e, 'node_modules', '@monoes', 'monograph'));
83
+ }));
84
+ }
85
+
86
+ function _resolveLocal(projectDir) {
87
+ var cands = _localCandidates(projectDir);
88
+ for (var i = 0; i < cands.length; i++) {
89
+ var hit = entryFromPkgDir(cands[i]);
90
+ if (hit) return hit;
91
+ }
92
+ var store = _pnpmStore(projectDir);
93
+ if (store) return store;
94
+ // Ancestor walk: what a bare specifier's node_modules lookup would find.
95
+ var dir = path.dirname(projectDir);
96
+ for (;;) {
97
+ var up = entryFromPkgDir(path.join(dir, 'node_modules', '@monoes', 'monograph'));
98
+ if (up) return up;
99
+ var parent = path.dirname(dir);
100
+ if (parent === dir) return null;
101
+ dir = parent;
102
+ }
103
+ }
104
+
105
+ var _globalRootCache;
106
+ function npmGlobalRoot() {
107
+ if (_globalRootCache !== undefined) return _globalRootCache;
108
+ try {
109
+ _globalRootCache = execSync('npm root -g', {
110
+ encoding: 'utf-8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
111
+ }).trim() || null;
112
+ } catch (_) { _globalRootCache = null; }
113
+ return _globalRootCache;
114
+ }
115
+
116
+ function _resolveGlobal(globalRoot) {
117
+ if (!globalRoot) return null;
118
+ var nested = path.join('node_modules', '@monoes', 'monograph');
119
+ var cands = [
120
+ path.join(globalRoot, '@monoes', 'monograph'),
121
+ path.join(globalRoot, 'monomind', nested),
122
+ path.join(globalRoot, 'monomind', 'node_modules', '@monoes', 'monomindcli', nested),
123
+ path.join(globalRoot, '@monoes', 'monomindcli', nested),
124
+ ];
125
+ for (var i = 0; i < cands.length; i++) {
126
+ var hit = entryFromPkgDir(cands[i]);
127
+ if (hit) return hit;
128
+ }
129
+ return null;
130
+ }
131
+
132
+ function npxCacheDir() {
133
+ if (process.env.npm_config_cache) return process.env.npm_config_cache;
134
+ if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
135
+ return path.join(process.env.LOCALAPPDATA, 'npm-cache');
136
+ }
137
+ return path.join(os.homedir(), '.npm');
138
+ }
139
+
140
+ // The copy the MCP server's `npx monomind` / `npx @monoes/monomindcli` run
141
+ // installed. Newest version wins when several CLI versions are cached.
142
+ function _resolveNpxCache(cacheDir) {
143
+ var base = path.join(cacheDir, '_npx');
144
+ var dirs;
145
+ try { dirs = fs.readdirSync(base); } catch (_) { return null; }
146
+ return _newest(dirs.map(function (d) {
147
+ return entryFromPkgDir(path.join(base, d, 'node_modules', '@monoes', 'monograph'));
148
+ }));
149
+ }
150
+
151
+ /**
152
+ * Find @monoes/monograph for `projectDir`: the project's own install, then a
153
+ * global npm install (standalone or bundled with the monomind CLI), then the
154
+ * copy bundled with the CLI in the npx cache. Returns
155
+ * { entry, pkgDir, version, source: 'local'|'global'|'npx' } or null.
156
+ * Only absolute paths come back, never a bare specifier.
157
+ */
158
+ function resolveMonographEntry(projectDir, opts) {
159
+ opts = opts || {};
160
+ var hit = _resolveLocal(projectDir);
161
+ if (hit) { hit.source = 'local'; return hit; }
162
+ hit = _resolveGlobal(opts.globalRoot !== undefined ? opts.globalRoot : npmGlobalRoot());
163
+ if (hit) { hit.source = 'global'; return hit; }
164
+ hit = _resolveNpxCache(opts.npxCacheDir || npxCacheDir());
165
+ if (hit) { hit.source = 'npx'; return hit; }
166
+ return null;
167
+ }
168
+
169
+ // The monomind CLI, for `monomind monograph build` when no package resolves:
170
+ // the project's own bin, then PATH (a global install). Never `npx -y`.
171
+ function findMonomindBin(projectDir, pathEnv) {
172
+ var names = process.platform === 'win32' ? ['monomind.cmd', 'monomind.exe'] : ['monomind'];
173
+ var dirs = [path.join(projectDir, 'node_modules', '.bin')]
174
+ .concat(String(pathEnv !== undefined ? pathEnv : process.env.PATH || '').split(path.delimiter));
175
+ for (var i = 0; i < dirs.length; i++) {
176
+ if (!dirs[i]) continue;
177
+ for (var j = 0; j < names.length; j++) {
178
+ var p = path.join(dirs[i], names[j]);
179
+ try { if (fs.statSync(p).isFile()) return p; } catch (_) {}
180
+ }
181
+ }
182
+ return null;
183
+ }
184
+
185
+ function nativeFix(resolved, projectDir) {
186
+ if (!resolved || resolved.source !== 'local') return GLOBAL_FIX;
187
+ var pnpm = fs.existsSync(path.join(projectDir || '', 'pnpm-lock.yaml'));
188
+ return (pnpm ? 'pnpm' : 'npm') + ' rebuild better-sqlite3';
189
+ }
190
+
191
+ function _firstLine(msg) {
192
+ return String(msg || '').split('\n').filter(function (l) { return l.trim(); })[0] || 'unknown error';
193
+ }
194
+
195
+ // Load the better-sqlite3 that `resolved`'s copy would load. A global npm
196
+ // install on current npm skips its install script (allowScripts), leaving no
197
+ // binary; a Node upgrade leaves one built for the wrong ABI.
198
+ function checkNative(resolved, projectDir) {
199
+ try {
200
+ var bs = require.resolve('better-sqlite3', { paths: [path.dirname(resolved.entry)] });
201
+ var Database = require(bs);
202
+ new Database(':memory:').close();
203
+ return { ok: true };
204
+ } catch (e) {
205
+ return { ok: false, error: _firstLine(e && e.message), fix: nativeFix(resolved, projectDir) };
206
+ }
207
+ }
208
+
209
+ function _graphDir(projectDir) { return path.join(projectDir, '.monomind', 'graph'); }
210
+ function _statusPath(projectDir) { return path.join(_graphDir(projectDir), 'rebuild-status.json'); }
211
+
212
+ function readRebuildStatus(projectDir) { return _readJson(_statusPath(projectDir)); }
213
+
214
+ function _writeStatus(projectDir, status) {
215
+ try {
216
+ fs.mkdirSync(_graphDir(projectDir), { recursive: true });
217
+ fs.writeFileSync(_statusPath(projectDir), JSON.stringify(status));
218
+ } catch (_) {}
219
+ }
220
+
221
+ // Keep build.log bounded: past 1 MB it moves to build.log.1 (replacing the
222
+ // previous one), so a failing rebuild can't grow it forever.
223
+ function capBuildLog(projectDir) {
224
+ var logPath = path.join(_graphDir(projectDir), 'build.log');
225
+ try {
226
+ if (fs.statSync(logPath).size > BUILD_LOG_MAX_BYTES) fs.renameSync(logPath, logPath + '.1');
227
+ } catch (_) {}
228
+ }
229
+
230
+ /**
231
+ * Record a failed rebuild in rebuild-status.json and build.log. The same
232
+ * failure repeated only bumps `repeats` in the status file; build.log gets a
233
+ * line when the failure first appears or changes.
234
+ */
235
+ function recordRebuildFailure(projectDir, reason, message, fix) {
236
+ var prev = readRebuildStatus(projectDir) || {};
237
+ var line = '[monograph] rebuild failed (' + reason + '): ' + message + (fix ? ' — fix: ' + fix : '');
238
+ var same = prev.ok === false && prev.line === line;
239
+ _writeStatus(projectDir, {
240
+ ok: false, reason: reason, message: message, fix: fix || null, line: line,
241
+ at: Date.now(), since: same ? prev.since : Date.now(), repeats: same ? (prev.repeats || 1) + 1 : 1,
242
+ });
243
+ if (same) return;
244
+ try {
245
+ capBuildLog(projectDir);
246
+ fs.appendFileSync(path.join(_graphDir(projectDir), 'build.log'), new Date().toISOString() + ' ' + line + '\n');
247
+ } catch (_) {}
248
+ }
249
+
250
+ // Called by the rebuild child (see _childScript) when buildAsync throws.
251
+ function recordBuildError(projectDir, err, source) {
252
+ var msg = _firstLine(err && (err.message || err));
253
+ if (NATIVE_ERROR_RE.test(String(err && err.message || err) + ' ' + String(err && err.code || ''))) {
254
+ recordRebuildFailure(projectDir, 'native', 'better-sqlite3 failed to load: ' + msg, nativeFix({ source: source }, projectDir));
255
+ } else {
256
+ recordRebuildFailure(projectDir, 'build', msg, null);
257
+ }
258
+ }
259
+
260
+ function recordRebuildSuccess(projectDir) { _writeStatus(projectDir, { ok: true, at: Date.now() }); }
261
+
262
+ function _pidAlive(pid) {
263
+ try { process.kill(pid, 0); return true; } catch (e) { return e.code === 'EPERM'; }
264
+ }
265
+
266
+ /**
267
+ * claimLock, but a lock whose PID has exited is stale once it is `minAgeMs`
268
+ * old (a crashed or finished rebuild), not only after `maxAgeMs`.
269
+ */
270
+ function claimRebuildLock(lockPath, minAgeMs, maxAgeMs) {
271
+ try {
272
+ var st = fs.statSync(lockPath);
273
+ var pid = parseInt(fs.readFileSync(lockPath, 'utf-8'), 10);
274
+ if (Date.now() - st.mtimeMs >= minAgeMs && !(pid > 0 && _pidAlive(pid))) {
275
+ var claimed = lockPath + '.' + process.pid + '.' + Date.now() + '.dead';
276
+ fs.renameSync(lockPath, claimed);
277
+ // Another process replaced the lock between the stat and the rename:
278
+ // that lock is live, so put it back.
279
+ var st2 = fs.statSync(claimed);
280
+ if (st2.ino !== st.ino || st2.mtimeMs !== st.mtimeMs) { try { fs.linkSync(claimed, lockPath); } catch (_) {} }
281
+ fs.unlinkSync(claimed);
282
+ }
283
+ } catch (_) { /* no lock, or lost a race — claimLock decides */ }
284
+ return claimLock(lockPath, maxAgeMs);
285
+ }
286
+
287
+ function _childScript(projectDir, resolved, cleanup, vacuum) {
288
+ var j = JSON.stringify;
289
+ var vacuumJs = !vacuum ? '' : `
290
+ try {
291
+ const dbPath = ${j(path.join(projectDir, '.monomind', 'monograph.db'))};
292
+ const fileMB = statSync(dbPath).size / 1024 / 1024;
293
+ // Array argv, no shell: a project path can't inject a command (P3-8).
294
+ const liveMB = parseInt(execFileSync('sqlite3', [dbPath, 'SELECT SUM(pgsize)/1024/1024 FROM dbstat;'],
295
+ { encoding: 'utf-8', timeout: 30000 }).trim(), 10);
296
+ if (fileMB > 100 && liveMB / fileMB < 0.5) execFileSync('sqlite3', [dbPath, 'VACUUM;'], { timeout: 120000 });
297
+ } catch (_) {}`;
298
+ return `
299
+ import { unlinkSync, statSync } from 'fs';
300
+ import { execFileSync } from 'child_process';
301
+ import { createRequire } from 'module';
302
+ const status = createRequire(${j(pathToFileURL(__filename).href)})(${j(__filename)});
303
+ try {
304
+ const { buildAsync } = await import(${j(pathToFileURL(resolved.entry).href)});
305
+ await buildAsync(${j(projectDir)});
306
+ status.recordRebuildSuccess(${j(projectDir)});${vacuumJs}
307
+ } catch (err) {
308
+ status.recordBuildError(${j(projectDir)}, err, ${j(resolved.source)});
309
+ process.exitCode = 1;
310
+ } finally {
311
+ for (const p of ${j(cleanup)}) { try { unlinkSync(p); } catch {} }
312
+ }`;
313
+ }
314
+
315
+ /**
316
+ * Start a detached background rebuild of `projectDir`'s graph; never waits
317
+ * for it. Imports the resolved package by absolute file URL; with nothing
318
+ * resolvable, runs `monomind monograph build` from the project or PATH; with
319
+ * neither, records an 'unresolvable' failure. The child's PID replaces the
320
+ * caller's in `opts.lockPath`, and the module child removes the lock and
321
+ * `opts.cleanup` files when done.
322
+ * Returns { mode: 'module'|'cli'|'none', pid?, resolved? }.
323
+ */
324
+ function startRebuild(projectDir, opts) {
325
+ opts = opts || {};
326
+ var resolved = opts.resolved !== undefined ? opts.resolved : resolveMonographEntry(projectDir);
327
+ var bin = resolved ? null : findMonomindBin(projectDir);
328
+ if (!resolved && !bin) {
329
+ recordRebuildFailure(projectDir, 'unresolvable',
330
+ '@monoes/monograph not found in the project, the global npm root or the npx cache', GLOBAL_FIX);
331
+ return { mode: 'none' };
332
+ }
333
+ var graphDir = _graphDir(projectDir);
334
+ try { fs.mkdirSync(graphDir, { recursive: true }); } catch (_) {}
335
+ capBuildLog(projectDir);
336
+ var logFd;
337
+ try { logFd = fs.openSync(path.join(graphDir, 'build.log'), 'a'); } catch (_) { logFd = 'ignore'; }
338
+ var cleanup = (opts.lockPath ? [opts.lockPath] : []).concat(opts.cleanup || []);
339
+ var child;
340
+ if (resolved) {
341
+ child = spawn(process.execPath,
342
+ ['--input-type=module', '--eval', _childScript(projectDir, resolved, cleanup, opts.vacuum)],
343
+ { detached: true, stdio: ['ignore', logFd, logFd], cwd: projectDir });
344
+ } else {
345
+ child = spawn(bin, ['monograph', 'build', '--path', projectDir], {
346
+ detached: true, stdio: ['ignore', logFd, logFd], cwd: projectDir,
347
+ shell: process.platform === 'win32',
348
+ });
349
+ }
350
+ child.on('error', function () {});
351
+ child.unref();
352
+ if (typeof logFd === 'number') { try { fs.closeSync(logFd); } catch (_) {} }
353
+ if (opts.lockPath && child.pid) { try { fs.writeFileSync(opts.lockPath, String(child.pid)); } catch (_) {} }
354
+ return { mode: resolved ? 'module' : 'cli', pid: child.pid, resolved: resolved };
355
+ }
356
+
357
+ function _suppressSqliteWarning(fn) {
358
+ var orig = process.emitWarning;
359
+ process.emitWarning = function (w) {
360
+ if (/SQLite is an experimental feature/.test(String(w && w.message || w))) return;
361
+ return orig.apply(process, arguments);
362
+ };
363
+ try { return fn(); } finally { process.emitWarning = orig; }
364
+ }
365
+
366
+ var COMMIT_SQL = "SELECT value FROM index_meta WHERE key IN ('last_commit_hash','lastCommit') ORDER BY key = 'last_commit_hash' DESC LIMIT 1";
367
+
368
+ // The commit the graph was built at, read with node:sqlite so it works even
369
+ // when @monoes/monograph or its native addon is what's missing.
370
+ function readIndexedCommit(dbPath) {
371
+ try {
372
+ return _suppressSqliteWarning(function () {
373
+ var DatabaseSync = require('node:sqlite').DatabaseSync;
374
+ var db = new DatabaseSync(dbPath, { readOnly: true });
375
+ try { var row = db.prepare(COMMIT_SQL).get(); return row && row.value ? String(row.value) : null; }
376
+ finally { db.close(); }
377
+ });
378
+ } catch (_) { return null; }
379
+ }
380
+
381
+ function commitsBehind(projectDir, commit) {
382
+ if (!commit || !/^[0-9a-f]{7,40}$/i.test(commit)) return null;
383
+ try {
384
+ var n = parseInt(execFileSync('git', ['rev-list', '--count', commit + '..HEAD'], {
385
+ cwd: projectDir, encoding: 'utf-8', timeout: 2000, stdio: ['ignore', 'pipe', 'ignore'],
386
+ }).trim(), 10);
387
+ return isNaN(n) ? null : n;
388
+ } catch (_) { return null; }
389
+ }
390
+
391
+ /**
392
+ * Everything `doctor` and the SessionStart warning need, from the hooks' point
393
+ * of view: { resolved, cliBin, native, dbExists, commit, behind, canRebuild,
394
+ * problem, fix, lastStatus }. `problem` says why the hooks can't rebuild.
395
+ */
396
+ function diagnose(projectDir, opts) {
397
+ opts = opts || {};
398
+ var resolved = resolveMonographEntry(projectDir, opts);
399
+ var cliBin = resolved ? null : findMonomindBin(projectDir, opts.pathEnv);
400
+ var native = resolved ? checkNative(resolved, projectDir) : null;
401
+ var dbPath = path.join(projectDir, '.monomind', 'monograph.db');
402
+ var dbExists = fs.existsSync(dbPath);
403
+ var commit = dbExists ? readIndexedCommit(dbPath) : null;
404
+ var problem = null;
405
+ var fix = null;
406
+ if (!resolved && !cliBin) {
407
+ problem = '@monoes/monograph not found by the hooks (project, global npm root, npx cache)';
408
+ fix = GLOBAL_FIX;
409
+ } else if (native && !native.ok) {
410
+ problem = 'better-sqlite3 for ' + resolved.pkgDir + ' failed to load: ' + native.error;
411
+ fix = native.fix;
412
+ }
413
+ return {
414
+ resolved: resolved, cliBin: cliBin, native: native, dbExists: dbExists, commit: commit,
415
+ behind: commitsBehind(projectDir, commit), canRebuild: !problem, problem: problem, fix: fix,
416
+ lastStatus: readRebuildStatus(projectDir),
417
+ };
418
+ }
419
+
420
+ // The one-line SessionStart warning, or null when there is nothing to say:
421
+ // shown when the hooks can't build a missing graph, or the graph is behind
422
+ // HEAD (or its commit can't be read) and the hooks can't rebuild it or the
423
+ // last rebuild failed.
424
+ function sessionWarning(diag) {
425
+ if (!diag.dbExists) {
426
+ return diag.problem ? '[MONOGRAPH_WARN] The hooks cannot build the monograph graph: ' + diag.problem + ' — run: ' + diag.fix : null;
427
+ }
428
+ if (diag.behind === 0) return null;
429
+ var last = diag.lastStatus && diag.lastStatus.ok === false ? diag.lastStatus : null;
430
+ var problem = diag.problem || (last && ('last rebuild failed: ' + last.message));
431
+ if (!problem) return null;
432
+ var fix = diag.fix || (last && last.fix) || 'see .monomind/graph/build.log';
433
+ var age = diag.behind == null ? 'may be stale' : 'is ' + diag.behind + ' commit(s) behind HEAD';
434
+ return '[MONOGRAPH_WARN] The monograph graph ' + age + ' and the hooks cannot rebuild it: ' +
435
+ problem + ' — run: ' + fix;
436
+ }
437
+
438
+ /**
439
+ * Once per cause, say that the grep gate and graph hints are off: the graph
440
+ * DB exists but the hooks can't open it (`db` null), or it is more than 50
441
+ * commits behind. Later prompts with the same cause return null.
442
+ */
443
+ function graphOffNoticeOnce(projectDir, db) {
444
+ var dbPath = path.join(projectDir, '.monomind', 'monograph.db');
445
+ var key;
446
+ var behind = null;
447
+ var commit = null;
448
+ if (!db) {
449
+ if (!fs.existsSync(dbPath)) return null;
450
+ key = 'unloadable';
451
+ } else {
452
+ try { var row = db.prepare(COMMIT_SQL).get(); commit = row && row.value; } catch (_) { return null; }
453
+ if (!commit) return null;
454
+ key = 'stale:' + commit;
455
+ }
456
+ var marker = path.join(_graphDir(projectDir), 'gate-off-notice.json');
457
+ var prev = _readJson(marker);
458
+ if (prev && prev.key === key) return null;
459
+ var msg;
460
+ if (!db) {
461
+ msg = '[MONOGRAPH_OFF] The hooks cannot load @monoes/monograph, so the grep gate and [MONOGRAPH] hints are off. Fix: ' + GLOBAL_FIX;
462
+ } else {
463
+ behind = commitsBehind(projectDir, commit);
464
+ if (behind == null || behind <= STALE_LIMIT) return null;
465
+ msg = '[MONOGRAPH_OFF] The monograph graph is ' + behind + ' commits behind HEAD (limit ' + STALE_LIMIT +
466
+ '), so the grep gate and [MONOGRAPH] hints are off until it is rebuilt. Rebuild: npx monomind monograph build (or mcp__monomind__monograph_build)';
467
+ }
468
+ try {
469
+ fs.mkdirSync(path.dirname(marker), { recursive: true });
470
+ fs.writeFileSync(marker, JSON.stringify({ key: key, at: Date.now() }));
471
+ } catch (_) {}
472
+ return msg;
473
+ }
474
+
475
+ module.exports = {
476
+ GLOBAL_FIX,
477
+ STALE_LIMIT,
478
+ BUILD_LOG_MAX_BYTES,
479
+ entryFromPkgDir,
480
+ resolveMonographEntry,
481
+ findMonomindBin,
482
+ npmGlobalRoot,
483
+ npxCacheDir,
484
+ checkNative,
485
+ claimRebuildLock,
486
+ startRebuild,
487
+ capBuildLog,
488
+ recordRebuildFailure,
489
+ recordBuildError,
490
+ recordRebuildSuccess,
491
+ readRebuildStatus,
492
+ readIndexedCommit,
493
+ commitsBehind,
494
+ diagnose,
495
+ sessionWarning,
496
+ graphOffNoticeOnce,
497
+ };
@@ -22,59 +22,16 @@ process.emitWarning = function (warning) {
22
22
  };
23
23
 
24
24
  // @monoes/monograph is "type":"module" with an exports map that has no
25
- // "require" condition — a bare `require('@monoes/monograph')` (or
26
- // require() of its package directory) always throws "No exports main
27
- // defined", regardless of whether the package is actually installed.
28
- // require()-ing the package's *resolved entry file* directly bypasses the
29
- // exports-map restriction and works via Node's require(esm) support (this
30
- // codebase targets Node 20+, which has it). Reads the entry path from the
31
- // package's own package.json instead of hardcoding "dist/src/index.js" so
32
- // this survives a future monograph dist-layout change.
33
- function _resolvePkgEntryFile(pkgDir) {
34
- try {
35
- var pkg = JSON.parse(fs.readFileSync(path.join(pkgDir, 'package.json'), 'utf-8'));
36
- var entry = (pkg.exports && pkg.exports['.'] && (pkg.exports['.'].import || pkg.exports['.'].default)) || pkg.main;
37
- if (!entry) return null;
38
- var full = path.join(pkgDir, entry);
39
- return fs.existsSync(full) ? full : null;
40
- } catch (e) { return null; }
41
- }
42
-
25
+ // "require" condition — a bare `require('@monoes/monograph')` always throws
26
+ // "No exports main defined". require()-ing the package's *resolved entry
27
+ // file* directly works via Node's require(esm) support. The entry comes from
28
+ // monograph-resolve.cjs, the one resolution every hook uses: project install,
29
+ // global npm root, then the copy bundled with the CLI in the npx cache (#328).
43
30
  function _requireMonograph() {
44
- var candidates = [
45
- path.join(CWD, 'node_modules/.pnpm/node_modules/@monoes/monograph'),
46
- path.join(CWD, 'packages/node_modules/.pnpm/node_modules/@monoes/monograph'),
47
- path.join(CWD, 'node_modules/@monoes/monograph'),
48
- ];
49
- for (var i = 0; i < candidates.length; i++) {
50
- var entry = fs.existsSync(candidates[i]) ? _resolvePkgEntryFile(candidates[i]) : null;
51
- if (entry) { try { return require(entry); } catch (e) {} }
52
- }
53
- // Ancestor-directory search — the equivalent of bare `require('@monoes/
54
- // monograph')`'s own node_modules walk, needed since that call form can
55
- // never succeed against this package's exports map.
56
- var dir = CWD;
57
- for (;;) {
58
- var pkgDir = path.join(dir, 'node_modules', '@monoes', 'monograph');
59
- var entry = fs.existsSync(pkgDir) ? _resolvePkgEntryFile(pkgDir) : null;
60
- if (entry) { try { return require(entry); } catch (e) {} break; }
61
- var parent = path.dirname(dir);
62
- if (parent === dir) break;
63
- dir = parent;
64
- }
65
- // Global npm install fallback (e.g. `npm install -g @monoes/monograph`).
66
- // Mirrors monograph-freshen.cjs's resolveMonographEntry(), which already
67
- // checks this — without it, a global-only install builds the graph fine
68
- // (via that script) but every hook-side consumer of this function
69
- // (graph-status, inline suggestions, micro-agents) can never find it.
70
31
  try {
71
- var { execSync } = require('child_process');
72
- var globalRoot = execSync('npm root -g', { encoding: 'utf-8', timeout: 5000 }).trim();
73
- var globalPkgDir = path.join(globalRoot, '@monoes', 'monograph');
74
- var globalEntry = fs.existsSync(globalPkgDir) ? _resolvePkgEntryFile(globalPkgDir) : null;
75
- if (globalEntry) return require(globalEntry);
76
- } catch (e) {}
77
- return null;
32
+ var hit = require('./monograph-resolve.cjs').resolveMonographEntry(CWD);
33
+ return hit ? require(hit.entry) : null;
34
+ } catch (e) { return null; }
78
35
  }
79
36
 
80
37
  // Memoized at module scope — opening monograph.db can take 7-10s.
@@ -1 +1 @@
1
- {"version":3,"file":"cap-code.d.ts","sourceRoot":"","sources":["../../../src/capabilities/cap-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAMjB,MAAM,YAAY,CAAC;AAcpB,eAAO,MAAM,cAAc,EAAE,gBAuE5B,CAAC"}
1
+ {"version":3,"file":"cap-code.d.ts","sourceRoot":"","sources":["../../../src/capabilities/cap-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAMjB,MAAM,YAAY,CAAC;AAcpB,eAAO,MAAM,cAAc,EAAE,gBA2E5B,CAAC"}
@@ -13,6 +13,10 @@ function getMonographDbPath(rootDir) {
13
13
  export const codeCapability = {
14
14
  name: 'code',
15
15
  detect(scan) {
16
+ // A built monograph index is proof there is code to search, even when the
17
+ // fingerprint predates the code (e.g. the one `init` writes up front).
18
+ if (scan.root && fs.existsSync(getMonographDbPath(scan.root)))
19
+ return 1;
16
20
  return scan.capabilities.code.confidence;
17
21
  },
18
22
  async activate(rootDir) {
@@ -49,12 +53,13 @@ export const codeCapability = {
49
53
  const rows = ftsSearch(db, query, limit);
50
54
  return rows
51
55
  .filter((r) => r.filePath)
52
- .map((r) => ({
56
+ .map((r, idx) => ({
53
57
  path: r.filePath,
54
- // FTS5 rank is <= 0, more negative = better match; flip the sign
55
- // so higher score = better, matching CapabilityManager.search()'s
56
- // sort order across capabilities.
57
- score: -r.rank,
58
+ // Rows arrive best-first. Raw FTS5 bm25 ranks are tiny on small
59
+ // indexes (~1e-6), which sank every code hit below the 0.5..1
60
+ // scores of other capabilities in CapabilityManager.search();
61
+ // score by position instead, as cap-documents does.
62
+ score: 1 / (idx + 1),
58
63
  snippet: r.startLine && r.startLine > 0
59
64
  ? `${r.label} ${r.name} (line ${r.startLine})`
60
65
  : `${r.label} ${r.name}`,
@@ -1 +1 @@
1
- {"version":3,"file":"cap-code.js","sourceRoot":"","sources":["../../../src/capabilities/cap-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B;;;;;GAKG;AACH,IAAI,WAAW,GAAG,EAAE,CAAC;AAErB,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,IAAI,EAAE,MAAM;IAEZ,MAAM,CAAC,IAAmB;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,sEAAsE;QACtE,sEAAsE;QACtE,uEAAuE;QACvE,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAmB;QAC7B,qDAAqD;QACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QACpC,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACzE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACzC,OAAO,IAAI;qBACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;qBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACX,IAAI,EAAE,CAAC,CAAC,QAAkB;oBAC1B,iEAAiE;oBACjE,kEAAkE;oBAClE,kCAAkC;oBAClC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;oBACd,OAAO,EACL,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC;wBAC5B,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,SAAS,GAAG;wBAC9C,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE;oBAC5B,IAAI,EAAE,MAAe;oBACrB,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;iBACzE,CAAC,CAAC;qBACF,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrB,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,oEAAoE;YACpE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,wEAAwE;QACxE,2EAA2E;QAC3E,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"cap-code.js","sourceRoot":"","sources":["../../../src/capabilities/cap-code.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export declare class CapabilityManager {
8
8
  isActive(name: CapabilityName): boolean;
9
9
  getActive(): CapabilityModule[];
10
10
  runHealthChecks(): Promise<HealthCheck[]>;
11
- search(query: string, limit?: number): Promise<SearchResult[]>;
11
+ /** `type` restricts the search to one capability, so others can't crowd it out of `limit`. */
12
+ search(query: string, limit?: number, type?: CapabilityName): Promise<SearchResult[]>;
12
13
  }
13
14
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/capabilities/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAMpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,MAAM,CAA+C;IAE7D,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAEvC;IAEK,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF;IAED,OAAO,CAAC,gBAAgB;IAexB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAEtC;IAED,SAAS,IAAI,gBAAgB,EAAE,CAE9B;IAEK,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAQ9C;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAQ/D;CACF"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/capabilities/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAMpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,MAAM,CAA+C;IAE7D,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAEvC;IAEK,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF;IAED,OAAO,CAAC,gBAAgB;IAexB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAEtC;IAED,SAAS,IAAI,gBAAgB,EAAE,CAE9B;IAEK,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAQ9C;IAED,8FAA8F;IACxF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAStF;CACF"}
@@ -66,9 +66,12 @@ export class CapabilityManager {
66
66
  }
67
67
  return results;
68
68
  }
69
- async search(query, limit = 20) {
69
+ /** `type` restricts the search to one capability, so others can't crowd it out of `limit`. */
70
+ async search(query, limit = 20, type) {
70
71
  const allResults = [];
71
72
  for (const module of this.active.values()) {
73
+ if (type && module.name !== type)
74
+ continue;
72
75
  if (module.search) {
73
76
  allResults.push(...(await module.search(query, limit)));
74
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/capabilities/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/capabilities/manager.ts"],"names":[],"mappings":"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"}