@mcp-graph-workflow/mcp-graph 5.33.1 → 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/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/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/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/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/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/docs-manifest.json +12 -5
- 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/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 +4 -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-BezNQCQh.js → benchmark-tab-Aqr2Xzu5.js} +1 -1
- package/dist/web/dashboard/dist/assets/{circle-alert-DKsqBTgC.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-Cmar9i-X.js → context-tab-CbmHGGZh.js} +1 -1
- package/dist/web/dashboard/dist/assets/{davinci-tab-CkWYkDsy.js → davinci-tab-krxsY7Pp.js} +1 -1
- package/dist/web/dashboard/dist/assets/{docs-tab-CYpDJ3Rl.js → docs-tab-AautK0dL.js} +1 -1
- package/dist/web/dashboard/dist/assets/{file-code-B0t0xVTk.js → file-code-DVOtQrhl.js} +1 -1
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-COEhhMeC.js → gitnexus-tab-D5xRYU3u.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-section-CheOuwv_.js → graph-section-D5y4S3T1.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-tab-B52UV5KP.js → graph-tab-tmjyMc4q.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-D5HpaYbf.js → graph-utils-BlwoHdjR.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-DFMBuNWV.js → index-C13O-yj1.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index--SYA0Gq0.js → index-CAOXRHQq.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-DdenFaJ5.js → index-DrvFzUJS.js} +2 -2
- package/dist/web/dashboard/dist/assets/{insights-tab-sPgv-iwt.js → insights-tab-9sq9NfBt.js} +1 -1
- package/dist/web/dashboard/dist/assets/{journey-tab-CS416bwg.js → journey-tab-ujeAoAsS.js} +1 -1
- package/dist/web/dashboard/dist/assets/{languages-tab-CcB_s-Ic.js → languages-tab-DT-46f7p.js} +1 -1
- package/dist/web/dashboard/dist/assets/{loader-circle-BSNUICqd.js → loader-circle-DQz_g7p_.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-BbDXtvmz.js → logs-tab-DHj9jG6G.js} +1 -1
- package/dist/web/dashboard/dist/assets/{lsp-tab-BrytF6mP.js → lsp-tab-DGIm2cTM.js} +1 -1
- package/dist/web/dashboard/dist/assets/{memories-tab-qCFdXJIV.js → memories-tab-DT7JcHgq.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-BiNvyICT.js → prd-backlog-tab-CLzQ5p_3.js} +1 -1
- package/dist/web/dashboard/dist/assets/{refresh-cw-CqVWFFCW.js → refresh-cw-C0EeXZ6n.js} +1 -1
- package/dist/web/dashboard/dist/assets/{siebel-tab-DFNHIBbS.js → siebel-tab-67cdoYQ_.js} +3 -3
- package/dist/web/dashboard/dist/assets/{skills-tab-DlInZCyj.js → skills-tab-DL8-pMo9.js} +1 -1
- package/dist/web/dashboard/dist/assets/{style-B4jQtUGE.js → style-DeKQIW_i.js} +1 -1
- package/dist/web/dashboard/dist/assets/{triangle-alert-CqXtIU3H.js → triangle-alert-cibtv50e.js} +1 -1
- package/dist/web/dashboard/dist/assets/{upload-Cb3pIYT5.js → upload-CZI9Zosi.js} +1 -1
- package/dist/web/dashboard/dist/index.html +1 -1
- package/package.json +3 -1
- package/dist/web/dashboard/dist/assets/constants-Dd6A34aQ.js +0 -1
|
@@ -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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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 { logger } from "../utils/logger.js";
|
|
10
|
+
export function analyzeMetricCoverage(doc) {
|
|
11
|
+
const metricNodes = doc.nodes.filter((n) => n.type === "metric");
|
|
12
|
+
const highRisks = doc.nodes.filter((n) => n.type === "risk" && n.priority <= 2);
|
|
13
|
+
// Build set of risk IDs that have at least one edge to/from a metric
|
|
14
|
+
const metricIds = new Set(metricNodes.map((n) => n.id));
|
|
15
|
+
const risksWithMetrics = new Set();
|
|
16
|
+
for (const edge of doc.edges) {
|
|
17
|
+
// Check if edge connects a risk to a metric (either direction)
|
|
18
|
+
if (metricIds.has(edge.to) && highRisks.some((r) => r.id === edge.from)) {
|
|
19
|
+
risksWithMetrics.add(edge.from);
|
|
20
|
+
}
|
|
21
|
+
if (metricIds.has(edge.from) && highRisks.some((r) => r.id === edge.to)) {
|
|
22
|
+
risksWithMetrics.add(edge.to);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const coveredRisks = [];
|
|
26
|
+
const uncoveredRisks = [];
|
|
27
|
+
for (const risk of highRisks) {
|
|
28
|
+
if (risksWithMetrics.has(risk.id)) {
|
|
29
|
+
coveredRisks.push(risk.id);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
uncoveredRisks.push({ nodeId: risk.id, title: risk.title, priority: risk.priority });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const coveragePercent = highRisks.length > 0
|
|
36
|
+
? Math.round((coveredRisks.length / highRisks.length) * 100)
|
|
37
|
+
: 100;
|
|
38
|
+
logger.debug("analyzer:metric-coverage", {
|
|
39
|
+
totalMetrics: metricNodes.length,
|
|
40
|
+
totalHighRisks: highRisks.length,
|
|
41
|
+
covered: coveredRisks.length,
|
|
42
|
+
coveragePercent,
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
totalMetrics: metricNodes.length,
|
|
46
|
+
totalHighRisks: highRisks.length,
|
|
47
|
+
coveredRisks,
|
|
48
|
+
uncoveredRisks,
|
|
49
|
+
coveragePercent,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=metric-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metric-coverage.js","sourceRoot":"","sources":["../../../src/core/analyzer/metric-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,MAAM,UAAU,qBAAqB,CAAC,GAAkB;IACtD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAEhF,qEAAqE;IACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,+DAA+D;QAC/D,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACxE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,cAAc,GAA+D,EAAE,CAAC;IAEtF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QAC5D,CAAC,CAAC,GAAG,CAAC;IAER,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;QACvC,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,cAAc,EAAE,SAAS,CAAC,MAAM;QAChC,OAAO,EAAE,YAAY,CAAC,MAAM;QAC5B,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,cAAc,EAAE,SAAS,CAAC,MAAM;QAChC,YAAY;QACZ,cAAc;QACd,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Budget Analyzer — checks performance budget node status.
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - Metadata has metricName and threshold
|
|
6
|
+
* - Status from metadata.status or default "untested"
|
|
7
|
+
*/
|
|
8
|
+
import type { GraphDocument } from "../graph/graph-types.js";
|
|
9
|
+
export type BudgetStatus = "untested" | "passing" | "failing";
|
|
10
|
+
export interface PerformanceBudgetReport {
|
|
11
|
+
budgets: Array<{
|
|
12
|
+
nodeId: string;
|
|
13
|
+
title: string;
|
|
14
|
+
metric: string;
|
|
15
|
+
threshold: string;
|
|
16
|
+
status: BudgetStatus;
|
|
17
|
+
}>;
|
|
18
|
+
totalBudgets: number;
|
|
19
|
+
untestedCount: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function analyzePerformanceBudgets(doc: GraphDocument): PerformanceBudgetReport;
|
|
22
|
+
//# sourceMappingURL=performance-budget-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-budget-check.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/performance-budget-check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IAC3G,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAOD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,aAAa,GAAG,uBAAuB,CA8BrF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Budget Analyzer — checks performance budget node status.
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - Metadata has metricName and threshold
|
|
6
|
+
* - Status from metadata.status or default "untested"
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
function toBudgetStatus(value) {
|
|
10
|
+
if (value === "passing" || value === "failing")
|
|
11
|
+
return value;
|
|
12
|
+
return "untested";
|
|
13
|
+
}
|
|
14
|
+
export function analyzePerformanceBudgets(doc) {
|
|
15
|
+
const budgetNodes = doc.nodes.filter((n) => n.type === "performance_budget");
|
|
16
|
+
const budgets = [];
|
|
17
|
+
let untestedCount = 0;
|
|
18
|
+
for (const node of budgetNodes) {
|
|
19
|
+
const metric = typeof node.metadata?.metricName === "string" ? node.metadata.metricName : "unknown";
|
|
20
|
+
const threshold = typeof node.metadata?.threshold === "string"
|
|
21
|
+
? node.metadata.threshold
|
|
22
|
+
: typeof node.metadata?.threshold === "number"
|
|
23
|
+
? String(node.metadata.threshold)
|
|
24
|
+
: "unspecified";
|
|
25
|
+
const status = toBudgetStatus(node.metadata?.status);
|
|
26
|
+
if (status === "untested")
|
|
27
|
+
untestedCount++;
|
|
28
|
+
budgets.push({ nodeId: node.id, title: node.title, metric, threshold, status });
|
|
29
|
+
}
|
|
30
|
+
logger.debug("analyzer:performance-budget", {
|
|
31
|
+
totalBudgets: budgetNodes.length,
|
|
32
|
+
untestedCount,
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
budgets,
|
|
36
|
+
totalBudgets: budgetNodes.length,
|
|
37
|
+
untestedCount,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=performance-budget-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-budget-check.js","sourceRoot":"","sources":["../../../src/core/analyzer/performance-budget-check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAkB;IAC1D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;IAE7E,MAAM,OAAO,GAAuC,EAAE,CAAC;IACvD,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACpG,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,KAAK,QAAQ;YAC5D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;YACzB,CAAC,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,KAAK,QAAQ;gBAC5C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACjC,CAAC,CAAC,aAAa,CAAC;QACpB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAErD,IAAI,MAAM,KAAK,UAAU;YAAE,aAAa,EAAE,CAAC;QAE3C,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;QAC1C,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,aAAa;KACd,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,aAAa;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-assessment.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/risk-assessment.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"risk-assessment.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/risk-assessment.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,kCAAkC,CAAC;AA4BzF,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CA+D1D"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* - Keywords in title/description drive automatic probability/impact scoring
|
|
6
6
|
* - Mitigation status: mitigated if child task is done, partial if in_progress
|
|
7
7
|
*/
|
|
8
|
+
import { assessMitigationLevel } from "../designer/tech-risk-assessor.js";
|
|
8
9
|
import { logger } from "../utils/logger.js";
|
|
9
10
|
const HIGH_PROBABILITY_KEYWORDS = ["sempre", "provável", "frequente", "common", "likely"];
|
|
10
11
|
const LOW_PROBABILITY_KEYWORDS = ["raro", "improvável", "unlikely", "rare"];
|
|
@@ -48,6 +49,14 @@ export function assessRisks(doc) {
|
|
|
48
49
|
else if (someProgress)
|
|
49
50
|
mitigationStatus = "partial";
|
|
50
51
|
}
|
|
52
|
+
// Also check edge-based mitigation (unified with tech_risk analyzer)
|
|
53
|
+
if (mitigationStatus === "unmitigated") {
|
|
54
|
+
const edgeLevel = assessMitigationLevel(doc, node);
|
|
55
|
+
if (edgeLevel === "mitigated")
|
|
56
|
+
mitigationStatus = "mitigated";
|
|
57
|
+
else if (edgeLevel === "partially_mitigated")
|
|
58
|
+
mitigationStatus = "partial";
|
|
59
|
+
}
|
|
51
60
|
const suggestedMitigation = mitigationStatus === "unmitigated"
|
|
52
61
|
? suggestMitigation(text, level)
|
|
53
62
|
: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-assessment.js","sourceRoot":"","sources":["../../../src/core/analyzer/risk-assessment.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"risk-assessment.js","sourceRoot":"","sources":["../../../src/core/analyzer/risk-assessment.ts"],"names":[],"mappings":"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"}
|