@mcp-graph-workflow/mcp-graph 5.1.5 → 5.3.0

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 (395) hide show
  1. package/dist/api/router.d.ts +0 -1
  2. package/dist/api/router.d.ts.map +1 -1
  3. package/dist/api/router.js +3 -4
  4. package/dist/api/router.js.map +1 -1
  5. package/dist/api/routes/benchmark.d.ts.map +1 -1
  6. package/dist/api/routes/benchmark.js +47 -2
  7. package/dist/api/routes/benchmark.js.map +1 -1
  8. package/dist/api/routes/code-graph.d.ts +12 -0
  9. package/dist/api/routes/code-graph.d.ts.map +1 -0
  10. package/dist/api/routes/code-graph.js +154 -0
  11. package/dist/api/routes/code-graph.js.map +1 -0
  12. package/dist/api/routes/folder.d.ts +1 -4
  13. package/dist/api/routes/folder.d.ts.map +1 -1
  14. package/dist/api/routes/folder.js +19 -17
  15. package/dist/api/routes/folder.js.map +1 -1
  16. package/dist/api/routes/integrations.d.ts.map +1 -1
  17. package/dist/api/routes/integrations.js +60 -16
  18. package/dist/api/routes/integrations.js.map +1 -1
  19. package/dist/api/routes/knowledge.js +1 -1
  20. package/dist/api/routes/knowledge.js.map +1 -1
  21. package/dist/api/routes/skills.d.ts.map +1 -1
  22. package/dist/api/routes/skills.js +57 -3
  23. package/dist/api/routes/skills.js.map +1 -1
  24. package/dist/cli/commands/index-cmd.js +5 -5
  25. package/dist/cli/commands/index-cmd.js.map +1 -1
  26. package/dist/core/analyzer/ac-parser.d.ts +7 -0
  27. package/dist/core/analyzer/ac-parser.d.ts.map +1 -0
  28. package/dist/core/analyzer/ac-parser.js +67 -0
  29. package/dist/core/analyzer/ac-parser.js.map +1 -0
  30. package/dist/core/analyzer/ac-validator.d.ts +15 -0
  31. package/dist/core/analyzer/ac-validator.d.ts.map +1 -0
  32. package/dist/core/analyzer/ac-validator.js +142 -0
  33. package/dist/core/analyzer/ac-validator.js.map +1 -0
  34. package/dist/core/analyzer/definition-of-ready.d.ts +16 -0
  35. package/dist/core/analyzer/definition-of-ready.d.ts.map +1 -0
  36. package/dist/core/analyzer/definition-of-ready.js +107 -0
  37. package/dist/core/analyzer/definition-of-ready.js.map +1 -0
  38. package/dist/core/analyzer/prd-quality.d.ts +14 -0
  39. package/dist/core/analyzer/prd-quality.d.ts.map +1 -0
  40. package/dist/core/analyzer/prd-quality.js +156 -0
  41. package/dist/core/analyzer/prd-quality.js.map +1 -0
  42. package/dist/core/analyzer/risk-assessment.d.ts +11 -0
  43. package/dist/core/analyzer/risk-assessment.d.ts.map +1 -0
  44. package/dist/core/analyzer/risk-assessment.js +97 -0
  45. package/dist/core/analyzer/risk-assessment.js.map +1 -0
  46. package/dist/core/analyzer/scope-analyzer.d.ts +7 -0
  47. package/dist/core/analyzer/scope-analyzer.d.ts.map +1 -0
  48. package/dist/core/analyzer/scope-analyzer.js +99 -0
  49. package/dist/core/analyzer/scope-analyzer.js.map +1 -0
  50. package/dist/core/code/code-indexer.d.ts +20 -0
  51. package/dist/core/code/code-indexer.d.ts.map +1 -0
  52. package/dist/core/code/code-indexer.js +161 -0
  53. package/dist/core/code/code-indexer.js.map +1 -0
  54. package/dist/core/code/code-search.d.ts +16 -0
  55. package/dist/core/code/code-search.d.ts.map +1 -0
  56. package/dist/core/code/code-search.js +77 -0
  57. package/dist/core/code/code-search.js.map +1 -0
  58. package/dist/core/code/code-store.d.ts +35 -0
  59. package/dist/core/code/code-store.d.ts.map +1 -0
  60. package/dist/core/code/code-store.js +228 -0
  61. package/dist/core/code/code-store.js.map +1 -0
  62. package/dist/core/code/code-types.d.ts +209 -0
  63. package/dist/core/code/code-types.d.ts.map +1 -0
  64. package/dist/core/code/code-types.js +94 -0
  65. package/dist/core/code/code-types.js.map +1 -0
  66. package/dist/core/code/graph-traversal.d.ts +27 -0
  67. package/dist/core/code/graph-traversal.d.ts.map +1 -0
  68. package/dist/core/code/graph-traversal.js +122 -0
  69. package/dist/core/code/graph-traversal.js.map +1 -0
  70. package/dist/core/code/process-detector.d.ts +11 -0
  71. package/dist/core/code/process-detector.d.ts.map +1 -0
  72. package/dist/core/code/process-detector.js +65 -0
  73. package/dist/core/code/process-detector.js.map +1 -0
  74. package/dist/core/code/ts-analyzer.d.ts +12 -0
  75. package/dist/core/code/ts-analyzer.d.ts.map +1 -0
  76. package/dist/core/code/ts-analyzer.js +331 -0
  77. package/dist/core/code/ts-analyzer.js.map +1 -0
  78. package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
  79. package/dist/core/config/ai-memory-generator.js +149 -64
  80. package/dist/core/config/ai-memory-generator.js.map +1 -1
  81. package/dist/core/config/config-loader.d.ts.map +1 -1
  82. package/dist/core/config/config-loader.js +2 -10
  83. package/dist/core/config/config-loader.js.map +1 -1
  84. package/dist/core/config/config-schema.d.ts +1 -2
  85. package/dist/core/config/config-schema.d.ts.map +1 -1
  86. package/dist/core/config/config-schema.js +2 -3
  87. package/dist/core/config/config-schema.js.map +1 -1
  88. package/dist/core/context/compact-context.d.ts +51 -0
  89. package/dist/core/context/compact-context.d.ts.map +1 -1
  90. package/dist/core/context/compact-context.js +292 -0
  91. package/dist/core/context/compact-context.js.map +1 -1
  92. package/dist/core/context/context-assembler.d.ts +4 -1
  93. package/dist/core/context/context-assembler.d.ts.map +1 -1
  94. package/dist/core/context/context-assembler.js +6 -3
  95. package/dist/core/context/context-assembler.js.map +1 -1
  96. package/dist/core/context/rag-context.d.ts +4 -2
  97. package/dist/core/context/rag-context.d.ts.map +1 -1
  98. package/dist/core/context/rag-context.js +8 -5
  99. package/dist/core/context/rag-context.js.map +1 -1
  100. package/dist/core/designer/adr-validator.d.ts +8 -0
  101. package/dist/core/designer/adr-validator.d.ts.map +1 -0
  102. package/dist/core/designer/adr-validator.js +61 -0
  103. package/dist/core/designer/adr-validator.js.map +1 -0
  104. package/dist/core/designer/coupling-analyzer.d.ts +7 -0
  105. package/dist/core/designer/coupling-analyzer.d.ts.map +1 -0
  106. package/dist/core/designer/coupling-analyzer.js +59 -0
  107. package/dist/core/designer/coupling-analyzer.js.map +1 -0
  108. package/dist/core/designer/definition-of-ready.d.ts +8 -0
  109. package/dist/core/designer/definition-of-ready.d.ts.map +1 -0
  110. package/dist/core/designer/definition-of-ready.js +146 -0
  111. package/dist/core/designer/definition-of-ready.js.map +1 -0
  112. package/dist/core/designer/interface-checker.d.ts +7 -0
  113. package/dist/core/designer/interface-checker.d.ts.map +1 -0
  114. package/dist/core/designer/interface-checker.js +53 -0
  115. package/dist/core/designer/interface-checker.js.map +1 -0
  116. package/dist/core/designer/tech-risk-assessor.d.ts +7 -0
  117. package/dist/core/designer/tech-risk-assessor.d.ts.map +1 -0
  118. package/dist/core/designer/tech-risk-assessor.js +95 -0
  119. package/dist/core/designer/tech-risk-assessor.js.map +1 -0
  120. package/dist/core/designer/traceability-matrix.d.ts +8 -0
  121. package/dist/core/designer/traceability-matrix.d.ts.map +1 -0
  122. package/dist/core/designer/traceability-matrix.js +67 -0
  123. package/dist/core/designer/traceability-matrix.js.map +1 -0
  124. package/dist/core/doctor/doctor-checks.d.ts +1 -1
  125. package/dist/core/doctor/doctor-checks.js +21 -21
  126. package/dist/core/doctor/doctor-checks.js.map +1 -1
  127. package/dist/core/events/event-types.d.ts +11 -1
  128. package/dist/core/events/event-types.d.ts.map +1 -1
  129. package/dist/core/handoff/delivery-checklist.d.ts +10 -0
  130. package/dist/core/handoff/delivery-checklist.d.ts.map +1 -0
  131. package/dist/core/handoff/delivery-checklist.js +148 -0
  132. package/dist/core/handoff/delivery-checklist.js.map +1 -0
  133. package/dist/core/handoff/doc-completeness.d.ts +7 -0
  134. package/dist/core/handoff/doc-completeness.d.ts.map +1 -0
  135. package/dist/core/handoff/doc-completeness.js +19 -0
  136. package/dist/core/handoff/doc-completeness.js.map +1 -0
  137. package/dist/core/implementer/definition-of-done.d.ts +11 -0
  138. package/dist/core/implementer/definition-of-done.d.ts.map +1 -0
  139. package/dist/core/implementer/definition-of-done.js +158 -0
  140. package/dist/core/implementer/definition-of-done.js.map +1 -0
  141. package/dist/core/implementer/sprint-progress.d.ts +11 -0
  142. package/dist/core/implementer/sprint-progress.d.ts.map +1 -0
  143. package/dist/core/implementer/sprint-progress.js +80 -0
  144. package/dist/core/implementer/sprint-progress.js.map +1 -0
  145. package/dist/core/implementer/tdd-checker.d.ts +15 -0
  146. package/dist/core/implementer/tdd-checker.d.ts.map +1 -0
  147. package/dist/core/implementer/tdd-checker.js +132 -0
  148. package/dist/core/implementer/tdd-checker.js.map +1 -0
  149. package/dist/core/insights/bottleneck-detector.js +1 -1
  150. package/dist/core/insights/bottleneck-detector.js.map +1 -1
  151. package/dist/core/integrations/enriched-context.d.ts +10 -6
  152. package/dist/core/integrations/enriched-context.d.ts.map +1 -1
  153. package/dist/core/integrations/enriched-context.js +35 -35
  154. package/dist/core/integrations/enriched-context.js.map +1 -1
  155. package/dist/core/integrations/integration-orchestrator.js +2 -2
  156. package/dist/core/integrations/integration-orchestrator.js.map +1 -1
  157. package/dist/core/integrations/mcp-deps-installer.d.ts +1 -1
  158. package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -1
  159. package/dist/core/integrations/mcp-deps-installer.js +1 -60
  160. package/dist/core/integrations/mcp-deps-installer.js.map +1 -1
  161. package/dist/core/integrations/mcp-servers-config.d.ts +1 -1
  162. package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -1
  163. package/dist/core/integrations/mcp-servers-config.js +0 -17
  164. package/dist/core/integrations/mcp-servers-config.js.map +1 -1
  165. package/dist/core/integrations/tool-status.d.ts +8 -3
  166. package/dist/core/integrations/tool-status.d.ts.map +1 -1
  167. package/dist/core/integrations/tool-status.js +38 -48
  168. package/dist/core/integrations/tool-status.js.map +1 -1
  169. package/dist/core/listener/backlog-health.d.ts +7 -0
  170. package/dist/core/listener/backlog-health.d.ts.map +1 -0
  171. package/dist/core/listener/backlog-health.js +64 -0
  172. package/dist/core/listener/backlog-health.js.map +1 -0
  173. package/dist/core/listener/feedback-readiness.d.ts +11 -0
  174. package/dist/core/listener/feedback-readiness.d.ts.map +1 -0
  175. package/dist/core/listener/feedback-readiness.js +124 -0
  176. package/dist/core/listener/feedback-readiness.js.map +1 -0
  177. package/dist/core/memory/memory-migrator.d.ts +15 -0
  178. package/dist/core/memory/memory-migrator.d.ts.map +1 -0
  179. package/dist/core/memory/memory-migrator.js +64 -0
  180. package/dist/core/memory/memory-migrator.js.map +1 -0
  181. package/dist/core/memory/memory-reader.d.ts +30 -0
  182. package/dist/core/memory/memory-reader.d.ts.map +1 -0
  183. package/dist/core/memory/memory-reader.js +106 -0
  184. package/dist/core/memory/memory-reader.js.map +1 -0
  185. package/dist/core/planner/lifecycle-phase.d.ts +1 -0
  186. package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
  187. package/dist/core/planner/lifecycle-phase.js +89 -58
  188. package/dist/core/planner/lifecycle-phase.js.map +1 -1
  189. package/dist/core/rag/memory-indexer.d.ts +16 -0
  190. package/dist/core/rag/memory-indexer.d.ts.map +1 -0
  191. package/dist/core/rag/{serena-indexer.js → memory-indexer.js} +12 -12
  192. package/dist/core/rag/memory-indexer.js.map +1 -0
  193. package/dist/core/rag/{serena-rag-query.d.ts → memory-rag-query.d.ts} +11 -9
  194. package/dist/core/rag/memory-rag-query.d.ts.map +1 -0
  195. package/dist/core/rag/{serena-rag-query.js → memory-rag-query.js} +18 -15
  196. package/dist/core/rag/memory-rag-query.js.map +1 -0
  197. package/dist/core/rag/phase-metadata.d.ts +23 -0
  198. package/dist/core/rag/phase-metadata.d.ts.map +1 -0
  199. package/dist/core/rag/phase-metadata.js +72 -0
  200. package/dist/core/rag/phase-metadata.js.map +1 -0
  201. package/dist/core/rag/phase-summary.d.ts +17 -0
  202. package/dist/core/rag/phase-summary.d.ts.map +1 -0
  203. package/dist/core/rag/phase-summary.js +104 -0
  204. package/dist/core/rag/phase-summary.js.map +1 -0
  205. package/dist/core/rag/prd-indexer.d.ts +16 -0
  206. package/dist/core/rag/prd-indexer.d.ts.map +1 -0
  207. package/dist/core/rag/prd-indexer.js +37 -0
  208. package/dist/core/rag/prd-indexer.js.map +1 -0
  209. package/dist/core/rag/skill-indexer.d.ts +16 -0
  210. package/dist/core/rag/skill-indexer.d.ts.map +1 -0
  211. package/dist/core/rag/skill-indexer.js +98 -0
  212. package/dist/core/rag/skill-indexer.js.map +1 -0
  213. package/dist/core/reviewer/review-readiness.d.ts +8 -0
  214. package/dist/core/reviewer/review-readiness.d.ts.map +1 -0
  215. package/dist/core/reviewer/review-readiness.js +159 -0
  216. package/dist/core/reviewer/review-readiness.js.map +1 -0
  217. package/dist/core/skills/built-in-skills.d.ts +26 -0
  218. package/dist/core/skills/built-in-skills.d.ts.map +1 -0
  219. package/dist/core/skills/built-in-skills.js +203 -0
  220. package/dist/core/skills/built-in-skills.js.map +1 -0
  221. package/dist/core/store/knowledge-store.d.ts +10 -1
  222. package/dist/core/store/knowledge-store.d.ts.map +1 -1
  223. package/dist/core/store/knowledge-store.js +23 -1
  224. package/dist/core/store/knowledge-store.js.map +1 -1
  225. package/dist/core/store/migrations.d.ts.map +1 -1
  226. package/dist/core/store/migrations.js +89 -0
  227. package/dist/core/store/migrations.js.map +1 -1
  228. package/dist/core/store/tool-token-store.d.ts +39 -0
  229. package/dist/core/store/tool-token-store.d.ts.map +1 -0
  230. package/dist/core/store/tool-token-store.js +79 -0
  231. package/dist/core/store/tool-token-store.js.map +1 -0
  232. package/dist/core/validator/definition-of-ready.d.ts +8 -0
  233. package/dist/core/validator/definition-of-ready.d.ts.map +1 -0
  234. package/dist/core/validator/definition-of-ready.js +155 -0
  235. package/dist/core/validator/definition-of-ready.js.map +1 -0
  236. package/dist/core/validator/done-integrity-checker.d.ts +7 -0
  237. package/dist/core/validator/done-integrity-checker.d.ts.map +1 -0
  238. package/dist/core/validator/done-integrity-checker.js +38 -0
  239. package/dist/core/validator/done-integrity-checker.js.map +1 -0
  240. package/dist/core/validator/status-flow-checker.d.ts +7 -0
  241. package/dist/core/validator/status-flow-checker.d.ts.map +1 -0
  242. package/dist/core/validator/status-flow-checker.js +26 -0
  243. package/dist/core/validator/status-flow-checker.js.map +1 -0
  244. package/dist/mcp/app-factory.d.ts +0 -1
  245. package/dist/mcp/app-factory.d.ts.map +1 -1
  246. package/dist/mcp/app-factory.js +2 -2
  247. package/dist/mcp/app-factory.js.map +1 -1
  248. package/dist/mcp/lifecycle-wrapper.d.ts +10 -0
  249. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
  250. package/dist/mcp/lifecycle-wrapper.js +48 -2
  251. package/dist/mcp/lifecycle-wrapper.js.map +1 -1
  252. package/dist/mcp/server.js +19 -14
  253. package/dist/mcp/server.js.map +1 -1
  254. package/dist/mcp/tools/{stats.d.ts → analyze.d.ts} +2 -2
  255. package/dist/mcp/tools/analyze.d.ts.map +1 -0
  256. package/dist/mcp/tools/analyze.js +272 -0
  257. package/dist/mcp/tools/analyze.js.map +1 -0
  258. package/dist/mcp/tools/import-prd.d.ts.map +1 -1
  259. package/dist/mcp/tools/import-prd.js +15 -1
  260. package/dist/mcp/tools/import-prd.js.map +1 -1
  261. package/dist/mcp/tools/index.js +10 -10
  262. package/dist/mcp/tools/index.js.map +1 -1
  263. package/dist/mcp/tools/list-skills.d.ts +7 -0
  264. package/dist/mcp/tools/list-skills.d.ts.map +1 -0
  265. package/dist/mcp/tools/list-skills.js +68 -0
  266. package/dist/mcp/tools/list-skills.js.map +1 -0
  267. package/dist/mcp/tools/memory.d.ts +8 -0
  268. package/dist/mcp/tools/memory.d.ts.map +1 -0
  269. package/dist/mcp/tools/memory.js +106 -0
  270. package/dist/mcp/tools/memory.js.map +1 -0
  271. package/dist/mcp/tools/{velocity.d.ts → metrics.d.ts} +2 -2
  272. package/dist/mcp/tools/metrics.d.ts.map +1 -0
  273. package/dist/mcp/tools/metrics.js +69 -0
  274. package/dist/mcp/tools/metrics.js.map +1 -0
  275. package/dist/mcp/tools/next.d.ts.map +1 -1
  276. package/dist/mcp/tools/next.js +19 -5
  277. package/dist/mcp/tools/next.js.map +1 -1
  278. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
  279. package/dist/mcp/tools/plan-sprint.js +20 -0
  280. package/dist/mcp/tools/plan-sprint.js.map +1 -1
  281. package/dist/mcp/tools/rag-context.d.ts.map +1 -1
  282. package/dist/mcp/tools/rag-context.js +20 -5
  283. package/dist/mcp/tools/rag-context.js.map +1 -1
  284. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
  285. package/dist/mcp/tools/reindex-knowledge.js +11 -7
  286. package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
  287. package/dist/mcp/tools/set-phase.d.ts.map +1 -1
  288. package/dist/mcp/tools/set-phase.js +16 -1
  289. package/dist/mcp/tools/set-phase.js.map +1 -1
  290. package/dist/mcp/tools/update-status.d.ts.map +1 -1
  291. package/dist/mcp/tools/update-status.js +21 -6
  292. package/dist/mcp/tools/update-status.js.map +1 -1
  293. package/dist/mcp/tools/{decompose.d.ts → validate-ac.d.ts} +2 -2
  294. package/dist/mcp/tools/validate-ac.d.ts.map +1 -0
  295. package/dist/mcp/tools/validate-ac.js +23 -0
  296. package/dist/mcp/tools/validate-ac.js.map +1 -0
  297. package/dist/schemas/ac-quality-schema.d.ts +90 -0
  298. package/dist/schemas/ac-quality-schema.d.ts.map +1 -0
  299. package/dist/schemas/ac-quality-schema.js +34 -0
  300. package/dist/schemas/ac-quality-schema.js.map +1 -0
  301. package/dist/schemas/analyzer-schema.d.ts +160 -0
  302. package/dist/schemas/analyzer-schema.d.ts.map +1 -0
  303. package/dist/schemas/analyzer-schema.js +74 -0
  304. package/dist/schemas/analyzer-schema.js.map +1 -0
  305. package/dist/schemas/designer-schema.d.ts +259 -0
  306. package/dist/schemas/designer-schema.d.ts.map +1 -0
  307. package/dist/schemas/designer-schema.js +102 -0
  308. package/dist/schemas/designer-schema.js.map +1 -0
  309. package/dist/schemas/handoff-schema.d.ts +49 -0
  310. package/dist/schemas/handoff-schema.d.ts.map +1 -0
  311. package/dist/schemas/handoff-schema.js +28 -0
  312. package/dist/schemas/handoff-schema.js.map +1 -0
  313. package/dist/schemas/implementer-schema.d.ts +187 -0
  314. package/dist/schemas/implementer-schema.d.ts.map +1 -0
  315. package/dist/schemas/implementer-schema.js +80 -0
  316. package/dist/schemas/implementer-schema.js.map +1 -0
  317. package/dist/schemas/knowledge.schema.d.ts +12 -0
  318. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  319. package/dist/schemas/knowledge.schema.js +1 -1
  320. package/dist/schemas/knowledge.schema.js.map +1 -1
  321. package/dist/schemas/listener-schema.d.ts +62 -0
  322. package/dist/schemas/listener-schema.d.ts.map +1 -0
  323. package/dist/schemas/listener-schema.js +35 -0
  324. package/dist/schemas/listener-schema.js.map +1 -0
  325. package/dist/schemas/reviewer-schema.d.ts +34 -0
  326. package/dist/schemas/reviewer-schema.d.ts.map +1 -0
  327. package/dist/schemas/reviewer-schema.js +17 -0
  328. package/dist/schemas/reviewer-schema.js.map +1 -0
  329. package/dist/schemas/validator-schema.d.ts +79 -0
  330. package/dist/schemas/validator-schema.d.ts.map +1 -0
  331. package/dist/schemas/validator-schema.js +43 -0
  332. package/dist/schemas/validator-schema.js.map +1 -0
  333. package/dist/web/dashboard/dist/assets/benchmark-tab-B5Sr8Cah.js +1 -0
  334. package/dist/web/dashboard/dist/assets/constants-kpH_c6vY.js +1 -0
  335. package/dist/web/dashboard/dist/assets/gitnexus-tab-DqmbSdzV.js +430 -0
  336. package/dist/web/dashboard/dist/assets/graph-tab-BKns5HdW.js +1 -0
  337. package/dist/web/dashboard/dist/assets/graph-utils-BxUWNvsI.js +7 -0
  338. package/dist/web/dashboard/dist/assets/index-CZOiKbTP.js +53 -0
  339. package/dist/web/dashboard/dist/assets/index-Dd4vKyDX.js +17 -0
  340. package/dist/web/dashboard/dist/assets/index-xyMN-_UV.css +1 -0
  341. package/dist/web/dashboard/dist/assets/insights-tab-B1kPckBM.js +52 -0
  342. package/dist/web/dashboard/dist/assets/{logs-tab-BPDyVj2B.js → logs-tab-BWfsrRlB.js} +1 -1
  343. package/dist/web/dashboard/dist/assets/memories-tab-D3zm-1Sq.js +1 -0
  344. package/dist/web/dashboard/dist/assets/prd-backlog-tab-DXP4dFP-.js +1 -0
  345. package/dist/web/dashboard/dist/assets/skills-tab-CAlVL80S.js +1 -0
  346. package/dist/web/dashboard/dist/index.html +2 -2
  347. package/package.json +2 -2
  348. package/dist/api/routes/gitnexus.d.ts +0 -12
  349. package/dist/api/routes/gitnexus.d.ts.map +0 -1
  350. package/dist/api/routes/gitnexus.js +0 -164
  351. package/dist/api/routes/gitnexus.js.map +0 -1
  352. package/dist/core/integrations/gitnexus-launcher.d.ts +0 -67
  353. package/dist/core/integrations/gitnexus-launcher.d.ts.map +0 -1
  354. package/dist/core/integrations/gitnexus-launcher.js +0 -268
  355. package/dist/core/integrations/gitnexus-launcher.js.map +0 -1
  356. package/dist/core/integrations/gitnexus-queries.d.ts +0 -55
  357. package/dist/core/integrations/gitnexus-queries.d.ts.map +0 -1
  358. package/dist/core/integrations/gitnexus-queries.js +0 -168
  359. package/dist/core/integrations/gitnexus-queries.js.map +0 -1
  360. package/dist/core/integrations/serena-reader.d.ts +0 -18
  361. package/dist/core/integrations/serena-reader.d.ts.map +0 -1
  362. package/dist/core/integrations/serena-reader.js +0 -68
  363. package/dist/core/integrations/serena-reader.js.map +0 -1
  364. package/dist/core/rag/serena-indexer.d.ts +0 -16
  365. package/dist/core/rag/serena-indexer.d.ts.map +0 -1
  366. package/dist/core/rag/serena-indexer.js.map +0 -1
  367. package/dist/core/rag/serena-rag-query.d.ts.map +0 -1
  368. package/dist/core/rag/serena-rag-query.js.map +0 -1
  369. package/dist/mcp/tools/bulk-update-status.d.ts +0 -4
  370. package/dist/mcp/tools/bulk-update-status.d.ts.map +0 -1
  371. package/dist/mcp/tools/bulk-update-status.js +0 -22
  372. package/dist/mcp/tools/bulk-update-status.js.map +0 -1
  373. package/dist/mcp/tools/decompose.d.ts.map +0 -1
  374. package/dist/mcp/tools/decompose.js +0 -25
  375. package/dist/mcp/tools/decompose.js.map +0 -1
  376. package/dist/mcp/tools/dependencies.d.ts +0 -4
  377. package/dist/mcp/tools/dependencies.d.ts.map +0 -1
  378. package/dist/mcp/tools/dependencies.js +0 -47
  379. package/dist/mcp/tools/dependencies.js.map +0 -1
  380. package/dist/mcp/tools/stats.d.ts.map +0 -1
  381. package/dist/mcp/tools/stats.js +0 -46
  382. package/dist/mcp/tools/stats.js.map +0 -1
  383. package/dist/mcp/tools/velocity.d.ts.map +0 -1
  384. package/dist/mcp/tools/velocity.js +0 -25
  385. package/dist/mcp/tools/velocity.js.map +0 -1
  386. package/dist/web/dashboard/dist/assets/benchmark-tab-DzYj_lJO.js +0 -1
  387. package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +0 -1
  388. package/dist/web/dashboard/dist/assets/gitnexus-tab-B16kDpcc.js +0 -312
  389. package/dist/web/dashboard/dist/assets/graph-tab-bgRao3Qi.js +0 -1
  390. package/dist/web/dashboard/dist/assets/graph-utils-CETPf3Qj.js +0 -23
  391. package/dist/web/dashboard/dist/assets/index-D4nxPvv8.css +0 -1
  392. package/dist/web/dashboard/dist/assets/index-DLehETrJ.js +0 -53
  393. package/dist/web/dashboard/dist/assets/insights-tab-MkpvetqF.js +0 -1
  394. package/dist/web/dashboard/dist/assets/prd-backlog-tab-DbnFo6Ve.js +0 -1
  395. package/dist/web/dashboard/dist/assets/serena-tab-CLJOpG5i.js +0 -1
