@mcp-graph-workflow/mcp-graph 5.9.1 → 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 +206 -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 +6 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -1
- package/dist/schemas/knowledge.schema.js +2 -1
- 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/dist/web/dashboard/dist/assets/benchmark-tab-DE9sF83l.js +1 -0
- package/dist/web/dashboard/dist/assets/{constants-z0QkAiYv.js → constants-lq4BIQN3.js} +1 -1
- package/dist/web/dashboard/dist/assets/context-tab-BDBUYfAA.js +1 -0
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-DDw7DUED.js → gitnexus-tab-Yn1v6B3B.js} +16 -16
- package/dist/web/dashboard/dist/assets/graph-section-C6dzE7Vr.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-eIpG9sGq.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-utils-Cq350VUG.js +1 -0
- package/dist/web/dashboard/dist/assets/{index-F9dY4AG_.js → index-BjE9IIVd.js} +2 -2
- package/dist/web/dashboard/dist/assets/index-CsH_Hv51.js +208 -0
- package/dist/web/dashboard/dist/assets/index-p238Jynp.css +1 -0
- package/dist/web/dashboard/dist/assets/index-ruquw1ns.js +1 -0
- package/dist/web/dashboard/dist/assets/{insights-tab-YN7G6mjm.js → insights-tab-iSZItsRP.js} +15 -15
- package/dist/web/dashboard/dist/assets/journey-tab-GXibD334.js +1 -0
- package/dist/web/dashboard/dist/assets/logs-tab-DROI_l7-.js +2 -0
- package/dist/web/dashboard/dist/assets/memories-tab-DUMqEP5R.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-DIQ0Fmr_.js +1 -0
- package/dist/web/dashboard/dist/assets/siebel-tab-Ci5KiOA6.js +4 -0
- package/dist/web/dashboard/dist/assets/sif-parse.worker-DZrybOHz.js +4 -0
- package/dist/web/dashboard/dist/assets/skills-tab-EfuAQFRT.js +1 -0
- package/dist/web/dashboard/dist/assets/{style-Da3qWU01.js → style-DF9Y1aXX.js} +1 -1
- package/dist/web/dashboard/dist/index.html +5 -2
- package/package.json +2 -2
- package/dist/web/dashboard/dist/assets/benchmark-tab-BoMsoQjO.js +0 -1
- package/dist/web/dashboard/dist/assets/context-tab-BLT4qQ77.js +0 -1
- package/dist/web/dashboard/dist/assets/graph-tab-DG9Q6nko.js +0 -1
- package/dist/web/dashboard/dist/assets/graph-utils-BpYHKE87.js +0 -1
- package/dist/web/dashboard/dist/assets/index-Cu23WCcu.css +0 -1
- package/dist/web/dashboard/dist/assets/index-DtkPX5ZZ.js +0 -55
- package/dist/web/dashboard/dist/assets/journey-tab-BcweuR82.js +0 -1
- package/dist/web/dashboard/dist/assets/logs-tab-BjdAURdy.js +0 -2
- package/dist/web/dashboard/dist/assets/memories-tab-CQ2xM2aw.js +0 -1
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-CIeCpE1a.js +0 -1
- package/dist/web/dashboard/dist/assets/siebel-tab-bj5CT4-Z.js +0 -3
- package/dist/web/dashboard/dist/assets/skills-tab-Bgk72mKO.js +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clone & Adapt — deep clone a Siebel object and adapt it with renames, field changes, and script updates.
|
|
3
|
+
*
|
|
4
|
+
* Uses sif-diff.ts to generate a structural diff between original and cloned object.
|
|
5
|
+
*/
|
|
6
|
+
import { diffSifObjects } from "./sif-diff.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
// --- Deep clone ---
|
|
9
|
+
function deepCloneObject(obj) {
|
|
10
|
+
return {
|
|
11
|
+
name: obj.name,
|
|
12
|
+
type: obj.type,
|
|
13
|
+
project: obj.project,
|
|
14
|
+
properties: obj.properties.map((p) => ({ name: p.name, value: p.value })),
|
|
15
|
+
children: obj.children.map(deepCloneObject),
|
|
16
|
+
parentName: obj.parentName,
|
|
17
|
+
inactive: obj.inactive,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// --- Rename logic ---
|
|
21
|
+
function applyRenames(value, renames) {
|
|
22
|
+
let result = value;
|
|
23
|
+
for (const [from, to] of Object.entries(renames)) {
|
|
24
|
+
// Use global replace to catch all occurrences
|
|
25
|
+
result = replaceAll(result, from, to);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
function replaceAll(str, search, replacement) {
|
|
30
|
+
if (search.length === 0)
|
|
31
|
+
return str;
|
|
32
|
+
let result = str;
|
|
33
|
+
let idx = result.indexOf(search);
|
|
34
|
+
while (idx !== -1) {
|
|
35
|
+
result = result.slice(0, idx) + replacement + result.slice(idx + search.length);
|
|
36
|
+
idx = result.indexOf(search, idx + replacement.length);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
function renameObjectTree(obj, newName, oldName, renames) {
|
|
41
|
+
let renamesApplied = 0;
|
|
42
|
+
// Build full rename map including the object name itself
|
|
43
|
+
const fullRenames = { ...renames };
|
|
44
|
+
if (oldName !== newName) {
|
|
45
|
+
fullRenames[oldName] = newName;
|
|
46
|
+
}
|
|
47
|
+
// Rename root object
|
|
48
|
+
const renamedProperties = obj.properties.map((p) => {
|
|
49
|
+
const newValue = applyRenames(p.value, fullRenames);
|
|
50
|
+
if (newValue !== p.value)
|
|
51
|
+
renamesApplied++;
|
|
52
|
+
return { name: p.name, value: newValue };
|
|
53
|
+
});
|
|
54
|
+
// Rename children recursively
|
|
55
|
+
const renamedChildren = obj.children.map((child) => {
|
|
56
|
+
const newParentName = newName;
|
|
57
|
+
const renamedChild = renameChild(child, newParentName, fullRenames);
|
|
58
|
+
renamesApplied += renamedChild.renamesApplied;
|
|
59
|
+
return renamedChild.object;
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
object: {
|
|
63
|
+
name: newName,
|
|
64
|
+
type: obj.type,
|
|
65
|
+
project: obj.project,
|
|
66
|
+
properties: renamedProperties,
|
|
67
|
+
children: renamedChildren,
|
|
68
|
+
parentName: obj.parentName ? applyRenames(obj.parentName, fullRenames) : undefined,
|
|
69
|
+
inactive: obj.inactive,
|
|
70
|
+
},
|
|
71
|
+
renamesApplied,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function renameChild(child, newParentName, renames) {
|
|
75
|
+
let renamesApplied = 0;
|
|
76
|
+
// Rename properties (including SCRIPT content)
|
|
77
|
+
const renamedProperties = child.properties.map((p) => {
|
|
78
|
+
const newValue = applyRenames(p.value, renames);
|
|
79
|
+
if (newValue !== p.value)
|
|
80
|
+
renamesApplied++;
|
|
81
|
+
return { name: p.name, value: newValue };
|
|
82
|
+
});
|
|
83
|
+
// Rename child name if it contains old names
|
|
84
|
+
let newChildName = child.name;
|
|
85
|
+
for (const [from, to] of Object.entries(renames)) {
|
|
86
|
+
if (newChildName.includes(from)) {
|
|
87
|
+
newChildName = replaceAll(newChildName, from, to);
|
|
88
|
+
renamesApplied++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Recursive for nested children
|
|
92
|
+
const renamedChildren = child.children.map((c) => {
|
|
93
|
+
const result = renameChild(c, newChildName, renames);
|
|
94
|
+
renamesApplied += result.renamesApplied;
|
|
95
|
+
return result.object;
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
object: {
|
|
99
|
+
name: newChildName,
|
|
100
|
+
type: child.type,
|
|
101
|
+
project: child.project,
|
|
102
|
+
properties: renamedProperties,
|
|
103
|
+
children: renamedChildren,
|
|
104
|
+
parentName: newParentName,
|
|
105
|
+
inactive: child.inactive,
|
|
106
|
+
},
|
|
107
|
+
renamesApplied,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// --- Main function ---
|
|
111
|
+
export function cloneAndAdapt(request) {
|
|
112
|
+
const { source, newName, renames, addChildren, removeChildren } = request;
|
|
113
|
+
logger.info("clone-adapt", {
|
|
114
|
+
source: source.name,
|
|
115
|
+
newName,
|
|
116
|
+
renameCount: String(Object.keys(renames).length),
|
|
117
|
+
});
|
|
118
|
+
// 1. Deep clone the source
|
|
119
|
+
const cloned = deepCloneObject(source);
|
|
120
|
+
// 2. Apply renames throughout the tree
|
|
121
|
+
const renamed = renameObjectTree(cloned, newName, source.name, renames);
|
|
122
|
+
let result = renamed.object;
|
|
123
|
+
// 3. Remove specified children
|
|
124
|
+
if (removeChildren && removeChildren.length > 0) {
|
|
125
|
+
const removeSet = new Set(removeChildren);
|
|
126
|
+
result = {
|
|
127
|
+
...result,
|
|
128
|
+
children: result.children.filter((c) => !removeSet.has(c.name)),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// 4. Add new children
|
|
132
|
+
if (addChildren && addChildren.length > 0) {
|
|
133
|
+
const newChildren = addChildren.map((c) => ({
|
|
134
|
+
...deepCloneObject(c),
|
|
135
|
+
parentName: newName,
|
|
136
|
+
}));
|
|
137
|
+
result = {
|
|
138
|
+
...result,
|
|
139
|
+
children: [...result.children, ...newChildren],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// 5. Generate diff between original and clone
|
|
143
|
+
const diff = diffSifObjects([source], [result]);
|
|
144
|
+
logger.info("clone-adapt:complete", {
|
|
145
|
+
childCount: String(result.children.length),
|
|
146
|
+
renamesApplied: String(renamed.renamesApplied),
|
|
147
|
+
diffAdded: String(diff.summary.addedCount),
|
|
148
|
+
diffRemoved: String(diff.summary.removedCount),
|
|
149
|
+
diffModified: String(diff.summary.modifiedCount),
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
cloned: result,
|
|
153
|
+
diff,
|
|
154
|
+
renamesApplied: renamed.renamesApplied,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=clone-adapt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-adapt.js","sourceRoot":"","sources":["../../../src/core/siebel/clone-adapt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Review Automatizado para SIFs — reviews Siebel objects before deploy
|
|
3
|
+
* checking patterns, anti-patterns, naming, scripts, and compliance.
|
|
4
|
+
*
|
|
5
|
+
* Categories: naming, error_handling, hardcoded_values, field_reference,
|
|
6
|
+
* profile_attr, test_objects
|
|
7
|
+
*/
|
|
8
|
+
import type { SiebelObject } from "../../schemas/siebel.schema.js";
|
|
9
|
+
export type ReviewCategory = "naming" | "error_handling" | "hardcoded_values" | "field_reference" | "profile_attr" | "test_objects";
|
|
10
|
+
export interface ReviewIssue {
|
|
11
|
+
readonly category: ReviewCategory;
|
|
12
|
+
readonly severity: "error" | "warning" | "info";
|
|
13
|
+
readonly objectName: string;
|
|
14
|
+
readonly detail: string;
|
|
15
|
+
readonly suggestion: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ReviewOptions {
|
|
18
|
+
readonly prefix: string;
|
|
19
|
+
readonly allowedPrefixes?: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ScoreBreakdown {
|
|
22
|
+
readonly naming: number;
|
|
23
|
+
readonly error_handling: number;
|
|
24
|
+
readonly hardcoded_values: number;
|
|
25
|
+
readonly field_reference: number;
|
|
26
|
+
readonly profile_attr: number;
|
|
27
|
+
readonly test_objects: number;
|
|
28
|
+
}
|
|
29
|
+
export interface CodeReviewResult {
|
|
30
|
+
readonly issues: readonly ReviewIssue[];
|
|
31
|
+
readonly score: number;
|
|
32
|
+
readonly breakdown: ScoreBreakdown;
|
|
33
|
+
readonly objectCount: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function reviewSiebelCode(objects: readonly SiebelObject[], options: ReviewOptions): CodeReviewResult;
|
|
36
|
+
//# sourceMappingURL=code-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/code-review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAKnE,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAiPD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE,aAAa,GACrB,gBAAgB,CA0BlB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Review Automatizado para SIFs — reviews Siebel objects before deploy
|
|
3
|
+
* checking patterns, anti-patterns, naming, scripts, and compliance.
|
|
4
|
+
*
|
|
5
|
+
* Categories: naming, error_handling, hardcoded_values, field_reference,
|
|
6
|
+
* profile_attr, test_objects
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
// --- Helpers ---
|
|
10
|
+
function getAllScripts(objects) {
|
|
11
|
+
const scripts = [];
|
|
12
|
+
for (const obj of objects) {
|
|
13
|
+
for (const child of obj.children) {
|
|
14
|
+
if (child.type === "escript") {
|
|
15
|
+
const code = child.properties.find((p) => p.name === "SOURCE_CODE")?.value ?? "";
|
|
16
|
+
if (code.trim()) {
|
|
17
|
+
scripts.push({ parent: obj.name, name: child.name, code });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return scripts;
|
|
23
|
+
}
|
|
24
|
+
function escapeRegex(str) {
|
|
25
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
26
|
+
}
|
|
27
|
+
// --- Checks ---
|
|
28
|
+
/** AC1: Naming convention check */
|
|
29
|
+
function checkNaming(objects, opts) {
|
|
30
|
+
const issues = [];
|
|
31
|
+
const prefixes = opts.allowedPrefixes ?? [opts.prefix];
|
|
32
|
+
const checkTypes = new Set(["applet", "business_component", "business_object", "view", "screen", "business_service", "integration_object", "workflow"]);
|
|
33
|
+
for (const obj of objects) {
|
|
34
|
+
if (!checkTypes.has(obj.type))
|
|
35
|
+
continue;
|
|
36
|
+
const hasPrefix = prefixes.some((p) => obj.name.startsWith(p));
|
|
37
|
+
if (!hasPrefix) {
|
|
38
|
+
issues.push({
|
|
39
|
+
category: "naming",
|
|
40
|
+
severity: "warning",
|
|
41
|
+
objectName: obj.name,
|
|
42
|
+
detail: `Object "${obj.name}" does not start with required prefix (${prefixes.join(", ")})`,
|
|
43
|
+
suggestion: `Rename to "${prefixes[0]}${obj.name}" or use an allowed prefix`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return issues;
|
|
48
|
+
}
|
|
49
|
+
/** AC2: Error handling check */
|
|
50
|
+
function checkErrorHandling(objects) {
|
|
51
|
+
const issues = [];
|
|
52
|
+
const scripts = getAllScripts(objects);
|
|
53
|
+
for (const s of scripts) {
|
|
54
|
+
const hasFunction = /function\s+\w+/.test(s.code);
|
|
55
|
+
const hasTry = /\btry\s*\{/.test(s.code);
|
|
56
|
+
if (hasFunction && !hasTry) {
|
|
57
|
+
issues.push({
|
|
58
|
+
category: "error_handling",
|
|
59
|
+
severity: "error",
|
|
60
|
+
objectName: s.parent,
|
|
61
|
+
detail: `Script "${s.name}" has no try/catch error handling`,
|
|
62
|
+
suggestion: "Wrap function body in try/catch/finally with TheApplication().RaiseErrorText()",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return issues;
|
|
67
|
+
}
|
|
68
|
+
/** AC3: Hardcoded values */
|
|
69
|
+
function checkHardcodedValues(objects) {
|
|
70
|
+
const issues = [];
|
|
71
|
+
const scripts = getAllScripts(objects);
|
|
72
|
+
const patterns = [
|
|
73
|
+
{ name: "URL", regex: /https?:\/\/[^\s"']+/, suggestion: "Use a system preference or profile attribute for URLs" },
|
|
74
|
+
{ name: "IP address", regex: /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/, suggestion: "Use a system preference for IP addresses" },
|
|
75
|
+
{ name: "environment name", regex: /\b(?:PROD|STAGING|DEV|TEST|UAT)_\w*(?:SERVER|HOST|ENV)\w*/i, suggestion: "Use TheApplication().GetProfileAttr() for environment-specific values" },
|
|
76
|
+
];
|
|
77
|
+
for (const s of scripts) {
|
|
78
|
+
for (const p of patterns) {
|
|
79
|
+
if (p.regex.test(s.code)) {
|
|
80
|
+
issues.push({
|
|
81
|
+
category: "hardcoded_values",
|
|
82
|
+
severity: "warning",
|
|
83
|
+
objectName: s.parent,
|
|
84
|
+
detail: `Script "${s.name}" contains hardcoded ${p.name}`,
|
|
85
|
+
suggestion: p.suggestion,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return issues;
|
|
91
|
+
}
|
|
92
|
+
/** AC4: Field reference validation */
|
|
93
|
+
function checkFieldReferences(objects) {
|
|
94
|
+
const issues = [];
|
|
95
|
+
// Build field index: BC name → Set of field names
|
|
96
|
+
const bcFields = new Map();
|
|
97
|
+
for (const obj of objects) {
|
|
98
|
+
if (obj.type === "business_component") {
|
|
99
|
+
const fields = new Set(obj.children.filter((c) => c.type === "field").map((c) => c.name));
|
|
100
|
+
bcFields.set(obj.name, fields);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (bcFields.size === 0)
|
|
104
|
+
return issues;
|
|
105
|
+
const scripts = getAllScripts(objects);
|
|
106
|
+
for (const s of scripts) {
|
|
107
|
+
const getFieldPattern = /GetFieldValue\s*\(\s*"([^"]+)"\s*\)/g;
|
|
108
|
+
let match;
|
|
109
|
+
while ((match = getFieldPattern.exec(s.code)) !== null) {
|
|
110
|
+
const fieldName = match[1];
|
|
111
|
+
// Check if any known BC has this field
|
|
112
|
+
let found = false;
|
|
113
|
+
for (const fields of bcFields.values()) {
|
|
114
|
+
if (fields.has(fieldName)) {
|
|
115
|
+
found = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!found) {
|
|
120
|
+
issues.push({
|
|
121
|
+
category: "field_reference",
|
|
122
|
+
severity: "warning",
|
|
123
|
+
objectName: s.parent,
|
|
124
|
+
detail: `Script "${s.name}" references field "${fieldName}" not found in any BC`,
|
|
125
|
+
suggestion: `Verify field "${fieldName}" exists in the target BC or add it`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return issues;
|
|
131
|
+
}
|
|
132
|
+
/** AC5: ProfileAttr tracking */
|
|
133
|
+
function checkProfileAttrs(objects) {
|
|
134
|
+
const issues = [];
|
|
135
|
+
const scripts = getAllScripts(objects);
|
|
136
|
+
const setAttrs = new Set();
|
|
137
|
+
const getAttrs = new Set();
|
|
138
|
+
for (const s of scripts) {
|
|
139
|
+
const setPattern = /SetProfileAttr\s*\(\s*"([^"]+)"/g;
|
|
140
|
+
const getPattern = /GetProfileAttr\s*\(\s*"([^"]+)"/g;
|
|
141
|
+
let match;
|
|
142
|
+
while ((match = setPattern.exec(s.code)) !== null) {
|
|
143
|
+
setAttrs.add(match[1]);
|
|
144
|
+
}
|
|
145
|
+
while ((match = getPattern.exec(s.code)) !== null) {
|
|
146
|
+
getAttrs.add(match[1]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Find orphan Set (set but never consumed)
|
|
150
|
+
for (const attr of setAttrs) {
|
|
151
|
+
if (!getAttrs.has(attr)) {
|
|
152
|
+
issues.push({
|
|
153
|
+
category: "profile_attr",
|
|
154
|
+
severity: "info",
|
|
155
|
+
objectName: "global",
|
|
156
|
+
detail: `ProfileAttr "${attr}" is set but never consumed by GetProfileAttr`,
|
|
157
|
+
suggestion: `Verify "${attr}" is consumed in other scripts not included in this review, or remove the SetProfileAttr`,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return issues;
|
|
162
|
+
}
|
|
163
|
+
/** AC6: Test objects check */
|
|
164
|
+
function checkTestObjects(objects) {
|
|
165
|
+
const issues = [];
|
|
166
|
+
const testPattern = /(?:^|[\s_])(?:Test|Debug|Temp|Temporary|TODO)(?:[\s_]|$)/i;
|
|
167
|
+
for (const obj of objects) {
|
|
168
|
+
if (obj.inactive)
|
|
169
|
+
continue;
|
|
170
|
+
if (testPattern.test(obj.name)) {
|
|
171
|
+
issues.push({
|
|
172
|
+
category: "test_objects",
|
|
173
|
+
severity: "warning",
|
|
174
|
+
objectName: obj.name,
|
|
175
|
+
detail: `Object "${obj.name}" appears to be a test/debug object but is active (INACTIVE=N)`,
|
|
176
|
+
suggestion: `Set INACTIVE="Y" or remove if no longer needed`,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return issues;
|
|
181
|
+
}
|
|
182
|
+
// --- Score calculation ---
|
|
183
|
+
function calculateScore(issues, objectCount) {
|
|
184
|
+
if (objectCount === 0) {
|
|
185
|
+
return {
|
|
186
|
+
score: 100,
|
|
187
|
+
breakdown: { naming: 100, error_handling: 100, hardcoded_values: 100, field_reference: 100, profile_attr: 100, test_objects: 100 },
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const weights = {
|
|
191
|
+
naming: { weight: 20, penalty: { error: 20, warning: 10, info: 5 } },
|
|
192
|
+
error_handling: { weight: 25, penalty: { error: 25, warning: 15, info: 5 } },
|
|
193
|
+
hardcoded_values: { weight: 15, penalty: { error: 15, warning: 8, info: 3 } },
|
|
194
|
+
field_reference: { weight: 15, penalty: { error: 15, warning: 8, info: 3 } },
|
|
195
|
+
profile_attr: { weight: 10, penalty: { error: 10, warning: 5, info: 2 } },
|
|
196
|
+
test_objects: { weight: 15, penalty: { error: 15, warning: 8, info: 3 } },
|
|
197
|
+
};
|
|
198
|
+
const breakdown = {};
|
|
199
|
+
let totalScore = 0;
|
|
200
|
+
for (const [cat, config] of Object.entries(weights)) {
|
|
201
|
+
const catIssues = issues.filter((i) => i.category === cat);
|
|
202
|
+
let catDeduction = 0;
|
|
203
|
+
for (const issue of catIssues) {
|
|
204
|
+
catDeduction += config.penalty[issue.severity] ?? 0;
|
|
205
|
+
}
|
|
206
|
+
const catScore = Math.max(0, 100 - catDeduction);
|
|
207
|
+
breakdown[cat] = catScore;
|
|
208
|
+
totalScore += catScore * (config.weight / 100);
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
score: Math.round(Math.max(0, Math.min(100, totalScore))),
|
|
212
|
+
breakdown: breakdown,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// --- Main function ---
|
|
216
|
+
export function reviewSiebelCode(objects, options) {
|
|
217
|
+
logger.debug("code-review: starting review", { objectCount: objects.length, prefix: options.prefix });
|
|
218
|
+
const allIssues = [
|
|
219
|
+
...checkNaming(objects, options),
|
|
220
|
+
...checkErrorHandling(objects),
|
|
221
|
+
...checkHardcodedValues(objects),
|
|
222
|
+
...checkFieldReferences(objects),
|
|
223
|
+
...checkProfileAttrs(objects),
|
|
224
|
+
...checkTestObjects(objects),
|
|
225
|
+
];
|
|
226
|
+
const { score, breakdown } = calculateScore(allIssues, objects.length);
|
|
227
|
+
logger.info("code-review: complete", {
|
|
228
|
+
objectCount: objects.length,
|
|
229
|
+
issues: allIssues.length,
|
|
230
|
+
score,
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
233
|
+
issues: allIssues,
|
|
234
|
+
score,
|
|
235
|
+
breakdown,
|
|
236
|
+
objectCount: objects.length,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=code-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../../src/core/siebel/code-review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAyC5C,kBAAkB;AAElB,SAAS,aAAa,CAAC,OAAgC;IACrD,MAAM,OAAO,GAA0D,EAAE,CAAC;IAC1E,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;gBACjF,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,iBAAiB;AAEjB,mCAAmC;AACnC,SAAS,WAAW,CAAC,OAAgC,EAAE,IAAmB;IACxE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC;IAExJ,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,GAAG,CAAC,IAAI;gBACpB,MAAM,EAAE,WAAW,GAAG,CAAC,IAAI,0CAA0C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAC3F,UAAU,EAAE,cAAc,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,4BAA4B;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gCAAgC;AAChC,SAAS,kBAAkB,CAAC,OAAgC;IAC1D,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,OAAO;gBACjB,UAAU,EAAE,CAAC,CAAC,MAAM;gBACpB,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,mCAAmC;gBAC5D,UAAU,EAAE,gFAAgF;aAC7F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4BAA4B;AAC5B,SAAS,oBAAoB,CAAC,OAAgC;IAC5D,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAA+D;QAC3E,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,uDAAuD,EAAE;QAClH,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,oCAAoC,EAAE,UAAU,EAAE,0CAA0C,EAAE;QAC3H,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,4DAA4D,EAAE,UAAU,EAAE,uEAAuE,EAAE;KACvL,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,kBAAkB;oBAC5B,QAAQ,EAAE,SAAS;oBACnB,UAAU,EAAE,CAAC,CAAC,MAAM;oBACpB,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,IAAI,EAAE;oBACzD,UAAU,EAAE,CAAC,CAAC,UAAU;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sCAAsC;AACtC,SAAS,oBAAoB,CAAC,OAAgC;IAC5D,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,kDAAkD;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1F,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,sCAAsC,CAAC;QAC/D,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,uCAAuC;YACvC,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,iBAAiB;oBAC3B,QAAQ,EAAE,SAAS;oBACnB,UAAU,EAAE,CAAC,CAAC,MAAM;oBACpB,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,uBAAuB,SAAS,uBAAuB;oBAChF,UAAU,EAAE,iBAAiB,SAAS,qCAAqC;iBAC5E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gCAAgC;AAChC,SAAS,iBAAiB,CAAC,OAAgC;IACzD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,kCAAkC,CAAC;QACtD,MAAM,UAAU,GAAG,kCAAkC,CAAC;QACtD,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,cAAc;gBACxB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,gBAAgB,IAAI,+CAA+C;gBAC3E,UAAU,EAAE,WAAW,IAAI,0FAA0F;aACtH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8BAA8B;AAC9B,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,2DAA2D,CAAC;IAEhF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,QAAQ;YAAE,SAAS;QAC3B,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,cAAc;gBACxB,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,GAAG,CAAC,IAAI;gBACpB,MAAM,EAAE,WAAW,GAAG,CAAC,IAAI,gEAAgE;gBAC3F,UAAU,EAAE,gDAAgD;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4BAA4B;AAE5B,SAAS,cAAc,CAAC,MAA8B,EAAE,WAAmB;IACzE,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,KAAK,EAAE,GAAG;YACV,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;SACnI,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAgF;QAC3F,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QACpE,cAAc,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5E,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QAC7E,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5E,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QACzE,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;KAC1E,CAAC;IAEF,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QAC3D,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC;QACjD,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QAC1B,UAAU,IAAI,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,SAAS,EAAE,SAAsC;KAClD,CAAC;AACJ,CAAC;AAED,wBAAwB;AAExB,MAAM,UAAU,gBAAgB,CAC9B,OAAgC,EAChC,OAAsB;IAEtB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtG,MAAM,SAAS,GAAkB;QAC/B,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;QAChC,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC9B,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAChC,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAChC,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC7B,GAAG,gBAAgB,CAAC,OAAO,CAAC;KAC7B,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvE,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;QACnC,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,KAAK;QACL,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity Metrics — calculates complexity scores for Siebel objects.
|
|
3
|
+
*/
|
|
4
|
+
import type { SiebelObject, SiebelDependency } from "../../schemas/siebel.schema.js";
|
|
5
|
+
export type ComplexityLevel = "low" | "medium" | "high" | "critical";
|
|
6
|
+
export interface ObjectMetrics {
|
|
7
|
+
fieldCount: number;
|
|
8
|
+
scriptCount: number;
|
|
9
|
+
userPropCount: number;
|
|
10
|
+
childCount: number;
|
|
11
|
+
dependencyCount: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ComplexityResult {
|
|
14
|
+
name: string;
|
|
15
|
+
type: string;
|
|
16
|
+
metrics: ObjectMetrics;
|
|
17
|
+
score: number;
|
|
18
|
+
level: ComplexityLevel;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculate complexity metrics for all top-level objects, ranked by score.
|
|
22
|
+
*/
|
|
23
|
+
export declare function calculateComplexity(objects: SiebelObject[], dependencies: SiebelDependency[]): ComplexityResult[];
|
|
24
|
+
//# sourceMappingURL=complexity-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-metrics.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/complexity-metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAErF,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,EAAE,gBAAgB,EAAE,GAC/B,gBAAgB,EAAE,CA8BpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity Metrics — calculates complexity scores for Siebel objects.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Calculate complexity metrics for all top-level objects, ranked by score.
|
|
6
|
+
*/
|
|
7
|
+
export function calculateComplexity(objects, dependencies) {
|
|
8
|
+
const topLevel = objects.filter((o) => !o.parentName);
|
|
9
|
+
const depCount = new Map();
|
|
10
|
+
for (const dep of dependencies) {
|
|
11
|
+
const key = `${dep.from.type}:${dep.from.name}`;
|
|
12
|
+
depCount.set(key, (depCount.get(key) ?? 0) + 1);
|
|
13
|
+
}
|
|
14
|
+
const results = topLevel.map((obj) => {
|
|
15
|
+
const metrics = {
|
|
16
|
+
fieldCount: obj.children.filter((c) => c.type === "field").length,
|
|
17
|
+
scriptCount: obj.children.filter((c) => c.type === "escript").length,
|
|
18
|
+
userPropCount: obj.children.filter((c) => c.type === "user_property").length,
|
|
19
|
+
childCount: obj.children.length,
|
|
20
|
+
dependencyCount: depCount.get(`${obj.type}:${obj.name}`) ?? 0,
|
|
21
|
+
};
|
|
22
|
+
const score = metrics.fieldCount * 1
|
|
23
|
+
+ metrics.scriptCount * 5
|
|
24
|
+
+ metrics.userPropCount * 2
|
|
25
|
+
+ metrics.dependencyCount * 3;
|
|
26
|
+
const level = scoreToLevel(score);
|
|
27
|
+
return { name: obj.name, type: obj.type, metrics, score, level };
|
|
28
|
+
});
|
|
29
|
+
results.sort((a, b) => b.score - a.score);
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
function scoreToLevel(score) {
|
|
33
|
+
if (score >= 100)
|
|
34
|
+
return "critical";
|
|
35
|
+
if (score >= 50)
|
|
36
|
+
return "high";
|
|
37
|
+
if (score >= 20)
|
|
38
|
+
return "medium";
|
|
39
|
+
return "low";
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=complexity-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-metrics.js","sourceRoot":"","sources":["../../../src/core/siebel/complexity-metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAuB,EACvB,YAAgC;IAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAuB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACvD,MAAM,OAAO,GAAkB;YAC7B,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM;YACjE,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM;YACpE,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,MAAM;YAC5E,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;YAC/B,eAAe,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;SAC9D,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC;cAChC,OAAO,CAAC,WAAW,GAAG,CAAC;cACvB,OAAO,CAAC,aAAa,GAAG,CAAC;cACzB,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAElC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automatic Context Enrichment — generates summary, dependency info,
|
|
3
|
+
* and usage analysis for imported SIF content.
|
|
4
|
+
*/
|
|
5
|
+
import type { SiebelObject, SiebelObjectRef, SiebelDependency, SiebelObjectType } from "../../schemas/siebel.schema.js";
|
|
6
|
+
export interface EnrichmentRequest {
|
|
7
|
+
readonly objects: readonly SiebelObject[];
|
|
8
|
+
readonly dependencies: readonly SiebelDependency[];
|
|
9
|
+
}
|
|
10
|
+
export interface EnrichmentResult {
|
|
11
|
+
readonly summary: string;
|
|
12
|
+
readonly objectTypes: readonly SiebelObjectType[];
|
|
13
|
+
readonly dependsOn: readonly SiebelObjectRef[];
|
|
14
|
+
readonly usedBy: readonly SiebelObjectRef[];
|
|
15
|
+
readonly objectCount: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function enrichSifContext(request: EnrichmentRequest): EnrichmentResult;
|
|
18
|
+
//# sourceMappingURL=context-enrichment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-enrichment.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/context-enrichment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AAKxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAyFD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAuB7E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automatic Context Enrichment — generates summary, dependency info,
|
|
3
|
+
* and usage analysis for imported SIF content.
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
// --- Implementation ---
|
|
7
|
+
function buildSummary(objects) {
|
|
8
|
+
if (objects.length === 0)
|
|
9
|
+
return "Empty SIF — no objects.";
|
|
10
|
+
const typeCounts = new Map();
|
|
11
|
+
const entityNames = new Set();
|
|
12
|
+
for (const obj of objects) {
|
|
13
|
+
typeCounts.set(obj.type, (typeCounts.get(obj.type) ?? 0) + 1);
|
|
14
|
+
// Extract entity name (strip prefix and type suffix)
|
|
15
|
+
const entity = obj.name
|
|
16
|
+
.replace(/^[A-Z]{2,4}[_ ]\s*/i, "")
|
|
17
|
+
.replace(/\s*(BC|Applet|View|Screen|BO|IO|List|Form)$/gi, "")
|
|
18
|
+
.trim();
|
|
19
|
+
if (entity)
|
|
20
|
+
entityNames.add(entity);
|
|
21
|
+
}
|
|
22
|
+
const typeList = [...typeCounts.entries()]
|
|
23
|
+
.map(([t, c]) => `${c} ${t}${c > 1 ? "s" : ""}`)
|
|
24
|
+
.join(", ");
|
|
25
|
+
const entities = [...entityNames].slice(0, 5).join(", ");
|
|
26
|
+
return `SIF with ${objects.length} objects (${typeList}). Main entities: ${entities || "unknown"}.`;
|
|
27
|
+
}
|
|
28
|
+
function findDependsOn(objects, dependencies) {
|
|
29
|
+
const objectKeys = new Set(objects.map((o) => `${o.type}:${o.name}`));
|
|
30
|
+
const external = [];
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
// Dependencies where our objects depend on something external
|
|
33
|
+
for (const dep of dependencies) {
|
|
34
|
+
const fromKey = `${dep.from.type}:${dep.from.name}`;
|
|
35
|
+
const toKey = `${dep.to.type}:${dep.to.name}`;
|
|
36
|
+
if (objectKeys.has(fromKey) && !objectKeys.has(toKey) && !seen.has(toKey)) {
|
|
37
|
+
seen.add(toKey);
|
|
38
|
+
external.push(dep.to);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Also check BUS_COMP references in applets
|
|
42
|
+
for (const obj of objects) {
|
|
43
|
+
if (obj.type === "applet") {
|
|
44
|
+
const busComp = obj.properties.find((p) => p.name === "BUS_COMP")?.value;
|
|
45
|
+
if (busComp) {
|
|
46
|
+
const key = `business_component:${busComp}`;
|
|
47
|
+
if (!objectKeys.has(key) && !seen.has(key)) {
|
|
48
|
+
seen.add(key);
|
|
49
|
+
external.push({ name: busComp, type: "business_component" });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return external;
|
|
55
|
+
}
|
|
56
|
+
function findUsedBy(objects, dependencies) {
|
|
57
|
+
const objectKeys = new Set(objects.map((o) => `${o.type}:${o.name}`));
|
|
58
|
+
const users = [];
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
for (const dep of dependencies) {
|
|
61
|
+
const fromKey = `${dep.from.type}:${dep.from.name}`;
|
|
62
|
+
const toKey = `${dep.to.type}:${dep.to.name}`;
|
|
63
|
+
if (objectKeys.has(toKey) && !objectKeys.has(fromKey) && !seen.has(fromKey)) {
|
|
64
|
+
seen.add(fromKey);
|
|
65
|
+
users.push(dep.from);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return users;
|
|
69
|
+
}
|
|
70
|
+
// --- Main function ---
|
|
71
|
+
export function enrichSifContext(request) {
|
|
72
|
+
const { objects, dependencies } = request;
|
|
73
|
+
logger.debug("context-enrichment: enriching", { objects: objects.length, deps: dependencies.length });
|
|
74
|
+
const summary = buildSummary(objects);
|
|
75
|
+
const objectTypes = [...new Set(objects.map((o) => o.type))];
|
|
76
|
+
const dependsOn = findDependsOn(objects, dependencies);
|
|
77
|
+
const usedBy = findUsedBy(objects, dependencies);
|
|
78
|
+
logger.info("context-enrichment: complete", {
|
|
79
|
+
types: objectTypes.length,
|
|
80
|
+
dependsOn: dependsOn.length,
|
|
81
|
+
usedBy: usedBy.length,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
summary,
|
|
85
|
+
objectTypes,
|
|
86
|
+
dependsOn,
|
|
87
|
+
usedBy,
|
|
88
|
+
objectCount: objects.length,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=context-enrichment.js.map
|