@monoes/monomindcli 2.0.3 → 2.1.3

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 (328) hide show
  1. package/.claude/helpers/control-start.cjs +13 -20
  2. package/.claude/helpers/event-logger.cjs +109 -6
  3. package/.claude/helpers/graphify-freshen.cjs +19 -17
  4. package/.claude/helpers/handlers/agent-start-handler.cjs +60 -28
  5. package/.claude/helpers/handlers/capture-handler.cjs +99 -28
  6. package/.claude/helpers/handlers/edit-handler.cjs +27 -9
  7. package/.claude/helpers/handlers/gates-handler.cjs +18 -9
  8. package/.claude/helpers/handlers/loops-status-handler.cjs +1 -1
  9. package/.claude/helpers/handlers/route-handler.cjs +33 -4
  10. package/.claude/helpers/handlers/session-handler.cjs +75 -45
  11. package/.claude/helpers/handlers/session-restore-handler.cjs +0 -12
  12. package/.claude/helpers/handlers/task-handler.cjs +53 -22
  13. package/.claude/helpers/hook-handler.cjs +75 -4
  14. package/.claude/helpers/intelligence.cjs +94 -15
  15. package/.claude/helpers/session.cjs +6 -1
  16. package/.claude/helpers/statusline.cjs +10 -10
  17. package/.claude/helpers/token-tracker.cjs +3 -3
  18. package/.claude/helpers/utils/agent-registrations.cjs +41 -0
  19. package/.claude/helpers/utils/fs-helpers.cjs +183 -0
  20. package/.claude/helpers/utils/micro-agents.cjs +10 -6
  21. package/.claude/helpers/utils/monograph.cjs +73 -2
  22. package/.claude/helpers/utils/telemetry.cjs +35 -19
  23. package/README.md +74 -92
  24. package/bin/cli.js +10 -1
  25. package/dist/src/agents/registry-builder.js.map +1 -1
  26. package/dist/src/browser/dashboard/server.js.map +1 -1
  27. package/dist/src/browser/workflow/engine.d.ts.map +1 -1
  28. package/dist/src/browser/workflow/engine.js.map +1 -1
  29. package/dist/src/browser/workflow/store.d.ts +2 -2
  30. package/dist/src/browser/workflow/store.d.ts.map +1 -1
  31. package/dist/src/browser/workflow/store.js.map +1 -1
  32. package/dist/src/capabilities/manager.d.ts.map +1 -1
  33. package/dist/src/capabilities/watcher.d.ts.map +1 -1
  34. package/dist/src/commands/agent-lifecycle.js.map +1 -1
  35. package/dist/src/commands/agent-ops.d.ts.map +1 -1
  36. package/dist/src/commands/agent-ops.js +9 -15
  37. package/dist/src/commands/agent-ops.js.map +1 -1
  38. package/dist/src/commands/agent.d.ts.map +1 -1
  39. package/dist/src/commands/analyze-ast.js.map +1 -1
  40. package/dist/src/commands/analyze.d.ts.map +1 -1
  41. package/dist/src/commands/analyze.js.map +1 -1
  42. package/dist/src/commands/autopilot.d.ts.map +1 -1
  43. package/dist/src/commands/browse-action.d.ts.map +1 -1
  44. package/dist/src/commands/browse-action.js.map +1 -1
  45. package/dist/src/commands/browse-platform.d.ts.map +1 -1
  46. package/dist/src/commands/browse-workflow.d.ts.map +1 -1
  47. package/dist/src/commands/browse.d.ts +1 -1
  48. package/dist/src/commands/browse.d.ts.map +1 -1
  49. package/dist/src/commands/cleanup.d.ts.map +1 -1
  50. package/dist/src/commands/cleanup.js +20 -4
  51. package/dist/src/commands/cleanup.js.map +1 -1
  52. package/dist/src/commands/completions.d.ts.map +1 -1
  53. package/dist/src/commands/completions.js +66 -261
  54. package/dist/src/commands/completions.js.map +1 -1
  55. package/dist/src/commands/config.d.ts.map +1 -1
  56. package/dist/src/commands/crash-reporting.d.ts.map +1 -1
  57. package/dist/src/commands/design-detect.d.ts.map +1 -1
  58. package/dist/src/commands/design-palette.d.ts.map +1 -1
  59. package/dist/src/commands/doc.d.ts.map +1 -1
  60. package/dist/src/commands/doctor-env-checks.d.ts.map +1 -1
  61. package/dist/src/commands/doctor-env-checks.js +5 -0
  62. package/dist/src/commands/doctor-env-checks.js.map +1 -1
  63. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  64. package/dist/src/commands/doctor.d.ts.map +1 -1
  65. package/dist/src/commands/doctor.js +7 -2
  66. package/dist/src/commands/doctor.js.map +1 -1
  67. package/dist/src/commands/guidance.d.ts.map +1 -1
  68. package/dist/src/commands/hooks-workers.d.ts.map +1 -1
  69. package/dist/src/commands/hooks-workers.js +7 -0
  70. package/dist/src/commands/hooks-workers.js.map +1 -1
  71. package/dist/src/commands/hooks.d.ts.map +1 -1
  72. package/dist/src/commands/index.d.ts.map +1 -1
  73. package/dist/src/commands/index.js +3 -0
  74. package/dist/src/commands/index.js.map +1 -1
  75. package/dist/src/commands/init.d.ts.map +1 -1
  76. package/dist/src/commands/mcp.d.ts.map +1 -1
  77. package/dist/src/commands/mcp.js +11 -6
  78. package/dist/src/commands/mcp.js.map +1 -1
  79. package/dist/src/commands/memory-admin.d.ts.map +1 -1
  80. package/dist/src/commands/memory-admin.js +12 -6
  81. package/dist/src/commands/memory-admin.js.map +1 -1
  82. package/dist/src/commands/memory-transfer.d.ts.map +1 -1
  83. package/dist/src/commands/memory-transfer.js +6 -13
  84. package/dist/src/commands/memory-transfer.js.map +1 -1
  85. package/dist/src/commands/memory.d.ts.map +1 -1
  86. package/dist/src/commands/monograph.d.ts.map +1 -1
  87. package/dist/src/commands/monograph.js +3 -3
  88. package/dist/src/commands/monograph.js.map +1 -1
  89. package/dist/src/commands/org.d.ts +3 -1
  90. package/dist/src/commands/org.d.ts.map +1 -1
  91. package/dist/src/commands/org.js +321 -127
  92. package/dist/src/commands/org.js.map +1 -1
  93. package/dist/src/commands/performance.d.ts.map +1 -1
  94. package/dist/src/commands/platforms.d.ts +1 -1
  95. package/dist/src/commands/platforms.d.ts.map +1 -1
  96. package/dist/src/commands/providers.d.ts.map +1 -1
  97. package/dist/src/commands/report-crash.d.ts.map +1 -1
  98. package/dist/src/commands/route.d.ts.map +1 -1
  99. package/dist/src/commands/search-universal.d.ts.map +1 -1
  100. package/dist/src/commands/security.d.ts.map +1 -1
  101. package/dist/src/commands/session.d.ts.map +1 -1
  102. package/dist/src/commands/start.d.ts.map +1 -1
  103. package/dist/src/commands/start.js +142 -37
  104. package/dist/src/commands/start.js.map +1 -1
  105. package/dist/src/commands/status.d.ts.map +1 -1
  106. package/dist/src/commands/swarm.d.ts.map +1 -1
  107. package/dist/src/commands/task.d.ts.map +1 -1
  108. package/dist/src/commands/tokens.d.ts.map +1 -1
  109. package/dist/src/commands/tokens.js +21 -3
  110. package/dist/src/commands/tokens.js.map +1 -1
  111. package/dist/src/commands/transfer-store.d.ts.map +1 -1
  112. package/dist/src/commands/update.d.ts.map +1 -1
  113. package/dist/src/config-adapter.d.ts.map +1 -1
  114. package/dist/src/config-adapter.js +37 -17
  115. package/dist/src/config-adapter.js.map +1 -1
  116. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  117. package/dist/src/index.d.ts.map +1 -1
  118. package/dist/src/index.js +64 -28
  119. package/dist/src/index.js.map +1 -1
  120. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  121. package/dist/src/init/claudemd-generator.js +44 -11
  122. package/dist/src/init/claudemd-generator.js.map +1 -1
  123. package/dist/src/init/executor.d.ts.map +1 -1
  124. package/dist/src/init/executor.js +93 -55
  125. package/dist/src/init/executor.js.map +1 -1
  126. package/dist/src/init/mcp-generator.js.map +1 -1
  127. package/dist/src/mcp-client.d.ts +8 -3
  128. package/dist/src/mcp-client.d.ts.map +1 -1
  129. package/dist/src/mcp-client.js +37 -3
  130. package/dist/src/mcp-client.js.map +1 -1
  131. package/dist/src/mcp-server.d.ts.map +1 -1
  132. package/dist/src/mcp-server.js +8 -2
  133. package/dist/src/mcp-server.js.map +1 -1
  134. package/dist/src/mcp-tools/agent-tools.d.ts +20 -0
  135. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  136. package/dist/src/mcp-tools/agent-tools.js +10 -5
  137. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  138. package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
  139. package/dist/src/mcp-tools/auto-install.d.ts +8 -8
  140. package/dist/src/mcp-tools/auto-install.d.ts.map +1 -1
  141. package/dist/src/mcp-tools/auto-install.js.map +1 -1
  142. package/dist/src/mcp-tools/browser-tools.d.ts.map +1 -1
  143. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  144. package/dist/src/mcp-tools/claims-tools.d.ts.map +1 -1
  145. package/dist/src/mcp-tools/coherence/causal-infer.d.ts.map +1 -1
  146. package/dist/src/mcp-tools/coherence/causal-infer.js.map +1 -1
  147. package/dist/src/mcp-tools/coherence/coherence-check.d.ts.map +1 -1
  148. package/dist/src/mcp-tools/coherence/consensus-verify.d.ts.map +1 -1
  149. package/dist/src/mcp-tools/coherence/memory-gate.d.ts.map +1 -1
  150. package/dist/src/mcp-tools/coherence/quantum-topology.d.ts.map +1 -1
  151. package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts.map +1 -1
  152. package/dist/src/mcp-tools/coherence/spectral-analyze.js.map +1 -1
  153. package/dist/src/mcp-tools/coherence/types.d.ts +31 -31
  154. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  155. package/dist/src/mcp-tools/github-tools.d.ts.map +1 -1
  156. package/dist/src/mcp-tools/github-tools.js +30 -8
  157. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  158. package/dist/src/mcp-tools/graphify-tools.d.ts.map +1 -1
  159. package/dist/src/mcp-tools/graphify-tools.js +11 -2
  160. package/dist/src/mcp-tools/graphify-tools.js.map +1 -1
  161. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  162. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  163. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  164. package/dist/src/mcp-tools/hive-mind-tools.js +56 -35
  165. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  166. package/dist/src/mcp-tools/hooks-embedding.js.map +1 -1
  167. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  168. package/dist/src/mcp-tools/knowledge-tools.d.ts.map +1 -1
  169. package/dist/src/mcp-tools/knowledge-tools.js +9 -1
  170. package/dist/src/mcp-tools/knowledge-tools.js.map +1 -1
  171. package/dist/src/mcp-tools/monograph-compat.d.ts.map +1 -1
  172. package/dist/src/mcp-tools/monograph-compat.js +56 -14
  173. package/dist/src/mcp-tools/monograph-compat.js.map +1 -1
  174. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  175. package/dist/src/mcp-tools/monograph-tools.js +88 -41
  176. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  177. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  178. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.d.ts +36 -36
  179. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.d.ts.map +1 -1
  180. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +4 -4
  181. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts.map +1 -1
  182. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  183. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  184. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  185. package/dist/src/mcp-tools/swarm-tools.js +6 -4
  186. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  187. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  188. package/dist/src/mcp-tools/system-tools.js +4 -4
  189. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  190. package/dist/src/mcp-tools/transfer-tools.d.ts.map +1 -1
  191. package/dist/src/mcp-tools/types.d.ts +20 -0
  192. package/dist/src/mcp-tools/types.d.ts.map +1 -1
  193. package/dist/src/mcp-tools/types.js +36 -1
  194. package/dist/src/mcp-tools/types.js.map +1 -1
  195. package/dist/src/memory/ewc-consolidation.d.ts +12 -0
  196. package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
  197. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  198. package/dist/src/memory/hnsw-operations.d.ts +13 -1
  199. package/dist/src/memory/hnsw-operations.d.ts.map +1 -1
  200. package/dist/src/memory/hnsw-operations.js +66 -14
  201. package/dist/src/memory/hnsw-operations.js.map +1 -1
  202. package/dist/src/memory/intelligence.d.ts.map +1 -1
  203. package/dist/src/memory/intelligence.js +99 -3
  204. package/dist/src/memory/intelligence.js.map +1 -1
  205. package/dist/src/memory/memory-bridge.d.ts +7 -0
  206. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  207. package/dist/src/memory/memory-bridge.js +20 -0
  208. package/dist/src/memory/memory-bridge.js.map +1 -1
  209. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  210. package/dist/src/memory/sona-optimizer.d.ts +12 -0
  211. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  212. package/dist/src/memory/sona-optimizer.js.map +1 -1
  213. package/dist/src/monovector/coverage-router.js.map +1 -1
  214. package/dist/src/monovector/coverage-tools.d.ts.map +1 -1
  215. package/dist/src/monovector/diff-classifier.d.ts.map +1 -1
  216. package/dist/src/monovector/diff-classifier.js.map +1 -1
  217. package/dist/src/monovector/init-state.js.map +1 -1
  218. package/dist/src/observability/replay-reader.d.ts.map +1 -1
  219. package/dist/src/orgrt/broker.d.ts +26 -0
  220. package/dist/src/orgrt/broker.d.ts.map +1 -0
  221. package/dist/src/orgrt/broker.js +73 -0
  222. package/dist/src/orgrt/broker.js.map +1 -0
  223. package/dist/src/orgrt/bus.d.ts +5 -1
  224. package/dist/src/orgrt/bus.d.ts.map +1 -1
  225. package/dist/src/orgrt/bus.js +5 -1
  226. package/dist/src/orgrt/bus.js.map +1 -1
  227. package/dist/src/orgrt/daemon.d.ts +46 -0
  228. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  229. package/dist/src/orgrt/daemon.js +201 -18
  230. package/dist/src/orgrt/daemon.js.map +1 -1
  231. package/dist/src/orgrt/forwarder.d.ts +10 -5
  232. package/dist/src/orgrt/forwarder.d.ts.map +1 -1
  233. package/dist/src/orgrt/forwarder.js +138 -8
  234. package/dist/src/orgrt/forwarder.js.map +1 -1
  235. package/dist/src/orgrt/inbox.d.ts +11 -0
  236. package/dist/src/orgrt/inbox.d.ts.map +1 -0
  237. package/dist/src/orgrt/inbox.js +56 -0
  238. package/dist/src/orgrt/inbox.js.map +1 -0
  239. package/dist/src/orgrt/mailbox.d.ts.map +1 -1
  240. package/dist/src/orgrt/policy.d.ts +5 -1
  241. package/dist/src/orgrt/policy.d.ts.map +1 -1
  242. package/dist/src/orgrt/policy.js +58 -5
  243. package/dist/src/orgrt/policy.js.map +1 -1
  244. package/dist/src/orgrt/provider.d.ts.map +1 -1
  245. package/dist/src/orgrt/provider.js +1 -0
  246. package/dist/src/orgrt/provider.js.map +1 -1
  247. package/dist/src/orgrt/scheduler.d.ts +13 -0
  248. package/dist/src/orgrt/scheduler.d.ts.map +1 -0
  249. package/dist/src/orgrt/scheduler.js +48 -0
  250. package/dist/src/orgrt/scheduler.js.map +1 -0
  251. package/dist/src/orgrt/server.d.ts +9 -0
  252. package/dist/src/orgrt/server.d.ts.map +1 -0
  253. package/dist/src/orgrt/server.js +39 -0
  254. package/dist/src/orgrt/server.js.map +1 -0
  255. package/dist/src/orgrt/session.d.ts +10 -1
  256. package/dist/src/orgrt/session.d.ts.map +1 -1
  257. package/dist/src/orgrt/session.js +24 -1
  258. package/dist/src/orgrt/session.js.map +1 -1
  259. package/dist/src/orgrt/test-loop.d.ts +12 -0
  260. package/dist/src/orgrt/test-loop.d.ts.map +1 -0
  261. package/dist/src/orgrt/test-loop.js +108 -0
  262. package/dist/src/orgrt/test-loop.js.map +1 -0
  263. package/dist/src/orgrt/types.d.ts +52 -52
  264. package/dist/src/output.d.ts +29 -29
  265. package/dist/src/output.d.ts.map +1 -1
  266. package/dist/src/output.js +22 -7
  267. package/dist/src/output.js.map +1 -1
  268. package/dist/src/parser.d.ts +32 -0
  269. package/dist/src/parser.d.ts.map +1 -1
  270. package/dist/src/parser.js +130 -5
  271. package/dist/src/parser.js.map +1 -1
  272. package/dist/src/pricing/model-pricing.d.ts.map +1 -1
  273. package/dist/src/production/circuit-breaker.d.ts.map +1 -1
  274. package/dist/src/production/circuit-breaker.js.map +1 -1
  275. package/dist/src/production/error-handler.d.ts.map +1 -1
  276. package/dist/src/production/error-handler.js.map +1 -1
  277. package/dist/src/production/monitoring.d.ts.map +1 -1
  278. package/dist/src/production/monitoring.js.map +1 -1
  279. package/dist/src/production/rate-limiter.d.ts.map +1 -1
  280. package/dist/src/production/rate-limiter.js.map +1 -1
  281. package/dist/src/production/retry.d.ts.map +1 -1
  282. package/dist/src/production/retry.js.map +1 -1
  283. package/dist/src/prompt.d.ts.map +1 -1
  284. package/dist/src/prompt.js.map +1 -1
  285. package/dist/src/routing/embed-worker.js +13 -1
  286. package/dist/src/routing/embed-worker.js.map +1 -1
  287. package/dist/src/routing/llm-caller.js.map +1 -1
  288. package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
  289. package/dist/src/routing/route-layer-factory.js +31 -0
  290. package/dist/src/routing/route-layer-factory.js.map +1 -1
  291. package/dist/src/services/config-file-manager.d.ts +21 -0
  292. package/dist/src/services/config-file-manager.d.ts.map +1 -1
  293. package/dist/src/services/config-file-manager.js +60 -7
  294. package/dist/src/services/config-file-manager.js.map +1 -1
  295. package/dist/src/services/crash-reporter.d.ts.map +1 -1
  296. package/dist/src/services/crash-reporter.js +2 -1
  297. package/dist/src/services/crash-reporter.js.map +1 -1
  298. package/dist/src/suggest.d.ts.map +1 -1
  299. package/dist/src/suggest.js.map +1 -1
  300. package/dist/src/transfer/export.js.map +1 -1
  301. package/dist/src/transfer/ipfs/client.js.map +1 -1
  302. package/dist/src/transfer/ipfs/upload.js.map +1 -1
  303. package/dist/src/transfer/models/seraphine.d.ts.map +1 -1
  304. package/dist/src/transfer/storage/gcs.js.map +1 -1
  305. package/dist/src/transfer/store/discovery.d.ts.map +1 -1
  306. package/dist/src/transfer/store/discovery.js.map +1 -1
  307. package/dist/src/transfer/store/download.d.ts.map +1 -1
  308. package/dist/src/transfer/store/download.js.map +1 -1
  309. package/dist/src/transfer/store/index.d.ts.map +1 -1
  310. package/dist/src/transfer/store/index.js.map +1 -1
  311. package/dist/src/transfer/store/publish.d.ts.map +1 -1
  312. package/dist/src/transfer/store/publish.js.map +1 -1
  313. package/dist/src/transfer/store/search.js.map +1 -1
  314. package/dist/src/types.d.ts +2 -2
  315. package/dist/src/types.d.ts.map +1 -1
  316. package/dist/src/types.js.map +1 -1
  317. package/dist/src/ui/dashboard.html +243 -49
  318. package/dist/src/ui/orgs-files.js +192 -0
  319. package/dist/src/ui/orgs.html +79 -11
  320. package/dist/src/ui/server.mjs +346 -139
  321. package/dist/src/update/checker.js.map +1 -1
  322. package/dist/src/update/rate-limiter.js.map +1 -1
  323. package/dist/src/utils/input-guards.d.ts +9 -0
  324. package/dist/src/utils/input-guards.d.ts.map +1 -1
  325. package/dist/src/utils/input-guards.js +39 -5
  326. package/dist/src/utils/input-guards.js.map +1 -1
  327. package/dist/tsconfig.tsbuildinfo +1 -1
  328. package/package.json +15 -15
