@mcp-graph-workflow/mcp-graph 5.32.0 → 5.34.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 (292) hide show
  1. package/dist/api/router.d.ts.map +1 -1
  2. package/dist/api/router.js +2 -0
  3. package/dist/api/router.js.map +1 -1
  4. package/dist/api/routes/code-graph.d.ts.map +1 -1
  5. package/dist/api/routes/code-graph.js +3 -1
  6. package/dist/api/routes/code-graph.js.map +1 -1
  7. package/dist/api/routes/davinci.d.ts +3 -0
  8. package/dist/api/routes/davinci.d.ts.map +1 -0
  9. package/dist/api/routes/davinci.js +188 -0
  10. package/dist/api/routes/davinci.js.map +1 -0
  11. package/dist/core/analyzer/ac-coverage.d.ts +16 -0
  12. package/dist/core/analyzer/ac-coverage.d.ts.map +1 -0
  13. package/dist/core/analyzer/ac-coverage.js +38 -0
  14. package/dist/core/analyzer/ac-coverage.js.map +1 -0
  15. package/dist/core/analyzer/asset-blockers.d.ts +23 -0
  16. package/dist/core/analyzer/asset-blockers.d.ts.map +1 -0
  17. package/dist/core/analyzer/asset-blockers.js +50 -0
  18. package/dist/core/analyzer/asset-blockers.js.map +1 -0
  19. package/dist/core/analyzer/concurrency-risk.d.ts +26 -0
  20. package/dist/core/analyzer/concurrency-risk.d.ts.map +1 -0
  21. package/dist/core/analyzer/concurrency-risk.js +99 -0
  22. package/dist/core/analyzer/concurrency-risk.js.map +1 -0
  23. package/dist/core/analyzer/config-coverage.d.ts +20 -0
  24. package/dist/core/analyzer/config-coverage.d.ts.map +1 -0
  25. package/dist/core/analyzer/config-coverage.js +49 -0
  26. package/dist/core/analyzer/config-coverage.js.map +1 -0
  27. package/dist/core/analyzer/contract-coverage.d.ts +22 -0
  28. package/dist/core/analyzer/contract-coverage.d.ts.map +1 -0
  29. package/dist/core/analyzer/contract-coverage.js +51 -0
  30. package/dist/core/analyzer/contract-coverage.js.map +1 -0
  31. package/dist/core/analyzer/data-integrity.d.ts +22 -0
  32. package/dist/core/analyzer/data-integrity.d.ts.map +1 -0
  33. package/dist/core/analyzer/data-integrity.js +80 -0
  34. package/dist/core/analyzer/data-integrity.js.map +1 -0
  35. package/dist/core/analyzer/economy-simulator.d.ts +33 -0
  36. package/dist/core/analyzer/economy-simulator.d.ts.map +1 -0
  37. package/dist/core/analyzer/economy-simulator.js +162 -0
  38. package/dist/core/analyzer/economy-simulator.js.map +1 -0
  39. package/dist/core/analyzer/formula-consistency.d.ts +25 -0
  40. package/dist/core/analyzer/formula-consistency.d.ts.map +1 -0
  41. package/dist/core/analyzer/formula-consistency.js +82 -0
  42. package/dist/core/analyzer/formula-consistency.js.map +1 -0
  43. package/dist/core/analyzer/metric-coverage.d.ts +22 -0
  44. package/dist/core/analyzer/metric-coverage.d.ts.map +1 -0
  45. package/dist/core/analyzer/metric-coverage.js +52 -0
  46. package/dist/core/analyzer/metric-coverage.js.map +1 -0
  47. package/dist/core/analyzer/performance-budget-check.d.ts +22 -0
  48. package/dist/core/analyzer/performance-budget-check.d.ts.map +1 -0
  49. package/dist/core/analyzer/performance-budget-check.js +40 -0
  50. package/dist/core/analyzer/performance-budget-check.js.map +1 -0
  51. package/dist/core/analyzer/risk-assessment.d.ts.map +1 -1
  52. package/dist/core/analyzer/risk-assessment.js +9 -0
  53. package/dist/core/analyzer/risk-assessment.js.map +1 -1
  54. package/dist/core/analyzer/scenario-coverage.d.ts +19 -0
  55. package/dist/core/analyzer/scenario-coverage.d.ts.map +1 -0
  56. package/dist/core/analyzer/scenario-coverage.js +59 -0
  57. package/dist/core/analyzer/scenario-coverage.js.map +1 -0
  58. package/dist/core/analyzer/state-completeness.d.ts +22 -0
  59. package/dist/core/analyzer/state-completeness.d.ts.map +1 -0
  60. package/dist/core/analyzer/state-completeness.js +76 -0
  61. package/dist/core/analyzer/state-completeness.js.map +1 -0
  62. package/dist/core/code/code-indexer.d.ts +1 -1
  63. package/dist/core/code/code-indexer.d.ts.map +1 -1
  64. package/dist/core/code/code-indexer.js +50 -3
  65. package/dist/core/code/code-indexer.js.map +1 -1
  66. package/dist/core/code/code-store.js +3 -3
  67. package/dist/core/code/code-store.js.map +1 -1
  68. package/dist/core/code/code-types.d.ts +4 -4
  69. package/dist/core/code/treesitter/treesitter-manager.d.ts.map +1 -1
  70. package/dist/core/code/treesitter/treesitter-manager.js +2 -0
  71. package/dist/core/code/treesitter/treesitter-manager.js.map +1 -1
  72. package/dist/core/davinci/build-runner.d.ts +37 -0
  73. package/dist/core/davinci/build-runner.d.ts.map +1 -0
  74. package/dist/core/davinci/build-runner.js +239 -0
  75. package/dist/core/davinci/build-runner.js.map +1 -0
  76. package/dist/core/davinci/davinci-parser.d.ts +6 -0
  77. package/dist/core/davinci/davinci-parser.d.ts.map +1 -0
  78. package/dist/core/davinci/davinci-parser.js +218 -0
  79. package/dist/core/davinci/davinci-parser.js.map +1 -0
  80. package/dist/core/davinci/davinci-store.d.ts +49 -0
  81. package/dist/core/davinci/davinci-store.d.ts.map +1 -0
  82. package/dist/core/davinci/davinci-store.js +121 -0
  83. package/dist/core/davinci/davinci-store.js.map +1 -0
  84. package/dist/core/davinci/davinci-types.d.ts +241 -0
  85. package/dist/core/davinci/davinci-types.d.ts.map +1 -0
  86. package/dist/core/davinci/davinci-types.js +123 -0
  87. package/dist/core/davinci/davinci-types.js.map +1 -0
  88. package/dist/core/davinci/davinci-validators.d.ts +16 -0
  89. package/dist/core/davinci/davinci-validators.d.ts.map +1 -0
  90. package/dist/core/davinci/davinci-validators.js +86 -0
  91. package/dist/core/davinci/davinci-validators.js.map +1 -0
  92. package/dist/core/davinci/descriptor-generator.d.ts +19 -0
  93. package/dist/core/davinci/descriptor-generator.d.ts.map +1 -0
  94. package/dist/core/davinci/descriptor-generator.js +52 -0
  95. package/dist/core/davinci/descriptor-generator.js.map +1 -0
  96. package/dist/core/davinci/plugin-generator.d.ts +29 -0
  97. package/dist/core/davinci/plugin-generator.d.ts.map +1 -0
  98. package/dist/core/davinci/plugin-generator.js +86 -0
  99. package/dist/core/davinci/plugin-generator.js.map +1 -0
  100. package/dist/core/davinci/plugin-type-detector.d.ts +15 -0
  101. package/dist/core/davinci/plugin-type-detector.d.ts.map +1 -0
  102. package/dist/core/davinci/plugin-type-detector.js +114 -0
  103. package/dist/core/davinci/plugin-type-detector.js.map +1 -0
  104. package/dist/core/davinci/pom-generator.d.ts +4 -0
  105. package/dist/core/davinci/pom-generator.d.ts.map +1 -0
  106. package/dist/core/davinci/pom-generator.js +179 -0
  107. package/dist/core/davinci/pom-generator.js.map +1 -0
  108. package/dist/core/davinci/template-registry.d.ts +25 -0
  109. package/dist/core/davinci/template-registry.d.ts.map +1 -0
  110. package/dist/core/davinci/template-registry.js +280 -0
  111. package/dist/core/davinci/template-registry.js.map +1 -0
  112. package/dist/core/davinci/variable-resolver.d.ts +9 -0
  113. package/dist/core/davinci/variable-resolver.d.ts.map +1 -0
  114. package/dist/core/davinci/variable-resolver.js +62 -0
  115. package/dist/core/davinci/variable-resolver.js.map +1 -0
  116. package/dist/core/designer/adr-validator.d.ts.map +1 -1
  117. package/dist/core/designer/adr-validator.js +12 -4
  118. package/dist/core/designer/adr-validator.js.map +1 -1
  119. package/dist/core/designer/tech-risk-assessor.d.ts +5 -1
  120. package/dist/core/designer/tech-risk-assessor.d.ts.map +1 -1
  121. package/dist/core/designer/tech-risk-assessor.js +39 -11
  122. package/dist/core/designer/tech-risk-assessor.js.map +1 -1
  123. package/dist/core/designer/traceability-matrix.d.ts.map +1 -1
  124. package/dist/core/designer/traceability-matrix.js +14 -3
  125. package/dist/core/designer/traceability-matrix.js.map +1 -1
  126. package/dist/core/graph/auto-sequence.d.ts +10 -0
  127. package/dist/core/graph/auto-sequence.d.ts.map +1 -0
  128. package/dist/core/graph/auto-sequence.js +29 -0
  129. package/dist/core/graph/auto-sequence.js.map +1 -0
  130. package/dist/core/graph/csv-export.d.ts +7 -0
  131. package/dist/core/graph/csv-export.d.ts.map +1 -0
  132. package/dist/core/graph/csv-export.js +43 -0
  133. package/dist/core/graph/csv-export.js.map +1 -0
  134. package/dist/core/graph/graph-types.d.ts +2 -2
  135. package/dist/core/graph/graph-types.d.ts.map +1 -1
  136. package/dist/core/graph/mermaid-export.d.ts +1 -1
  137. package/dist/core/graph/mermaid-export.d.ts.map +1 -1
  138. package/dist/core/graph/mermaid-export.js +101 -0
  139. package/dist/core/graph/mermaid-export.js.map +1 -1
  140. package/dist/core/importer/prd-to-graph.d.ts.map +1 -1
  141. package/dist/core/importer/prd-to-graph.js +8 -1
  142. package/dist/core/importer/prd-to-graph.js.map +1 -1
  143. package/dist/core/listener/backlog-health.d.ts.map +1 -1
  144. package/dist/core/listener/backlog-health.js +15 -3
  145. package/dist/core/listener/backlog-health.js.map +1 -1
  146. package/dist/core/parser/classify.d.ts +4 -0
  147. package/dist/core/parser/classify.d.ts.map +1 -1
  148. package/dist/core/parser/classify.js +18 -0
  149. package/dist/core/parser/classify.js.map +1 -1
  150. package/dist/core/parser/extract.d.ts.map +1 -1
  151. package/dist/core/parser/extract.js +22 -4
  152. package/dist/core/parser/extract.js.map +1 -1
  153. package/dist/core/parser/prd-diff.d.ts +23 -0
  154. package/dist/core/parser/prd-diff.d.ts.map +1 -0
  155. package/dist/core/parser/prd-diff.js +55 -0
  156. package/dist/core/parser/prd-diff.js.map +1 -0
  157. package/dist/core/parser/read-swagger.d.ts.map +1 -1
  158. package/dist/core/parser/read-swagger.js +6 -0
  159. package/dist/core/parser/read-swagger.js.map +1 -1
  160. package/dist/core/parser/segment.d.ts +5 -0
  161. package/dist/core/parser/segment.d.ts.map +1 -1
  162. package/dist/core/parser/segment.js +70 -0
  163. package/dist/core/parser/segment.js.map +1 -1
  164. package/dist/core/planner/auto-ready.d.ts +19 -0
  165. package/dist/core/planner/auto-ready.d.ts.map +1 -0
  166. package/dist/core/planner/auto-ready.js +39 -0
  167. package/dist/core/planner/auto-ready.js.map +1 -0
  168. package/dist/core/planner/planning-report.d.ts +13 -1
  169. package/dist/core/planner/planning-report.d.ts.map +1 -1
  170. package/dist/core/planner/planning-report.js +53 -2
  171. package/dist/core/planner/planning-report.js.map +1 -1
  172. package/dist/core/planner/sprint-health.d.ts +22 -0
  173. package/dist/core/planner/sprint-health.d.ts.map +1 -0
  174. package/dist/core/planner/sprint-health.js +41 -0
  175. package/dist/core/planner/sprint-health.js.map +1 -0
  176. package/dist/core/siebel/sif-parser.d.ts.map +1 -1
  177. package/dist/core/siebel/sif-parser.js +6 -0
  178. package/dist/core/siebel/sif-parser.js.map +1 -1
  179. package/dist/core/siebel/wsdl-parser.d.ts.map +1 -1
  180. package/dist/core/siebel/wsdl-parser.js +6 -0
  181. package/dist/core/siebel/wsdl-parser.js.map +1 -1
  182. package/dist/core/store/migrations.d.ts.map +1 -1
  183. package/dist/core/store/migrations.js +17 -0
  184. package/dist/core/store/migrations.js.map +1 -1
  185. package/dist/core/store/sqlite-store.d.ts +6 -0
  186. package/dist/core/store/sqlite-store.d.ts.map +1 -1
  187. package/dist/core/store/sqlite-store.js +54 -3
  188. package/dist/core/store/sqlite-store.js.map +1 -1
  189. package/dist/core/templates/template-engine.d.ts +36 -0
  190. package/dist/core/templates/template-engine.d.ts.map +1 -0
  191. package/dist/core/templates/template-engine.js +104 -0
  192. package/dist/core/templates/template-engine.js.map +1 -0
  193. package/dist/core/translation/generators/universal-generator.d.ts.map +1 -1
  194. package/dist/core/translation/generators/universal-generator.js +187 -9
  195. package/dist/core/translation/generators/universal-generator.js.map +1 -1
  196. package/dist/core/translation/language-detect.d.ts.map +1 -1
  197. package/dist/core/translation/language-detect.js +37 -14
  198. package/dist/core/translation/language-detect.js.map +1 -1
  199. package/dist/docs-manifest.json +68 -5
  200. package/dist/mcp/app-factory.js +1 -1
  201. package/dist/mcp/app-factory.js.map +1 -1
  202. package/dist/mcp/tools/analyze.d.ts.map +1 -1
  203. package/dist/mcp/tools/analyze.js +100 -1
  204. package/dist/mcp/tools/analyze.js.map +1 -1
  205. package/dist/mcp/tools/davinci-analyze.d.ts +4 -0
  206. package/dist/mcp/tools/davinci-analyze.d.ts.map +1 -0
  207. package/dist/mcp/tools/davinci-analyze.js +31 -0
  208. package/dist/mcp/tools/davinci-analyze.js.map +1 -0
  209. package/dist/mcp/tools/davinci-build.d.ts +4 -0
  210. package/dist/mcp/tools/davinci-build.d.ts.map +1 -0
  211. package/dist/mcp/tools/davinci-build.js +43 -0
  212. package/dist/mcp/tools/davinci-build.js.map +1 -0
  213. package/dist/mcp/tools/davinci-convert.d.ts +4 -0
  214. package/dist/mcp/tools/davinci-convert.d.ts.map +1 -0
  215. package/dist/mcp/tools/davinci-convert.js +61 -0
  216. package/dist/mcp/tools/davinci-convert.js.map +1 -0
  217. package/dist/mcp/tools/edge.d.ts.map +1 -1
  218. package/dist/mcp/tools/edge.js +81 -3
  219. package/dist/mcp/tools/edge.js.map +1 -1
  220. package/dist/mcp/tools/export.d.ts.map +1 -1
  221. package/dist/mcp/tools/export.js +17 -4
  222. package/dist/mcp/tools/export.js.map +1 -1
  223. package/dist/mcp/tools/import-prd.d.ts.map +1 -1
  224. package/dist/mcp/tools/import-prd.js +89 -2
  225. package/dist/mcp/tools/import-prd.js.map +1 -1
  226. package/dist/mcp/tools/index.d.ts.map +1 -1
  227. package/dist/mcp/tools/index.js +12 -0
  228. package/dist/mcp/tools/index.js.map +1 -1
  229. package/dist/mcp/tools/node.d.ts.map +1 -1
  230. package/dist/mcp/tools/node.js +127 -6
  231. package/dist/mcp/tools/node.js.map +1 -1
  232. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
  233. package/dist/mcp/tools/plan-sprint.js +6 -2
  234. package/dist/mcp/tools/plan-sprint.js.map +1 -1
  235. package/dist/mcp/tools/show.d.ts.map +1 -1
  236. package/dist/mcp/tools/show.js +11 -4
  237. package/dist/mcp/tools/show.js.map +1 -1
  238. package/dist/mcp/tools/template.d.ts +4 -0
  239. package/dist/mcp/tools/template.d.ts.map +1 -0
  240. package/dist/mcp/tools/template.js +137 -0
  241. package/dist/mcp/tools/template.js.map +1 -0
  242. package/dist/schemas/analyzer-schema.d.ts +2 -2
  243. package/dist/schemas/designer-schema.d.ts +21 -0
  244. package/dist/schemas/designer-schema.d.ts.map +1 -1
  245. package/dist/schemas/designer-schema.js +2 -0
  246. package/dist/schemas/designer-schema.js.map +1 -1
  247. package/dist/schemas/edge.schema.d.ts +6 -0
  248. package/dist/schemas/edge.schema.d.ts.map +1 -1
  249. package/dist/schemas/edge.schema.js +2 -0
  250. package/dist/schemas/edge.schema.js.map +1 -1
  251. package/dist/schemas/graph.schema.d.ts +13 -0
  252. package/dist/schemas/graph.schema.d.ts.map +1 -1
  253. package/dist/schemas/node.schema.d.ts +20 -0
  254. package/dist/schemas/node.schema.d.ts.map +1 -1
  255. package/dist/schemas/node.schema.js +3 -0
  256. package/dist/schemas/node.schema.js.map +1 -1
  257. package/dist/schemas/siebel.schema.d.ts +13 -13
  258. package/dist/web/dashboard/dist/assets/{benchmark-tab-en-UkR66.js → benchmark-tab-Aqr2Xzu5.js} +1 -1
  259. package/dist/web/dashboard/dist/assets/{circle-alert-5GIBBP3L.js → circle-alert-BJTyaShp.js} +1 -1
  260. package/dist/web/dashboard/dist/assets/constants-DLyESMjx.js +1 -0
  261. package/dist/web/dashboard/dist/assets/{context-tab-DjfwQik8.js → context-tab-CbmHGGZh.js} +1 -1
  262. package/dist/web/dashboard/dist/assets/davinci-tab-krxsY7Pp.js +10 -0
  263. package/dist/web/dashboard/dist/assets/{docs-tab-gEBzBEEV.js → docs-tab-AautK0dL.js} +1 -1
  264. package/dist/web/dashboard/dist/assets/file-code-DVOtQrhl.js +11 -0
  265. package/dist/web/dashboard/dist/assets/{gitnexus-tab-BE2pi0xe.js → gitnexus-tab-D5xRYU3u.js} +1 -1
  266. package/dist/web/dashboard/dist/assets/{graph-section-Cwx-Bmeh.js → graph-section-D5y4S3T1.js} +1 -1
  267. package/dist/web/dashboard/dist/assets/{graph-tab-BcS75lY0.js → graph-tab-tmjyMc4q.js} +1 -1
  268. package/dist/web/dashboard/dist/assets/{graph-utils-OY_fOvB3.js → graph-utils-BlwoHdjR.js} +1 -1
  269. package/dist/web/dashboard/dist/assets/index-BcMjWikL.css +1 -0
  270. package/dist/web/dashboard/dist/assets/{index-4X4gmCkA.js → index-C13O-yj1.js} +1 -1
  271. package/dist/web/dashboard/dist/assets/{index-1aGs8JPI.js → index-CAOXRHQq.js} +1 -1
  272. package/dist/web/dashboard/dist/assets/{index-C3Kad9YO.js → index-DrvFzUJS.js} +24 -19
  273. package/dist/web/dashboard/dist/assets/{insights-tab-CP2uIpid.js → insights-tab-9sq9NfBt.js} +1 -1
  274. package/dist/web/dashboard/dist/assets/{journey-tab-ChwNK_8S.js → journey-tab-ujeAoAsS.js} +1 -1
  275. package/dist/web/dashboard/dist/assets/{languages-tab-DnBvSh4N.js → languages-tab-DT-46f7p.js} +24 -39
  276. package/dist/web/dashboard/dist/assets/{loader-circle-Bxe_TLXv.js → loader-circle-DQz_g7p_.js} +1 -1
  277. package/dist/web/dashboard/dist/assets/{logs-tab-BH86QvKe.js → logs-tab-DHj9jG6G.js} +1 -1
  278. package/dist/web/dashboard/dist/assets/{lsp-tab-DUpaQXtx.js → lsp-tab-DGIm2cTM.js} +3 -3
  279. package/dist/web/dashboard/dist/assets/{memories-tab-CkwtNv3t.js → memories-tab-DT7JcHgq.js} +1 -1
  280. package/dist/web/dashboard/dist/assets/{prd-backlog-tab-CPJanaVF.js → prd-backlog-tab-CLzQ5p_3.js} +1 -1
  281. package/dist/web/dashboard/dist/assets/{refresh-cw-DL1dUrhF.js → refresh-cw-C0EeXZ6n.js} +1 -1
  282. package/dist/web/dashboard/dist/assets/{siebel-tab-D7x34UXy.js → siebel-tab-67cdoYQ_.js} +3 -3
  283. package/dist/web/dashboard/dist/assets/{sif-parse.worker-DZrybOHz.js → sif-parse.worker-Cty_N-lP.js} +3 -3
  284. package/dist/web/dashboard/dist/assets/{skills-tab-BuqCMS29.js → skills-tab-DL8-pMo9.js} +1 -1
  285. package/dist/web/dashboard/dist/assets/{style-iy_ryTT6.js → style-DeKQIW_i.js} +1 -1
  286. package/dist/web/dashboard/dist/assets/triangle-alert-cibtv50e.js +16 -0
  287. package/dist/web/dashboard/dist/assets/upload-CZI9Zosi.js +16 -0
  288. package/dist/web/dashboard/dist/index.html +2 -2
  289. package/package.json +3 -1
  290. package/dist/web/dashboard/dist/assets/constants-Dd6A34aQ.js +0 -1
  291. package/dist/web/dashboard/dist/assets/index-BVhCKhGJ.css +0 -1
  292. package/dist/web/dashboard/dist/assets/triangle-alert-CPzksLkC.js +0 -26
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency-risk.js","sourceRoot":"","sources":["../../../src/core/analyzer/concurrency-risk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Config Coverage Analyzer — checks config schema coverage.
3
+ *
4
+ * Checks:
5
+ * - Finds config_schema nodes
6
+ * - Checks metadata.referencedBy exists and is non-empty
7
+ * - Reports orphan configs (no references) and referenced-but-undefined configs
8
+ */
9
+ import type { GraphDocument } from "../graph/graph-types.js";
10
+ export interface ConfigCoverageReport {
11
+ totalConfigs: number;
12
+ orphanConfigs: Array<{
13
+ nodeId: string;
14
+ title: string;
15
+ }>;
16
+ referencedButUndefined: string[];
17
+ coveragePercent: number;
18
+ }
19
+ export declare function analyzeConfigCoverage(doc: GraphDocument): ConfigCoverageReport;
20
+ //# sourceMappingURL=config-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-coverage.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/config-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,oBAAoB,CA8C9E"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Config Coverage Analyzer — checks config schema coverage.
3
+ *
4
+ * Checks:
5
+ * - Finds config_schema nodes
6
+ * - Checks metadata.referencedBy exists and is non-empty
7
+ * - Reports orphan configs (no references) and referenced-but-undefined configs
8
+ */
9
+ import { logger } from "../utils/logger.js";
10
+ export function analyzeConfigCoverage(doc) {
11
+ const configNodes = doc.nodes.filter((n) => n.type === "config_schema");
12
+ const configIds = new Set(configNodes.map((n) => n.id));
13
+ const orphanConfigs = [];
14
+ const allReferencedBy = new Set();
15
+ for (const node of configNodes) {
16
+ const meta = node.metadata;
17
+ const referencedBy = meta?.referencedBy ?? [];
18
+ if (referencedBy.length === 0) {
19
+ orphanConfigs.push({ nodeId: node.id, title: node.title });
20
+ }
21
+ for (const ref of referencedBy) {
22
+ allReferencedBy.add(ref);
23
+ }
24
+ }
25
+ // Find config names referenced by tasks/descriptions but not defined as config_schema nodes
26
+ const referencedButUndefined = [];
27
+ for (const ref of allReferencedBy) {
28
+ if (!configIds.has(ref)) {
29
+ referencedButUndefined.push(ref);
30
+ }
31
+ }
32
+ const referencedCount = configNodes.length - orphanConfigs.length;
33
+ const coveragePercent = configNodes.length > 0
34
+ ? Math.round((referencedCount / configNodes.length) * 100)
35
+ : 100;
36
+ logger.debug("analyzer:config-coverage", {
37
+ totalConfigs: configNodes.length,
38
+ orphans: orphanConfigs.length,
39
+ undefined: referencedButUndefined.length,
40
+ coveragePercent,
41
+ });
42
+ return {
43
+ totalConfigs: configNodes.length,
44
+ orphanConfigs,
45
+ referencedButUndefined,
46
+ coveragePercent,
47
+ };
48
+ }
49
+ //# sourceMappingURL=config-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-coverage.js","sourceRoot":"","sources":["../../../src/core/analyzer/config-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,UAAU,qBAAqB,CAAC,GAAkB;IACtD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAExD,MAAM,aAAa,GAA6C,EAAE,CAAC;IACnE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAA+C,CAAC;QAClE,MAAM,YAAY,GAAI,IAAI,EAAE,YAAyB,IAAI,EAAE,CAAC;QAE5D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,4FAA4F;IAC5F,MAAM,sBAAsB,GAAa,EAAE,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAClE,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QAC1D,CAAC,CAAC,GAAG,CAAC;IAER,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;QACvC,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,OAAO,EAAE,aAAa,CAAC,MAAM;QAC7B,SAAS,EAAE,sBAAsB,CAAC,MAAM;QACxC,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,aAAa;QACb,sBAAsB;QACtB,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Contract Coverage Analyzer — checks cross-service contract coverage.
3
+ *
4
+ * Checks:
5
+ * - Each contract node has at least one 'provides' edge (provider)
6
+ * - Each contract node has at least one 'consumes' edge (consumer)
7
+ * - Reports uncovered contracts and overall coverage percentage
8
+ */
9
+ import type { GraphDocument } from "../graph/graph-types.js";
10
+ export interface ContractCoverageReport {
11
+ contracts: Array<{
12
+ nodeId: string;
13
+ title: string;
14
+ hasProvider: boolean;
15
+ hasConsumer: boolean;
16
+ }>;
17
+ uncoveredContracts: string[];
18
+ totalContracts: number;
19
+ coveragePercent: number;
20
+ }
21
+ export declare function analyzeContractCoverage(doc: GraphDocument): ContractCoverageReport;
22
+ //# sourceMappingURL=contract-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-coverage.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/contract-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChG,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,GAAG,sBAAsB,CAiDlF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Contract Coverage Analyzer — checks cross-service contract coverage.
3
+ *
4
+ * Checks:
5
+ * - Each contract node has at least one 'provides' edge (provider)
6
+ * - Each contract node has at least one 'consumes' edge (consumer)
7
+ * - Reports uncovered contracts and overall coverage percentage
8
+ */
9
+ import { logger } from "../utils/logger.js";
10
+ export function analyzeContractCoverage(doc) {
11
+ const contractNodes = doc.nodes.filter((n) => n.type === "contract");
12
+ // Build edge lookup: edges where target is a contract
13
+ const providesTargets = new Set();
14
+ const consumesTargets = new Set();
15
+ for (const edge of doc.edges) {
16
+ if (edge.relationType === "provides") {
17
+ // "from" provides "to" — the target (to) is the contract
18
+ providesTargets.add(edge.to);
19
+ }
20
+ if (edge.relationType === "consumes") {
21
+ // "from" consumes "to" — the target (to) is the contract
22
+ consumesTargets.add(edge.to);
23
+ }
24
+ }
25
+ const contracts = [];
26
+ const uncoveredContracts = [];
27
+ for (const node of contractNodes) {
28
+ const hasProvider = providesTargets.has(node.id);
29
+ const hasConsumer = consumesTargets.has(node.id);
30
+ contracts.push({ nodeId: node.id, title: node.title, hasProvider, hasConsumer });
31
+ if (!hasProvider || !hasConsumer) {
32
+ uncoveredContracts.push(node.id);
33
+ }
34
+ }
35
+ const coveredCount = contractNodes.length - uncoveredContracts.length;
36
+ const coveragePercent = contractNodes.length > 0
37
+ ? Math.round((coveredCount / contractNodes.length) * 100)
38
+ : 100;
39
+ logger.debug("analyzer:contract-coverage", {
40
+ totalContracts: contractNodes.length,
41
+ coveragePercent,
42
+ uncovered: uncoveredContracts.length,
43
+ });
44
+ return {
45
+ contracts,
46
+ uncoveredContracts,
47
+ totalContracts: contractNodes.length,
48
+ coveragePercent,
49
+ };
50
+ }
51
+ //# sourceMappingURL=contract-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-coverage.js","sourceRoot":"","sources":["../../../src/core/analyzer/contract-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,UAAU,uBAAuB,CAAC,GAAkB;IACxD,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAErE,sDAAsD;IACtD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACrC,yDAAyD;YACzD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACrC,yDAAyD;YACzD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAwC,EAAE,CAAC;IAC1D,MAAM,kBAAkB,GAAa,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjD,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QAEjF,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;IACtE,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QACzD,CAAC,CAAC,GAAG,CAAC;IAER,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;QACzC,cAAc,EAAE,aAAa,CAAC,MAAM;QACpC,eAAe;QACf,SAAS,EAAE,kBAAkB,CAAC,MAAM;KACrC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS;QACT,kBAAkB;QAClB,cAAc,EAAE,aAAa,CAAC,MAAM;QACpC,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Data Integrity Analyzer — validates data table nodes.
3
+ *
4
+ * Checks:
5
+ * - Metadata has columns (array)
6
+ * - If rowsPreview exists, validates basic integrity:
7
+ * - Probability columns sum to approximately 1.0
8
+ * - Cost values > 0
9
+ */
10
+ import type { GraphDocument } from "../graph/graph-types.js";
11
+ export interface DataIntegrityReport {
12
+ tables: Array<{
13
+ nodeId: string;
14
+ title: string;
15
+ valid: boolean;
16
+ issues: string[];
17
+ }>;
18
+ totalTables: number;
19
+ validCount: number;
20
+ }
21
+ export declare function analyzeDataIntegrity(doc: GraphDocument): DataIntegrityReport;
22
+ //# sourceMappingURL=data-integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/data-integrity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,mBAAmB,CAkE5E"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Data Integrity Analyzer — validates data table nodes.
3
+ *
4
+ * Checks:
5
+ * - Metadata has columns (array)
6
+ * - If rowsPreview exists, validates basic integrity:
7
+ * - Probability columns sum to approximately 1.0
8
+ * - Cost values > 0
9
+ */
10
+ import { logger } from "../utils/logger.js";
11
+ function getColumns(value) {
12
+ if (!Array.isArray(value))
13
+ return [];
14
+ return value.filter((v) => typeof v === "string");
15
+ }
16
+ function getRowsPreview(value) {
17
+ if (!Array.isArray(value))
18
+ return [];
19
+ return value.filter((v) => typeof v === "object" && v !== null);
20
+ }
21
+ const PROBABILITY_EPSILON = 0.05;
22
+ export function analyzeDataIntegrity(doc) {
23
+ const tableNodes = doc.nodes.filter((n) => n.type === "data_table");
24
+ const tables = [];
25
+ let validCount = 0;
26
+ for (const node of tableNodes) {
27
+ const issues = [];
28
+ const columns = getColumns(node.metadata?.columns);
29
+ if (!node.metadata?.columns) {
30
+ issues.push("Missing 'columns' in metadata");
31
+ }
32
+ else if (columns.length === 0) {
33
+ issues.push("'columns' is empty");
34
+ }
35
+ // Validate rowsPreview if present
36
+ const rows = getRowsPreview(node.metadata?.rowsPreview);
37
+ if (rows.length > 0 && columns.length > 0) {
38
+ // Find probability columns (name contains "probability", "prob", "chance", "weight")
39
+ const probColumns = columns.filter((c) => /prob|chance|weight/i.test(c));
40
+ for (const probCol of probColumns) {
41
+ const values = rows
42
+ .map((r) => r[probCol])
43
+ .filter((v) => typeof v === "number");
44
+ if (values.length > 0) {
45
+ const sum = values.reduce((a, b) => a + b, 0);
46
+ if (Math.abs(sum - 1.0) > PROBABILITY_EPSILON) {
47
+ issues.push(`Probability column '${probCol}' sums to ${sum.toFixed(3)}, expected ~1.0`);
48
+ }
49
+ }
50
+ }
51
+ // Find cost columns (name contains "cost", "price", "value")
52
+ const costColumns = columns.filter((c) => /cost|price|value/i.test(c));
53
+ for (const costCol of costColumns) {
54
+ const values = rows
55
+ .map((r) => r[costCol])
56
+ .filter((v) => typeof v === "number");
57
+ for (const val of values) {
58
+ if (val <= 0) {
59
+ issues.push(`Cost column '${costCol}' has non-positive value: ${val}`);
60
+ break; // Report once per column
61
+ }
62
+ }
63
+ }
64
+ }
65
+ const valid = issues.length === 0;
66
+ if (valid)
67
+ validCount++;
68
+ tables.push({ nodeId: node.id, title: node.title, valid, issues });
69
+ }
70
+ logger.debug("analyzer:data-integrity", {
71
+ totalTables: tableNodes.length,
72
+ validCount,
73
+ });
74
+ return {
75
+ tables,
76
+ totalTables: tableNodes.length,
77
+ validCount,
78
+ };
79
+ }
80
+ //# sourceMappingURL=data-integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.js","sourceRoot":"","sources":["../../../src/core/analyzer/data-integrity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Economy Simulation Analyzer — simulates gold inflow vs outflow to detect
3
+ * potential inflation BEFORE implementation.
4
+ *
5
+ * Extracts economy flows from formula nodes (type "formula") and estimates
6
+ * rates from node descriptions when formulas are unavailable.
7
+ * Uses regex-based number extraction — no eval(), no new Function(), no mathjs.
8
+ */
9
+ import type { GraphDocument } from "../graph/graph-types.js";
10
+ export interface EconomySimulationParams {
11
+ playerCount: number;
12
+ avgSessionHours: number;
13
+ avgLevel: number;
14
+ }
15
+ export interface EconomyFlow {
16
+ name: string;
17
+ type: "inflow" | "outflow";
18
+ ratePerPlayerPerHour: number;
19
+ source: string;
20
+ }
21
+ export interface EconomySimulationReport {
22
+ params: EconomySimulationParams;
23
+ flows: EconomyFlow[];
24
+ totalInflowPerDay: number;
25
+ totalOutflowPerDay: number;
26
+ netFlowPerDay: number;
27
+ inflationRisk: "none" | "low" | "medium" | "high" | "critical";
28
+ inflationRatePercent: number;
29
+ suggestions: string[];
30
+ warnings: string[];
31
+ }
32
+ export declare function simulateEconomy(doc: GraphDocument, params: EconomySimulationParams): EconomySimulationReport;
33
+ //# sourceMappingURL=economy-simulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy-simulator.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/economy-simulator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,yBAAyB,CAAC;AAGxE,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC/D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,uBAAuB,GAC9B,uBAAuB,CAyGzB"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Economy Simulation Analyzer — simulates gold inflow vs outflow to detect
3
+ * potential inflation BEFORE implementation.
4
+ *
5
+ * Extracts economy flows from formula nodes (type "formula") and estimates
6
+ * rates from node descriptions when formulas are unavailable.
7
+ * Uses regex-based number extraction — no eval(), no new Function(), no mathjs.
8
+ */
9
+ import { logger } from "../utils/logger.js";
10
+ const ECONOMY_KEYWORDS = [
11
+ "gold", "currency", "cost", "price", "reward", "drop",
12
+ "income", "sink", "tax", "fee",
13
+ ];
14
+ const INFLOW_PATTERN = /\b(reward|drop|income|earn|loot|quest\s*reward)\b/;
15
+ const OUTFLOW_PATTERN = /\b(cost|price|sink|tax|fee|buy|repair|craft)\b/;
16
+ export function simulateEconomy(doc, params) {
17
+ const { playerCount, avgSessionHours, avgLevel } = params;
18
+ const flows = [];
19
+ const warnings = [];
20
+ const formulaNodes = doc.nodes.filter((n) => n.type === "formula" &&
21
+ matchesEconomyKeywords(n));
22
+ // Extract flows from formula metadata
23
+ for (const node of formulaNodes) {
24
+ const meta = node.metadata;
25
+ if (!meta)
26
+ continue;
27
+ const expression = meta.expression ?? "";
28
+ const text = buildSearchText(node);
29
+ const type = classifyFlowType(text);
30
+ const rate = extractNumericRate(expression, meta, avgLevel);
31
+ if (rate > 0) {
32
+ flows.push({
33
+ name: node.title,
34
+ type,
35
+ ratePerPlayerPerHour: rate,
36
+ source: node.id,
37
+ });
38
+ }
39
+ else {
40
+ warnings.push(`Formula "${node.title}" — could not extract numeric rate from expression: ${expression || "none"}`);
41
+ }
42
+ }
43
+ // Fallback: estimate flows from economy-related node descriptions
44
+ if (flows.length === 0) {
45
+ const economyNodes = doc.nodes.filter((n) => matchesEconomyKeywords(n));
46
+ for (const node of economyNodes) {
47
+ const text = buildSearchText(node);
48
+ const isInflow = INFLOW_PATTERN.test(text);
49
+ const isOutflow = OUTFLOW_PATTERN.test(text);
50
+ if (isInflow || isOutflow) {
51
+ const numbers = text.match(/\d[\d.]*/g);
52
+ const rate = numbers ? parseFloat(numbers[0]) : 100;
53
+ flows.push({
54
+ name: node.title,
55
+ type: isInflow ? "inflow" : "outflow",
56
+ ratePerPlayerPerHour: rate / 10,
57
+ source: "estimated",
58
+ });
59
+ }
60
+ }
61
+ if (flows.length > 0) {
62
+ warnings.push("No formula nodes found — using estimated rates from node descriptions");
63
+ }
64
+ }
65
+ // Calculate totals
66
+ const hoursPerDay = avgSessionHours;
67
+ const totalInflowPerDay = flows
68
+ .filter((f) => f.type === "inflow")
69
+ .reduce((sum, f) => sum + f.ratePerPlayerPerHour * playerCount * hoursPerDay, 0);
70
+ const totalOutflowPerDay = flows
71
+ .filter((f) => f.type === "outflow")
72
+ .reduce((sum, f) => sum + f.ratePerPlayerPerHour * playerCount * hoursPerDay, 0);
73
+ const netFlowPerDay = totalInflowPerDay - totalOutflowPerDay;
74
+ // Calculate inflation risk
75
+ const inflationRatePercent = totalOutflowPerDay > 0
76
+ ? Math.round((netFlowPerDay / totalOutflowPerDay) * 100)
77
+ : netFlowPerDay > 0
78
+ ? 100
79
+ : 0;
80
+ const inflationRisk = classifyInflationRisk(inflationRatePercent);
81
+ // Generate suggestions
82
+ const suggestions = buildSuggestions(inflationRisk, inflationRatePercent, flows);
83
+ logger.info("economy-simulator", {
84
+ inflow: Math.round(totalInflowPerDay),
85
+ outflow: Math.round(totalOutflowPerDay),
86
+ net: Math.round(netFlowPerDay),
87
+ risk: inflationRisk,
88
+ });
89
+ return {
90
+ params,
91
+ flows,
92
+ totalInflowPerDay: Math.round(totalInflowPerDay),
93
+ totalOutflowPerDay: Math.round(totalOutflowPerDay),
94
+ netFlowPerDay: Math.round(netFlowPerDay),
95
+ inflationRisk,
96
+ inflationRatePercent,
97
+ suggestions,
98
+ warnings,
99
+ };
100
+ }
101
+ function matchesEconomyKeywords(node) {
102
+ const text = buildSearchText(node);
103
+ return ECONOMY_KEYWORDS.some((kw) => text.includes(kw));
104
+ }
105
+ function buildSearchText(node) {
106
+ return (node.title + " " + (node.description ?? "")).toLowerCase();
107
+ }
108
+ function classifyFlowType(text) {
109
+ const isInflow = INFLOW_PATTERN.test(text);
110
+ const isOutflow = OUTFLOW_PATTERN.test(text);
111
+ if (isOutflow && !isInflow)
112
+ return "outflow";
113
+ return "inflow";
114
+ }
115
+ /**
116
+ * Extract a numeric rate from formula expression or metadata.
117
+ * Handles simple patterns like "100 * level", "base + modifier", etc.
118
+ * No eval() — regex-based extraction only.
119
+ */
120
+ function extractNumericRate(expression, meta, avgLevel) {
121
+ // Try metadata.rate directly
122
+ if (typeof meta.rate === "number")
123
+ return meta.rate;
124
+ // Try to find a number in the expression
125
+ const numbers = expression.match(/\d[\d.]*/g);
126
+ if (!numbers || numbers.length === 0)
127
+ return 0;
128
+ // Heuristic: take the first number, multiply by level factor if "level" is mentioned
129
+ let rate = parseFloat(numbers[0]);
130
+ if (expression.toLowerCase().includes("level")) {
131
+ rate = rate * (avgLevel / 50);
132
+ }
133
+ return rate;
134
+ }
135
+ function classifyInflationRisk(inflationRatePercent) {
136
+ if (inflationRatePercent > 20)
137
+ return "critical";
138
+ if (inflationRatePercent > 10)
139
+ return "high";
140
+ if (inflationRatePercent > 5)
141
+ return "medium";
142
+ if (inflationRatePercent > 0)
143
+ return "low";
144
+ return "none";
145
+ }
146
+ function buildSuggestions(inflationRisk, inflationRatePercent, flows) {
147
+ const suggestions = [];
148
+ if (inflationRisk === "critical" || inflationRisk === "high") {
149
+ suggestions.push(`Net gold inflow is ${inflationRatePercent}% above outflow — consider reducing drop rates or increasing sink costs`);
150
+ const topInflow = flows
151
+ .filter((f) => f.type === "inflow")
152
+ .sort((a, b) => b.ratePerPlayerPerHour - a.ratePerPlayerPerHour)[0];
153
+ if (topInflow) {
154
+ suggestions.push(`Highest inflow source: "${topInflow.name}" (${topInflow.ratePerPlayerPerHour}/player/hour) — consider reducing by ${Math.round(inflationRatePercent / 2)}%`);
155
+ }
156
+ }
157
+ if (flows.filter((f) => f.type === "outflow").length === 0 && flows.length > 0) {
158
+ suggestions.push("No gold sinks detected — add repair costs, taxes, or crafting fees");
159
+ }
160
+ return suggestions;
161
+ }
162
+ //# sourceMappingURL=economy-simulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy-simulator.js","sourceRoot":"","sources":["../../../src/core/analyzer/economy-simulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Formula Consistency Analyzer — validates formula nodes for consistency.
3
+ *
4
+ * Checks:
5
+ * - Metadata has expression, inputs, outputs
6
+ * - No conflicting output variables (multiple formulas same output)
7
+ * - All referenced inputs exist as outputs of other formulas or are declared external
8
+ */
9
+ import type { GraphDocument } from "../graph/graph-types.js";
10
+ export interface FormulaConsistencyReport {
11
+ formulas: Array<{
12
+ nodeId: string;
13
+ title: string;
14
+ valid: boolean;
15
+ issues: string[];
16
+ }>;
17
+ conflicts: Array<{
18
+ output: string;
19
+ formulaIds: string[];
20
+ }>;
21
+ totalFormulas: number;
22
+ validCount: number;
23
+ }
24
+ export declare function analyzeFormulaConsistency(doc: GraphDocument): FormulaConsistencyReport;
25
+ //# sourceMappingURL=formula-consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formula-consistency.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/formula-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrF,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,aAAa,GAAG,wBAAwB,CA4EtF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Formula Consistency Analyzer — validates formula nodes for consistency.
3
+ *
4
+ * Checks:
5
+ * - Metadata has expression, inputs, outputs
6
+ * - No conflicting output variables (multiple formulas same output)
7
+ * - All referenced inputs exist as outputs of other formulas or are declared external
8
+ */
9
+ import { logger } from "../utils/logger.js";
10
+ function getStringArray(value) {
11
+ if (!Array.isArray(value))
12
+ return [];
13
+ return value.filter((v) => typeof v === "string");
14
+ }
15
+ export function analyzeFormulaConsistency(doc) {
16
+ const formulaNodes = doc.nodes.filter((n) => n.type === "formula");
17
+ // Build output→formulaId map for conflict detection
18
+ const outputMap = new Map();
19
+ // Build set of all known outputs for input resolution
20
+ const allOutputs = new Set();
21
+ // Build set of declared external inputs
22
+ const allExternalInputs = new Set();
23
+ // First pass: collect outputs and externals
24
+ for (const node of formulaNodes) {
25
+ const outputs = getStringArray(node.metadata?.outputs);
26
+ for (const out of outputs) {
27
+ allOutputs.add(out);
28
+ const existing = outputMap.get(out) ?? [];
29
+ existing.push(node.id);
30
+ outputMap.set(out, existing);
31
+ }
32
+ const externals = getStringArray(node.metadata?.externalInputs);
33
+ for (const ext of externals) {
34
+ allExternalInputs.add(ext);
35
+ }
36
+ }
37
+ // Second pass: validate each formula
38
+ const formulas = [];
39
+ let validCount = 0;
40
+ for (const node of formulaNodes) {
41
+ const issues = [];
42
+ if (!node.metadata?.expression) {
43
+ issues.push("Missing 'expression' in metadata");
44
+ }
45
+ if (!node.metadata?.inputs) {
46
+ issues.push("Missing 'inputs' in metadata");
47
+ }
48
+ if (!node.metadata?.outputs) {
49
+ issues.push("Missing 'outputs' in metadata");
50
+ }
51
+ // Check unresolved inputs
52
+ const inputs = getStringArray(node.metadata?.inputs);
53
+ for (const input of inputs) {
54
+ if (!allOutputs.has(input) && !allExternalInputs.has(input)) {
55
+ issues.push(`Input '${input}' is not provided by any formula output or declared external`);
56
+ }
57
+ }
58
+ const valid = issues.length === 0;
59
+ if (valid)
60
+ validCount++;
61
+ formulas.push({ nodeId: node.id, title: node.title, valid, issues });
62
+ }
63
+ // Detect conflicts: multiple formulas producing same output
64
+ const conflicts = [];
65
+ for (const [output, ids] of outputMap.entries()) {
66
+ if (ids.length > 1) {
67
+ conflicts.push({ output, formulaIds: ids });
68
+ }
69
+ }
70
+ logger.debug("analyzer:formula-consistency", {
71
+ totalFormulas: formulaNodes.length,
72
+ validCount,
73
+ conflicts: conflicts.length,
74
+ });
75
+ return {
76
+ formulas,
77
+ conflicts,
78
+ totalFormulas: formulaNodes.length,
79
+ validCount,
80
+ };
81
+ }
82
+ //# sourceMappingURL=formula-consistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formula-consistency.js","sourceRoot":"","sources":["../../../src/core/analyzer/formula-consistency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Metric Coverage Analyzer — checks metric monitoring coverage for high-priority risks.
3
+ *
4
+ * Checks:
5
+ * - Finds metric nodes
6
+ * - Finds risk nodes with high priority (1-2)
7
+ * - Reports high risks without linked metrics
8
+ */
9
+ import type { GraphDocument } from "../graph/graph-types.js";
10
+ export interface MetricCoverageReport {
11
+ totalMetrics: number;
12
+ totalHighRisks: number;
13
+ coveredRisks: string[];
14
+ uncoveredRisks: Array<{
15
+ nodeId: string;
16
+ title: string;
17
+ priority: number;
18
+ }>;
19
+ coveragePercent: number;
20
+ }
21
+ export declare function analyzeMetricCoverage(doc: GraphDocument): MetricCoverageReport;
22
+ //# sourceMappingURL=metric-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-coverage.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/metric-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,oBAAoB,CA+C9E"}