@mcp-graph-workflow/mcp-graph 5.10.0 → 5.11.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/siebel.d.ts.map +1 -1
- package/dist/api/routes/siebel.js +170 -0
- package/dist/api/routes/siebel.js.map +1 -1
- package/dist/core/rag/siebel-indexer.d.ts.map +1 -1
- package/dist/core/rag/siebel-indexer.js +57 -1
- package/dist/core/rag/siebel-indexer.js.map +1 -1
- package/dist/core/rag/wsdl-indexer.d.ts +16 -0
- package/dist/core/rag/wsdl-indexer.d.ts.map +1 -0
- package/dist/core/rag/wsdl-indexer.js +115 -0
- package/dist/core/rag/wsdl-indexer.js.map +1 -0
- package/dist/core/siebel/auto-wiring.d.ts +29 -0
- package/dist/core/siebel/auto-wiring.d.ts.map +1 -0
- package/dist/core/siebel/auto-wiring.js +211 -0
- package/dist/core/siebel/auto-wiring.js.map +1 -0
- package/dist/core/siebel/best-practices.d.ts +16 -0
- package/dist/core/siebel/best-practices.d.ts.map +1 -0
- package/dist/core/siebel/best-practices.js +92 -0
- package/dist/core/siebel/best-practices.js.map +1 -0
- package/dist/core/siebel/change-simulator.d.ts +32 -0
- package/dist/core/siebel/change-simulator.d.ts.map +1 -0
- package/dist/core/siebel/change-simulator.js +138 -0
- package/dist/core/siebel/change-simulator.js.map +1 -0
- package/dist/core/siebel/clone-adapt.d.ts +21 -0
- package/dist/core/siebel/clone-adapt.d.ts.map +1 -0
- package/dist/core/siebel/clone-adapt.js +157 -0
- package/dist/core/siebel/clone-adapt.js.map +1 -0
- package/dist/core/siebel/code-review.d.ts +36 -0
- package/dist/core/siebel/code-review.d.ts.map +1 -0
- package/dist/core/siebel/code-review.js +239 -0
- package/dist/core/siebel/code-review.js.map +1 -0
- package/dist/core/siebel/complexity-metrics.d.ts +24 -0
- package/dist/core/siebel/complexity-metrics.d.ts.map +1 -0
- package/dist/core/siebel/complexity-metrics.js +41 -0
- package/dist/core/siebel/complexity-metrics.js.map +1 -0
- package/dist/core/siebel/context-enrichment.d.ts +18 -0
- package/dist/core/siebel/context-enrichment.d.ts.map +1 -0
- package/dist/core/siebel/context-enrichment.js +91 -0
- package/dist/core/siebel/context-enrichment.js.map +1 -0
- package/dist/core/siebel/cross-project-analyzer.d.ts +30 -0
- package/dist/core/siebel/cross-project-analyzer.d.ts.map +1 -0
- package/dist/core/siebel/cross-project-analyzer.js +108 -0
- package/dist/core/siebel/cross-project-analyzer.js.map +1 -0
- package/dist/core/siebel/definition-of-ready.d.ts +25 -0
- package/dist/core/siebel/definition-of-ready.d.ts.map +1 -0
- package/dist/core/siebel/definition-of-ready.js +164 -0
- package/dist/core/siebel/definition-of-ready.js.map +1 -0
- package/dist/core/siebel/escript-crossref.d.ts +18 -0
- package/dist/core/siebel/escript-crossref.d.ts.map +1 -0
- package/dist/core/siebel/escript-crossref.js +50 -0
- package/dist/core/siebel/escript-crossref.js.map +1 -0
- package/dist/core/siebel/escript-generator.d.ts +33 -0
- package/dist/core/siebel/escript-generator.d.ts.map +1 -0
- package/dist/core/siebel/escript-generator.js +200 -0
- package/dist/core/siebel/escript-generator.js.map +1 -0
- package/dist/core/siebel/escript-patterns.d.ts +20 -0
- package/dist/core/siebel/escript-patterns.d.ts.map +1 -0
- package/dist/core/siebel/escript-patterns.js +69 -0
- package/dist/core/siebel/escript-patterns.js.map +1 -0
- package/dist/core/siebel/escript-refactor.d.ts +23 -0
- package/dist/core/siebel/escript-refactor.d.ts.map +1 -0
- package/dist/core/siebel/escript-refactor.js +270 -0
- package/dist/core/siebel/escript-refactor.js.map +1 -0
- package/dist/core/siebel/field-suggestion.d.ts +29 -0
- package/dist/core/siebel/field-suggestion.d.ts.map +1 -0
- package/dist/core/siebel/field-suggestion.js +105 -0
- package/dist/core/siebel/field-suggestion.js.map +1 -0
- package/dist/core/siebel/health-check.d.ts +21 -0
- package/dist/core/siebel/health-check.d.ts.map +1 -0
- package/dist/core/siebel/health-check.js +51 -0
- package/dist/core/siebel/health-check.js.map +1 -0
- package/dist/core/siebel/integration-test-gen.d.ts +26 -0
- package/dist/core/siebel/integration-test-gen.d.ts.map +1 -0
- package/dist/core/siebel/integration-test-gen.js +131 -0
- package/dist/core/siebel/integration-test-gen.js.map +1 -0
- package/dist/core/siebel/lov-mapper.d.ts +23 -0
- package/dist/core/siebel/lov-mapper.d.ts.map +1 -0
- package/dist/core/siebel/lov-mapper.js +42 -0
- package/dist/core/siebel/lov-mapper.js.map +1 -0
- package/dist/core/siebel/migration-package.d.ts +38 -0
- package/dist/core/siebel/migration-package.d.ts.map +1 -0
- package/dist/core/siebel/migration-package.js +276 -0
- package/dist/core/siebel/migration-package.js.map +1 -0
- package/dist/core/siebel/naming-convention-validator.d.ts +38 -0
- package/dist/core/siebel/naming-convention-validator.d.ts.map +1 -0
- package/dist/core/siebel/naming-convention-validator.js +165 -0
- package/dist/core/siebel/naming-convention-validator.js.map +1 -0
- package/dist/core/siebel/object-erd.d.ts +28 -0
- package/dist/core/siebel/object-erd.d.ts.map +1 -0
- package/dist/core/siebel/object-erd.js +82 -0
- package/dist/core/siebel/object-erd.js.map +1 -0
- package/dist/core/siebel/orphan-detector.d.ts +21 -0
- package/dist/core/siebel/orphan-detector.d.ts.map +1 -0
- package/dist/core/siebel/orphan-detector.js +64 -0
- package/dist/core/siebel/orphan-detector.js.map +1 -0
- package/dist/core/siebel/pattern-analyzer.d.ts +32 -0
- package/dist/core/siebel/pattern-analyzer.d.ts.map +1 -0
- package/dist/core/siebel/pattern-analyzer.js +155 -0
- package/dist/core/siebel/pattern-analyzer.js.map +1 -0
- package/dist/core/siebel/profileattr-flow.d.ts +26 -0
- package/dist/core/siebel/profileattr-flow.d.ts.map +1 -0
- package/dist/core/siebel/profileattr-flow.js +50 -0
- package/dist/core/siebel/profileattr-flow.js.map +1 -0
- package/dist/core/siebel/runtime-dep-builder.d.ts +9 -0
- package/dist/core/siebel/runtime-dep-builder.d.ts.map +1 -0
- package/dist/core/siebel/runtime-dep-builder.js +47 -0
- package/dist/core/siebel/runtime-dep-builder.js.map +1 -0
- package/dist/core/siebel/scaffold-generator.d.ts +25 -0
- package/dist/core/siebel/scaffold-generator.d.ts.map +1 -0
- package/dist/core/siebel/scaffold-generator.js +278 -0
- package/dist/core/siebel/scaffold-generator.js.map +1 -0
- package/dist/core/siebel/siebel-context-builder.d.ts +10 -0
- package/dist/core/siebel/siebel-context-builder.d.ts.map +1 -0
- package/dist/core/siebel/siebel-context-builder.js +75 -0
- package/dist/core/siebel/siebel-context-builder.js.map +1 -0
- package/dist/core/siebel/siebel-rag-booster.d.ts +19 -0
- package/dist/core/siebel/siebel-rag-booster.d.ts.map +1 -0
- package/dist/core/siebel/siebel-rag-booster.js +41 -0
- package/dist/core/siebel/siebel-rag-booster.js.map +1 -0
- package/dist/core/siebel/siebel-validators.d.ts +73 -0
- package/dist/core/siebel/siebel-validators.d.ts.map +1 -0
- package/dist/core/siebel/siebel-validators.js +269 -0
- package/dist/core/siebel/siebel-validators.js.map +1 -0
- package/dist/core/siebel/sif-batch-importer.d.ts +27 -0
- package/dist/core/siebel/sif-batch-importer.d.ts.map +1 -0
- package/dist/core/siebel/sif-batch-importer.js +68 -0
- package/dist/core/siebel/sif-batch-importer.js.map +1 -0
- package/dist/core/siebel/sif-diff.d.ts +57 -0
- package/dist/core/siebel/sif-diff.d.ts.map +1 -0
- package/dist/core/siebel/sif-diff.js +198 -0
- package/dist/core/siebel/sif-diff.js.map +1 -0
- package/dist/core/siebel/sif-parser.d.ts.map +1 -1
- package/dist/core/siebel/sif-parser.js +86 -0
- package/dist/core/siebel/sif-parser.js.map +1 -1
- package/dist/core/siebel/similarity-detector.d.ts +20 -0
- package/dist/core/siebel/similarity-detector.d.ts.map +1 -0
- package/dist/core/siebel/similarity-detector.js +83 -0
- package/dist/core/siebel/similarity-detector.js.map +1 -0
- package/dist/core/siebel/template-learner.d.ts +25 -0
- package/dist/core/siebel/template-learner.d.ts.map +1 -0
- package/dist/core/siebel/template-learner.js +129 -0
- package/dist/core/siebel/template-learner.js.map +1 -0
- package/dist/core/siebel/troubleshoot.d.ts +37 -0
- package/dist/core/siebel/troubleshoot.d.ts.map +1 -0
- package/dist/core/siebel/troubleshoot.js +249 -0
- package/dist/core/siebel/troubleshoot.js.map +1 -0
- package/dist/core/siebel/wsdl-correlation.d.ts +22 -0
- package/dist/core/siebel/wsdl-correlation.d.ts.map +1 -0
- package/dist/core/siebel/wsdl-correlation.js +64 -0
- package/dist/core/siebel/wsdl-correlation.js.map +1 -0
- package/dist/core/siebel/wsdl-parser.d.ts +57 -0
- package/dist/core/siebel/wsdl-parser.d.ts.map +1 -0
- package/dist/core/siebel/wsdl-parser.js +226 -0
- package/dist/core/siebel/wsdl-parser.js.map +1 -0
- package/dist/core/siebel/wsdl-to-sif.d.ts +22 -0
- package/dist/core/siebel/wsdl-to-sif.d.ts.map +1 -0
- package/dist/core/siebel/wsdl-to-sif.js +184 -0
- package/dist/core/siebel/wsdl-to-sif.js.map +1 -0
- package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -1
- package/dist/mcp/tools/siebel-analyze.js +89 -6
- package/dist/mcp/tools/siebel-analyze.js.map +1 -1
- package/dist/mcp/tools/siebel-composer.d.ts.map +1 -1
- package/dist/mcp/tools/siebel-composer.js +40 -3
- package/dist/mcp/tools/siebel-composer.js.map +1 -1
- package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -1
- package/dist/mcp/tools/siebel-generate-sif.js +188 -3
- package/dist/mcp/tools/siebel-generate-sif.js.map +1 -1
- package/dist/mcp/tools/siebel-search.js +1 -1
- package/dist/mcp/tools/siebel-search.js.map +1 -1
- package/dist/mcp/tools/siebel-validate.d.ts.map +1 -1
- package/dist/mcp/tools/siebel-validate.js +94 -5
- package/dist/mcp/tools/siebel-validate.js.map +1 -1
- package/dist/schemas/knowledge.schema.d.ts +4 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -1
- package/dist/schemas/knowledge.schema.js +1 -0
- package/dist/schemas/knowledge.schema.js.map +1 -1
- package/dist/schemas/siebel.schema.d.ts +42 -0
- package/dist/schemas/siebel.schema.d.ts.map +1 -1
- package/dist/schemas/siebel.schema.js +4 -0
- package/dist/schemas/siebel.schema.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Siebel Validators — security, performance, and migration readiness validation.
|
|
3
|
+
*
|
|
4
|
+
* Tasks 10.2, 10.3, 10.4 of Epic 10: Validação Avançada e Compliance.
|
|
5
|
+
*/
|
|
6
|
+
import { detectCircularDeps } from "./dependency-analyzer.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
// ============================================================
|
|
9
|
+
// 10.2 — Security Validation
|
|
10
|
+
// ============================================================
|
|
11
|
+
const SENSITIVE_FIELD_PATTERNS = [
|
|
12
|
+
/cpf/i, /cnpj/i, /credit.?card/i, /cartao/i, /ssn/i,
|
|
13
|
+
/password/i, /senha/i, /token/i, /secret/i,
|
|
14
|
+
];
|
|
15
|
+
const PERSONAL_FIELD_PATTERNS = [
|
|
16
|
+
/email/i, /phone/i, /telefone/i, /celular/i, /mobile/i,
|
|
17
|
+
/address/i, /endereco/i, /birth/i, /nascimento/i,
|
|
18
|
+
/cpf/i, /cnpj/i, /rg\b/i,
|
|
19
|
+
];
|
|
20
|
+
export function validateSecurity(objects) {
|
|
21
|
+
const sensitiveFields = [];
|
|
22
|
+
const dangerousOperations = [];
|
|
23
|
+
const visibilityIssues = [];
|
|
24
|
+
const personalFields = [];
|
|
25
|
+
for (const obj of objects) {
|
|
26
|
+
// AC1: Sensitive fields in BCs
|
|
27
|
+
if (obj.type === "business_component") {
|
|
28
|
+
for (const child of obj.children) {
|
|
29
|
+
if (child.type === "field") {
|
|
30
|
+
const col = child.properties.find((p) => p.name === "COLUMN")?.value ?? "";
|
|
31
|
+
for (const pattern of SENSITIVE_FIELD_PATTERNS) {
|
|
32
|
+
if (pattern.test(child.name) || pattern.test(col)) {
|
|
33
|
+
sensitiveFields.push({
|
|
34
|
+
bcName: obj.name,
|
|
35
|
+
fieldName: child.name,
|
|
36
|
+
columnName: col,
|
|
37
|
+
reason: `Matches sensitive pattern: ${pattern.source}`,
|
|
38
|
+
});
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// LGPD personal fields
|
|
43
|
+
for (const pattern of PERSONAL_FIELD_PATTERNS) {
|
|
44
|
+
if (pattern.test(child.name) || pattern.test(col)) {
|
|
45
|
+
personalFields.push({ bcName: obj.name, fieldName: child.name });
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// AC2: Dangerous delete operations
|
|
53
|
+
if (obj.type === "applet") {
|
|
54
|
+
for (const child of obj.children) {
|
|
55
|
+
const method = child.properties.find((p) => p.name === "METHOD_INVOKED")?.value;
|
|
56
|
+
if (method === "DeleteRecord") {
|
|
57
|
+
dangerousOperations.push({
|
|
58
|
+
objectName: obj.name,
|
|
59
|
+
objectType: obj.type,
|
|
60
|
+
operation: "DeleteRecord",
|
|
61
|
+
reason: "Applet exposes DeleteRecord method",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// AC3: Visibility rules
|
|
67
|
+
if (obj.type === "view" || obj.type === "applet") {
|
|
68
|
+
const hasVisibility = obj.properties.some((p) => p.name === "VISIBILITY_TYPE" || p.name === "VISIBILITY_APPLET_TYPE");
|
|
69
|
+
if (!hasVisibility) {
|
|
70
|
+
visibilityIssues.push({
|
|
71
|
+
objectName: obj.name,
|
|
72
|
+
objectType: obj.type,
|
|
73
|
+
issue: "No VISIBILITY_TYPE defined — may expose data to unauthorized users",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const hasIssues = sensitiveFields.length > 0 || dangerousOperations.length > 0 || visibilityIssues.length > 0;
|
|
79
|
+
const status = sensitiveFields.length > 0 ? "invalid" : hasIssues ? "warnings" : "valid";
|
|
80
|
+
logger.debug("validate-security", {
|
|
81
|
+
sensitiveFields: String(sensitiveFields.length),
|
|
82
|
+
dangerousOps: String(dangerousOperations.length),
|
|
83
|
+
visibilityIssues: String(visibilityIssues.length),
|
|
84
|
+
personalFields: String(personalFields.length),
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
status,
|
|
88
|
+
sensitiveFields,
|
|
89
|
+
dangerousOperations,
|
|
90
|
+
visibilityIssues,
|
|
91
|
+
lgpdReport: {
|
|
92
|
+
personalFieldsExposed: personalFields.length,
|
|
93
|
+
fields: personalFields,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const INFINITE_LOOP_PATTERNS = [
|
|
98
|
+
/while\s*\(\s*true\s*\)/i,
|
|
99
|
+
/while\s*\(\s*1\s*\)/i,
|
|
100
|
+
/for\s*\(\s*;\s*;\s*\)/i,
|
|
101
|
+
];
|
|
102
|
+
export function validatePerformance(objects) {
|
|
103
|
+
const issues = [];
|
|
104
|
+
for (const obj of objects) {
|
|
105
|
+
// AC1: Excessive fields in BCs
|
|
106
|
+
if (obj.type === "business_component") {
|
|
107
|
+
const fieldCount = obj.children.filter((c) => c.type === "field").length;
|
|
108
|
+
if (fieldCount > 100) {
|
|
109
|
+
issues.push({
|
|
110
|
+
objectName: obj.name, objectType: obj.type,
|
|
111
|
+
rule: "excessive_fields", severity: "error",
|
|
112
|
+
detail: `BC has ${fieldCount} fields (>100 limit)`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else if (fieldCount > 50) {
|
|
116
|
+
issues.push({
|
|
117
|
+
objectName: obj.name, objectType: obj.type,
|
|
118
|
+
rule: "excessive_fields", severity: "warning",
|
|
119
|
+
detail: `BC has ${fieldCount} fields (>50 threshold)`,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// AC2: Missing search/sort spec
|
|
123
|
+
const hasSearchSpec = obj.properties.some((p) => p.name === "SEARCH_SPEC");
|
|
124
|
+
const hasSortSpec = obj.properties.some((p) => p.name === "SORT_SPEC");
|
|
125
|
+
if (!hasSearchSpec && !hasSortSpec) {
|
|
126
|
+
issues.push({
|
|
127
|
+
objectName: obj.name, objectType: obj.type,
|
|
128
|
+
rule: "missing_search_spec", severity: "warning",
|
|
129
|
+
detail: "BC has no SEARCH_SPEC or SORT_SPEC — may cause full table scans",
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// AC3: Views with too many applets
|
|
134
|
+
if (obj.type === "view") {
|
|
135
|
+
const appletCount = obj.children.filter((c) => c.type === "applet").length;
|
|
136
|
+
if (appletCount > 5) {
|
|
137
|
+
issues.push({
|
|
138
|
+
objectName: obj.name, objectType: obj.type,
|
|
139
|
+
rule: "excessive_applets", severity: "warning",
|
|
140
|
+
detail: `View has ${appletCount} applets (>5 threshold)`,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// AC4: Links without constraints (check link children)
|
|
145
|
+
if (obj.type === "link") {
|
|
146
|
+
const hasConstraint = obj.properties.some((p) => p.name === "SOURCE_FIELD" || p.name === "DESTINATION_FIELD");
|
|
147
|
+
if (!hasConstraint) {
|
|
148
|
+
issues.push({
|
|
149
|
+
objectName: obj.name, objectType: obj.type,
|
|
150
|
+
rule: "unconstrained_link", severity: "warning",
|
|
151
|
+
detail: "Link has no relationship constraints",
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// AC5: Infinite loop detection in scripts
|
|
156
|
+
if (obj.type === "escript") {
|
|
157
|
+
const script = obj.properties.find((p) => p.name === "SCRIPT")?.value ?? "";
|
|
158
|
+
for (const pattern of INFINITE_LOOP_PATTERNS) {
|
|
159
|
+
if (pattern.test(script)) {
|
|
160
|
+
issues.push({
|
|
161
|
+
objectName: obj.name, objectType: obj.type,
|
|
162
|
+
rule: "potential_infinite_loop", severity: "error",
|
|
163
|
+
detail: `Script contains potential infinite loop pattern: ${pattern.source}`,
|
|
164
|
+
});
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const hasErrors = issues.some((i) => i.severity === "error");
|
|
171
|
+
const status = hasErrors ? "invalid" : issues.length > 0 ? "warnings" : "valid";
|
|
172
|
+
logger.debug("validate-performance", { issueCount: String(issues.length), status });
|
|
173
|
+
return { status, issues };
|
|
174
|
+
}
|
|
175
|
+
const HARDCODED_PATTERNS = [
|
|
176
|
+
/https?:\/\/[a-zA-Z0-9.-]+\.(com|net|org|io|internal|local)/i,
|
|
177
|
+
/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, // IP addresses
|
|
178
|
+
/jdbc:[a-zA-Z]+:\/\//i,
|
|
179
|
+
/server\s*=\s*["'][^"']+["']/i,
|
|
180
|
+
/host\s*=\s*["'][^"']+["']/i,
|
|
181
|
+
];
|
|
182
|
+
export function validateMigrationReadiness(objects, dependencies) {
|
|
183
|
+
// AC1: Check unresolved dependencies
|
|
184
|
+
const objectIndex = new Set(objects.map((o) => `${o.type}::${o.name}`));
|
|
185
|
+
const unresolvedDeps = [];
|
|
186
|
+
for (const dep of dependencies) {
|
|
187
|
+
const toKey = `${dep.to.type}::${dep.to.name}`;
|
|
188
|
+
if (!objectIndex.has(toKey)) {
|
|
189
|
+
unresolvedDeps.push({ from: dep.from.name, to: dep.to.name, toType: dep.to.type });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// AC2: Circular dependencies
|
|
193
|
+
const cycles = detectCircularDeps([...dependencies]);
|
|
194
|
+
const hasCycles = cycles.length > 0;
|
|
195
|
+
// AC3: Best practices — delegated to existing validateBestPractices in siebel-validate.ts
|
|
196
|
+
// We check basic structural validity here
|
|
197
|
+
const bestPracticeIssues = [];
|
|
198
|
+
for (const obj of objects) {
|
|
199
|
+
if (obj.type === "business_component" && !obj.properties.some((p) => p.name === "TABLE")) {
|
|
200
|
+
bestPracticeIssues.push(`BC "${obj.name}" missing TABLE`);
|
|
201
|
+
}
|
|
202
|
+
if (obj.type === "applet" && !obj.properties.some((p) => p.name === "BUS_COMP")) {
|
|
203
|
+
bestPracticeIssues.push(`Applet "${obj.name}" missing BUS_COMP`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// AC4: Hardcoded environment values
|
|
207
|
+
const hardcodedValues = [];
|
|
208
|
+
for (const obj of objects) {
|
|
209
|
+
for (const prop of obj.properties) {
|
|
210
|
+
if (prop.name === "SCRIPT" || prop.name === "VALUE") {
|
|
211
|
+
for (const pattern of HARDCODED_PATTERNS) {
|
|
212
|
+
const match = prop.value.match(pattern);
|
|
213
|
+
if (match) {
|
|
214
|
+
hardcodedValues.push({
|
|
215
|
+
objectName: obj.name,
|
|
216
|
+
pattern: pattern.source,
|
|
217
|
+
snippet: match[0].slice(0, 80),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// AC5: Build checklist
|
|
225
|
+
const checklist = [
|
|
226
|
+
{
|
|
227
|
+
check: "dependencies_resolved",
|
|
228
|
+
status: unresolvedDeps.length === 0 ? "green" : "red",
|
|
229
|
+
detail: unresolvedDeps.length === 0
|
|
230
|
+
? "All dependencies resolved"
|
|
231
|
+
: `${unresolvedDeps.length} unresolved dependencies`,
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
check: "no_circular_deps",
|
|
235
|
+
status: hasCycles ? "red" : "green",
|
|
236
|
+
detail: hasCycles ? `${cycles.length} circular dependencies found` : "No circular dependencies",
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
check: "best_practices",
|
|
240
|
+
status: bestPracticeIssues.length === 0 ? "green" : "yellow",
|
|
241
|
+
detail: bestPracticeIssues.length === 0
|
|
242
|
+
? "All objects pass best practice checks"
|
|
243
|
+
: `${bestPracticeIssues.length} best practice issues`,
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
check: "no_hardcoded_values",
|
|
247
|
+
status: hardcodedValues.length === 0 ? "green" : "yellow",
|
|
248
|
+
detail: hardcodedValues.length === 0
|
|
249
|
+
? "No hardcoded environment values detected"
|
|
250
|
+
: `${hardcodedValues.length} hardcoded values found in scripts`,
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
check: "object_count",
|
|
254
|
+
status: objects.length > 0 ? "green" : "yellow",
|
|
255
|
+
detail: `${objects.length} objects ready for migration`,
|
|
256
|
+
},
|
|
257
|
+
];
|
|
258
|
+
const hasRed = checklist.some((c) => c.status === "red");
|
|
259
|
+
const hasYellow = checklist.some((c) => c.status === "yellow");
|
|
260
|
+
const status = hasRed ? "invalid" : hasYellow ? "warnings" : "valid";
|
|
261
|
+
logger.debug("validate-migration-readiness", {
|
|
262
|
+
unresolvedDeps: String(unresolvedDeps.length),
|
|
263
|
+
hasCycles: String(hasCycles),
|
|
264
|
+
hardcodedValues: String(hardcodedValues.length),
|
|
265
|
+
status,
|
|
266
|
+
});
|
|
267
|
+
return { status, unresolvedDeps, hasCycles, hardcodedValues, checklist };
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=siebel-validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"siebel-validators.js","sourceRoot":"","sources":["../../../src/core/siebel/siebel-validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch SIF Importer — imports multiple SIF files from a directory with concurrency control.
|
|
3
|
+
*/
|
|
4
|
+
import type { SiebelSifParseResult } from "../../schemas/siebel.schema.js";
|
|
5
|
+
export interface BatchImportOptions {
|
|
6
|
+
concurrency?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface BatchImportError {
|
|
9
|
+
file: string;
|
|
10
|
+
error: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BatchImportResult {
|
|
13
|
+
totalFiles: number;
|
|
14
|
+
successCount: number;
|
|
15
|
+
errorCount: number;
|
|
16
|
+
totalObjects: number;
|
|
17
|
+
totalDependencies: number;
|
|
18
|
+
objectsByType: Record<string, number>;
|
|
19
|
+
errors: BatchImportError[];
|
|
20
|
+
results: SiebelSifParseResult[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Import all .sif files from a directory with concurrency control.
|
|
24
|
+
* Non-SIF files are skipped. Errors are collected per-file without failing the batch.
|
|
25
|
+
*/
|
|
26
|
+
export declare function batchImportSifs(dirPath: string, options?: BatchImportOptions): Promise<BatchImportResult>;
|
|
27
|
+
//# sourceMappingURL=sif-batch-importer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sif-batch-importer.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/sif-batch-importer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,gCAAgC,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CA6D5B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch SIF Importer — imports multiple SIF files from a directory with concurrency control.
|
|
3
|
+
*/
|
|
4
|
+
import { readdir } from "node:fs/promises";
|
|
5
|
+
import { join, extname } from "node:path";
|
|
6
|
+
import { parseSifFile } from "./sif-parser.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
/**
|
|
9
|
+
* Import all .sif files from a directory with concurrency control.
|
|
10
|
+
* Non-SIF files are skipped. Errors are collected per-file without failing the batch.
|
|
11
|
+
*/
|
|
12
|
+
export async function batchImportSifs(dirPath, options) {
|
|
13
|
+
const concurrency = options?.concurrency ?? 5;
|
|
14
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
15
|
+
const sifFiles = entries
|
|
16
|
+
.filter((e) => e.isFile() && extname(e.name).toLowerCase() === ".sif")
|
|
17
|
+
.map((e) => e.name);
|
|
18
|
+
const results = [];
|
|
19
|
+
const errors = [];
|
|
20
|
+
const objectsByType = {};
|
|
21
|
+
let totalObjects = 0;
|
|
22
|
+
let totalDependencies = 0;
|
|
23
|
+
// Process in batches respecting concurrency limit
|
|
24
|
+
for (let i = 0; i < sifFiles.length; i += concurrency) {
|
|
25
|
+
const batch = sifFiles.slice(i, i + concurrency);
|
|
26
|
+
const batchPromises = batch.map(async (fileName) => {
|
|
27
|
+
const filePath = join(dirPath, fileName);
|
|
28
|
+
try {
|
|
29
|
+
const parseResult = await parseSifFile(filePath);
|
|
30
|
+
return { fileName, parseResult, error: null };
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
return { fileName, parseResult: null, error: err instanceof Error ? err.message : String(err) };
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const batchResults = await Promise.all(batchPromises);
|
|
37
|
+
for (const item of batchResults) {
|
|
38
|
+
if (item.parseResult) {
|
|
39
|
+
results.push(item.parseResult);
|
|
40
|
+
totalObjects += item.parseResult.objects.length;
|
|
41
|
+
totalDependencies += item.parseResult.dependencies.length;
|
|
42
|
+
for (const obj of item.parseResult.objects) {
|
|
43
|
+
objectsByType[obj.type] = (objectsByType[obj.type] ?? 0) + 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
errors.push({ file: item.fileName, error: item.error ?? "Unknown error" });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
logger.info("Batch SIF import complete", {
|
|
52
|
+
totalFiles: String(sifFiles.length),
|
|
53
|
+
success: String(results.length),
|
|
54
|
+
errors: String(errors.length),
|
|
55
|
+
totalObjects: String(totalObjects),
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
totalFiles: sifFiles.length,
|
|
59
|
+
successCount: results.length,
|
|
60
|
+
errorCount: errors.length,
|
|
61
|
+
totalObjects,
|
|
62
|
+
totalDependencies,
|
|
63
|
+
objectsByType,
|
|
64
|
+
errors,
|
|
65
|
+
results,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=sif-batch-importer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sif-batch-importer.js","sourceRoot":"","sources":["../../../src/core/siebel/sif-batch-importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIF Diff — structural diff between two sets of Siebel objects.
|
|
3
|
+
*
|
|
4
|
+
* Compares objects by name+type, then diffs their properties and children.
|
|
5
|
+
* Produces both structured JSON and Markdown output.
|
|
6
|
+
*/
|
|
7
|
+
import type { SiebelObject, SiebelObjectType } from "../../schemas/siebel.schema.js";
|
|
8
|
+
export interface PropertyChange {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly changeType: "added" | "removed" | "modified";
|
|
11
|
+
readonly oldValue?: string;
|
|
12
|
+
readonly newValue?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ChildChanges {
|
|
15
|
+
readonly added: readonly {
|
|
16
|
+
name: string;
|
|
17
|
+
type: SiebelObjectType;
|
|
18
|
+
}[];
|
|
19
|
+
readonly removed: readonly {
|
|
20
|
+
name: string;
|
|
21
|
+
type: SiebelObjectType;
|
|
22
|
+
}[];
|
|
23
|
+
readonly modified: readonly {
|
|
24
|
+
name: string;
|
|
25
|
+
type: SiebelObjectType;
|
|
26
|
+
propertyChanges: readonly PropertyChange[];
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
export interface ObjectModification {
|
|
30
|
+
readonly objectName: string;
|
|
31
|
+
readonly objectType: SiebelObjectType;
|
|
32
|
+
readonly propertyChanges: readonly PropertyChange[];
|
|
33
|
+
readonly childChanges: ChildChanges;
|
|
34
|
+
}
|
|
35
|
+
export interface SifDiffResult {
|
|
36
|
+
readonly added: readonly {
|
|
37
|
+
name: string;
|
|
38
|
+
type: SiebelObjectType;
|
|
39
|
+
}[];
|
|
40
|
+
readonly removed: readonly {
|
|
41
|
+
name: string;
|
|
42
|
+
type: SiebelObjectType;
|
|
43
|
+
}[];
|
|
44
|
+
readonly modified: readonly ObjectModification[];
|
|
45
|
+
readonly unchanged: number;
|
|
46
|
+
readonly summary: {
|
|
47
|
+
totalBase: number;
|
|
48
|
+
totalTarget: number;
|
|
49
|
+
addedCount: number;
|
|
50
|
+
removedCount: number;
|
|
51
|
+
modifiedCount: number;
|
|
52
|
+
unchangedCount: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export declare function diffSifObjects(baseObjects: readonly SiebelObject[], targetObjects: readonly SiebelObject[]): SifDiffResult;
|
|
56
|
+
export declare function formatDiffMarkdown(diff: SifDiffResult): string;
|
|
57
|
+
//# sourceMappingURL=sif-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sif-diff.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/sif-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAKrF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAC;QAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAA;KAAE,EAAE,CAAC;CACpH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,EAAE,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AA6ED,wBAAgB,cAAc,CAC5B,WAAW,EAAE,SAAS,YAAY,EAAE,EACpC,aAAa,EAAE,SAAS,YAAY,EAAE,GACrC,aAAa,CA8Ef;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CA+D9D"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIF Diff — structural diff between two sets of Siebel objects.
|
|
3
|
+
*
|
|
4
|
+
* Compares objects by name+type, then diffs their properties and children.
|
|
5
|
+
* Produces both structured JSON and Markdown output.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
// --- Diff Logic ---
|
|
9
|
+
function objectKey(obj) {
|
|
10
|
+
return `${obj.type}::${obj.name}`;
|
|
11
|
+
}
|
|
12
|
+
function diffProperties(baseProps, targetProps) {
|
|
13
|
+
const changes = [];
|
|
14
|
+
const baseMap = new Map(baseProps.map((p) => [p.name, p.value]));
|
|
15
|
+
const targetMap = new Map(targetProps.map((p) => [p.name, p.value]));
|
|
16
|
+
// Check for modified and removed
|
|
17
|
+
for (const [name, oldValue] of baseMap) {
|
|
18
|
+
const newValue = targetMap.get(name);
|
|
19
|
+
if (newValue === undefined) {
|
|
20
|
+
changes.push({ name, changeType: "removed", oldValue });
|
|
21
|
+
}
|
|
22
|
+
else if (newValue !== oldValue) {
|
|
23
|
+
changes.push({ name, changeType: "modified", oldValue, newValue });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Check for added
|
|
27
|
+
for (const [name, newValue] of targetMap) {
|
|
28
|
+
if (!baseMap.has(name)) {
|
|
29
|
+
changes.push({ name, changeType: "added", newValue });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return changes;
|
|
33
|
+
}
|
|
34
|
+
function diffChildren(baseChildren, targetChildren) {
|
|
35
|
+
const baseIndex = new Map();
|
|
36
|
+
for (const child of baseChildren) {
|
|
37
|
+
baseIndex.set(objectKey(child), child);
|
|
38
|
+
}
|
|
39
|
+
const targetIndex = new Map();
|
|
40
|
+
for (const child of targetChildren) {
|
|
41
|
+
targetIndex.set(objectKey(child), child);
|
|
42
|
+
}
|
|
43
|
+
const added = [];
|
|
44
|
+
const removed = [];
|
|
45
|
+
const modified = [];
|
|
46
|
+
// Removed children
|
|
47
|
+
for (const [key, child] of baseIndex) {
|
|
48
|
+
if (!targetIndex.has(key)) {
|
|
49
|
+
removed.push({ name: child.name, type: child.type });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Added and modified children
|
|
53
|
+
for (const [key, child] of targetIndex) {
|
|
54
|
+
const baseChild = baseIndex.get(key);
|
|
55
|
+
if (!baseChild) {
|
|
56
|
+
added.push({ name: child.name, type: child.type });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const propChanges = diffProperties(baseChild.properties, child.properties);
|
|
60
|
+
if (propChanges.length > 0) {
|
|
61
|
+
modified.push({ name: child.name, type: child.type, propertyChanges: propChanges });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { added, removed, modified };
|
|
66
|
+
}
|
|
67
|
+
export function diffSifObjects(baseObjects, targetObjects) {
|
|
68
|
+
const baseIndex = new Map();
|
|
69
|
+
for (const obj of baseObjects) {
|
|
70
|
+
if (!obj.parentName) {
|
|
71
|
+
baseIndex.set(objectKey(obj), obj);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const targetIndex = new Map();
|
|
75
|
+
for (const obj of targetObjects) {
|
|
76
|
+
if (!obj.parentName) {
|
|
77
|
+
targetIndex.set(objectKey(obj), obj);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const added = [];
|
|
81
|
+
const removed = [];
|
|
82
|
+
const modified = [];
|
|
83
|
+
let unchanged = 0;
|
|
84
|
+
// Removed objects
|
|
85
|
+
for (const [key, obj] of baseIndex) {
|
|
86
|
+
if (!targetIndex.has(key)) {
|
|
87
|
+
removed.push({ name: obj.name, type: obj.type });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Added and modified objects
|
|
91
|
+
for (const [key, obj] of targetIndex) {
|
|
92
|
+
const baseObj = baseIndex.get(key);
|
|
93
|
+
if (!baseObj) {
|
|
94
|
+
added.push({ name: obj.name, type: obj.type });
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const propertyChanges = diffProperties(baseObj.properties, obj.properties);
|
|
98
|
+
const childChanges = diffChildren(baseObj.children, obj.children);
|
|
99
|
+
const hasChanges = propertyChanges.length > 0 ||
|
|
100
|
+
childChanges.added.length > 0 ||
|
|
101
|
+
childChanges.removed.length > 0 ||
|
|
102
|
+
childChanges.modified.length > 0;
|
|
103
|
+
if (hasChanges) {
|
|
104
|
+
modified.push({
|
|
105
|
+
objectName: obj.name,
|
|
106
|
+
objectType: obj.type,
|
|
107
|
+
propertyChanges,
|
|
108
|
+
childChanges,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
unchanged++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const result = {
|
|
117
|
+
added,
|
|
118
|
+
removed,
|
|
119
|
+
modified,
|
|
120
|
+
unchanged,
|
|
121
|
+
summary: {
|
|
122
|
+
totalBase: baseIndex.size,
|
|
123
|
+
totalTarget: targetIndex.size,
|
|
124
|
+
addedCount: added.length,
|
|
125
|
+
removedCount: removed.length,
|
|
126
|
+
modifiedCount: modified.length,
|
|
127
|
+
unchangedCount: unchanged,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
logger.debug("sif-diff", {
|
|
131
|
+
added: String(added.length),
|
|
132
|
+
removed: String(removed.length),
|
|
133
|
+
modified: String(modified.length),
|
|
134
|
+
unchanged: String(unchanged),
|
|
135
|
+
});
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
// --- Markdown Formatter ---
|
|
139
|
+
export function formatDiffMarkdown(diff) {
|
|
140
|
+
const lines = [];
|
|
141
|
+
lines.push("# SIF Diff Report");
|
|
142
|
+
lines.push("");
|
|
143
|
+
lines.push(`**Base:** ${diff.summary.totalBase} objects | **Target:** ${diff.summary.totalTarget} objects`);
|
|
144
|
+
lines.push(`**Added:** ${diff.summary.addedCount} | **Removed:** ${diff.summary.removedCount} | **Modified:** ${diff.summary.modifiedCount} | **Unchanged:** ${diff.summary.unchangedCount}`);
|
|
145
|
+
lines.push("");
|
|
146
|
+
// Added
|
|
147
|
+
if (diff.added.length > 0) {
|
|
148
|
+
lines.push("## Added Objects");
|
|
149
|
+
for (const obj of diff.added) {
|
|
150
|
+
lines.push(`- **${obj.type}**: \`${obj.name}\``);
|
|
151
|
+
}
|
|
152
|
+
lines.push("");
|
|
153
|
+
}
|
|
154
|
+
// Removed
|
|
155
|
+
if (diff.removed.length > 0) {
|
|
156
|
+
lines.push("## Removed Objects");
|
|
157
|
+
for (const obj of diff.removed) {
|
|
158
|
+
lines.push(`- **${obj.type}**: \`${obj.name}\``);
|
|
159
|
+
}
|
|
160
|
+
lines.push("");
|
|
161
|
+
}
|
|
162
|
+
// Modified
|
|
163
|
+
if (diff.modified.length > 0) {
|
|
164
|
+
lines.push("## Modified Objects");
|
|
165
|
+
for (const mod of diff.modified) {
|
|
166
|
+
lines.push(`### ${mod.objectType}: \`${mod.objectName}\``);
|
|
167
|
+
if (mod.propertyChanges.length > 0) {
|
|
168
|
+
lines.push("**Property Changes:**");
|
|
169
|
+
for (const pc of mod.propertyChanges) {
|
|
170
|
+
switch (pc.changeType) {
|
|
171
|
+
case "added":
|
|
172
|
+
lines.push(` - (+) \`${pc.name}\` = \`${pc.newValue}\``);
|
|
173
|
+
break;
|
|
174
|
+
case "removed":
|
|
175
|
+
lines.push(` - (-) \`${pc.name}\` (was \`${pc.oldValue}\`)`);
|
|
176
|
+
break;
|
|
177
|
+
case "modified":
|
|
178
|
+
lines.push(` - (~) \`${pc.name}\`: \`${pc.oldValue}\` → \`${pc.newValue}\``);
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const cc = mod.childChanges;
|
|
184
|
+
if (cc.added.length > 0 || cc.removed.length > 0 || cc.modified.length > 0) {
|
|
185
|
+
lines.push("**Child Changes:**");
|
|
186
|
+
for (const c of cc.added)
|
|
187
|
+
lines.push(` - (+) ${c.type}: \`${c.name}\``);
|
|
188
|
+
for (const c of cc.removed)
|
|
189
|
+
lines.push(` - (-) ${c.type}: \`${c.name}\``);
|
|
190
|
+
for (const c of cc.modified)
|
|
191
|
+
lines.push(` - (~) ${c.type}: \`${c.name}\` (${c.propertyChanges.length} property changes)`);
|
|
192
|
+
}
|
|
193
|
+
lines.push("");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return lines.join("\n");
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=sif-diff.js.map
|