@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,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Package Builder — builds deploy packages from modified Siebel objects
|
|
3
|
+
* with transitive dependency resolution, topological ordering, lock conflict
|
|
4
|
+
* detection, and per-environment deploy scripts.
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from "../utils/logger.js";
|
|
7
|
+
// --- Constants ---
|
|
8
|
+
/** Canonical deploy order for Siebel object types */
|
|
9
|
+
export const DEPLOY_ORDER = [
|
|
10
|
+
"table",
|
|
11
|
+
"column",
|
|
12
|
+
"field",
|
|
13
|
+
"pick_list",
|
|
14
|
+
"link",
|
|
15
|
+
"business_component",
|
|
16
|
+
"business_object",
|
|
17
|
+
"business_service",
|
|
18
|
+
"integration_object",
|
|
19
|
+
"workflow",
|
|
20
|
+
"web_template",
|
|
21
|
+
"web_template_item",
|
|
22
|
+
"applet",
|
|
23
|
+
"control",
|
|
24
|
+
"list_column",
|
|
25
|
+
"menu_item",
|
|
26
|
+
"user_property",
|
|
27
|
+
"view",
|
|
28
|
+
"screen",
|
|
29
|
+
"application",
|
|
30
|
+
"project",
|
|
31
|
+
"escript",
|
|
32
|
+
];
|
|
33
|
+
// --- Helpers ---
|
|
34
|
+
function refKey(ref) {
|
|
35
|
+
return `${ref.type}:${ref.name}`;
|
|
36
|
+
}
|
|
37
|
+
function objToRef(obj) {
|
|
38
|
+
return { name: obj.name, type: obj.type };
|
|
39
|
+
}
|
|
40
|
+
/** AC2: Resolve transitive dependents (objects that depend ON modified objects) */
|
|
41
|
+
function resolveTransitiveDependents(modifiedRefs, allObjects, dependencies) {
|
|
42
|
+
// Build reverse adjacency: "to" → list of "from" (objects that reference "to")
|
|
43
|
+
const reverseDeps = new Map();
|
|
44
|
+
for (const dep of dependencies) {
|
|
45
|
+
const toKey = refKey(dep.to);
|
|
46
|
+
if (!reverseDeps.has(toKey)) {
|
|
47
|
+
reverseDeps.set(toKey, []);
|
|
48
|
+
}
|
|
49
|
+
reverseDeps.get(toKey).push(dep.from);
|
|
50
|
+
}
|
|
51
|
+
const visited = new Set(modifiedRefs);
|
|
52
|
+
const result = [];
|
|
53
|
+
const queue = [...modifiedRefs];
|
|
54
|
+
while (queue.length > 0) {
|
|
55
|
+
const currentKey = queue.shift();
|
|
56
|
+
const dependents = reverseDeps.get(currentKey) ?? [];
|
|
57
|
+
for (const dep of dependents) {
|
|
58
|
+
const depKey = refKey(dep);
|
|
59
|
+
if (!visited.has(depKey)) {
|
|
60
|
+
visited.add(depKey);
|
|
61
|
+
result.push(dep);
|
|
62
|
+
queue.push(depKey);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
/** AC3: Sort by deploy order */
|
|
69
|
+
function sortByDeployOrder(refs) {
|
|
70
|
+
return [...refs].sort((a, b) => {
|
|
71
|
+
const aIdx = DEPLOY_ORDER.indexOf(a.type);
|
|
72
|
+
const bIdx = DEPLOY_ORDER.indexOf(b.type);
|
|
73
|
+
const aOrder = aIdx === -1 ? DEPLOY_ORDER.length : aIdx;
|
|
74
|
+
const bOrder = bIdx === -1 ? DEPLOY_ORDER.length : bIdx;
|
|
75
|
+
if (aOrder !== bOrder)
|
|
76
|
+
return aOrder - bOrder;
|
|
77
|
+
return a.name.localeCompare(b.name);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** AC5: Detect lock conflicts */
|
|
81
|
+
function detectLockConflicts(objects, packageRefs, currentUser) {
|
|
82
|
+
const conflicts = [];
|
|
83
|
+
for (const obj of objects) {
|
|
84
|
+
const key = refKey(objToRef(obj));
|
|
85
|
+
if (!packageRefs.has(key))
|
|
86
|
+
continue;
|
|
87
|
+
const locked = obj.properties.find((p) => p.name === "OBJECT_LOCKED")?.value;
|
|
88
|
+
const lockedBy = obj.properties.find((p) => p.name === "LOCKED_BY")?.value;
|
|
89
|
+
if (locked === "Y" && lockedBy && lockedBy !== currentUser) {
|
|
90
|
+
conflicts.push({
|
|
91
|
+
objectName: obj.name,
|
|
92
|
+
objectType: obj.type,
|
|
93
|
+
lockedBy,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return conflicts;
|
|
98
|
+
}
|
|
99
|
+
/** Detect circular dependencies within the package */
|
|
100
|
+
function detectCircularDeps(packageRefs, dependencies) {
|
|
101
|
+
const circulars = [];
|
|
102
|
+
const adj = new Map();
|
|
103
|
+
for (const dep of dependencies) {
|
|
104
|
+
const fromKey = refKey(dep.from);
|
|
105
|
+
const toKey = refKey(dep.to);
|
|
106
|
+
if (packageRefs.has(fromKey) && packageRefs.has(toKey)) {
|
|
107
|
+
if (!adj.has(fromKey))
|
|
108
|
+
adj.set(fromKey, []);
|
|
109
|
+
adj.get(fromKey).push(toKey);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Simple cycle detection via DFS
|
|
113
|
+
const visited = new Set();
|
|
114
|
+
const inStack = new Set();
|
|
115
|
+
function dfs(node, path) {
|
|
116
|
+
if (inStack.has(node)) {
|
|
117
|
+
const cycleStart = path.indexOf(node);
|
|
118
|
+
if (cycleStart !== -1) {
|
|
119
|
+
const cycle = path.slice(cycleStart);
|
|
120
|
+
circulars.push({
|
|
121
|
+
objects: cycle.map((k) => {
|
|
122
|
+
const [type, ...nameParts] = k.split(":");
|
|
123
|
+
return { name: nameParts.join(":"), type: type };
|
|
124
|
+
}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (visited.has(node))
|
|
130
|
+
return;
|
|
131
|
+
visited.add(node);
|
|
132
|
+
inStack.add(node);
|
|
133
|
+
for (const neighbor of adj.get(node) ?? []) {
|
|
134
|
+
dfs(neighbor, [...path, node]);
|
|
135
|
+
}
|
|
136
|
+
inStack.delete(node);
|
|
137
|
+
}
|
|
138
|
+
for (const key of packageRefs) {
|
|
139
|
+
if (!visited.has(key)) {
|
|
140
|
+
dfs(key, []);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return circulars;
|
|
144
|
+
}
|
|
145
|
+
/** AC6: Generate deploy scripts */
|
|
146
|
+
function generateDeployScripts(deployOrder, environments) {
|
|
147
|
+
return environments.map((env) => {
|
|
148
|
+
const commands = [
|
|
149
|
+
`# Deploy script for ${env.toUpperCase()}`,
|
|
150
|
+
`# Generated: ${new Date().toISOString().split("T")[0]}`,
|
|
151
|
+
`# Objects: ${deployOrder.length}`,
|
|
152
|
+
"",
|
|
153
|
+
];
|
|
154
|
+
// Group by type for batch import
|
|
155
|
+
const byType = new Map();
|
|
156
|
+
for (const ref of deployOrder) {
|
|
157
|
+
if (!byType.has(ref.type))
|
|
158
|
+
byType.set(ref.type, []);
|
|
159
|
+
byType.get(ref.type).push(ref);
|
|
160
|
+
}
|
|
161
|
+
for (const [type, refs] of byType) {
|
|
162
|
+
commands.push(`# --- ${type} (${refs.length}) ---`);
|
|
163
|
+
for (const ref of refs) {
|
|
164
|
+
commands.push(`srvrmgr> import sif ${ref.name}.sif`);
|
|
165
|
+
}
|
|
166
|
+
commands.push("");
|
|
167
|
+
}
|
|
168
|
+
commands.push(`# Compile all`);
|
|
169
|
+
commands.push(`srvrmgr> compile project`);
|
|
170
|
+
return { environment: env, commands };
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/** Calculate risk level */
|
|
174
|
+
function calculateRisk(objectCount, conflicts, circulars) {
|
|
175
|
+
if (circulars > 0 || conflicts > 2)
|
|
176
|
+
return "critical";
|
|
177
|
+
if (objectCount > 20 || conflicts > 0)
|
|
178
|
+
return "high";
|
|
179
|
+
if (objectCount > 10)
|
|
180
|
+
return "medium";
|
|
181
|
+
return "low";
|
|
182
|
+
}
|
|
183
|
+
/** AC4: Generate impact report */
|
|
184
|
+
function generateReport(pkg) {
|
|
185
|
+
const lines = [
|
|
186
|
+
"# Migration Package Report",
|
|
187
|
+
"",
|
|
188
|
+
`## Summary`,
|
|
189
|
+
`- **Modified objects**: ${pkg.modifiedCount}`,
|
|
190
|
+
`- **Transitive dependents**: ${pkg.transitiveCount}`,
|
|
191
|
+
`- **Total in package**: ${pkg.objects.length}`,
|
|
192
|
+
`- **Risk level**: ${pkg.riskLevel.toUpperCase()}`,
|
|
193
|
+
"",
|
|
194
|
+
"## Impact — Deploy Order",
|
|
195
|
+
"",
|
|
196
|
+
];
|
|
197
|
+
for (const ref of pkg.deployOrder) {
|
|
198
|
+
lines.push(`- ${ref.type}: \`${ref.name}\``);
|
|
199
|
+
}
|
|
200
|
+
if (pkg.conflicts.length > 0) {
|
|
201
|
+
lines.push("", "## Lock Conflicts", "");
|
|
202
|
+
for (const c of pkg.conflicts) {
|
|
203
|
+
lines.push(`- ⚠ \`${c.objectName}\` (${c.objectType}) locked by **${c.lockedBy}**`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (pkg.circularDeps.length > 0) {
|
|
207
|
+
lines.push("", "## Circular Dependencies", "");
|
|
208
|
+
for (const cd of pkg.circularDeps) {
|
|
209
|
+
lines.push(`- 🔄 ${cd.objects.map((o) => `${o.type}:${o.name}`).join(" → ")}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
lines.push("");
|
|
213
|
+
return lines.join("\n");
|
|
214
|
+
}
|
|
215
|
+
// --- Main function ---
|
|
216
|
+
export function buildMigrationPackage(request) {
|
|
217
|
+
const { modifiedObjects, allObjects, dependencies, currentUser, environments = ["dev", "test", "staging", "prod"], } = request;
|
|
218
|
+
logger.debug("migration-package: building", {
|
|
219
|
+
modified: modifiedObjects.length,
|
|
220
|
+
total: allObjects.length,
|
|
221
|
+
deps: dependencies.length,
|
|
222
|
+
});
|
|
223
|
+
// Collect modified refs
|
|
224
|
+
const modifiedRefs = new Set(modifiedObjects.map((o) => refKey(objToRef(o))));
|
|
225
|
+
const modifiedObjRefs = modifiedObjects.map(objToRef);
|
|
226
|
+
// AC2: Resolve transitive dependents
|
|
227
|
+
const transitiveRefs = resolveTransitiveDependents(modifiedRefs, allObjects, dependencies);
|
|
228
|
+
// Combine all package objects (modified + transitive)
|
|
229
|
+
const allPackageRefs = [...modifiedObjRefs, ...transitiveRefs];
|
|
230
|
+
const packageRefSet = new Set(allPackageRefs.map(refKey));
|
|
231
|
+
// Deduplicate
|
|
232
|
+
const uniqueRefs = [];
|
|
233
|
+
const seen = new Set();
|
|
234
|
+
for (const ref of allPackageRefs) {
|
|
235
|
+
const key = refKey(ref);
|
|
236
|
+
if (!seen.has(key)) {
|
|
237
|
+
seen.add(key);
|
|
238
|
+
uniqueRefs.push(ref);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// AC3: Sort by deploy order
|
|
242
|
+
const deployOrder = sortByDeployOrder(uniqueRefs);
|
|
243
|
+
// AC5: Lock conflicts
|
|
244
|
+
const conflicts = detectLockConflicts(allObjects, packageRefSet, currentUser);
|
|
245
|
+
// Circular deps
|
|
246
|
+
const circularDeps = detectCircularDeps(packageRefSet, dependencies);
|
|
247
|
+
// Risk level
|
|
248
|
+
const riskLevel = calculateRisk(uniqueRefs.length, conflicts.length, circularDeps.length);
|
|
249
|
+
// AC6: Deploy scripts
|
|
250
|
+
const deployScripts = generateDeployScripts(deployOrder, environments);
|
|
251
|
+
// AC4: Report
|
|
252
|
+
const report = generateReport({
|
|
253
|
+
objects: uniqueRefs,
|
|
254
|
+
deployOrder,
|
|
255
|
+
conflicts,
|
|
256
|
+
circularDeps,
|
|
257
|
+
riskLevel,
|
|
258
|
+
modifiedCount: modifiedObjects.length,
|
|
259
|
+
transitiveCount: transitiveRefs.length,
|
|
260
|
+
});
|
|
261
|
+
logger.info("migration-package: complete", {
|
|
262
|
+
objects: uniqueRefs.length,
|
|
263
|
+
conflicts: conflicts.length,
|
|
264
|
+
riskLevel,
|
|
265
|
+
});
|
|
266
|
+
return {
|
|
267
|
+
objects: uniqueRefs,
|
|
268
|
+
deployOrder,
|
|
269
|
+
conflicts,
|
|
270
|
+
circularDeps,
|
|
271
|
+
deployScripts,
|
|
272
|
+
riskLevel,
|
|
273
|
+
report,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=migration-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-package.js","sourceRoot":"","sources":["../../../src/core/siebel/migration-package.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SiebelObject, SiebelObjectType } from "../../schemas/siebel.schema.js";
|
|
2
|
+
export interface PrefixRule {
|
|
3
|
+
readonly prefix: string;
|
|
4
|
+
readonly appliesTo: readonly SiebelObjectType[];
|
|
5
|
+
}
|
|
6
|
+
export interface CaseRule {
|
|
7
|
+
readonly pattern: "PascalCase" | "snake_case" | "camelCase" | "UPPER_SNAKE";
|
|
8
|
+
readonly appliesTo: readonly SiebelObjectType[];
|
|
9
|
+
}
|
|
10
|
+
export interface NamingException {
|
|
11
|
+
readonly objectName: string;
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
}
|
|
14
|
+
export interface NamingRuleSet {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly prefixes: readonly PrefixRule[];
|
|
17
|
+
readonly caseRules: readonly CaseRule[];
|
|
18
|
+
readonly exceptions: readonly NamingException[];
|
|
19
|
+
}
|
|
20
|
+
export interface NamingViolation {
|
|
21
|
+
readonly objectName: string;
|
|
22
|
+
readonly objectType: SiebelObjectType;
|
|
23
|
+
readonly rule: "prefix" | "case";
|
|
24
|
+
readonly expected: string;
|
|
25
|
+
readonly actual: string;
|
|
26
|
+
readonly severity: "warning" | "error";
|
|
27
|
+
}
|
|
28
|
+
export interface NamingValidationResult {
|
|
29
|
+
readonly ruleSetName: string;
|
|
30
|
+
readonly status: "valid" | "warnings" | "invalid";
|
|
31
|
+
readonly violations: readonly NamingViolation[];
|
|
32
|
+
readonly checkedCount: number;
|
|
33
|
+
readonly skippedCount: number;
|
|
34
|
+
readonly exceptedCount: number;
|
|
35
|
+
}
|
|
36
|
+
export declare const DEFAULT_RULE_SETS: Record<string, NamingRuleSet>;
|
|
37
|
+
export declare function validateNamingConventions(objects: readonly SiebelObject[], ruleSet: NamingRuleSet): NamingValidationResult;
|
|
38
|
+
//# sourceMappingURL=naming-convention-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming-convention-validator.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/naming-convention-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAKrF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;IAC5E,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAMD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA+B3D,CAAC;AA6CF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE,aAAa,GACrB,sBAAsB,CA0GxB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
// --- Default Rule Sets ---
|
|
3
|
+
// Users configure their own rule sets per organization/project.
|
|
4
|
+
// These are minimal examples for common Siebel patterns.
|
|
5
|
+
export const DEFAULT_RULE_SETS = {
|
|
6
|
+
standard: {
|
|
7
|
+
name: "standard",
|
|
8
|
+
prefixes: [
|
|
9
|
+
{ prefix: "CX_", appliesTo: ["applet", "business_component", "view", "screen"] },
|
|
10
|
+
],
|
|
11
|
+
caseRules: [
|
|
12
|
+
{ pattern: "PascalCase", appliesTo: ["applet", "view", "screen"] },
|
|
13
|
+
],
|
|
14
|
+
exceptions: [
|
|
15
|
+
{ objectName: "Account", reason: "Base Siebel object" },
|
|
16
|
+
{ objectName: "Contact", reason: "Base Siebel object" },
|
|
17
|
+
{ objectName: "Service Request", reason: "Base Siebel object" },
|
|
18
|
+
{ objectName: "Opportunity", reason: "Base Siebel object" },
|
|
19
|
+
{ objectName: "Activity", reason: "Base Siebel object" },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
multi_prefix: {
|
|
23
|
+
name: "multi_prefix",
|
|
24
|
+
prefixes: [
|
|
25
|
+
{ prefix: "CX_", appliesTo: ["applet", "business_component", "view", "screen"] },
|
|
26
|
+
{ prefix: "XX_", appliesTo: ["applet", "business_component", "view", "screen"] },
|
|
27
|
+
],
|
|
28
|
+
caseRules: [
|
|
29
|
+
{ pattern: "PascalCase", appliesTo: ["applet", "view", "screen"] },
|
|
30
|
+
],
|
|
31
|
+
exceptions: [
|
|
32
|
+
{ objectName: "Account", reason: "Base Siebel object" },
|
|
33
|
+
{ objectName: "Contact", reason: "Base Siebel object" },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
// --- Validation Logic ---
|
|
38
|
+
function isPascalCase(name) {
|
|
39
|
+
// After removing known prefix (e.g., "CX_"), check if remaining words start uppercase
|
|
40
|
+
const words = name.split(/[\s_]+/).filter(Boolean);
|
|
41
|
+
if (words.length === 0)
|
|
42
|
+
return false;
|
|
43
|
+
return words.every((w) => /^[A-Z]/.test(w));
|
|
44
|
+
}
|
|
45
|
+
function isSnakeCase(name) {
|
|
46
|
+
return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);
|
|
47
|
+
}
|
|
48
|
+
function isCamelCase(name) {
|
|
49
|
+
return /^[a-z][a-zA-Z0-9]*$/.test(name);
|
|
50
|
+
}
|
|
51
|
+
function isUpperSnake(name) {
|
|
52
|
+
return /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/.test(name);
|
|
53
|
+
}
|
|
54
|
+
function checkCase(name, pattern) {
|
|
55
|
+
switch (pattern) {
|
|
56
|
+
case "PascalCase":
|
|
57
|
+
return isPascalCase(name);
|
|
58
|
+
case "snake_case":
|
|
59
|
+
return isSnakeCase(name);
|
|
60
|
+
case "camelCase":
|
|
61
|
+
return isCamelCase(name);
|
|
62
|
+
case "UPPER_SNAKE":
|
|
63
|
+
return isUpperSnake(name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function stripPrefix(name, prefixes) {
|
|
67
|
+
for (const p of prefixes) {
|
|
68
|
+
if (name.startsWith(p)) {
|
|
69
|
+
return name.slice(p.length);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return name;
|
|
73
|
+
}
|
|
74
|
+
export function validateNamingConventions(objects, ruleSet) {
|
|
75
|
+
const violations = [];
|
|
76
|
+
let checkedCount = 0;
|
|
77
|
+
let skippedCount = 0;
|
|
78
|
+
let exceptedCount = 0;
|
|
79
|
+
const exceptionNames = new Set(ruleSet.exceptions.map((e) => e.objectName));
|
|
80
|
+
const prefixesByType = new Map();
|
|
81
|
+
const caseRulesByType = new Map();
|
|
82
|
+
// Index prefix rules by object type
|
|
83
|
+
for (const rule of ruleSet.prefixes) {
|
|
84
|
+
for (const objType of rule.appliesTo) {
|
|
85
|
+
const existing = prefixesByType.get(objType) ?? [];
|
|
86
|
+
existing.push(rule.prefix);
|
|
87
|
+
prefixesByType.set(objType, existing);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Index case rules by object type
|
|
91
|
+
for (const rule of ruleSet.caseRules) {
|
|
92
|
+
for (const objType of rule.appliesTo) {
|
|
93
|
+
const existing = caseRulesByType.get(objType) ?? [];
|
|
94
|
+
existing.push(rule.pattern);
|
|
95
|
+
caseRulesByType.set(objType, existing);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
for (const obj of objects) {
|
|
99
|
+
// Check if this object type has any rules
|
|
100
|
+
const applicablePrefixes = prefixesByType.get(obj.type);
|
|
101
|
+
const applicableCaseRules = caseRulesByType.get(obj.type);
|
|
102
|
+
if (!applicablePrefixes && !applicableCaseRules) {
|
|
103
|
+
skippedCount++;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
// Check if object is excepted
|
|
107
|
+
if (exceptionNames.has(obj.name)) {
|
|
108
|
+
exceptedCount++;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
checkedCount++;
|
|
112
|
+
// Check prefix
|
|
113
|
+
if (applicablePrefixes && applicablePrefixes.length > 0) {
|
|
114
|
+
const hasValidPrefix = applicablePrefixes.some((p) => obj.name.startsWith(p));
|
|
115
|
+
if (!hasValidPrefix) {
|
|
116
|
+
violations.push({
|
|
117
|
+
objectName: obj.name,
|
|
118
|
+
objectType: obj.type,
|
|
119
|
+
rule: "prefix",
|
|
120
|
+
expected: `One of: ${applicablePrefixes.join(", ")}`,
|
|
121
|
+
actual: obj.name.split(/[\s_]/)[0] + "_",
|
|
122
|
+
severity: "warning",
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Check case
|
|
127
|
+
if (applicableCaseRules && applicableCaseRules.length > 0) {
|
|
128
|
+
const nameToCheck = stripPrefix(obj.name, applicablePrefixes ?? []);
|
|
129
|
+
for (const casePattern of applicableCaseRules) {
|
|
130
|
+
if (!checkCase(nameToCheck, casePattern)) {
|
|
131
|
+
violations.push({
|
|
132
|
+
objectName: obj.name,
|
|
133
|
+
objectType: obj.type,
|
|
134
|
+
rule: "case",
|
|
135
|
+
expected: `${casePattern} (after prefix removal)`,
|
|
136
|
+
actual: nameToCheck,
|
|
137
|
+
severity: "warning",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const status = violations.length === 0
|
|
144
|
+
? "valid"
|
|
145
|
+
: violations.some((v) => v.severity === "error")
|
|
146
|
+
? "invalid"
|
|
147
|
+
: "warnings";
|
|
148
|
+
logger.debug("naming-convention-validator", {
|
|
149
|
+
ruleSet: ruleSet.name,
|
|
150
|
+
checkedCount,
|
|
151
|
+
skippedCount,
|
|
152
|
+
exceptedCount,
|
|
153
|
+
violationCount: violations.length,
|
|
154
|
+
status,
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
ruleSetName: ruleSet.name,
|
|
158
|
+
status,
|
|
159
|
+
violations,
|
|
160
|
+
checkedCount,
|
|
161
|
+
skippedCount,
|
|
162
|
+
exceptedCount,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=naming-convention-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming-convention-validator.js","sourceRoot":"","sources":["../../../src/core/siebel/naming-convention-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Siebel Object ERD Generator — extracts tables, columns, and relationships
|
|
3
|
+
* from BCs/Links and generates Mermaid ER diagrams.
|
|
4
|
+
*/
|
|
5
|
+
import type { SiebelObject } from "../../schemas/siebel.schema.js";
|
|
6
|
+
export interface ErdColumn {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly fieldName: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ErdTable {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly bcName: string;
|
|
13
|
+
readonly columns: readonly ErdColumn[];
|
|
14
|
+
}
|
|
15
|
+
export interface ErdRelationship {
|
|
16
|
+
readonly fromTable: string;
|
|
17
|
+
readonly toTable: string;
|
|
18
|
+
readonly fromField: string;
|
|
19
|
+
readonly toField: string;
|
|
20
|
+
readonly label: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ErdResult {
|
|
23
|
+
readonly tables: readonly ErdTable[];
|
|
24
|
+
readonly relationships: readonly ErdRelationship[];
|
|
25
|
+
readonly mermaid: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function generateSiebelErd(objects: readonly SiebelObject[], projectFilter?: string): ErdResult;
|
|
28
|
+
//# sourceMappingURL=object-erd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-erd.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/object-erd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAKnE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,SAAS,eAAe,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAID,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,aAAa,CAAC,EAAE,MAAM,GACrB,SAAS,CAkEX"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Siebel Object ERD Generator — extracts tables, columns, and relationships
|
|
3
|
+
* from BCs/Links and generates Mermaid ER diagrams.
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
// --- Implementation ---
|
|
7
|
+
export function generateSiebelErd(objects, projectFilter) {
|
|
8
|
+
logger.debug("object-erd: generating", { objectCount: objects.length, project: projectFilter });
|
|
9
|
+
let bcs = objects.filter((o) => o.type === "business_component");
|
|
10
|
+
if (projectFilter) {
|
|
11
|
+
bcs = bcs.filter((bc) => bc.project === projectFilter);
|
|
12
|
+
}
|
|
13
|
+
// Build BC → table name map
|
|
14
|
+
const bcToTable = new Map();
|
|
15
|
+
for (const bc of bcs) {
|
|
16
|
+
const table = bc.properties.find((p) => p.name === "TABLE")?.value;
|
|
17
|
+
if (table) {
|
|
18
|
+
bcToTable.set(bc.name, table);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Extract tables with columns
|
|
22
|
+
const tables = [];
|
|
23
|
+
for (const bc of bcs) {
|
|
24
|
+
const tableName = bcToTable.get(bc.name);
|
|
25
|
+
if (!tableName)
|
|
26
|
+
continue;
|
|
27
|
+
const columns = bc.children
|
|
28
|
+
.filter((c) => c.type === "field")
|
|
29
|
+
.map((f) => ({
|
|
30
|
+
name: f.properties.find((p) => p.name === "COLUMN")?.value ?? f.name,
|
|
31
|
+
fieldName: f.name,
|
|
32
|
+
}));
|
|
33
|
+
tables.push({ name: tableName, bcName: bc.name, columns });
|
|
34
|
+
}
|
|
35
|
+
// Extract relationships from LINK elements
|
|
36
|
+
const relationships = [];
|
|
37
|
+
for (const bc of bcs) {
|
|
38
|
+
const fromTable = bcToTable.get(bc.name);
|
|
39
|
+
if (!fromTable)
|
|
40
|
+
continue;
|
|
41
|
+
const links = bc.children.filter((c) => c.type === "link");
|
|
42
|
+
for (const link of links) {
|
|
43
|
+
const childBcName = link.properties.find((p) => p.name === "CHILD_BC")?.value;
|
|
44
|
+
if (!childBcName)
|
|
45
|
+
continue;
|
|
46
|
+
const toTable = bcToTable.get(childBcName);
|
|
47
|
+
if (!toTable)
|
|
48
|
+
continue;
|
|
49
|
+
const sourceField = link.properties.find((p) => p.name === "SOURCE_FIELD")?.value ?? "Id";
|
|
50
|
+
const destField = link.properties.find((p) => p.name === "DEST_FIELD")?.value ?? "Parent Id";
|
|
51
|
+
relationships.push({
|
|
52
|
+
fromTable,
|
|
53
|
+
toTable,
|
|
54
|
+
fromField: sourceField,
|
|
55
|
+
toField: destField,
|
|
56
|
+
label: link.name,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Generate Mermaid
|
|
61
|
+
const mermaid = generateMermaid(tables, relationships);
|
|
62
|
+
logger.info("object-erd: complete", { tables: tables.length, relationships: relationships.length });
|
|
63
|
+
return { tables, relationships, mermaid };
|
|
64
|
+
}
|
|
65
|
+
function generateMermaid(tables, relationships) {
|
|
66
|
+
const lines = ["erDiagram"];
|
|
67
|
+
for (const table of tables) {
|
|
68
|
+
lines.push(` ${sanitize(table.name)} {`);
|
|
69
|
+
for (const col of table.columns.slice(0, 20)) { // Limit to avoid huge diagrams
|
|
70
|
+
lines.push(` string ${sanitize(col.name)}`);
|
|
71
|
+
}
|
|
72
|
+
lines.push(" }");
|
|
73
|
+
}
|
|
74
|
+
for (const rel of relationships) {
|
|
75
|
+
lines.push(` ${sanitize(rel.fromTable)} ||--o{ ${sanitize(rel.toTable)} : "${rel.label}"`);
|
|
76
|
+
}
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
}
|
|
79
|
+
function sanitize(name) {
|
|
80
|
+
return name.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=object-erd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-erd.js","sourceRoot":"","sources":["../../../src/core/siebel/object-erd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA6B5C,yBAAyB;AAEzB,MAAM,UAAU,iBAAiB,CAC/B,OAAgC,EAChC,aAAsB;IAEtB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEhG,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;IACjE,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC;QACnE,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,OAAO,GAAgB,EAAE,CAAC,QAAQ;aACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI;YACpE,SAAS,EAAE,CAAC,CAAC,IAAI;SAClB,CAAC,CAAC,CAAC;QAEN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,2CAA2C;IAC3C,MAAM,aAAa,GAAsB,EAAE,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,KAAK,CAAC;YAC9E,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;YAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC;YAE7F,aAAa,CAAC,IAAI,CAAC;gBACjB,SAAS;gBACT,OAAO;gBACP,SAAS,EAAE,WAAW;gBACtB,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,IAAI,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEvD,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe,CAAC,MAA2B,EAAE,aAAyC;IAC7F,MAAM,KAAK,GAAa,CAAC,WAAW,CAAC,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,+BAA+B;YAC7E,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orphan Detector — identifies Siebel objects not referenced by any other object.
|
|
3
|
+
*/
|
|
4
|
+
import type { SiebelObject, SiebelObjectRef, SiebelDependency } from "../../schemas/siebel.schema.js";
|
|
5
|
+
export type OrphanClassification = "definitely_orphan" | "probably_orphan" | "intentionally_standalone";
|
|
6
|
+
export interface OrphanObject {
|
|
7
|
+
object: SiebelObjectRef;
|
|
8
|
+
classification: OrphanClassification;
|
|
9
|
+
reason: string;
|
|
10
|
+
}
|
|
11
|
+
export interface OrphanResult {
|
|
12
|
+
orphans: OrphanObject[];
|
|
13
|
+
totalScanned: number;
|
|
14
|
+
orphanCount: number;
|
|
15
|
+
orphanRate: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Detect orphan objects — those not referenced by any other object in the dependency graph.
|
|
19
|
+
*/
|
|
20
|
+
export declare function detectOrphans(objects: SiebelObject[], dependencies: SiebelDependency[]): OrphanResult;
|
|
21
|
+
//# sourceMappingURL=orphan-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-detector.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/orphan-detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEtG,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,0BAA0B,CAAC;AAKxG,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,cAAc,EAAE,oBAAoB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,EAAE,gBAAgB,EAAE,GAC/B,YAAY,CA8Dd"}
|