@@ -1,2 +1,2 @@
1
- import{r,a as f,j as t}from"./index-DLehETrJ.js";function w(){const[l,o]=r.useState([]),[n,v]=r.useState(!0),d=r.useRef(0),p=r.useCallback(async()=>{try{const{logs:c}=await f.getLogs();o(c),c.length>0&&(d.current=c[c.length-1].id)}finally{v(!1)}},[]),u=r.useCallback(async()=>{await f.clearLogs(),o([]),d.current=0},[]);return r.useEffect(()=>{p()},[p]),r.useEffect(()=>{const c=new EventSource("/api/v1/events"),i=b=>{try{const s=JSON.parse(b.data),a={id:s.payload.id,level:s.payload.level,message:s.payload.message,context:s.payload.context,timestamp:s.timestamp};a.id>d.current&&(d.current=a.id,o(h=>[...h,a]))}catch{}};return c.addEventListener("log:entry",i),c.onerror=()=>{c.close(),setTimeout(()=>{},5e3)},()=>c.close()},[]),{logs:l,loading:n,clearLogs:u,refresh:p}}const k={info:"bg-blue-500/20 text-blue-400",warn:"bg-yellow-500/20 text-yellow-400",error:"bg-red-500/20 text-red-400",success:"bg-green-500/20 text-green-400",debug:"bg-gray-500/20 text-gray-400"},E=["info","warn","error","success","debug"];function y(l){return new Date(l).toLocaleTimeString("en-US",{hour12:!1})}function L(l){return!l||Object.keys(l).length===0?"":Object.entries(l).map(([o,n])=>`${o}="${String(n)}"`).join(" ")}function j(l){return l.map(o=>{const n=L(o.context);return`[${y(o.timestamp)}] [${o.level.toUpperCase()}] ${o.message}${n?" "+n:""}`}).join(`
1
+ import{r,a as f,j as t}from"./index-CZOiKbTP.js";function w(){const[l,o]=r.useState([]),[n,v]=r.useState(!0),d=r.useRef(0),p=r.useCallback(async()=>{try{const{logs:c}=await f.getLogs();o(c),c.length>0&&(d.current=c[c.length-1].id)}finally{v(!1)}},[]),u=r.useCallback(async()=>{await f.clearLogs(),o([]),d.current=0},[]);return r.useEffect(()=>{p()},[p]),r.useEffect(()=>{const c=new EventSource("/api/v1/events"),i=b=>{try{const s=JSON.parse(b.data),a={id:s.payload.id,level:s.payload.level,message:s.payload.message,context:s.payload.context,timestamp:s.timestamp};a.id>d.current&&(d.current=a.id,o(h=>[...h,a]))}catch{}};return c.addEventListener("log:entry",i),c.onerror=()=>{c.close(),setTimeout(()=>{},5e3)},()=>c.close()},[]),{logs:l,loading:n,clearLogs:u,refresh:p}}const k={info:"bg-blue-500/20 text-blue-400",warn:"bg-yellow-500/20 text-yellow-400",error:"bg-red-500/20 text-red-400",success:"bg-green-500/20 text-green-400",debug:"bg-gray-500/20 text-gray-400"},E=["info","warn","error","success","debug"];function y(l){return new Date(l).toLocaleTimeString("en-US",{hour12:!1})}function L(l){return!l||Object.keys(l).length===0?"":Object.entries(l).map(([o,n])=>`${o}="${String(n)}"`).join(" ")}function j(l){return l.map(o=>{const n=L(o.context);return`[${y(o.timestamp)}] [${o.level.toUpperCase()}] ${o.message}${n?" "+n:""}`}).join(`
2
2
  `)}function O(){const{logs:l,loading:o,clearLogs:n,refresh:v}=w(),[d,p]=r.useState("all"),[u,c]=r.useState(""),[i,b]=r.useState(!0),s=r.useRef(null),a=r.useMemo(()=>{let e=l;if(d!=="all"&&(e=e.filter(x=>x.level===d)),u.trim()){const x=u.toLowerCase();e=e.filter(g=>g.message.toLowerCase().includes(x))}return e},[l,d,u]);r.useEffect(()=>{i&&s.current&&(s.current.scrollTop=s.current.scrollHeight)},[a,i]);const h=r.useCallback(()=>{if(!s.current)return;const{scrollTop:e,scrollHeight:x,clientHeight:g}=s.current,m=x-e-g<40;b(m)},[]),C=r.useCallback(async()=>{const e=j(a);await navigator.clipboard.writeText(e)},[a]),N=r.useCallback(()=>{const e=j(a),x=new Blob([e],{type:"text/plain"}),g=URL.createObjectURL(x),m=document.createElement("a");m.href=g,m.download=`mcp-graph-logs-${new Date().toISOString().slice(0,19).replace(/:/g,"-")}.txt`,m.click(),URL.revokeObjectURL(g)},[a]),S=r.useCallback(async()=>{await n()},[n]);return o?t.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:"Loading logs..."}):t.jsxs("div",{className:"flex flex-col h-full","data-testid":"logs-tab",children:[t.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)]",children:[t.jsxs("select",{value:d,onChange:e=>p(e.target.value),className:"px-2 py-1 text-sm rounded border border-[var(--color-border)] bg-[var(--color-bg)] text-[var(--color-text)]","data-testid":"log-level-filter",children:[t.jsx("option",{value:"all",children:"All Levels"}),E.map(e=>t.jsx("option",{value:e,children:e.charAt(0).toUpperCase()+e.slice(1)},e))]}),t.jsx("input",{type:"text",value:u,onChange:e=>c(e.target.value),placeholder:"Search logs...",className:"flex-1 px-2 py-1 text-sm rounded border border-[var(--color-border)] bg-[var(--color-bg)] text-[var(--color-text)] placeholder:text-[var(--color-text-muted)]","data-testid":"log-search"}),t.jsx("button",{onClick:()=>b(!i),className:`px-2 py-1 text-xs rounded border ${i?"border-[var(--color-accent)] text-[var(--color-accent)]":"border-[var(--color-border)] text-[var(--color-text-muted)]"}`,title:i?"Auto-scroll enabled":"Auto-scroll paused",children:i?"Auto-scroll ON":"Auto-scroll OFF"}),t.jsx("button",{onClick:C,className:"px-2 py-1 text-xs rounded border border-[var(--color-border)] text-[var(--color-text-muted)] hover:text-[var(--color-text)]",title:"Copy all visible logs",children:"Copy"}),t.jsx("button",{onClick:N,className:"px-2 py-1 text-xs rounded border border-[var(--color-border)] text-[var(--color-text-muted)] hover:text-[var(--color-text)]",title:"Download logs as .txt",children:"Download"}),t.jsx("button",{onClick:S,className:"px-2 py-1 text-xs rounded border border-red-500/30 text-red-400 hover:bg-red-500/10",title:"Clear all logs",children:"Clear"}),t.jsx("button",{onClick:()=>void v(),className:"px-2 py-1 text-xs rounded border border-[var(--color-border)] text-[var(--color-text-muted)] hover:text-[var(--color-text)]",title:"Refresh logs",children:"Refresh"}),t.jsxs("span",{className:"text-xs text-[var(--color-text-muted)]",children:[a.length," entries"]})]}),t.jsx("div",{ref:s,onScroll:h,className:"flex-1 overflow-y-auto font-mono text-xs p-2","data-testid":"log-list",children:a.length===0?t.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:"No logs to display"}):a.map(e=>t.jsxs("div",{className:"flex items-start gap-2 py-0.5 hover:bg-[var(--color-bg-secondary)]",children:[t.jsx("span",{className:"text-[var(--color-text-muted)] shrink-0",children:y(e.timestamp)}),t.jsx("span",{className:`px-1.5 py-0 rounded text-[10px] font-semibold uppercase shrink-0 ${k[e.level]}`,children:e.level}),t.jsx("span",{className:"text-[var(--color-text)]",children:e.message}),e.context&&Object.keys(e.context).length>0&&t.jsx("span",{className:"text-[var(--color-text-muted)]",children:L(e.context)})]},e.id))})]})}export{O as LogsTab};
@@ -0,0 +1 @@
1
+ import{r as i,a as b,j as e}from"./index-CZOiKbTP.js";function j(t){const c=[];for(const l of t){const o=l.name.split("/");let a=c;for(let n=0;n<o.length;n++){const r=o[n],x=o.slice(0,n+1).join("/"),d=n===o.length-1;let s=a.find(f=>f.name===r);s||(s={name:r,path:x,children:[]},d&&(s.memory=l),a.push(s)),d&&!s.memory&&(s.memory=l),a=s.children}}return c}function S(){const[t,c]=i.useState([]),[l,o]=i.useState(null),[a,n]=i.useState(null),[r,x]=i.useState(!0),d=i.useCallback(async()=>{try{x(!0);const s=await b.getMemories().catch(()=>[]);c(s)}catch(s){n(s instanceof Error?s.message:"Failed to load")}finally{x(!1)}},[]);return i.useEffect(()=>{d()},[d]),r?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:"Loading Memories..."}):a?e.jsxs("div",{className:"flex items-center justify-center h-full text-[var(--color-danger)]",children:["Failed to load: ",a]}):e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)]",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Memories"}),e.jsx(g,{label:"Memories",active:t.length>0}),e.jsxs("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:[t.length," memories"]})]}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx(N,{memories:t,selectedMemory:l,onSelect:o}),e.jsx("div",{className:"flex-1 min-w-0 overflow-auto",children:e.jsx(y,{selectedMemory:l})})]})]})}function g({label:t,active:c}){const l=c?"var(--color-success)":"var(--color-text-muted)",o=c?"Active":"No data";return e.jsxs("span",{className:"text-[10px] font-medium px-2 py-0.5 rounded-full",style:{background:`${l}20`,color:l},children:[t,": ",o]})}function N({memories:t,selectedMemory:c,onSelect:l}){const[o,a]=i.useState(""),[n,r]=i.useState(!1),[x,d]=i.useState(new Set),s=i.useMemo(()=>{if(!o.trim())return t;const m=o.toLowerCase();return t.filter(p=>p.name.toLowerCase().includes(m))},[t,o]),f=i.useMemo(()=>j(s),[s]),v=i.useCallback(m=>{d(p=>{const u=new Set(p);return u.has(m)?u.delete(m):u.add(m),u})},[]);return n?e.jsx("div",{className:"w-8 border-r border-[var(--color-border)] bg-[var(--color-bg-secondary)] flex flex-col items-center pt-2",children:e.jsx("button",{onClick:()=>r(!1),className:"text-[10px] text-[var(--color-text-muted)] hover:text-[var(--color-text)] rotate-90",title:"Expand file explorer",children:"Files"})}):e.jsxs("div",{className:"w-64 border-r border-[var(--color-border)] bg-[var(--color-bg-secondary)] flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-2 py-1.5 border-b border-[var(--color-border)]",children:[e.jsx("span",{className:"text-[10px] font-semibold text-[var(--color-text-muted)] uppercase tracking-wider",children:"Files"}),e.jsx("button",{onClick:()=>r(!0),className:"text-[10px] text-[var(--color-text-muted)] hover:text-[var(--color-text)]",title:"Collapse",children:"✕"})]}),e.jsx("div",{className:"px-2 py-1.5 border-b border-[var(--color-border)]",children:e.jsx("input",{type:"text",value:o,onChange:m=>a(m.target.value),placeholder:"Search files...",className:"w-full text-[11px] px-2 py-1 rounded bg-[var(--color-bg)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})}),e.jsx("div",{className:"flex-1 overflow-y-auto text-[11px]",children:t.length===0?e.jsx("div",{className:"px-2 py-4 text-center text-[var(--color-text-muted)]",children:"No memories"}):e.jsx(h,{nodes:f,depth:0,expandedPaths:x,onToggle:v,selectedMemory:c,onSelect:l})})]})}function h({nodes:t,depth:c,expandedPaths:l,onToggle:o,selectedMemory:a,onSelect:n}){return e.jsx(e.Fragment,{children:t.map(r=>{const x=r.children.length>0,d=l.has(r.path),s=r.memory!=null&&(a==null?void 0:a.name)===r.memory.name;return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>{x&&o(r.path),r.memory&&n(r.memory)},className:`w-full text-left px-2 py-0.5 flex items-center gap-1 hover:bg-[var(--color-bg-tertiary)] transition-colors ${s?"bg-[var(--color-accent)]15 text-[var(--color-accent)]":"text-[var(--color-text)]"}`,style:{paddingLeft:`${c*12+8}px`},children:[x?e.jsx("span",{className:"w-3 text-[9px] text-[var(--color-text-muted)]",children:d?"▾":"▸"}):e.jsx("span",{className:"w-3 text-[9px] text-[var(--color-text-muted)]",children:"·"}),e.jsx("span",{className:"truncate",children:r.name})]}),x&&d&&e.jsx(h,{nodes:r.children,depth:c+1,expandedPaths:l,onToggle:o,selectedMemory:a,onSelect:n})]},r.path)})})}function y({selectedMemory:t}){return t?e.jsxs("div",{className:"p-4",children:[e.jsx("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-[var(--color-border)]",children:e.jsx("span",{className:"text-sm font-semibold",children:t.name})}),e.jsx("pre",{className:"text-xs whitespace-pre-wrap text-[var(--color-text-muted)] font-mono leading-relaxed",children:t.content})]}):e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-sm mb-1",children:"Select a memory from the explorer"}),e.jsx("p",{className:"text-xs",children:"Project memories appear as navigable files"})]})})}export{S as MemoriesTab};
@@ -0,0 +1 @@
1
+ import{r as a,j as e}from"./index-CZOiKbTP.js";import{R as _,u as M,a as E,h as P,b as T,g as B,t as D,d as R,e as F,i as $,W as z,f as I,B as L,C as A,N as O}from"./graph-utils-BxUWNvsI.js";import{S as y}from"./constants-kpH_c6vY.js";import"./index-Dd4vKyDX.js";const V=a.memo(function({graph:c,onNodeClick:N}){const{groups:w,nextTask:h,nodeMap:g}=a.useMemo(()=>{const d=c.nodes.filter(s=>s.type==="task"||s.type==="subtask"),x=new Map(c.nodes.map(s=>[s.id,s])),m=new Set(c.nodes.filter(s=>s.status==="done").map(s=>s.id)),f=d.filter(s=>s.status!=="backlog"&&s.status!=="ready"||s.blocked?!1:c.edges.filter(r=>r.from===s.id&&r.relationType==="depends_on").every(r=>m.has(r.to)));f.sort((s,t)=>s.priority-t.priority);const i=new Map;for(const s of d){const t=s.parentId||"__root__";i.has(t)||i.set(t,[]),i.get(t).push(s)}for(const s of i.values())s.sort((t,r)=>t.priority-r.priority);return{groups:i,nextTask:f[0]||null,nodeMap:x}},[c]);return c.nodes.filter(d=>d.type==="task"||d.type==="subtask").length===0?e.jsx("div",{className:"p-4 text-center text-[var(--color-text-muted)]",children:"No tasks in backlog."}):e.jsxs("div",{className:"p-2",children:[h&&e.jsxs("div",{className:"mb-3 px-3 py-2 bg-[var(--color-accent)]10 border border-[var(--color-accent)] rounded-lg",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--color-accent)]",children:"Next:"})," ",e.jsx("span",{className:"text-sm font-semibold",children:h.title})]}),Array.from(w.entries()).map(([d,x])=>{const m=d!=="__root__"?g.get(d):null,f=m?m.title:"Ungrouped Tasks",i=x.filter(t=>t.status==="done").length,s=Math.round(i/x.length*100);return e.jsxs("div",{className:"mb-3",children:[e.jsxs("div",{className:"flex items-center justify-between px-2 py-1",children:[e.jsx("h4",{className:"text-xs font-semibold truncate",children:f}),e.jsxs("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:[i,"/",x.length]})]}),e.jsx("div",{className:"h-1 mx-2 mb-1 bg-[var(--color-bg-tertiary)] rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full",style:{width:`${s}%`,background:y.done}})}),x.map(t=>{const r=(h==null?void 0:h.id)===t.id,v=y[t.status]||"#9e9e9e",j=c.edges.filter(n=>n.from===t.id&&n.relationType==="depends_on").map(n=>{var l;return((l=g.get(n.to))==null?void 0:l.title)||n.to});return e.jsxs("div",{onClick:()=>N(t),className:`mx-1 mb-1 px-2 py-1.5 rounded cursor-pointer hover:bg-[var(--color-bg-tertiary)] transition-colors ${r?"ring-1 ring-[var(--color-accent)]":""}`,children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[9px] px-1 py-0.5 rounded font-medium shrink-0",style:{background:`${v}20`,color:v},children:t.status.replace("_"," ")}),e.jsx("span",{className:"text-xs truncate flex-1",children:t.title}),e.jsxs("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:["P",t.priority]}),t.xpSize&&e.jsx("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:t.xpSize})]}),j.length>0&&e.jsxs("div",{className:"text-[10px] text-[var(--color-text-muted)] mt-0.5 truncate pl-1",children:["Depends on: ",j.join(", ")]})]},t.id)})]},d)})]})}),W={workflowNode:I},U={workflowEdge:z},Z={hideAttribution:!0};function G({graph:o}){const[c,N,w]=M([]),[h,g,d]=E([]),[x,m]=a.useState(null),[f,i]=a.useState(new Set),s=a.useRef(!0),{fitView:t}=P(),r=a.useMemo(()=>T(o.nodes,o.edges),[o.nodes,o.edges]),v=a.useCallback(l=>{i(u=>{const p=new Set(u);return p.has(l)?p.delete(l):p.add(l),p})},[]);a.useEffect(()=>{const l=B(o.nodes,f,r),u=D(l,void 0,r,f,v),p=new Set(u.map(S=>S.id)),k=R(o.edges,p),b=F(u,k,"TB");N(b.nodes),g(b.edges),s.current?s.current=!1:setTimeout(()=>t({duration:300}),50)},[o,N,g,f,r,v,t]);const C=a.useCallback((l,u)=>{m(u.data.sourceNode)},[]),j=a.useCallback(l=>{m(l)},[]),n=a.useMemo(()=>{const l=o.nodes.length,u=o.nodes.filter(b=>b.status==="done").length,p=o.nodes.filter(b=>b.status==="in_progress").length,k=o.nodes.filter(b=>b.status==="blocked").length;return{total:l,done:u,inProgress:p,blocked:k,pctDone:l?Math.round(u/l*100):0}},[o.nodes]);return e.jsxs("div",{className:"flex h-full",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col",children:[e.jsx("div",{className:"px-3 py-1.5 bg-[var(--color-bg-secondary)] border-b border-[var(--color-border)] flex items-center gap-2 text-xs relative z-10",children:e.jsxs("span",{className:"text-[var(--color-text-muted)]",children:["Showing ",c.length," of ",o.nodes.length," nodes — click ▶ to expand"]})}),o.nodes.length>0?e.jsxs($,{nodes:c,edges:h,onNodesChange:w,onEdgesChange:d,onNodeClick:C,nodeTypes:W,edgeTypes:U,nodesDraggable:!1,nodesConnectable:!1,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Z,children:[e.jsx(L,{gap:16,size:1}),e.jsx(A,{showInteractive:!1})]}):e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:"Import a PRD to see the workflow"})]}),e.jsxs("div",{className:"w-96 border-l border-[var(--color-border)] flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"px-4 py-3 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)]",children:[e.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[e.jsxs("span",{children:[n.done,"/",n.total," done (",n.pctDone,"%)"]}),e.jsxs("span",{className:"text-[var(--color-text-muted)]",children:[n.inProgress," in progress, ",n.blocked," blocked"]})]}),e.jsxs("div",{className:"h-2 bg-[var(--color-bg-tertiary)] rounded-full overflow-hidden flex",children:[e.jsx("div",{className:"h-full transition-all",style:{width:`${n.pctDone}%`,background:y.done}}),e.jsx("div",{className:"h-full transition-all",style:{width:`${n.total?Math.round(n.inProgress/n.total*100):0}%`,background:y.in_progress}})]})]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:e.jsx(V,{graph:o,onNodeClick:j})})]}),x&&e.jsx(O,{node:x,onClose:()=>m(null)})]})}function Q({graph:o}){return e.jsx(_,{children:e.jsx(G,{graph:o})})}export{Q as PrdBacklogTab};
@@ -0,0 +1 @@
1
+ import{r as o,a as f,j as e}from"./index-CZOiKbTP.js";function N(){const[s,t]=o.useState([]),[r,n]=o.useState([]),[c,i]=o.useState(0),[h,x]=o.useState(!0),[m,d]=o.useState(null),l=o.useCallback(async()=>{x(!0),d(null);try{const[a,b]=await Promise.all([f.getSkills(),f.getRecommendations().catch(()=>({recommendations:[]}))]);t(a.skills),i(a.totalTokens),n(b.recommendations)}catch(a){d(a instanceof Error?a.message:"Failed to load skills")}finally{x(!1)}},[]);return o.useEffect(()=>{l()},[l]),{skills:s,recommendations:r,totalTokens:c,loading:h,error:m,refresh:l}}const y=["ANALYZE","DESIGN","PLAN","IMPLEMENT","VALIDATE","REVIEW","HANDOFF","LISTENING"],j={ANALYZE:"#8b5cf6",DESIGN:"#3b82f6",PLAN:"#06b6d4",IMPLEMENT:"#10b981",VALIDATE:"#f59e0b",REVIEW:"#ef4444",HANDOFF:"#ec4899",LISTENING:"#6b7280"},g=4e3;function u({value:s,label:t}){return e.jsxs("div",{className:"p-3 rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-border)] text-center","data-testid":"metric-card",children:[e.jsx("div",{className:"text-xl font-bold",children:s}),e.jsx("div",{className:"text-[10px] text-[var(--color-text-muted)] uppercase",children:t})]})}function k({phase:s}){const t=j[s]??"#6b7280";return e.jsx("span",{className:"px-2 py-0.5 rounded-full text-[10px] font-medium",style:{background:`${t}20`,color:t},children:s})}function S({source:s}){const t=s==="built-in";return e.jsx("span",{className:`px-1.5 py-0.5 rounded text-[10px] font-medium ${t?"bg-[var(--color-accent)]/10 text-[var(--color-accent)]":"bg-[var(--color-text-muted)]/10 text-[var(--color-text-muted)]"}`,children:s})}function E({skill:s}){return e.jsxs("div",{className:"p-3 rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-border)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[e.jsx("span",{className:"text-sm font-medium truncate",children:s.name}),e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx(S,{source:s.source}),e.jsxs("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:[s.estimatedTokens.toLocaleString()," tok"]})]})]}),e.jsx("p",{className:"text-xs text-[var(--color-text-muted)] line-clamp-2",children:s.description})]})}function v({phase:s,skills:t}){const[r,n]=o.useState(!0),c=j[s]??"#6b7280";return e.jsxs("div",{className:"rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-border)] overflow-hidden",children:[e.jsxs("button",{type:"button",onClick:()=>n(!r),className:"w-full flex items-center justify-between px-3 py-2 text-xs font-medium hover:bg-[var(--color-bg-tertiary)] transition-colors",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-2 h-2 rounded-full",style:{background:c}}),s,e.jsx("span",{className:"px-1.5 py-0.5 rounded-full bg-[var(--color-border)] text-[10px]",children:t.length})]}),e.jsx("span",{className:"text-[var(--color-text-muted)]",children:r?"▲":"▼"})]}),r&&e.jsx("div",{className:"px-3 pb-3 space-y-2",children:t.map(i=>e.jsx(E,{skill:i},i.name))})]})}function L({rec:s}){return e.jsxs("div",{className:"p-3 rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-accent)]/30",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("span",{className:"text-sm font-medium",children:s.skill}),e.jsx(k,{phase:s.phase})]}),e.jsx("p",{className:"text-xs text-[var(--color-text-muted)]",children:s.reason})]})}function T({totalTokens:s}){const t=Math.min(s/g,1),r=Math.round(t*100),n=t>.8?"#ef4444":t>.5?"#f59e0b":"#10b981";return e.jsxs("div",{"data-testid":"token-budget-bar",className:"p-4 rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-border)]",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("h3",{className:"text-xs font-semibold text-[var(--color-text-muted)] uppercase",children:"Token Budget"}),e.jsxs("span",{className:"text-xs text-[var(--color-text-muted)]",children:[s.toLocaleString()," / ",g.toLocaleString()," tokens (",r,"%)"]})]}),e.jsx("div",{className:"w-full h-2 rounded-full bg-[var(--color-border)]",children:e.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${r}%`,background:n}})})]})}function w(){const{skills:s,recommendations:t,totalTokens:r,loading:n,error:c,refresh:i}=N();if(c)return e.jsxs("div",{className:"flex items-center justify-center h-full text-[var(--color-danger)]",children:["Failed to load skills: ",c]});if(n)return e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:"Loading skills..."});const h=s.filter(l=>l.source==="built-in").length,x=s.filter(l=>l.source==="filesystem").length,m=new Map;for(const l of y){const a=s.filter(b=>{var p;return(p=b.phases)==null?void 0:p.includes(l)});a.length>0&&m.set(l,a)}const d=s.filter(l=>!l.phases||l.phases.length===0);return e.jsxs("div",{className:"p-6 max-w-6xl mx-auto space-y-6 overflow-y-auto h-full",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"Skills"}),e.jsx("button",{onClick:()=>void i(),className:"text-xs px-3 py-1.5 rounded-lg bg-[var(--color-accent)] text-white hover:opacity-90 transition-opacity",children:"Refresh"})]}),e.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-3","data-testid":"skills-stats",children:[e.jsx(u,{value:s.length,label:"Total Skills"}),e.jsx(u,{value:h,label:"Built-in"}),e.jsx(u,{value:x,label:"Filesystem"}),e.jsx(u,{value:r.toLocaleString(),label:"Total Tokens"})]}),e.jsx(T,{totalTokens:r}),t.length>0&&e.jsxs("div",{"data-testid":"recommendations-section",className:"space-y-2",children:[e.jsxs("h3",{className:"text-xs font-semibold text-[var(--color-text-muted)] uppercase",children:["Recommendations (",t.length,")"]}),e.jsx("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-2",children:t.map(l=>e.jsx(L,{rec:l},l.skill))})]}),e.jsxs("div",{"data-testid":"skills-by-phase",className:"space-y-3",children:[e.jsx("h3",{className:"text-xs font-semibold text-[var(--color-text-muted)] uppercase",children:"Skills by Lifecycle Phase"}),[...m.entries()].map(([l,a])=>e.jsx(v,{phase:l,skills:a},l)),d.length>0&&e.jsx(v,{phase:"Other",skills:d})]})]})}export{w as SkillsTab};
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
7
7
  <title>mcp-graph Workstation</title>