@@ -6,26 +6,67 @@
6
6
  * moved to the real package.
7
7
  */
8
8
  import { join, resolve, relative } from 'path';
9
- import { existsSync, readFileSync, statSync } from 'fs';
10
- import { openDb, closeDb, countNodes } from '@monoes/monograph';
9
+ import { existsSync, statSync } from 'fs';
10
+ import { execSync } from 'child_process';
11
+ import { openDb, closeDb, countNodes, parseGroupConfig } from '@monoes/monograph';
12
+ import { getProjectCwd } from './types.js';
13
+ import { realOrResolved } from '../utils/input-guards.js';
14
+ // ── Group config reader ───────────────────────────────────────────────────────
11
15
  const MAX_GROUP_CONFIG_BYTES = 1 * 1024 * 1024; // 1 MB
16
+ /**
17
+ * Read repos from a group.yaml config (the real group config format used by
18
+ * monograph_group_query / monograph_group_sync / monograph_group_list — see
19
+ * @monoes/monograph's groups/group-config.ts).
20
+ *
21
+ * Throws on an out-of-bounds or oversized path instead of silently returning
22
+ * an empty list, so callers can distinguish "no groups configured" from
23
+ * "your repoPath was rejected".
24
+ */
12
25
  function readGroupConfig(configPath) {
13
26
  if (!existsSync(configPath))
14
27
  return [];
28
+ // Guard: only allow paths within the project cwd to prevent traversal to
29
+ // /etc/passwd etc. Uses getProjectCwd() (honors MONOMIND_CWD) rather than
30
+ // process.cwd(), which is trivially bypassed when the MCP server runs with
31
+ // cwd "/".
32
+ // realOrResolved resolves symlinks (walking up to the longest existing
33
+ // ancestor) so a link that's lexically inside projectCwd but physically
34
+ // points outside it can't bypass this containment check — same guard
35
+ // input-guards.ts's validatePath uses, applied here against getProjectCwd()
36
+ // instead of process.cwd() since that's the whole reason this check isn't
37
+ // just a direct call to validateInput({type:'path'}).
38
+ const projectCwd = realOrResolved(getProjectCwd());
39
+ const resolved = realOrResolved(resolve(configPath));
40
+ const rel = relative(projectCwd, resolved);
41
+ if (rel.startsWith('..') || resolve(rel) === resolve('/')) {
42
+ throw new Error(`Rejected group config path outside project directory: ${resolved} (project cwd: ${projectCwd})`);
43
+ }
44
+ // OOM guard: skip files larger than 1 MB
45
+ if (statSync(configPath).size > MAX_GROUP_CONFIG_BYTES) {
46
+ throw new Error(`Group config file too large (> ${MAX_GROUP_CONFIG_BYTES} bytes): ${configPath}`);
47
+ }
48
+ return parseGroupConfig(configPath).repos;
49
+ }
50
+ /**
51
+ * Compute whether a repo's monograph index is stale relative to HEAD, the
52
+ * same way monograph_staleness does: compare the last indexed commit hash
53
+ * against `git rev-list --count <lastCommit>..HEAD`. Mirrors the threshold
54
+ * used by monograph-tools.ts (STALENESS_THRESHOLD = 10).
55
+ */
56
+ function isRepoStale(db, repoPath) {
15
57
  try {
16
- // Guard: only allow paths within cwd to prevent traversal to /etc/passwd etc.
17
- const resolved = resolve(configPath);
18
- const rel = relative(process.cwd(), resolved);
19
- if (rel.startsWith('..') || resolve(rel) === resolve('/'))
20
- return [];
21
- // OOM guard: skip files larger than 1 MB
22
- if (statSync(configPath).size > MAX_GROUP_CONFIG_BYTES)
23
- return [];
24
- const raw = readFileSync(configPath, 'utf-8');
25
- return JSON.parse(raw);
58
+ const meta = (db.prepare("SELECT value FROM index_meta WHERE key = 'last_commit_hash'").get()
59
+ ?? db.prepare("SELECT value FROM index_meta WHERE key = 'lastCommit'").get());
60
+ const lastCommit = meta?.value;
61
+ if (!lastCommit || !/^[0-9a-f]{7,40}$/i.test(lastCommit))
62
+ return false;
63
+ const out = execSync(`git rev-list --count ${lastCommit}..HEAD`, {
64
+ cwd: repoPath, encoding: 'utf-8',
65
+ }).trim();
66
+ return parseInt(out, 10) > 10;
26
67
  }
27
68
  catch {
28
- return [];
69
+ return false;
29
70
  }
30
71
  }
