@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.
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +2 -0
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/code-graph.d.ts.map +1 -1
- package/dist/api/routes/code-graph.js +3 -1
- package/dist/api/routes/code-graph.js.map +1 -1
- package/dist/api/routes/davinci.d.ts +3 -0
- package/dist/api/routes/davinci.d.ts.map +1 -0
- package/dist/api/routes/davinci.js +188 -0
- package/dist/api/routes/davinci.js.map +1 -0
- package/dist/core/analyzer/ac-coverage.d.ts +16 -0
- package/dist/core/analyzer/ac-coverage.d.ts.map +1 -0
- package/dist/core/analyzer/ac-coverage.js +38 -0
- package/dist/core/analyzer/ac-coverage.js.map +1 -0
- package/dist/core/analyzer/asset-blockers.d.ts +23 -0
- package/dist/core/analyzer/asset-blockers.d.ts.map +1 -0
- package/dist/core/analyzer/asset-blockers.js +50 -0
- package/dist/core/analyzer/asset-blockers.js.map +1 -0
- package/dist/core/analyzer/concurrency-risk.d.ts +26 -0
- package/dist/core/analyzer/concurrency-risk.d.ts.map +1 -0
- package/dist/core/analyzer/concurrency-risk.js +99 -0
- package/dist/core/analyzer/concurrency-risk.js.map +1 -0
- package/dist/core/analyzer/config-coverage.d.ts +20 -0
- package/dist/core/analyzer/config-coverage.d.ts.map +1 -0
- package/dist/core/analyzer/config-coverage.js +49 -0
- package/dist/core/analyzer/config-coverage.js.map +1 -0
- package/dist/core/analyzer/contract-coverage.d.ts +22 -0
- package/dist/core/analyzer/contract-coverage.d.ts.map +1 -0
- package/dist/core/analyzer/contract-coverage.js +51 -0
- package/dist/core/analyzer/contract-coverage.js.map +1 -0
- package/dist/core/analyzer/data-integrity.d.ts +22 -0
- package/dist/core/analyzer/data-integrity.d.ts.map +1 -0
- package/dist/core/analyzer/data-integrity.js +80 -0
- package/dist/core/analyzer/data-integrity.js.map +1 -0
- package/dist/core/analyzer/economy-simulator.d.ts +33 -0
- package/dist/core/analyzer/economy-simulator.d.ts.map +1 -0
- package/dist/core/analyzer/economy-simulator.js +162 -0
- package/dist/core/analyzer/economy-simulator.js.map +1 -0
- package/dist/core/analyzer/formula-consistency.d.ts +25 -0
- package/dist/core/analyzer/formula-consistency.d.ts.map +1 -0
- package/dist/core/analyzer/formula-consistency.js +82 -0
- package/dist/core/analyzer/formula-consistency.js.map +1 -0
- package/dist/core/analyzer/metric-coverage.d.ts +22 -0
- package/dist/core/analyzer/metric-coverage.d.ts.map +1 -0
- package/dist/core/analyzer/metric-coverage.js +52 -0
- package/dist/core/analyzer/metric-coverage.js.map +1 -0
- package/dist/core/analyzer/performance-budget-check.d.ts +22 -0
- package/dist/core/analyzer/performance-budget-check.d.ts.map +1 -0
- package/dist/core/analyzer/performance-budget-check.js +40 -0
- package/dist/core/analyzer/performance-budget-check.js.map +1 -0
- package/dist/core/analyzer/risk-assessment.d.ts.map +1 -1
- package/dist/core/analyzer/risk-assessment.js +9 -0
- package/dist/core/analyzer/risk-assessment.js.map +1 -1
- package/dist/core/analyzer/scenario-coverage.d.ts +19 -0
- package/dist/core/analyzer/scenario-coverage.d.ts.map +1 -0
- package/dist/core/analyzer/scenario-coverage.js +59 -0
- package/dist/core/analyzer/scenario-coverage.js.map +1 -0
- package/dist/core/analyzer/state-completeness.d.ts +22 -0
- package/dist/core/analyzer/state-completeness.d.ts.map +1 -0
- package/dist/core/analyzer/state-completeness.js +76 -0
- package/dist/core/analyzer/state-completeness.js.map +1 -0
- package/dist/core/code/code-indexer.d.ts +1 -1
- package/dist/core/code/code-indexer.d.ts.map +1 -1
- package/dist/core/code/code-indexer.js +50 -3
- package/dist/core/code/code-indexer.js.map +1 -1
- package/dist/core/code/code-store.js +3 -3
- package/dist/core/code/code-store.js.map +1 -1
- package/dist/core/code/code-types.d.ts +4 -4
- package/dist/core/code/treesitter/treesitter-manager.d.ts.map +1 -1
- package/dist/core/code/treesitter/treesitter-manager.js +2 -0
- package/dist/core/code/treesitter/treesitter-manager.js.map +1 -1
- package/dist/core/davinci/build-runner.d.ts +37 -0
- package/dist/core/davinci/build-runner.d.ts.map +1 -0
- package/dist/core/davinci/build-runner.js +239 -0
- package/dist/core/davinci/build-runner.js.map +1 -0
- package/dist/core/davinci/davinci-parser.d.ts +6 -0
- package/dist/core/davinci/davinci-parser.d.ts.map +1 -0
- package/dist/core/davinci/davinci-parser.js +218 -0
- package/dist/core/davinci/davinci-parser.js.map +1 -0
- package/dist/core/davinci/davinci-store.d.ts +49 -0
- package/dist/core/davinci/davinci-store.d.ts.map +1 -0
- package/dist/core/davinci/davinci-store.js +121 -0
- package/dist/core/davinci/davinci-store.js.map +1 -0
- package/dist/core/davinci/davinci-types.d.ts +241 -0
- package/dist/core/davinci/davinci-types.d.ts.map +1 -0
- package/dist/core/davinci/davinci-types.js +123 -0
- package/dist/core/davinci/davinci-types.js.map +1 -0
- package/dist/core/davinci/davinci-validators.d.ts +16 -0
- package/dist/core/davinci/davinci-validators.d.ts.map +1 -0
- package/dist/core/davinci/davinci-validators.js +86 -0
- package/dist/core/davinci/davinci-validators.js.map +1 -0
- package/dist/core/davinci/descriptor-generator.d.ts +19 -0
- package/dist/core/davinci/descriptor-generator.d.ts.map +1 -0
- package/dist/core/davinci/descriptor-generator.js +52 -0
- package/dist/core/davinci/descriptor-generator.js.map +1 -0
- package/dist/core/davinci/plugin-generator.d.ts +29 -0
- package/dist/core/davinci/plugin-generator.d.ts.map +1 -0
- package/dist/core/davinci/plugin-generator.js +86 -0
- package/dist/core/davinci/plugin-generator.js.map +1 -0
- package/dist/core/davinci/plugin-type-detector.d.ts +15 -0
- package/dist/core/davinci/plugin-type-detector.d.ts.map +1 -0
- package/dist/core/davinci/plugin-type-detector.js +114 -0
- package/dist/core/davinci/plugin-type-detector.js.map +1 -0
- package/dist/core/davinci/pom-generator.d.ts +4 -0
- package/dist/core/davinci/pom-generator.d.ts.map +1 -0
- package/dist/core/davinci/pom-generator.js +179 -0
- package/dist/core/davinci/pom-generator.js.map +1 -0
- package/dist/core/davinci/template-registry.d.ts +25 -0
- package/dist/core/davinci/template-registry.d.ts.map +1 -0
- package/dist/core/davinci/template-registry.js +280 -0
- package/dist/core/davinci/template-registry.js.map +1 -0
- package/dist/core/davinci/variable-resolver.d.ts +9 -0
- package/dist/core/davinci/variable-resolver.d.ts.map +1 -0
- package/dist/core/davinci/variable-resolver.js +62 -0
- package/dist/core/davinci/variable-resolver.js.map +1 -0
- package/dist/core/designer/adr-validator.d.ts.map +1 -1
- package/dist/core/designer/adr-validator.js +12 -4
- package/dist/core/designer/adr-validator.js.map +1 -1
- package/dist/core/designer/tech-risk-assessor.d.ts +5 -1
- package/dist/core/designer/tech-risk-assessor.d.ts.map +1 -1
- package/dist/core/designer/tech-risk-assessor.js +39 -11
- package/dist/core/designer/tech-risk-assessor.js.map +1 -1
- package/dist/core/designer/traceability-matrix.d.ts.map +1 -1
- package/dist/core/designer/traceability-matrix.js +14 -3
- package/dist/core/designer/traceability-matrix.js.map +1 -1
- package/dist/core/graph/auto-sequence.d.ts +10 -0
- package/dist/core/graph/auto-sequence.d.ts.map +1 -0
- package/dist/core/graph/auto-sequence.js +29 -0
- package/dist/core/graph/auto-sequence.js.map +1 -0
- package/dist/core/graph/csv-export.d.ts +7 -0
- package/dist/core/graph/csv-export.d.ts.map +1 -0
- package/dist/core/graph/csv-export.js +43 -0
- package/dist/core/graph/csv-export.js.map +1 -0
- package/dist/core/graph/graph-types.d.ts +2 -2
- package/dist/core/graph/graph-types.d.ts.map +1 -1
- package/dist/core/graph/mermaid-export.d.ts +1 -1
- package/dist/core/graph/mermaid-export.d.ts.map +1 -1
- package/dist/core/graph/mermaid-export.js +101 -0
- package/dist/core/graph/mermaid-export.js.map +1 -1
- package/dist/core/importer/prd-to-graph.d.ts.map +1 -1
- package/dist/core/importer/prd-to-graph.js +8 -1
- package/dist/core/importer/prd-to-graph.js.map +1 -1
- package/dist/core/listener/backlog-health.d.ts.map +1 -1
- package/dist/core/listener/backlog-health.js +15 -3
- package/dist/core/listener/backlog-health.js.map +1 -1
- package/dist/core/parser/classify.d.ts +4 -0
- package/dist/core/parser/classify.d.ts.map +1 -1
- package/dist/core/parser/classify.js +18 -0
- package/dist/core/parser/classify.js.map +1 -1
- package/dist/core/parser/extract.d.ts.map +1 -1
- package/dist/core/parser/extract.js +22 -4
- package/dist/core/parser/extract.js.map +1 -1
- package/dist/core/parser/prd-diff.d.ts +23 -0
- package/dist/core/parser/prd-diff.d.ts.map +1 -0
- package/dist/core/parser/prd-diff.js +55 -0
- package/dist/core/parser/prd-diff.js.map +1 -0
- package/dist/core/parser/read-swagger.d.ts.map +1 -1
- package/dist/core/parser/read-swagger.js +6 -0
- package/dist/core/parser/read-swagger.js.map +1 -1
- package/dist/core/parser/segment.d.ts +5 -0
- package/dist/core/parser/segment.d.ts.map +1 -1
- package/dist/core/parser/segment.js +70 -0
- package/dist/core/parser/segment.js.map +1 -1
- package/dist/core/planner/auto-ready.d.ts +19 -0
- package/dist/core/planner/auto-ready.d.ts.map +1 -0
- package/dist/core/planner/auto-ready.js +39 -0
- package/dist/core/planner/auto-ready.js.map +1 -0
- package/dist/core/planner/planning-report.d.ts +13 -1
- package/dist/core/planner/planning-report.d.ts.map +1 -1
- package/dist/core/planner/planning-report.js +53 -2
- package/dist/core/planner/planning-report.js.map +1 -1
- package/dist/core/planner/sprint-health.d.ts +22 -0
- package/dist/core/planner/sprint-health.d.ts.map +1 -0
- package/dist/core/planner/sprint-health.js +41 -0
- package/dist/core/planner/sprint-health.js.map +1 -0
- package/dist/core/siebel/sif-parser.d.ts.map +1 -1
- package/dist/core/siebel/sif-parser.js +6 -0
- package/dist/core/siebel/sif-parser.js.map +1 -1
- package/dist/core/siebel/wsdl-parser.d.ts.map +1 -1
- package/dist/core/siebel/wsdl-parser.js +6 -0
- package/dist/core/siebel/wsdl-parser.js.map +1 -1
- package/dist/core/store/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +17 -0
- package/dist/core/store/migrations.js.map +1 -1
- package/dist/core/store/sqlite-store.d.ts +6 -0
- package/dist/core/store/sqlite-store.d.ts.map +1 -1
- package/dist/core/store/sqlite-store.js +54 -3
- package/dist/core/store/sqlite-store.js.map +1 -1
- package/dist/core/templates/template-engine.d.ts +36 -0
- package/dist/core/templates/template-engine.d.ts.map +1 -0
- package/dist/core/templates/template-engine.js +104 -0
- package/dist/core/templates/template-engine.js.map +1 -0
- package/dist/core/translation/generators/universal-generator.d.ts.map +1 -1
- package/dist/core/translation/generators/universal-generator.js +187 -9
- package/dist/core/translation/generators/universal-generator.js.map +1 -1
- package/dist/core/translation/language-detect.d.ts.map +1 -1
- package/dist/core/translation/language-detect.js +37 -14
- package/dist/core/translation/language-detect.js.map +1 -1
- package/dist/docs-manifest.json +68 -5
- package/dist/mcp/app-factory.js +1 -1
- package/dist/mcp/app-factory.js.map +1 -1
- package/dist/mcp/tools/analyze.d.ts.map +1 -1
- package/dist/mcp/tools/analyze.js +100 -1
- package/dist/mcp/tools/analyze.js.map +1 -1
- package/dist/mcp/tools/davinci-analyze.d.ts +4 -0
- package/dist/mcp/tools/davinci-analyze.d.ts.map +1 -0
- package/dist/mcp/tools/davinci-analyze.js +31 -0
- package/dist/mcp/tools/davinci-analyze.js.map +1 -0
- package/dist/mcp/tools/davinci-build.d.ts +4 -0
- package/dist/mcp/tools/davinci-build.d.ts.map +1 -0
- package/dist/mcp/tools/davinci-build.js +43 -0
- package/dist/mcp/tools/davinci-build.js.map +1 -0
- package/dist/mcp/tools/davinci-convert.d.ts +4 -0
- package/dist/mcp/tools/davinci-convert.d.ts.map +1 -0
- package/dist/mcp/tools/davinci-convert.js +61 -0
- package/dist/mcp/tools/davinci-convert.js.map +1 -0
- package/dist/mcp/tools/edge.d.ts.map +1 -1
- package/dist/mcp/tools/edge.js +81 -3
- package/dist/mcp/tools/edge.js.map +1 -1
- package/dist/mcp/tools/export.d.ts.map +1 -1
- package/dist/mcp/tools/export.js +17 -4
- package/dist/mcp/tools/export.js.map +1 -1
- package/dist/mcp/tools/import-prd.d.ts.map +1 -1
- package/dist/mcp/tools/import-prd.js +89 -2
- package/dist/mcp/tools/import-prd.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +12 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/node.d.ts.map +1 -1
- package/dist/mcp/tools/node.js +127 -6
- package/dist/mcp/tools/node.js.map +1 -1
- package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
- package/dist/mcp/tools/plan-sprint.js +6 -2
- package/dist/mcp/tools/plan-sprint.js.map +1 -1
- package/dist/mcp/tools/show.d.ts.map +1 -1
- package/dist/mcp/tools/show.js +11 -4
- package/dist/mcp/tools/show.js.map +1 -1
- package/dist/mcp/tools/template.d.ts +4 -0
- package/dist/mcp/tools/template.d.ts.map +1 -0
- package/dist/mcp/tools/template.js +137 -0
- package/dist/mcp/tools/template.js.map +1 -0
- package/dist/schemas/analyzer-schema.d.ts +2 -2
- package/dist/schemas/designer-schema.d.ts +21 -0
- package/dist/schemas/designer-schema.d.ts.map +1 -1
- package/dist/schemas/designer-schema.js +2 -0
- package/dist/schemas/designer-schema.js.map +1 -1
- package/dist/schemas/edge.schema.d.ts +6 -0
- package/dist/schemas/edge.schema.d.ts.map +1 -1
- package/dist/schemas/edge.schema.js +2 -0
- package/dist/schemas/edge.schema.js.map +1 -1
- package/dist/schemas/graph.schema.d.ts +13 -0
- package/dist/schemas/graph.schema.d.ts.map +1 -1
- package/dist/schemas/node.schema.d.ts +20 -0
- package/dist/schemas/node.schema.d.ts.map +1 -1
- package/dist/schemas/node.schema.js +3 -0
- package/dist/schemas/node.schema.js.map +1 -1
- package/dist/schemas/siebel.schema.d.ts +13 -13
- package/dist/web/dashboard/dist/assets/{benchmark-tab-en-UkR66.js → benchmark-tab-Aqr2Xzu5.js} +1 -1
- package/dist/web/dashboard/dist/assets/{circle-alert-5GIBBP3L.js → circle-alert-BJTyaShp.js} +1 -1
- package/dist/web/dashboard/dist/assets/constants-DLyESMjx.js +1 -0
- package/dist/web/dashboard/dist/assets/{context-tab-DjfwQik8.js → context-tab-CbmHGGZh.js} +1 -1
- package/dist/web/dashboard/dist/assets/davinci-tab-krxsY7Pp.js +10 -0
- package/dist/web/dashboard/dist/assets/{docs-tab-gEBzBEEV.js → docs-tab-AautK0dL.js} +1 -1
- package/dist/web/dashboard/dist/assets/file-code-DVOtQrhl.js +11 -0
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-BE2pi0xe.js → gitnexus-tab-D5xRYU3u.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-section-Cwx-Bmeh.js → graph-section-D5y4S3T1.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-tab-BcS75lY0.js → graph-tab-tmjyMc4q.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-OY_fOvB3.js → graph-utils-BlwoHdjR.js} +1 -1
- package/dist/web/dashboard/dist/assets/index-BcMjWikL.css +1 -0
- package/dist/web/dashboard/dist/assets/{index-4X4gmCkA.js → index-C13O-yj1.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-1aGs8JPI.js → index-CAOXRHQq.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-C3Kad9YO.js → index-DrvFzUJS.js} +24 -19
- package/dist/web/dashboard/dist/assets/{insights-tab-CP2uIpid.js → insights-tab-9sq9NfBt.js} +1 -1
- package/dist/web/dashboard/dist/assets/{journey-tab-ChwNK_8S.js → journey-tab-ujeAoAsS.js} +1 -1
- package/dist/web/dashboard/dist/assets/{languages-tab-DnBvSh4N.js → languages-tab-DT-46f7p.js} +24 -39
- package/dist/web/dashboard/dist/assets/{loader-circle-Bxe_TLXv.js → loader-circle-DQz_g7p_.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-BH86QvKe.js → logs-tab-DHj9jG6G.js} +1 -1
- package/dist/web/dashboard/dist/assets/{lsp-tab-DUpaQXtx.js → lsp-tab-DGIm2cTM.js} +3 -3
- package/dist/web/dashboard/dist/assets/{memories-tab-CkwtNv3t.js → memories-tab-DT7JcHgq.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-CPJanaVF.js → prd-backlog-tab-CLzQ5p_3.js} +1 -1
- package/dist/web/dashboard/dist/assets/{refresh-cw-DL1dUrhF.js → refresh-cw-C0EeXZ6n.js} +1 -1
- package/dist/web/dashboard/dist/assets/{siebel-tab-D7x34UXy.js → siebel-tab-67cdoYQ_.js} +3 -3
- package/dist/web/dashboard/dist/assets/{sif-parse.worker-DZrybOHz.js → sif-parse.worker-Cty_N-lP.js} +3 -3
- package/dist/web/dashboard/dist/assets/{skills-tab-BuqCMS29.js → skills-tab-DL8-pMo9.js} +1 -1
- package/dist/web/dashboard/dist/assets/{style-iy_ryTT6.js → style-DeKQIW_i.js} +1 -1
- package/dist/web/dashboard/dist/assets/triangle-alert-cibtv50e.js +16 -0
- package/dist/web/dashboard/dist/assets/upload-CZI9Zosi.js +16 -0
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +3 -1
- package/dist/web/dashboard/dist/assets/constants-Dd6A34aQ.js +0 -1
- package/dist/web/dashboard/dist/assets/index-BVhCKhGJ.css +0 -1
- 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":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAkB;IAC1D,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEnE,oDAAoD;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,sDAAsD;IACtD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,wCAAwC;IACxC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,4CAA4C;IAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAC1D,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,8DAA8D,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK;YAAE,UAAU,EAAE,CAAC;QAExB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,4DAA4D;IAC5D,MAAM,SAAS,GAA0C,EAAE,CAAC;IAC5D,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;QAC3C,aAAa,EAAE,YAAY,CAAC,MAAM;QAClC,UAAU;QACV,SAAS,EAAE,SAAS,CAAC,MAAM;KAC5B,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,SAAS;QACT,aAAa,EAAE,YAAY,CAAC,MAAM;QAClC,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|