8
- <script type="module" crossorigin src="/assets/index-DLehETrJ.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-D4nxPvv8.css">
8
+ <script type="module" crossorigin src="/assets/index-CZOiKbTP.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-xyMN-_UV.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-graph-workflow/mcp-graph",
3
- "version": "5.1.5",
3
+ "version": "5.3.0",
4
4
  "description": "MCP local-first PRD to task graph — transforms text into executable structure",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -70,7 +70,7 @@
70
70
  "@vitest/coverage-v8": "^4.0.0",
71
71
  "eslint": "^10.0.3",
72
72
  "eslint-plugin-security": "^4.0.0",
73
- "gitnexus": "^1.3.11",
73
+ "graphology": "^0.26.0",
74
74
  "supertest": "^7.2.2",
75
75
  "tsx": "^4.21.0",
76
76
  "typescript": "^5.9.3",
@@ -1,12 +0,0 @@
1
- /**
2
- * GitNexus API bridge routes.
3
- * Proxies requests to the local GitNexus instance.
4
- * All data stays local — no external communication.
5
- */
6
- import { Router } from "express";
7
- export interface GitNexusRouterOptions {
8
- getBasePath: () => string;
9
- gitnexusPort?: number;
10
- }
11
- export declare function createGitNexusRouter(options: GitNexusRouterOptions): Router;
12
- //# sourceMappingURL=gitnexus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitnexus.d.ts","sourceRoot":"","sources":["../../../src/api/routes/gitnexus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAuBjC,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAyI3E"}
@@ -1,164 +0,0 @@
1
- /**
2
- * GitNexus API bridge routes.
3
- * Proxies requests to the local GitNexus instance.
4
- * All data stays local — no external communication.
5
- */
6
- import { Router } from "express";
7
- import { z } from "zod/v4";
8
- import { isGitNexusIndexed, isGitNexusRunning, getAnalyzePhase, getServeBasePath, ensureGitNexusAnalyzed, startGitNexusServe, } from "../../core/integrations/gitnexus-launcher.js";
9
- import { logger } from "../../core/utils/logger.js";
10
- import { buildContextQuery, buildImpactQuery, parseContextResponse, parseImpactResponse, } from "../../core/integrations/gitnexus-queries.js";
11
- const QueryBodySchema = z.object({ query: z.string().min(1) });
12
- const SymbolBodySchema = z.object({ symbol: z.string().min(1) });
13
- const DEFAULT_GITNEXUS_PORT = 3737;
14
- async function proxyToGitNexus(port, endpoint, body) {
15
- try {
16
- const res = await fetch(`http://localhost:${port}${endpoint}`, {
17
- method: "POST",
18
- headers: { "Content-Type": "application/json" },
19
- body: JSON.stringify(body),
20
- });
21
- // Handle non-JSON responses (e.g. HTML 404 pages) gracefully
22
- const contentType = res.headers.get("content-type") ?? "";
23
- if (!contentType.includes("application/json")) {
24
- return { ok: false, status: res.status, data: { error: `Non-JSON response from GitNexus (${res.status})` } };
25
- }
26
- const data = await res.json();
27
- return { ok: res.ok, status: res.status, data };
28
- }
29
- catch (err) {
30
- const message = err instanceof Error ? err.message : String(err);
31
- return { ok: false, status: 502, data: { error: `GitNexus proxy error: ${message}` } };
32
- }
33
- }
34
- export function createGitNexusRouter(options) {
35
- const { getBasePath, gitnexusPort = DEFAULT_GITNEXUS_PORT } = options;
36
- const router = Router();
37
- // ── GET /status ───────────────────────────────
38
- router.get("/status", async (_req, res, next) => {
39
- try {
40
- const indexed = isGitNexusIndexed(getBasePath());
41
- const running = await isGitNexusRunning(gitnexusPort);
42
- res.json({
43
- indexed,
44
- running,
45
- port: gitnexusPort,
46
- analyzePhase: getAnalyzePhase(),
47
- basePath: getBasePath(),
48
- serveBasePath: getServeBasePath(),
49
- ...(running ? { url: `http://localhost:${gitnexusPort}` } : {}),
50
- });
51
- }
52
- catch (err) {
53
- next(err);
54
- }
55
- });
56
- // ── POST /analyze ────────────────────────────────
57
- router.post("/analyze", async (_req, res, next) => {
58
- try {
59
- const result = await ensureGitNexusAnalyzed(getBasePath());
60
- res.json(result);
61
- }
62
- catch (err) {
63
- next(err);
64
- }
65
- });
66
- // ── POST /serve ─────────────────────────────────
67
- router.post("/serve", async (_req, res, next) => {
68
- try {
69
- const result = await startGitNexusServe(getBasePath(), gitnexusPort);
70
- res.json(result);
71
- }
72
- catch (err) {
73
- next(err);
74
- }
75
- });
76
- // ── POST /query ───────────────────────────────
77
- router.post("/query", async (req, res, next) => {
78
- try {
79
- const parsed = QueryBodySchema.safeParse(req.body);
80
- if (!parsed.success) {
81
- res.status(400).json({ error: "Missing required field: query" });
82
- return;
83
- }
84
- const running = await isGitNexusRunning(gitnexusPort);
85
- if (!running) {
86
- res.status(503).json({ error: "GitNexus is not running. Start with: gitnexus serve" });
87
- return;
88
- }
89
- const result = await proxyToGitNexus(gitnexusPort, "/api/query", { cypher: parsed.data.query });
90
- res.status(result.status).json(result.data);
91
- }
92
- catch (err) {
93
- next(err);
94
- }
95
- });
96
- // ── POST /context ─────────────────────────────
97
- router.post("/context", async (req, res, next) => {
98
- try {
99
- const parsed = SymbolBodySchema.safeParse(req.body);
100
- if (!parsed.success) {
101
- res.status(400).json({ error: "Missing required field: symbol" });
102
- return;
103
- }
104
- const running = await isGitNexusRunning(gitnexusPort);
105
- if (!running) {
106
- res.status(503).json({ error: "GitNexus is not running. Start with: gitnexus serve" });
107
- return;
108
- }
109
- // Try direct proxy first, fallback to Cypher query
110
- const result = await proxyToGitNexus(gitnexusPort, "/api/context", { symbol: parsed.data.symbol });
111
- if (result.status === 404) {
112
- logger.debug("GitNexus /api/context returned 404, falling back to Cypher query", { symbol: parsed.data.symbol });
113
- const cypher = buildContextQuery(parsed.data.symbol);
114
- const cypherResult = await proxyToGitNexus(gitnexusPort, "/api/query", { cypher });
115
- if (!cypherResult.ok) {
116
- res.status(cypherResult.status).json(cypherResult.data);
117
- return;
118
- }
119
- const contextData = parseContextResponse(cypherResult.data);
120
- res.json(contextData);
121
- return;
122
- }
123
- res.status(result.status).json(result.data);
124
- }
125
- catch (err) {
126
- next(err);
127
- }
128
- });
129
- // ── POST /impact ──────────────────────────────
130
- router.post("/impact", async (req, res, next) => {
131
- try {
132
- const parsed = SymbolBodySchema.safeParse(req.body);
133
- if (!parsed.success) {
134
- res.status(400).json({ error: "Missing required field: symbol" });
135
- return;
136
- }
137
- const running = await isGitNexusRunning(gitnexusPort);
138
- if (!running) {
139
- res.status(503).json({ error: "GitNexus is not running. Start with: gitnexus serve" });
140
- return;
141
- }
142
- // Try direct proxy first, fallback to Cypher query
143
- const result = await proxyToGitNexus(gitnexusPort, "/api/impact", { symbol: parsed.data.symbol });
144
- if (result.status === 404) {
145
- logger.debug("GitNexus /api/impact returned 404, falling back to Cypher query", { symbol: parsed.data.symbol });
146
- const cypher = buildImpactQuery(parsed.data.symbol);
147
- const cypherResult = await proxyToGitNexus(gitnexusPort, "/api/query", { cypher });
148
- if (!cypherResult.ok) {
149
- res.status(cypherResult.status).json(cypherResult.data);
150
- return;
151
- }
152
- const impactData = parseImpactResponse(cypherResult.data, parsed.data.symbol);
153
- res.json(impactData);
154
- return;
155
- }
156
- res.status(result.status).json(result.data);
157
- }
158
- catch (err) {
159
- next(err);
160
- }
161
- });
162
- return router;
163
- }
164
- //# sourceMappingURL=gitnexus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitnexus.js","sourceRoot":"","sources":["../../../src/api/routes/gitnexus.ts"],"names":[],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- /**
2
- * GitNexus lifecycle manager.
3
- * Handles analyze, serve (as child process), and cleanup.
4
- * All operations are local-only — no data sent externally.
5
- *
6
- * Binary resolution order:
7
- * 1. Local node_modules/.bin/gitnexus (target project)
8
- * 2. Local node_modules/.bin/gitnexus (mcp-graph install dir)
9
- * 3. Global `gitnexus` on PATH
10
- * 4. Auto-install via `npm install --no-save gitnexus` in target project, then use local bin
11
- */
12
- export type AnalyzePhase = "idle" | "analyzing" | "ready" | "unavailable" | "error";
13
- /**
14
- * Get the current analyze phase.
15
- */
16
- export declare function getAnalyzePhase(): AnalyzePhase;
17
- /**
18
- * Reset analyze phase to idle (for testing).
19
- */
20
- export declare function resetAnalyzePhase(): void;
21
- /**
22
- * Get the basePath that the current GitNexus serve process is running for.
23
- * Returns null if serve is not running.
24
- */
25
- export declare function getServeBasePath(): string | null;
26
- /**
27
- * Check if the given path is inside a git repository.
28
- */
29
- export declare function isGitRepo(basePath: string): boolean;
30
- export interface AnalyzeResult {
31
- skipped: boolean;
32
- success?: boolean;
33
- reason: string;
34
- }
35
- export interface ServeResult {
36
- started: boolean;
37
- message: string;
38
- port?: number;
39
- }
40
- /**
41
- * Check if the codebase has been indexed by GitNexus.
42
- */
43
- export declare function isGitNexusIndexed(basePath: string): boolean;
44
- /**
45
- * Check if GitNexus serve is running on a given port via HTTP probe.
46
- */
47
- export declare function isGitNexusRunning(port: number): Promise<boolean>;
48
- /**
49
- * Resolve the gitnexus binary path.
50
- * Caches result after first successful resolution.
51
- */
52
- export declare function resolveGitNexusBin(basePath: string): Promise<string | null>;
53
- /**
54
- * Ensure codebase is analyzed by GitNexus.
55
- * Skips if `.gitnexus/` already exists.
56
- */
57
- export declare function ensureGitNexusAnalyzed(basePath: string): Promise<AnalyzeResult>;
58
- /**
59
- * Start GitNexus serve as a child process on the given port.
60
- * Returns immediately after spawning — does not wait for readiness.
61
- */
62
- export declare function startGitNexusServe(basePath: string, port: number): Promise<ServeResult>;
63
- /**
64
- * Stop the GitNexus serve child process if running.
65
- */
66
- export declare function stopGitNexus(): Promise<void>;
67
- //# sourceMappingURL=gitnexus-launcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitnexus-launcher.d.ts","sourceRoot":"","sources":["../../../src/core/integrations/gitnexus-launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmBH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,CAAC;AAIpF;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUtE;AA4CD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqCjF;AAID;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAyCrF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgE7F;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAalD"}
@@ -1,268 +0,0 @@
1
- /**
2
- * GitNexus lifecycle manager.
3
- * Handles analyze, serve (as child process), and cleanup.
4
- * All operations are local-only — no data sent externally.
5
- *
6
- * Binary resolution order:
7
- * 1. Local node_modules/.bin/gitnexus (target project)
8
- * 2. Local node_modules/.bin/gitnexus (mcp-graph install dir)
9
- * 3. Global `gitnexus` on PATH
10
- * 4. Auto-install via `npm install --no-save gitnexus` in target project, then use local bin
11
- */
12
- import { existsSync } from "node:fs";
13
- import { execFile, spawn } from "node:child_process";
14
- import { promisify } from "node:util";
15
- import path from "node:path";
16
- import { fileURLToPath } from "node:url";
17
- import { logger } from "../utils/logger.js";
18
- import { IS_WINDOWS as IS_WIN, killProcess } from "../utils/platform.js";
19
- const execAsync = promisify(execFile);
20
- const GITNEXUS_DIR = ".gitnexus";
21
- const GITNEXUS_PKG = "gitnexus";
22
- let serveProcess = null;
23
- let resolvedBin = null;
24
- let currentServePath = null;
25
- let analyzePhase = "idle";
26
- /**
27
- * Get the current analyze phase.
28
- */
29
- export function getAnalyzePhase() {
30
- return analyzePhase;
31
- }
32
- /**
33
- * Reset analyze phase to idle (for testing).
34
- */
35
- export function resetAnalyzePhase() {
36
- analyzePhase = "idle";
37
- resolvedBin = null;
38
- currentServePath = null;
39
- }
40
- /**
41
- * Get the basePath that the current GitNexus serve process is running for.
42
- * Returns null if serve is not running.
43
- */
44
- export function getServeBasePath() {
45
- return currentServePath;
46
- }
47
- /**
48
- * Check if the given path is inside a git repository.
49
- */
50
- export function isGitRepo(basePath) {
51
- return existsSync(path.join(basePath, ".git"));
52
- }
53
- /**
54
- * Check if the codebase has been indexed by GitNexus.
55
- */
56
- export function isGitNexusIndexed(basePath) {
57
- return existsSync(path.join(basePath, GITNEXUS_DIR));
58
- }
59
- /**
60
- * Check if GitNexus serve is running on a given port via HTTP probe.
61
- */
62
- export async function isGitNexusRunning(port) {
63
- try {
64
- const controller = new AbortController();
65
- const timer = setTimeout(() => controller.abort(), 2000);
66
- const res = await fetch(`http://localhost:${port}`, { signal: controller.signal });
67
- clearTimeout(timer);
68
- return res.ok || res.status < 500;
69
- }
70
- catch {
71
- return false;
72
- }
73
- }
74
- // ── Binary resolution ─────────────────────────────────────
75
- const IS_WINDOWS = IS_WIN;
76
- function localBin(dir) {
77
- const binName = IS_WINDOWS ? `${GITNEXUS_PKG}.cmd` : GITNEXUS_PKG;
78
- return path.join(dir, "node_modules", ".bin", binName);
79
- }
80
- function mcpGraphRoot() {
81
- const thisFile = fileURLToPath(import.meta.url);
82
- // src/core/integrations/gitnexus-launcher.ts → project root (3 levels up)
83
- return path.resolve(path.dirname(thisFile), "..", "..", "..");
84
- }
85
- async function whichGitNexus() {
86
- const cmd = IS_WINDOWS ? "where" : "which";
87
- try {
88
- const { stdout } = await execAsync(cmd, [GITNEXUS_PKG]);
89
- const bin = stdout.trim().split(/\r?\n/)[0];
90
- return bin.length > 0 ? bin : null;
91
- }
92
- catch {
93
- return null;
94
- }
95
- }
96
- async function installGitNexus(basePath) {
97
- logger.info("Auto-installing gitnexus in target project", { basePath });
98
- try {
99
- await execAsync("npm", ["install", "--no-save", GITNEXUS_PKG], {
100
- cwd: basePath,
101
- timeout: 120_000,
102
- });
103
- logger.success("gitnexus installed successfully", { basePath });
104
- return true;
105
- }
106
- catch (err) {
107
- const msg = err instanceof Error ? err.message : String(err);
108
- logger.warn("Failed to auto-install gitnexus", { error: msg });
109
- return false;
110
- }
111
- }
112
- /**
113
- * Resolve the gitnexus binary path.
114
- * Caches result after first successful resolution.
115
- */
116
- export async function resolveGitNexusBin(basePath) {
117
- if (resolvedBin && existsSync(resolvedBin))
118
- return resolvedBin;
119
- // 1. Local bin in target project
120
- const targetBin = localBin(basePath);
121
- if (existsSync(targetBin)) {
122
- resolvedBin = targetBin;
123
- logger.debug("GitNexus resolved: target project local bin", { bin: targetBin });
124
- return resolvedBin;
125
- }
126
- // 2. Local bin in mcp-graph install directory
127
- const mcpBin = localBin(mcpGraphRoot());
128
- if (existsSync(mcpBin)) {
129
- resolvedBin = mcpBin;
130
- logger.debug("GitNexus resolved: mcp-graph local bin", { bin: mcpBin });
131
- return resolvedBin;
132
- }
133
- // 3. Global binary on PATH
134
- const globalBin = await whichGitNexus();
135
- if (globalBin) {
136
- resolvedBin = globalBin;
137
- logger.debug("GitNexus resolved: global binary", { bin: globalBin });
138
- return resolvedBin;
139
- }
140
- // 4. Auto-install in target project
141
- const installed = await installGitNexus(basePath);
142
- if (installed && existsSync(targetBin)) {
143
- resolvedBin = targetBin;
144
- logger.debug("GitNexus resolved: auto-installed local bin", { bin: targetBin });
145
- return resolvedBin;
146
- }
147
- logger.warn("GitNexus binary not found and auto-install failed");
148
- return null;
149
- }
150
- // ── Core operations ─────────────────────────────────────
151
- /**
152
- * Ensure codebase is analyzed by GitNexus.
153
- * Skips if `.gitnexus/` already exists.
154
- */
155
- export async function ensureGitNexusAnalyzed(basePath) {
156
- if (!isGitRepo(basePath)) {
157
- analyzePhase = "unavailable";
158
- logger.info("No git repository found, skipping GitNexus analysis", { basePath });
159
- return { skipped: true, reason: "No git repository found" };
160
- }
161
- if (isGitNexusIndexed(basePath)) {
162
- analyzePhase = "ready";
163
- logger.info("GitNexus index already exists, skipping analysis", { basePath });
164
- return { skipped: true, reason: "Already indexed" };
165
- }
166
- const bin = await resolveGitNexusBin(basePath);
167
- if (!bin) {
168
- analyzePhase = "error";
169
- return {
170
- skipped: false,
171
- success: false,
172
- reason: "GitNexus binary not found. Install with: npm install gitnexus",
173
- };
174
- }
175
- analyzePhase = "analyzing";
176
- logger.info("Running GitNexus analyze", { basePath, bin });
177
- try {
178
- await execAsync(bin, ["analyze", basePath], {
179
- timeout: 300_000,
180
- cwd: basePath,
181
- });
182
- analyzePhase = "ready";
183
- logger.success("GitNexus analysis complete", { basePath });
184
- return { skipped: false, success: true, reason: "Analysis completed" };
185
- }
186
- catch (err) {
187
- const message = err instanceof Error ? err.message : String(err);
188
- analyzePhase = "error";
189
- logger.warn("GitNexus analysis failed", { basePath, error: message });
190
- return { skipped: false, success: false, reason: `Analysis failed: ${message}` };
191
- }
192
- }
193
- /**
194
- * Start GitNexus serve as a child process on the given port.
195
- * Returns immediately after spawning — does not wait for readiness.
196
- */
197
- export async function startGitNexusServe(basePath, port) {
198
- if (!isGitNexusIndexed(basePath)) {
199
- logger.info("GitNexus not indexed, skipping serve", { basePath });
200
- return { started: false, message: "Codebase not indexed. Run gitnexus analyze first." };
201
- }
202
- // If serve is running for a different basePath, stop it first
203
- if (currentServePath && currentServePath !== basePath) {
204
- logger.info("GitNexus basePath changed, restarting serve", {
205
- oldBasePath: currentServePath,
206
- newBasePath: basePath,
207
- });
208
- await stopGitNexus();
209
- }
210
- const alreadyRunning = await isGitNexusRunning(port);
211
- if (alreadyRunning && currentServePath === basePath) {
212
- logger.info("GitNexus already running for current basePath", { port, basePath });
213
- return { started: true, message: `GitNexus already running on port ${port}`, port };
214
- }
215
- // If something else is running on the port but not our process, we can't start
216
- if (alreadyRunning && currentServePath !== basePath) {
217
- logger.warn("GitNexus port in use by external process, stopping and restarting", { port });
218
- await stopGitNexus();
219
- }
220
- if (serveProcess && !serveProcess.killed) {
221
- logger.info("GitNexus serve process already spawned", { pid: serveProcess.pid });
222
- return { started: true, message: "GitNexus serve process already active", port };
223
- }
224
- const bin = await resolveGitNexusBin(basePath);
225
- if (!bin) {
226
- return { started: false, message: "GitNexus binary not found. Install with: npm install gitnexus" };
227
- }
228
- try {
229
- serveProcess = spawn(bin, ["serve", "--port", String(port)], {
230
- cwd: basePath,
231
- stdio: "pipe",
232
- detached: false,
233
- });
234
- serveProcess.on("error", (err) => {
235
- logger.error("GitNexus serve process error", { error: err.message });
236
- serveProcess = null;
237
- currentServePath = null;
238
- });
239
- serveProcess.on("exit", (code) => {
240
- logger.info("GitNexus serve process exited", { code });
241
- serveProcess = null;
242
- currentServePath = null;
243
- });
244
- currentServePath = basePath;
245
- logger.success("GitNexus serve started", { port, pid: serveProcess.pid, basePath });
246
- return { started: true, message: `GitNexus serve started on port ${port}`, port };
247
- }
248
- catch (err) {
249
- const message = err instanceof Error ? err.message : String(err);
250
- logger.error("Failed to start GitNexus serve", { error: message });
251
- return { started: false, message: `Failed to start: ${message}` };
252
- }
253
- }
254
- /**
255
- * Stop the GitNexus serve child process if running.
256
- */
257
- export async function stopGitNexus() {
258
- if (!serveProcess || serveProcess.killed) {
259
- serveProcess = null;
260
- currentServePath = null;
261
- return;
262
- }
263
- logger.info("Stopping GitNexus serve", { pid: serveProcess.pid });
264
- killProcess(serveProcess);
265
- serveProcess = null;
266
- currentServePath = null;
267
- }
268
- //# sourceMappingURL=gitnexus-launcher.js.map