31
72
  // ── getGroupContracts ─────────────────────────────────────────────────────────
@@ -74,11 +115,12 @@ export async function getGroupStatus(configPath) {
74
115
  const nc = countNodes(db);
75
116
  const contracts = db.prepare("SELECT COUNT(*) as n FROM nodes WHERE label = 'Route'").get();
76
117
  const meta = db.prepare("SELECT value FROM index_meta WHERE key IN ('ua_last_commit','lastCommit') LIMIT 1").get();
118
+ const stale = isRepoStale(db, repoPath);
77
119
  closeDb(db);
78
120
  groups.push({
79
121
  name,
80
122
  indexed: nc > 0,
81
- stale: false,
123
+ stale,
82
124
  contractCount: contracts?.n ?? 0,
83
125
  ...(meta?.value ? { lastSync: meta.value } : {}),
84
126
  });
@@ -1 +1 @@
1
- {"version":3,"file":"monograph-compat.js","sourceRoot":"","sources":["../../../src/mcp-tools/monograph-compat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monograph-compat.js","sourceRoot":"","sources":["../../../src/mcp-tools/monograph-compat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"monograph-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/monograph-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAw0E1C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAAuD,CAAC;AAE/F,eAAO,MAAM,cAAc,EAAE,OAAO,EAAsD,CAAC"}
1
+ {"version":3,"file":"monograph-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/monograph-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAo3E1C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAAuD,CAAC;AAE/F,eAAO,MAAM,cAAc,EAAE,OAAO,EAAsD,CAAC"}
@@ -19,23 +19,36 @@ function _isValidDb(p) {
19
19
  return false;
20
20
  }
21
21
  }
22
- function getDbPath() {
23
- const cwd = getProjectCwd();
22
+ /**
23
+ * Resolve the monograph DB path for a given repo root (defaults to project cwd).
24
+ * Falls back to searching up to the git root when the DB isn't directly under
25
+ * `<cwd>/.monomind` — e.g. when called from a subdirectory of the repo. Only
26
+ * the no-arg (project cwd) form is cached; explicit `repoPath` overrides are
27
+ * cheap one-off lookups (staleness checks with a user-supplied path) so caching
28
+ * them isn't worth the invalidation complexity.
29
+ */
30
+ function getDbPath(repoPathOverride) {
31
+ const cwd = repoPathOverride ?? getProjectCwd();
32
+ const useCache = repoPathOverride === undefined;
24
33
  // Invalidate cache when project root changes (e.g. MONOMIND_CWD set after initialize)
25
- if (_cachedDbPath && _cachedCwd === cwd)
34
+ if (useCache && _cachedDbPath && _cachedCwd === cwd)
26
35
  return _cachedDbPath;
27
- _cachedCwd = cwd;
28
- _cachedDbPath = undefined;
36
+ if (useCache) {
37
+ _cachedCwd = cwd;
38
+ _cachedDbPath = undefined;
39
+ }
29
40
  const direct = join(cwd, '.monomind', 'monograph.db');
30
41
  if (_isValidDb(direct)) {
31
- _cachedDbPath = direct;
42
+ if (useCache)
43
+ _cachedDbPath = direct;
32
44
  return direct;
33
45
  }
34
46
  try {
35
47
  const root = execSync('git rev-parse --show-toplevel', { cwd, encoding: 'utf8' }).trim();
36
48
  const candidate = join(root, '.monomind', 'monograph.db');
37
49
  if (_isValidDb(candidate)) {
38
- _cachedDbPath = candidate;
50
+ if (useCache)
51
+ _cachedDbPath = candidate;
39
52
  return candidate;
40
53
  }
41
54
  }
@@ -46,13 +59,6 @@ function getDbPath() {
46
59
  function text(t) {
47
60
  return { content: [{ type: 'text', text: t }] };
48
61
  }
49
- function ensureDbExists() {
50
- const p = getDbPath();
51
- if (!_isValidDb(p)) {
52
- throw new Error(`Monograph index not built yet. Run monograph_build first (path: ${p}).`);
53
- }
54
- return p;
55
- }
56
62
  // ── Active watcher registry ──────────────────────────────────────────────────
57
63
  const _activeWatchers = new Map();
58
64
  function applyPprRerank(db, seedNodes, damping, maxResults) {
@@ -577,9 +583,13 @@ function taskRelevance(task, nodeText) {
577
583
  return taskTerms.filter(t => txt.includes(t)).length / taskTerms.length;
578
584
  }
579
585
  // ── monograph_visualize ───────────────────────────────────────────────────────
586
+ // Columns needed to render/export the graph — deliberately excludes `embedding`,
587
+ // which can be several KB per node (384D vectors) and would otherwise bloat
588
+ // tool-result payloads and written files by many MB.
589
+ const NODE_RENDER_COLUMNS = 'id, label, name, norm_label, file_path, start_line, end_line, community_id, is_exported, language, properties';
580
590
  const monographVisualizeTool = {
581
591
  name: 'monograph_visualize',
582
- description: 'Render the knowledge graph as HTML (default), SVG, or JSON.',
592
+ description: 'Render the knowledge graph as HTML (default), SVG, or JSON. Writes output to a file under .monomind/visualize/ and returns the file path (output can be multi-MB at the max node count, too large to return inline).',
583
593
  inputSchema: {
584
594
  type: 'object',
585
595
  properties: {
@@ -589,6 +599,7 @@ const monographVisualizeTool = {
589
599
  },
590
600
  handler: async (input) => {
591
601
  const { openDb, closeDb, toJson, toHtml, toSvg } = await import('@monoes/monograph');
602
+ const { writeFileSync, mkdirSync } = await import('fs');
592
603
  const db = openDb(getDbPath());
593
604
  try {
594
605
  // Cap maxNodes: passed to SQL LIMIT clause for both nodes (n) and edges
@@ -598,7 +609,7 @@ const monographVisualizeTool = {
598
609
  const limit = Number.isFinite(rawMaxNodes) && rawMaxNodes > 0
599
610
  ? Math.min(Math.floor(rawMaxNodes), MAX_EXPORT_NODES)
600
611
  : 500;
601
- const nodes = db.prepare('SELECT * FROM nodes LIMIT ?').all(limit);
612
+ const nodes = db.prepare(`SELECT ${NODE_RENDER_COLUMNS} FROM nodes LIMIT ?`).all(limit);
602
613
  // Only include edges where both endpoints are in the visible node set
603
614
  const edges = db.prepare(`
604
615
  SELECT e.* FROM edges e
@@ -607,11 +618,15 @@ const monographVisualizeTool = {
607
618
  LIMIT ?
608
619
  `).all(limit, limit, limit * 3);
609
620
  const fmt = input.format ?? 'html';
610
- if (fmt === 'json')
611
- return text(toJson(nodes, edges));
612
- if (fmt === 'svg')
613
- return text(toSvg(nodes, edges));
614
- return text(toHtml(nodes, edges));
621
+ const rendered = fmt === 'json' ? toJson(nodes, edges)
622
+ : fmt === 'svg' ? toSvg(nodes, edges)
623
+ : toHtml(nodes, edges);
624
+ const ext = fmt === 'json' ? 'json' : fmt === 'svg' ? 'svg' : 'html';
625
+ const outDir = resolve(join(getProjectCwd(), '.monomind', 'visualize'));
626
+ mkdirSync(outDir, { recursive: true });
627
+ const outPath = join(outDir, `graph-${Date.now()}.${ext}`);
628
+ writeFileSync(outPath, rendered);
629
+ return text(`Visualization written to ${outPath} (${nodes.length} nodes, ${edges.length} edges)${ext === 'html' ? '\nNote: HTML uses the vis-network CDN script and requires network access to render.' : ''}`);
615
630
  }
616
631
  finally {
617
632
  closeDb(db);
@@ -700,7 +715,8 @@ const monographReportTool = {
700
715
  return `${i + 1}. **${n.name}** (${n.label}) — degree ${n.degree}${loc ? ` \`${loc}\`` : ''}`;
701
716
  }),
702
717
  ].join('\n');
703
- const outPath = resolve(input.path ?? join(getProjectCwd(), '.monomind', 'GRAPH_REPORT.md'));
718
+ const rawOutPath = input.path ?? join(getProjectCwd(), '.monomind', 'GRAPH_REPORT.md');
719
+ const outPath = resolve(getProjectCwd(), rawOutPath);
704
720
  const allowedRoot = resolve(getProjectCwd());
705
721
  if (outPath !== allowedRoot && !outPath.startsWith(allowedRoot + sep)) {
706
722
  return text(`Error: path must be within the project directory (${allowedRoot})`);
@@ -725,7 +741,13 @@ let _buildInProgress = false;
725
741
  async function computeCommitsBehind(repoPath) {
726
742
  const { openDb, closeDb } = await import('@monoes/monograph');
727
743
  const { execSync } = await import('child_process');
728
- const db = openDb(join(repoPath, '.monomind', 'monograph.db'));
744
+ const dbPath = getDbPath(repoPath);
745
+ if (!_isValidDb(dbPath))
746
+ return null;
747
+ // openDb's fileMustExist option isn't in the currently-published
748
+ // @monoes/monograph release this CLI depends on — _isValidDb above is the
749
+ // real guard against openDb silently creating an empty DB at a missing path.
750
+ const db = openDb(dbPath);
729
751
  try {
730
752
  const meta = db.prepare("SELECT value FROM index_meta WHERE key = 'last_commit_hash'").get() ?? db.prepare("SELECT value FROM index_meta WHERE key = 'lastCommit'").get();
731
753
  const lastCommit = meta?.value ?? null;
@@ -929,11 +951,13 @@ const monographExportTool = {
929
951
  const { writeFileSync, mkdirSync } = await import('fs');
930
952
  const db = openDb(getDbPath());
931
953
  try {
932
- const nodes = db.prepare('SELECT * FROM nodes').all();
954
+ // Exclude `embedding` a several-KB-per-node vector column that would
955
+ // otherwise bloat exported files by many MB for no rendering benefit.
956
+ const nodes = db.prepare(`SELECT ${NODE_RENDER_COLUMNS} FROM nodes`).all();
933
957
  const edges = db.prepare('SELECT * FROM edges').all();
934
958
  const fmt = input.format;
935
959
  const requestedOut = input.outputPath ?? join(getProjectCwd(), '.monomind', 'export');
936
- const outDir = resolve(requestedOut);
960
+ const outDir = resolve(getProjectCwd(), requestedOut);
937
961
  const allowedRoot = resolve(getProjectCwd());
938
962
  if (outDir !== allowedRoot && !outDir.startsWith(allowedRoot + sep)) {
939
963
  return text(`Error: outputPath must be within the project directory (${allowedRoot})`);
@@ -1072,8 +1096,10 @@ const monographImpactTool = {
1072
1096
  const impactPath = typeof rawImpactPath === 'string' && rawImpactPath.length > MAX_IMPACT_PATH_LEN
1073
1097
  ? rawImpactPath.slice(0, MAX_IMPACT_PATH_LEN) : rawImpactPath;
1074
1098
  const rawDepth = input.depth;
1075
- const depth = typeof rawDepth === 'number' && Number.isFinite(rawDepth) && rawDepth > 0
1076
- ? Math.min(Math.floor(rawDepth), 6) : rawDepth;
1099
+ const depth = rawDepth === undefined
1100
+ ? undefined
1101
+ : (typeof rawDepth === 'number' && Number.isFinite(rawDepth) && rawDepth > 0
1102
+ ? Math.min(Math.floor(rawDepth), 6) : 3);
1077
1103
  const result = getMonographImpact(db, {
1078
1104
  name: impactName,
1079
1105
  filePath: impactPath,
@@ -1737,7 +1763,13 @@ const monographInstallSkillsTool = {
1737
1763
  return text(`Invalid platform "${platform}". Must be one of: ${validPlatforms.join(', ')}`);
1738
1764
  }
1739
1765
  // Load community data from graph
1740
- const dbPath = join(repoPath, '.monomind', 'monograph.db');
1766
+ const dbPath = getDbPath(repoPath);
1767
+ // openDb's fileMustExist option isn't in the currently-published
1768
+ // @monoes/monograph release this CLI depends on — check validity
1769
+ // ourselves so a missing DB doesn't get silently auto-created empty.
1770
+ if (!_isValidDb(dbPath)) {
1771
+ return text('Graph not built yet. Run monograph_build first.');
1772
+ }
1741
1773
  let db;
1742
1774
  try {
1743
1775
  db = openDb(dbPath);
@@ -1846,21 +1878,19 @@ const monographListReposTool = {
1846
1878
  // ── monograph_group_contracts ─────────────────────────────────────────────────
1847
1879
  const monographGroupContractsTool = {
1848
1880
  name: 'monograph_group_contracts',
1849
- description: 'List public API contracts (exported symbols, interfaces, and types) for all groups defined in .monograph/groups.json.',
1881
+ description: 'List public API contracts (exported symbols, interfaces, and types) for all groups defined in group.yaml.',
1850
1882
  inputSchema: {
1851
1883
  type: 'object',
1852
1884
  properties: {
1853
- repoPath: { type: 'string', description: 'Absolute path to the repository (defaults to cwd).' },
1885
+ configPath: { type: 'string', description: 'Path to group.yaml (defaults to group.yaml in project cwd)' },
1854
1886
  },
1855
1887
  },
1856
1888
  handler: async (input) => {
1857
1889
  const { getGroupContracts } = await import('./monograph-compat.js');
1858
- const { join } = await import('path');
1859
- const repoPath = input.repoPath ?? getProjectCwd();
1860
- const configPath = join(repoPath, '.monograph', 'groups.json');
1890
+ const configPath = input.configPath ?? join(getProjectCwd(), 'group.yaml');
1861
1891
  const contracts = await getGroupContracts(configPath);
1862
1892
  if (contracts.length === 0)
1863
- return text('No contracts found. Ensure groups are defined in .monograph/groups.json.');
1893
+ return text(`No contracts found. Ensure groups are defined in ${configPath}.`);
1864
1894
  const lines = contracts.map(c => `[${c.groupName}] ${c.symbol} — ${c.filePath}:${c.line}`);
1865
1895
  return text(lines.join('\n'));
1866
1896
  },
@@ -1872,14 +1902,12 @@ const monographGroupStatusTool = {
1872
1902
  inputSchema: {
1873
1903
  type: 'object',
1874
1904
  properties: {
1875
- repoPath: { type: 'string', description: 'Absolute path to the repository (defaults to cwd).' },
1905
+ configPath: { type: 'string', description: 'Path to group.yaml (defaults to group.yaml in project cwd)' },
1876
1906
  },
1877
1907
  },
1878
1908
  handler: async (input) => {
1879
1909
  const { getGroupStatus } = await import('./monograph-compat.js');
1880
- const { join } = await import('path');
1881
- const repoPath = input.repoPath ?? getProjectCwd();
1882
- const configPath = join(repoPath, '.monograph', 'groups.json');
1910
+ const configPath = input.configPath ?? join(getProjectCwd(), 'group.yaml');
1883
1911
  const status = await getGroupStatus(configPath);
1884
1912
  const lines = [`Groups: ${status.totalGroups} (${status.indexedGroups} indexed, ${status.stalledGroups} stalled)`];
1885
1913
  for (const g of status.groups) {
@@ -1954,10 +1982,26 @@ const monographDeadCodeTool = {
1954
1982
  const repoPath = input.path ?? getProjectCwd();
1955
1983
  const cats = input.categories ?? ['dead-functions', 'orphan-files', 'stale-dist'];
1956
1984
  const result = {};
1957
- const dbPath = join(repoPath, '.monomind', 'monograph.db');
1985
+ const dbPath = getDbPath(repoPath);
1986
+ // openDb's fileMustExist option isn't in the currently-published
1987
+ // @monoes/monograph release this CLI depends on — check validity
1988
+ // ourselves so a missing DB doesn't get silently auto-created empty.
1989
+ if (!_isValidDb(dbPath)) {
1990
+ return text(JSON.stringify({ error: 'No monograph index found. Run monograph_build first.' }));
1991
+ }
1958
1992
  let db = null;
1959
1993
  try {
1960
1994
  db = openDb(dbPath);
1995
+ // _isValidDb's size check can't distinguish a real index from an
1996
+ // empty-but-schema-migrated DB (better-sqlite3 auto-creates + migrates
1997
+ // on open, and other unguarded openDb() call sites in this file can
1998
+ // create exactly that as a side effect of an unrelated tool call before
1999
+ // monograph_build ever runs). Verify actual content post-open so this
2000
+ // reports "never built" instead of a misleading "0 dead functions found".
2001
+ const { count } = db.prepare('SELECT COUNT(*) as count FROM nodes').get();
2002
+ if (count === 0) {
2003
+ return text(JSON.stringify({ error: 'No monograph index found. Run monograph_build first.' }));
2004
+ }
1961
2005
  }
1962
2006
  catch {
1963
2007
  return text(JSON.stringify({ error: 'No monograph index found. Run monograph_build first.' }));
@@ -1997,9 +2041,12 @@ const monographDeadCodeTool = {
1997
2041
  FROM nodes n
1998
2042
  WHERE n.label = 'File'
1999
2043
  AND (SELECT COUNT(*) FROM edges e WHERE e.target_id = n.id AND e.relation = 'IMPORTS') = 0
2000
- AND n.file_path NOT LIKE '%test%'
2044
+ AND n.file_path NOT LIKE '%/test/%'
2045
+ AND n.file_path NOT LIKE '%/tests/%'
2046
+ AND n.file_path NOT LIKE '%.test.%'
2001
2047
  AND n.file_path NOT LIKE '%__tests__%'
2002
- AND n.file_path NOT LIKE '%spec%'
2048
+ AND n.file_path NOT LIKE '%/spec/%'
2049
+ AND n.file_path NOT LIKE '%.spec.%'
2003
2050
  AND n.file_path NOT LIKE '%/index.%'
2004
2051
  AND n.file_path NOT LIKE 'bin/%'
2005
2052
  AND n.file_path NOT LIKE 'scripts/%'