@mcp-graph-workflow/mcp-graph 5.10.0 → 5.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/api/routes/siebel.d.ts.map +1 -1
  2. package/dist/api/routes/siebel.js +170 -0
  3. package/dist/api/routes/siebel.js.map +1 -1
  4. package/dist/core/rag/siebel-indexer.d.ts.map +1 -1
  5. package/dist/core/rag/siebel-indexer.js +57 -1
  6. package/dist/core/rag/siebel-indexer.js.map +1 -1
  7. package/dist/core/rag/wsdl-indexer.d.ts +16 -0
  8. package/dist/core/rag/wsdl-indexer.d.ts.map +1 -0
  9. package/dist/core/rag/wsdl-indexer.js +115 -0
  10. package/dist/core/rag/wsdl-indexer.js.map +1 -0
  11. package/dist/core/siebel/auto-wiring.d.ts +29 -0
  12. package/dist/core/siebel/auto-wiring.d.ts.map +1 -0
  13. package/dist/core/siebel/auto-wiring.js +211 -0
  14. package/dist/core/siebel/auto-wiring.js.map +1 -0
  15. package/dist/core/siebel/best-practices.d.ts +16 -0
  16. package/dist/core/siebel/best-practices.d.ts.map +1 -0
  17. package/dist/core/siebel/best-practices.js +92 -0
  18. package/dist/core/siebel/best-practices.js.map +1 -0
  19. package/dist/core/siebel/change-simulator.d.ts +32 -0
  20. package/dist/core/siebel/change-simulator.d.ts.map +1 -0
  21. package/dist/core/siebel/change-simulator.js +138 -0
  22. package/dist/core/siebel/change-simulator.js.map +1 -0
  23. package/dist/core/siebel/clone-adapt.d.ts +21 -0
  24. package/dist/core/siebel/clone-adapt.d.ts.map +1 -0
  25. package/dist/core/siebel/clone-adapt.js +157 -0
  26. package/dist/core/siebel/clone-adapt.js.map +1 -0
  27. package/dist/core/siebel/code-review.d.ts +36 -0
  28. package/dist/core/siebel/code-review.d.ts.map +1 -0
  29. package/dist/core/siebel/code-review.js +239 -0
  30. package/dist/core/siebel/code-review.js.map +1 -0
  31. package/dist/core/siebel/complexity-metrics.d.ts +24 -0
  32. package/dist/core/siebel/complexity-metrics.d.ts.map +1 -0
  33. package/dist/core/siebel/complexity-metrics.js +41 -0
  34. package/dist/core/siebel/complexity-metrics.js.map +1 -0
  35. package/dist/core/siebel/context-enrichment.d.ts +18 -0
  36. package/dist/core/siebel/context-enrichment.d.ts.map +1 -0
  37. package/dist/core/siebel/context-enrichment.js +91 -0
  38. package/dist/core/siebel/context-enrichment.js.map +1 -0
  39. package/dist/core/siebel/cross-project-analyzer.d.ts +30 -0
  40. package/dist/core/siebel/cross-project-analyzer.d.ts.map +1 -0
  41. package/dist/core/siebel/cross-project-analyzer.js +108 -0
  42. package/dist/core/siebel/cross-project-analyzer.js.map +1 -0
  43. package/dist/core/siebel/definition-of-ready.d.ts +25 -0
  44. package/dist/core/siebel/definition-of-ready.d.ts.map +1 -0
  45. package/dist/core/siebel/definition-of-ready.js +164 -0
  46. package/dist/core/siebel/definition-of-ready.js.map +1 -0
  47. package/dist/core/siebel/escript-crossref.d.ts +18 -0
  48. package/dist/core/siebel/escript-crossref.d.ts.map +1 -0
  49. package/dist/core/siebel/escript-crossref.js +50 -0
  50. package/dist/core/siebel/escript-crossref.js.map +1 -0
  51. package/dist/core/siebel/escript-generator.d.ts +33 -0
  52. package/dist/core/siebel/escript-generator.d.ts.map +1 -0
  53. package/dist/core/siebel/escript-generator.js +200 -0
  54. package/dist/core/siebel/escript-generator.js.map +1 -0
  55. package/dist/core/siebel/escript-patterns.d.ts +20 -0
  56. package/dist/core/siebel/escript-patterns.d.ts.map +1 -0
  57. package/dist/core/siebel/escript-patterns.js +69 -0
  58. package/dist/core/siebel/escript-patterns.js.map +1 -0
  59. package/dist/core/siebel/escript-refactor.d.ts +23 -0
  60. package/dist/core/siebel/escript-refactor.d.ts.map +1 -0
  61. package/dist/core/siebel/escript-refactor.js +270 -0
  62. package/dist/core/siebel/escript-refactor.js.map +1 -0
  63. package/dist/core/siebel/field-suggestion.d.ts +29 -0
  64. package/dist/core/siebel/field-suggestion.d.ts.map +1 -0
  65. package/dist/core/siebel/field-suggestion.js +105 -0
  66. package/dist/core/siebel/field-suggestion.js.map +1 -0
  67. package/dist/core/siebel/health-check.d.ts +21 -0
  68. package/dist/core/siebel/health-check.d.ts.map +1 -0
  69. package/dist/core/siebel/health-check.js +51 -0
  70. package/dist/core/siebel/health-check.js.map +1 -0
  71. package/dist/core/siebel/integration-test-gen.d.ts +26 -0
  72. package/dist/core/siebel/integration-test-gen.d.ts.map +1 -0
  73. package/dist/core/siebel/integration-test-gen.js +131 -0
  74. package/dist/core/siebel/integration-test-gen.js.map +1 -0
  75. package/dist/core/siebel/lov-mapper.d.ts +23 -0
  76. package/dist/core/siebel/lov-mapper.d.ts.map +1 -0
  77. package/dist/core/siebel/lov-mapper.js +42 -0
  78. package/dist/core/siebel/lov-mapper.js.map +1 -0
  79. package/dist/core/siebel/migration-package.d.ts +38 -0
  80. package/dist/core/siebel/migration-package.d.ts.map +1 -0
  81. package/dist/core/siebel/migration-package.js +276 -0
  82. package/dist/core/siebel/migration-package.js.map +1 -0
  83. package/dist/core/siebel/naming-convention-validator.d.ts +38 -0
  84. package/dist/core/siebel/naming-convention-validator.d.ts.map +1 -0
  85. package/dist/core/siebel/naming-convention-validator.js +165 -0
  86. package/dist/core/siebel/naming-convention-validator.js.map +1 -0
  87. package/dist/core/siebel/object-erd.d.ts +28 -0
  88. package/dist/core/siebel/object-erd.d.ts.map +1 -0
  89. package/dist/core/siebel/object-erd.js +82 -0
  90. package/dist/core/siebel/object-erd.js.map +1 -0
  91. package/dist/core/siebel/orphan-detector.d.ts +21 -0
  92. package/dist/core/siebel/orphan-detector.d.ts.map +1 -0
  93. package/dist/core/siebel/orphan-detector.js +64 -0
  94. package/dist/core/siebel/orphan-detector.js.map +1 -0
  95. package/dist/core/siebel/pattern-analyzer.d.ts +32 -0
  96. package/dist/core/siebel/pattern-analyzer.d.ts.map +1 -0
  97. package/dist/core/siebel/pattern-analyzer.js +155 -0
  98. package/dist/core/siebel/pattern-analyzer.js.map +1 -0
  99. package/dist/core/siebel/profileattr-flow.d.ts +26 -0
  100. package/dist/core/siebel/profileattr-flow.d.ts.map +1 -0
  101. package/dist/core/siebel/profileattr-flow.js +50 -0
  102. package/dist/core/siebel/profileattr-flow.js.map +1 -0
  103. package/dist/core/siebel/runtime-dep-builder.d.ts +9 -0
  104. package/dist/core/siebel/runtime-dep-builder.d.ts.map +1 -0
  105. package/dist/core/siebel/runtime-dep-builder.js +47 -0
  106. package/dist/core/siebel/runtime-dep-builder.js.map +1 -0
  107. package/dist/core/siebel/scaffold-generator.d.ts +25 -0
  108. package/dist/core/siebel/scaffold-generator.d.ts.map +1 -0
  109. package/dist/core/siebel/scaffold-generator.js +278 -0
  110. package/dist/core/siebel/scaffold-generator.js.map +1 -0
  111. package/dist/core/siebel/siebel-context-builder.d.ts +10 -0
  112. package/dist/core/siebel/siebel-context-builder.d.ts.map +1 -0
  113. package/dist/core/siebel/siebel-context-builder.js +75 -0
  114. package/dist/core/siebel/siebel-context-builder.js.map +1 -0
  115. package/dist/core/siebel/siebel-rag-booster.d.ts +19 -0
  116. package/dist/core/siebel/siebel-rag-booster.d.ts.map +1 -0
  117. package/dist/core/siebel/siebel-rag-booster.js +41 -0
  118. package/dist/core/siebel/siebel-rag-booster.js.map +1 -0
  119. package/dist/core/siebel/siebel-validators.d.ts +73 -0
  120. package/dist/core/siebel/siebel-validators.d.ts.map +1 -0
  121. package/dist/core/siebel/siebel-validators.js +269 -0
  122. package/dist/core/siebel/siebel-validators.js.map +1 -0
  123. package/dist/core/siebel/sif-batch-importer.d.ts +27 -0
  124. package/dist/core/siebel/sif-batch-importer.d.ts.map +1 -0
  125. package/dist/core/siebel/sif-batch-importer.js +68 -0
  126. package/dist/core/siebel/sif-batch-importer.js.map +1 -0
  127. package/dist/core/siebel/sif-diff.d.ts +57 -0
  128. package/dist/core/siebel/sif-diff.d.ts.map +1 -0
  129. package/dist/core/siebel/sif-diff.js +198 -0
  130. package/dist/core/siebel/sif-diff.js.map +1 -0
  131. package/dist/core/siebel/sif-parser.d.ts.map +1 -1
  132. package/dist/core/siebel/sif-parser.js +86 -0
  133. package/dist/core/siebel/sif-parser.js.map +1 -1
  134. package/dist/core/siebel/similarity-detector.d.ts +20 -0
  135. package/dist/core/siebel/similarity-detector.d.ts.map +1 -0
  136. package/dist/core/siebel/similarity-detector.js +83 -0
  137. package/dist/core/siebel/similarity-detector.js.map +1 -0
  138. package/dist/core/siebel/template-learner.d.ts +25 -0
  139. package/dist/core/siebel/template-learner.d.ts.map +1 -0
  140. package/dist/core/siebel/template-learner.js +129 -0
  141. package/dist/core/siebel/template-learner.js.map +1 -0
  142. package/dist/core/siebel/troubleshoot.d.ts +37 -0
  143. package/dist/core/siebel/troubleshoot.d.ts.map +1 -0
  144. package/dist/core/siebel/troubleshoot.js +249 -0
  145. package/dist/core/siebel/troubleshoot.js.map +1 -0
  146. package/dist/core/siebel/wsdl-correlation.d.ts +22 -0
  147. package/dist/core/siebel/wsdl-correlation.d.ts.map +1 -0
  148. package/dist/core/siebel/wsdl-correlation.js +64 -0
  149. package/dist/core/siebel/wsdl-correlation.js.map +1 -0
  150. package/dist/core/siebel/wsdl-parser.d.ts +57 -0
  151. package/dist/core/siebel/wsdl-parser.d.ts.map +1 -0
  152. package/dist/core/siebel/wsdl-parser.js +226 -0
  153. package/dist/core/siebel/wsdl-parser.js.map +1 -0
  154. package/dist/core/siebel/wsdl-to-sif.d.ts +22 -0
  155. package/dist/core/siebel/wsdl-to-sif.d.ts.map +1 -0
  156. package/dist/core/siebel/wsdl-to-sif.js +184 -0
  157. package/dist/core/siebel/wsdl-to-sif.js.map +1 -0
  158. package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -1
  159. package/dist/mcp/tools/siebel-analyze.js +89 -6
  160. package/dist/mcp/tools/siebel-analyze.js.map +1 -1
  161. package/dist/mcp/tools/siebel-composer.d.ts.map +1 -1
  162. package/dist/mcp/tools/siebel-composer.js +40 -3
  163. package/dist/mcp/tools/siebel-composer.js.map +1 -1
  164. package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -1
  165. package/dist/mcp/tools/siebel-generate-sif.js +188 -3
  166. package/dist/mcp/tools/siebel-generate-sif.js.map +1 -1
  167. package/dist/mcp/tools/siebel-search.js +1 -1
  168. package/dist/mcp/tools/siebel-search.js.map +1 -1
  169. package/dist/mcp/tools/siebel-validate.d.ts.map +1 -1
  170. package/dist/mcp/tools/siebel-validate.js +94 -5
  171. package/dist/mcp/tools/siebel-validate.js.map +1 -1
  172. package/dist/schemas/knowledge.schema.d.ts +4 -0
  173. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  174. package/dist/schemas/knowledge.schema.js +1 -0
  175. package/dist/schemas/knowledge.schema.js.map +1 -1
  176. package/dist/schemas/siebel.schema.d.ts +42 -0
  177. package/dist/schemas/siebel.schema.d.ts.map +1 -1
  178. package/dist/schemas/siebel.schema.js +4 -0
  179. package/dist/schemas/siebel.schema.js.map +1 -1
  180. package/package.json +2 -2
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Auto-Wiring de Dependências — automatically detects and wires dependencies
3
+ * for new Siebel objects based on their references and the existing repository.
4
+ *
5
+ * Dependency rules:
6
+ * Applet → BC (via BUS_COMP property)
7
+ * View → Applet (via children of type applet)
8
+ * BC → Table (suggest from similar BCs if TABLE property missing)
9
+ * BO → BC (via children of type business_component)
10
+ * Screen → View (via children of type view)
11
+ */
12
+ import { logger } from "../utils/logger.js";
13
+ // --- Helpers ---
14
+ function refKey(ref) {
15
+ return `${ref.type}:${ref.name}`;
16
+ }
17
+ function buildObjectIndex(objects) {
18
+ const index = new Map();
19
+ for (const obj of objects) {
20
+ index.set(refKey({ name: obj.name, type: obj.type }), obj);
21
+ }
22
+ return index;
23
+ }
24
+ function findSimilarBC(bcName, repository) {
25
+ const repoBCs = repository.filter((o) => o.type === "business_component");
26
+ if (repoBCs.length === 0)
27
+ return undefined;
28
+ // Extract entity keyword from BC name (strip prefixes and "BC" suffix)
29
+ const entity = bcName
30
+ .replace(/^[A-Z]{2,4}_\s*/i, "")
31
+ .replace(/\s*BC$/i, "")
32
+ .trim()
33
+ .toLowerCase();
34
+ // Find BC with most similar entity name
35
+ let best;
36
+ let bestScore = 0;
37
+ for (const bc of repoBCs) {
38
+ const repoEntity = bc.name
39
+ .replace(/^[A-Z]{2,4}_\s*/i, "")
40
+ .replace(/\s*BC$/i, "")
41
+ .trim()
42
+ .toLowerCase();
43
+ if (repoEntity === entity) {
44
+ return bc; // Exact entity match
45
+ }
46
+ // Simple word overlap score
47
+ const words = entity.split(/\s+/);
48
+ const repoWords = repoEntity.split(/\s+/);
49
+ const overlap = words.filter((w) => repoWords.includes(w)).length;
50
+ const score = overlap / Math.max(words.length, repoWords.length);
51
+ if (score > bestScore) {
52
+ bestScore = score;
53
+ best = bc;
54
+ }
55
+ }
56
+ return bestScore >= 0.5 ? best : undefined;
57
+ }
58
+ function detectAppletDeps(obj) {
59
+ if (obj.type !== "applet")
60
+ return [];
61
+ const deps = [];
62
+ const busComp = obj.properties.find((p) => p.name === "BUS_COMP")?.value;
63
+ if (busComp) {
64
+ deps.push({
65
+ from: { name: obj.name, type: obj.type },
66
+ to: { name: busComp, type: "business_component" },
67
+ relationType: "references",
68
+ });
69
+ }
70
+ return deps;
71
+ }
72
+ function detectViewDeps(obj) {
73
+ if (obj.type !== "view")
74
+ return [];
75
+ const deps = [];
76
+ // View references applets via children
77
+ const appletChildren = obj.children.filter((c) => c.type === "applet");
78
+ for (const child of appletChildren) {
79
+ deps.push({
80
+ from: { name: obj.name, type: obj.type },
81
+ to: { name: child.name, type: "applet" },
82
+ relationType: "references",
83
+ });
84
+ }
85
+ return deps;
86
+ }
87
+ function detectBODeps(obj) {
88
+ if (obj.type !== "business_object")
89
+ return [];
90
+ const deps = [];
91
+ // BO references BCs via children
92
+ const bcChildren = obj.children.filter((c) => c.type === "business_component");
93
+ for (const child of bcChildren) {
94
+ deps.push({
95
+ from: { name: obj.name, type: obj.type },
96
+ to: { name: child.name, type: "business_component" },
97
+ relationType: "contains",
98
+ });
99
+ }
100
+ return deps;
101
+ }
102
+ function detectScreenDeps(obj) {
103
+ if (obj.type !== "screen")
104
+ return [];
105
+ const deps = [];
106
+ const viewChildren = obj.children.filter((c) => c.type === "view");
107
+ for (const child of viewChildren) {
108
+ deps.push({
109
+ from: { name: obj.name, type: obj.type },
110
+ to: { name: child.name, type: "view" },
111
+ relationType: "references",
112
+ });
113
+ }
114
+ return deps;
115
+ }
116
+ function detectBCTableDep(obj, repository) {
117
+ if (obj.type !== "business_component")
118
+ return undefined;
119
+ // If BC already has TABLE property, no suggestion needed
120
+ const hasTable = obj.properties.some((p) => p.name === "TABLE" && p.value);
121
+ if (hasTable)
122
+ return undefined;
123
+ const similar = findSimilarBC(obj.name, repository);
124
+ if (!similar)
125
+ return undefined;
126
+ const tableName = similar.properties.find((p) => p.name === "TABLE")?.value;
127
+ if (!tableName)
128
+ return undefined;
129
+ return {
130
+ from: { name: obj.name, type: obj.type },
131
+ to: { name: tableName, type: "table" },
132
+ relationType: "based_on",
133
+ suggestion: "link",
134
+ };
135
+ }
136
+ // --- Report generation ---
137
+ function generateReport(wired, missing) {
138
+ const lines = ["# Auto-Wiring Report", ""];
139
+ if (wired.length > 0) {
140
+ lines.push(`## Wired Dependencies (${wired.length})`, "");
141
+ for (const edge of wired) {
142
+ lines.push(`- ✓ ${edge.from.type}:\`${edge.from.name}\` → ${edge.to.type}:\`${edge.to.name}\` (${edge.relationType})`);
143
+ }
144
+ lines.push("");
145
+ }
146
+ if (missing.length > 0) {
147
+ lines.push(`## Missing Dependencies (${missing.length})`, "");
148
+ for (const dep of missing) {
149
+ const action = dep.suggestion === "create" ? "CREATE" : "LINK";
150
+ lines.push(`- ✗ ${dep.from.type}:\`${dep.from.name}\` → ${dep.to.type}:\`${dep.to.name}\` — **${action}** (${dep.relationType})`);
151
+ }
152
+ lines.push("");
153
+ }
154
+ if (wired.length === 0 && missing.length === 0) {
155
+ lines.push("No dependencies detected.", "");
156
+ }
157
+ return lines.join("\n");
158
+ }
159
+ // --- Main function ---
160
+ export function autoWireDependencies(request) {
161
+ const { newObjects, repository } = request;
162
+ logger.debug("auto-wiring: analyzing dependencies", {
163
+ newCount: newObjects.length,
164
+ repoCount: repository.length,
165
+ });
166
+ // Build combined index of all known objects (repo + new)
167
+ const allKnown = buildObjectIndex([...repository, ...newObjects]);
168
+ const repoIndex = buildObjectIndex(repository);
169
+ const wiredEdges = [];
170
+ const missingDependencies = [];
171
+ // Detect structural dependencies for each new object
172
+ const detectors = [detectAppletDeps, detectViewDeps, detectBODeps, detectScreenDeps];
173
+ for (const obj of newObjects) {
174
+ for (const detect of detectors) {
175
+ const deps = detect(obj);
176
+ for (const dep of deps) {
177
+ const targetKey = refKey(dep.to);
178
+ if (allKnown.has(targetKey)) {
179
+ // Target exists — wire it
180
+ wiredEdges.push({
181
+ from: dep.from,
182
+ to: dep.to,
183
+ relationType: dep.relationType,
184
+ inferred: true,
185
+ });
186
+ }
187
+ else {
188
+ // Target missing — suggest creation
189
+ missingDependencies.push({
190
+ from: dep.from,
191
+ to: dep.to,
192
+ relationType: dep.relationType,
193
+ suggestion: "create",
194
+ });
195
+ }
196
+ }
197
+ }
198
+ // BC → Table suggestion (separate logic)
199
+ const tableDep = detectBCTableDep(obj, repository);
200
+ if (tableDep) {
201
+ missingDependencies.push(tableDep);
202
+ }
203
+ }
204
+ const report = generateReport(wiredEdges, missingDependencies);
205
+ logger.info("auto-wiring: complete", {
206
+ wired: wiredEdges.length,
207
+ missing: missingDependencies.length,
208
+ });
209
+ return { wiredEdges, missingDependencies, report };
210
+ }
211
+ //# sourceMappingURL=auto-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-wiring.js","sourceRoot":"","sources":["../../../src/core/siebel/auto-wiring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Siebel Best Practices Knowledge Base — 50+ rules categorized by object type.
3
+ * Each rule has correct/incorrect examples and severity.
4
+ */
5
+ export interface BestPracticeRule {
6
+ readonly id: string;
7
+ readonly category: string;
8
+ readonly title: string;
9
+ readonly description: string;
10
+ readonly severity: "error" | "warning" | "info";
11
+ readonly correct: string;
12
+ readonly incorrect: string;
13
+ }
14
+ export declare function getSiebelBestPractices(): readonly BestPracticeRule[];
15
+ export declare function getBestPracticesByCategory(): Record<string, readonly BestPracticeRule[]>;
16
+ //# sourceMappingURL=best-practices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"best-practices.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/best-practices.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAkFD,wBAAgB,sBAAsB,IAAI,SAAS,gBAAgB,EAAE,CAGpE;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAUxF"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Siebel Best Practices Knowledge Base — 50+ rules categorized by object type.
3
+ * Each rule has correct/incorrect examples and severity.
4
+ */
5
+ import { logger } from "../utils/logger.js";
6
+ // --- Rules ---
7
+ const RULES = [
8
+ // NAMING (10)
9
+ { id: "NAM-001", category: "naming", title: "Use project prefix", description: "All custom objects must use the project-specific prefix", severity: "error", correct: "CX_Account BC", incorrect: "Account BC" },
10
+ { id: "NAM-002", category: "naming", title: "BC suffix", description: "Business Components must end with ' BC'", severity: "warning", correct: "CX Account BC", incorrect: "CX Account BusComp" },
11
+ { id: "NAM-003", category: "naming", title: "Applet suffix with style", description: "Applets must end with 'List Applet' or 'Form Applet'", severity: "warning", correct: "CX Account List Applet", incorrect: "CX Account Applet1" },
12
+ { id: "NAM-004", category: "naming", title: "View suffix", description: "Views must end with ' View'", severity: "warning", correct: "CX Account Detail View", incorrect: "CX Account Screen1" },
13
+ { id: "NAM-005", category: "naming", title: "IO suffix", description: "Integration Objects must end with ' IO'", severity: "warning", correct: "CX Account IO", incorrect: "CX Account Integration" },
14
+ { id: "NAM-006", category: "naming", title: "No spaces in table names", description: "Custom table names use underscores", severity: "error", correct: "CX_S_ACCOUNT", incorrect: "CX S ACCOUNT" },
15
+ { id: "NAM-007", category: "naming", title: "Field naming consistency", description: "Fields use PascalCase or match base table columns", severity: "info", correct: "Account Name", incorrect: "account_name_field" },
16
+ { id: "NAM-008", category: "naming", title: "BO naming matches entity", description: "BO name should match the primary entity", severity: "info", correct: "CX Account BO", incorrect: "CX AcctMgmt BO" },
17
+ { id: "NAM-009", category: "naming", title: "Screen naming", description: "Screen name should match the main entity", severity: "info", correct: "CX Account Screen", incorrect: "CX Screen 1" },
18
+ { id: "NAM-010", category: "naming", title: "Link naming", description: "Link names describe the relationship", severity: "info", correct: "Account/Contact", incorrect: "Link1" },
19
+ // CONFIGURATION (15)
20
+ { id: "CFG-001", category: "configuration", title: "BC must have TABLE", description: "Every BC must define the TABLE property", severity: "error", correct: "TABLE = S_ORG_EXT", incorrect: "TABLE = (empty)" },
21
+ { id: "CFG-002", category: "configuration", title: "Applet must have BUS_COMP", description: "Every Applet must reference a BC", severity: "error", correct: "BUS_COMP = CX Account BC", incorrect: "BUS_COMP = (empty)" },
22
+ { id: "CFG-003", category: "configuration", title: "View must have BO", description: "Every View must reference a Business Object", severity: "error", correct: "BUS_OBJECT = CX Account BO", incorrect: "BUS_OBJECT = (empty)" },
23
+ { id: "CFG-004", category: "configuration", title: "No INACTIVE test objects in prod", description: "Objects with Test/Debug/Temp in name must be INACTIVE=Y", severity: "warning", correct: "INACTIVE = Y for test objects", incorrect: "INACTIVE = N for 'CX Test Applet'" },
24
+ { id: "CFG-005", category: "configuration", title: "SORT_SPEC for list applets", description: "List applets should have a SORT_SPEC on the BC", severity: "info", correct: "SORT_SPEC = Name (ASC)", incorrect: "SORT_SPEC = (empty)" },
25
+ { id: "CFG-006", category: "configuration", title: "SEARCH_SPEC for filtered BCs", description: "BCs with pre-filtering should define SEARCH_SPEC", severity: "info", correct: "SEARCH_SPEC = [Status] = 'Active'", incorrect: "No SearchSpec on filtered BC" },
26
+ { id: "CFG-007", category: "configuration", title: "User Properties documented", description: "Custom User Properties should have descriptive names", severity: "info", correct: "Named Search: My Custom Search", incorrect: "User Prop 1" },
27
+ { id: "CFG-008", category: "configuration", title: "Web Template exists", description: "Applet web template must reference existing template", severity: "error", correct: "WEB_TEMPLATE = Applet Form", incorrect: "WEB_TEMPLATE = (non-existent)" },
28
+ { id: "CFG-009", category: "configuration", title: "Link source/dest fields valid", description: "Link SOURCE_FIELD and DEST_FIELD must exist in respective BCs", severity: "error", correct: "SOURCE_FIELD = Id, DEST_FIELD = Account Id", incorrect: "SOURCE_FIELD = NonExistent" },
29
+ { id: "CFG-010", category: "configuration", title: "IO fields have DATA_TYPE", description: "IC Fields must have DATA_TYPE defined", severity: "warning", correct: "DATA_TYPE = DTYPE_TEXT", incorrect: "DATA_TYPE = (empty)" },
30
+ { id: "CFG-011", category: "configuration", title: "IO User Keys defined", description: "Integration Objects should define User Keys for upsert matching", severity: "warning", correct: "User Key on Account Id field", incorrect: "No User Keys on IO" },
31
+ { id: "CFG-012", category: "configuration", title: "No duplicate field names", description: "BC should not have duplicate field names", severity: "error", correct: "Unique field names", incorrect: "Two fields named 'Status'" },
32
+ { id: "CFG-013", category: "configuration", title: "Control FIELD property set", description: "Applet controls must reference a BC field via FIELD property", severity: "warning", correct: "FIELD = Account Name", incorrect: "FIELD = (empty)" },
33
+ { id: "CFG-014", category: "configuration", title: "View applet references valid", description: "View must reference applets that exist", severity: "error", correct: "Applet ref to existing CX Account List Applet", incorrect: "Applet ref to non-existent applet" },
34
+ { id: "CFG-015", category: "configuration", title: "No circular BC links", description: "BC link chains should not create circular references", severity: "error", correct: "Account -> Contact -> Address (linear)", incorrect: "Account -> Contact -> Account (circular)" },
35
+ // SCRIPTING (15)
36
+ { id: "SCR-001", category: "scripting", title: "try/catch/finally required", description: "Every event handler must use try/catch/finally", severity: "error", correct: "try { ... } catch(e) { RaiseErrorText(e) } finally { cleanup }", incorrect: "No try/catch in event handler" },
37
+ { id: "SCR-002", category: "scripting", title: "Memory cleanup in finally", description: "Set all Siebel objects to null in finally block", severity: "error", correct: "finally { bc = null; bs = null; }", incorrect: "No null assignments in finally" },
38
+ { id: "SCR-003", category: "scripting", title: "ActivateField before query", description: "Call ActivateField for every field read before ExecuteQuery", severity: "warning", correct: "bc.ActivateField('Name'); bc.ExecuteQuery()", incorrect: "bc.ExecuteQuery(); bc.GetFieldValue('Name')" },
39
+ { id: "SCR-004", category: "scripting", title: "ForwardOnly queries", description: "Use ExecuteQuery(ForwardOnly) for read-only iteration", severity: "warning", correct: "bc.ExecuteQuery(ForwardOnly)", incorrect: "bc.ExecuteQuery()" },
40
+ { id: "SCR-005", category: "scripting", title: "No empty catch blocks", description: "Catch blocks must handle the error, not swallow it", severity: "error", correct: "catch(e) { TheApplication().RaiseErrorText(e.toString()) }", incorrect: "catch(e) { }" },
41
+ { id: "SCR-006", category: "scripting", title: "No hardcoded URLs", description: "Use system preferences or ProfileAttr for URLs", severity: "warning", correct: "GetProfileAttr('IntegrationURL')", incorrect: "var url = 'http://prod.example.com'" },
42
+ { id: "SCR-007", category: "scripting", title: "No hardcoded IPs", description: "Never hardcode IP addresses in scripts", severity: "warning", correct: "Use DNS name via config", incorrect: "var host = '10.0.1.100'" },
43
+ { id: "SCR-008", category: "scripting", title: "Cache LOV lookups", description: "Cache LookupValue results in variables outside loops", severity: "warning", correct: "var cached = LookupValue(...); for(...) use cached", incorrect: "for(...) { LookupValue(...) inside loop }" },
44
+ { id: "SCR-009", category: "scripting", title: "Use var keyword", description: "Always declare variables with var keyword", severity: "warning", correct: "var sName = bc.GetFieldValue('Name')", incorrect: "sName = bc.GetFieldValue('Name')" },
45
+ { id: "SCR-010", category: "scripting", title: "RaiseErrorText for user errors", description: "Use RaiseErrorText to display errors to user", severity: "info", correct: "TheApplication().RaiseErrorText(sMsg)", incorrect: "alert(sMsg)" },
46
+ { id: "SCR-011", category: "scripting", title: "No dead code", description: "Remove commented-out code blocks marked as dead", severity: "info", correct: "Clean code without dead blocks", incorrect: "/* Dead Code */ var old = ... /* End Dead Code */" },
47
+ { id: "SCR-012", category: "scripting", title: "Document ProfileAttr usage", description: "Every SetProfileAttr should have a corresponding GetProfileAttr", severity: "info", correct: "Set in View A, Get in View B (documented)", incorrect: "SetProfileAttr with no consumer" },
48
+ { id: "SCR-013", category: "scripting", title: "Consistent return values", description: "Event handlers must return CancelOperation or ContinueOperation", severity: "warning", correct: "return CancelOperation; ... return ContinueOperation;", incorrect: "No return statement" },
49
+ { id: "SCR-014", category: "scripting", title: "No GetFieldValue in loops without ActivateField", description: "Activate fields before entering record iteration loops", severity: "warning", correct: "ActivateField before while(bc.NextRecord())", incorrect: "GetFieldValue inside loop without ActivateField" },
50
+ { id: "SCR-015", category: "scripting", title: "Use typed error messages", description: "Include error code and context in error messages", severity: "info", correct: "RaiseErrorText('ERR-001: Account not found: ' + sId)", incorrect: "RaiseErrorText('Error')" },
51
+ // BUSINESS_COMPONENT (5)
52
+ { id: "BC-001", category: "business_component", title: "Define primary field", description: "BC should have a clear primary/display field", severity: "info", correct: "Name field as primary display", incorrect: "No identifiable display field" },
53
+ { id: "BC-002", category: "business_component", title: "Limit field count", description: "BC with 100+ fields may indicate need for decomposition", severity: "warning", correct: "BC with focused field set (< 50)", incorrect: "BC with 150+ fields" },
54
+ { id: "BC-003", category: "business_component", title: "Link cardinality", description: "Define link cardinality (1:1, 1:M) correctly", severity: "warning", correct: "1:M link from Account to Contact", incorrect: "Missing cardinality definition" },
55
+ { id: "BC-004", category: "business_component", title: "SearchSpec SQL injection", description: "SearchSpec values must be parameterized, not concatenated", severity: "error", correct: "SetSearchSpec('Name', sInput)", incorrect: "SearchSpec = \"[Name] = '\" + sInput + \"'\"" },
56
+ { id: "BC-005", category: "business_component", title: "ViewMode awareness", description: "Set correct ViewMode before queries", severity: "warning", correct: "bc.SetViewMode(AllView) for admin queries", incorrect: "Default ViewMode for cross-org queries" },
57
+ // APPLET (5)
58
+ { id: "APL-001", category: "applet", title: "Control-to-field mapping", description: "Every visible control must map to a BC field", severity: "error", correct: "Control FIELD = Account Name", incorrect: "Control with no FIELD mapping" },
59
+ { id: "APL-002", category: "applet", title: "List applet column limit", description: "List applets should show 5-10 columns max", severity: "info", correct: "7 columns in list applet", incorrect: "25 columns in list applet" },
60
+ { id: "APL-003", category: "applet", title: "Form applet section grouping", description: "Form applets should group related fields in sections", severity: "info", correct: "Sections: Basic Info, Address, Contact", incorrect: "All 30 fields in one flat form" },
61
+ { id: "APL-004", category: "applet", title: "Toggles and buttons named clearly", description: "Action buttons should have descriptive labels", severity: "info", correct: "Button: Submit Order", incorrect: "Button: Button1" },
62
+ { id: "APL-005", category: "applet", title: "No duplicate controls", description: "Applet should not have duplicate controls for same field", severity: "warning", correct: "One control per field", incorrect: "Two controls mapping to 'Name'" },
63
+ // INTEGRATION (5)
64
+ { id: "INT-001", category: "integration", title: "IO matches WSDL contract", description: "IO fields must match the WSDL complex type fields", severity: "error", correct: "IO fields align with WSDL types", incorrect: "IO has extra/missing fields vs WSDL" },
65
+ { id: "INT-002", category: "integration", title: "Error fields present", description: "IO should include Error_spcCode and Error_spcMessage fields", severity: "warning", correct: "Error_spcCode and Error_spcMessage IC Fields", incorrect: "No error handling fields" },
66
+ { id: "INT-003", category: "integration", title: "Inbound operations use upsert", description: "Inbound sync operations should use upsert pattern", severity: "info", correct: "UpsertAccount operation", incorrect: "Separate Insert + Update operations" },
67
+ { id: "INT-004", category: "integration", title: "Outbound retry logic", description: "Outbound calls should implement retry for transient failures", severity: "warning", correct: "Retry with exponential backoff", incorrect: "Single call, fail on timeout" },
68
+ { id: "INT-005", category: "integration", title: "Contract versioning", description: "Use version suffix when evolving contracts", severity: "info", correct: "AccountServiceV3", incorrect: "AccountService (ambiguous version)" },
69
+ // SECURITY (5)
70
+ { id: "SEC-001", category: "security", title: "No sensitive data in scripts", description: "Never store passwords, tokens, or PII in scripts", severity: "error", correct: "Use system preferences for credentials", incorrect: "var password = 'secret123'" },
71
+ { id: "SEC-002", category: "security", title: "LGPD compliance for PII fields", description: "PII fields (CPF, email, phone) must be flagged for data protection", severity: "error", correct: "PII fields marked with privacy metadata", incorrect: "CPF field with no privacy controls" },
72
+ { id: "SEC-003", category: "security", title: "No DeleteRecord in applet scripts", description: "Avoid DeleteRecord in applet scripts — use BC-level or workflow", severity: "warning", correct: "Delete via workflow with audit", incorrect: "bc.DeleteRecord() in applet script" },
73
+ { id: "SEC-004", category: "security", title: "Validate input in inbound services", description: "Validate all input fields in inbound web service handlers", severity: "error", correct: "Check required fields, validate types", incorrect: "Pass input directly to BC without validation" },
74
+ { id: "SEC-005", category: "security", title: "Audit trail for sensitive operations", description: "Log sensitive operations (delete, update PII, export)", severity: "warning", correct: "TheApplication().Trace() for audit", incorrect: "No logging of sensitive operations" },
75
+ ];
76
+ // --- Public API ---
77
+ export function getSiebelBestPractices() {
78
+ logger.debug("best-practices: returning all rules", { count: RULES.length });
79
+ return RULES;
80
+ }
81
+ export function getBestPracticesByCategory() {
82
+ const categories = {};
83
+ for (const rule of RULES) {
84
+ if (!categories[rule.category]) {
85
+ categories[rule.category] = [];
86
+ }
87
+ categories[rule.category].push(rule);
88
+ }
89
+ logger.debug("best-practices: by category", { categories: Object.keys(categories).length });
90
+ return categories;
91
+ }
92
+ //# sourceMappingURL=best-practices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"best-practices.js","sourceRoot":"","sources":["../../../src/core/siebel/best-practices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Change Simulator — simulates the impact of a change before executing it.
3
+ * Propagates impact through the dependency chain with severity scoring.
4
+ */
5
+ import type { SiebelObject, SiebelObjectRef, SiebelDependency } from "../../schemas/siebel.schema.js";
6
+ export type ChangeAction = "rename_field" | "add_field" | "remove_field" | "change_type" | "modify_bc" | "remove_applet";
7
+ export type Severity = "breaking" | "warning" | "info";
8
+ export type RiskLevel = "low" | "medium" | "high" | "critical";
9
+ export interface ChangeProposal {
10
+ action: ChangeAction;
11
+ targetObject: SiebelObjectRef;
12
+ fieldName?: string;
13
+ newFieldName?: string;
14
+ }
15
+ export interface AffectedObject {
16
+ object: SiebelObjectRef;
17
+ severity: Severity;
18
+ reason: string;
19
+ suggestedAction: string;
20
+ depth: number;
21
+ }
22
+ export interface SimulationResult {
23
+ proposal: ChangeProposal;
24
+ affectedObjects: AffectedObject[];
25
+ riskScore: number;
26
+ riskLevel: RiskLevel;
27
+ }
28
+ /**
29
+ * Simulate the impact of a proposed change across the dependency graph.
30
+ */
31
+ export declare function simulateChange(objects: SiebelObject[], dependencies: SiebelDependency[], proposal: ChangeProposal): SimulationResult;
32
+ //# sourceMappingURL=change-simulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-simulator.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/change-simulator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEtG,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,eAAe,CAAC;AACzH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,EAAE,gBAAgB,EAAE,EAChC,QAAQ,EAAE,cAAc,GACvB,gBAAgB,CA2ElB"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Change Simulator — simulates the impact of a change before executing it.
3
+ * Propagates impact through the dependency chain with severity scoring.
4
+ */
5
+ /**
6
+ * Simulate the impact of a proposed change across the dependency graph.
7
+ */
8
+ export function simulateChange(objects, dependencies, proposal) {
9
+ const objectIndex = new Map();
10
+ for (const obj of objects) {
11
+ objectIndex.set(`${obj.type}:${obj.name}`, obj);
12
+ }
13
+ const target = objectIndex.get(`${proposal.targetObject.type}:${proposal.targetObject.name}`);
14
+ if (!target) {
15
+ return { proposal, affectedObjects: [], riskScore: 0, riskLevel: "low" };
16
+ }
17
+ const affected = [];
18
+ if (proposal.action === "add_field") {
19
+ // Adding a field is non-breaking — just info for dependents
20
+ const dependents = findDependents(proposal.targetObject, dependencies);
21
+ for (const dep of dependents) {
22
+ affected.push({
23
+ object: dep.ref,
24
+ severity: "info",
25
+ reason: `New field "${proposal.fieldName}" added to dependency`,
26
+ suggestedAction: "no-action",
27
+ depth: dep.depth,
28
+ });
29
+ }
30
+ }
31
+ else if (proposal.action === "remove_field" || proposal.action === "rename_field") {
32
+ const fieldName = proposal.fieldName ?? "";
33
+ // Find direct dependents (applets using this BC)
34
+ const directDeps = findDependents(proposal.targetObject, dependencies);
35
+ for (const dep of directDeps) {
36
+ const depObj = objectIndex.get(`${dep.ref.type}:${dep.ref.name}`);
37
+ if (!depObj)
38
+ continue;
39
+ // Check if the dependent references the field
40
+ const referencesField = depObj.children.some((child) => {
41
+ const fieldProp = child.properties.find((p) => p.name === "FIELD");
42
+ return fieldProp?.value === fieldName;
43
+ });
44
+ if (referencesField) {
45
+ affected.push({
46
+ object: dep.ref,
47
+ severity: "breaking",
48
+ reason: proposal.action === "remove_field"
49
+ ? `Control references removed field "${fieldName}"`
50
+ : `Control references renamed field "${fieldName}" → "${proposal.newFieldName}"`,
51
+ suggestedAction: "update",
52
+ depth: dep.depth,
53
+ });
54
+ }
55
+ else if (dep.depth === 1) {
56
+ affected.push({
57
+ object: dep.ref,
58
+ severity: "warning",
59
+ reason: `Direct dependent of modified BC`,
60
+ suggestedAction: "review",
61
+ depth: dep.depth,
62
+ });
63
+ }
64
+ else {
65
+ affected.push({
66
+ object: dep.ref,
67
+ severity: "info",
68
+ reason: `Transitive dependent (depth ${dep.depth})`,
69
+ suggestedAction: "no-action",
70
+ depth: dep.depth,
71
+ });
72
+ }
73
+ }
74
+ }
75
+ const riskScore = computeRiskScore(affected);
76
+ const riskLevel = scoreToLevel(riskScore);
77
+ return { proposal, affectedObjects: affected, riskScore, riskLevel };
78
+ }
79
+ function findDependents(target, dependencies) {
80
+ const result = [];
81
+ const visited = new Set();
82
+ const queue = [];
83
+ // Find objects that depend ON the target (reverse lookup)
84
+ const key = `${target.type}:${target.name}`;
85
+ visited.add(key);
86
+ for (const dep of dependencies) {
87
+ const toKey = `${dep.to.type}:${dep.to.name}`;
88
+ if (toKey === key) {
89
+ const fromKey = `${dep.from.type}:${dep.from.name}`;
90
+ if (!visited.has(fromKey)) {
91
+ visited.add(fromKey);
92
+ const ref = { ref: dep.from, depth: 1 };
93
+ result.push(ref);
94
+ queue.push(ref);
95
+ }
96
+ }
97
+ }
98
+ // BFS for transitive dependents
99
+ while (queue.length > 0) {
100
+ const current = queue.shift();
101
+ const currentKey = `${current.ref.type}:${current.ref.name}`;
102
+ for (const dep of dependencies) {
103
+ const toKey = `${dep.to.type}:${dep.to.name}`;
104
+ if (toKey === currentKey) {
105
+ const fromKey = `${dep.from.type}:${dep.from.name}`;
106
+ if (!visited.has(fromKey)) {
107
+ visited.add(fromKey);
108
+ const ref = { ref: dep.from, depth: current.depth + 1 };
109
+ result.push(ref);
110
+ queue.push(ref);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return result;
116
+ }
117
+ function computeRiskScore(affected) {
118
+ let score = 0;
119
+ for (const a of affected) {
120
+ if (a.severity === "breaking")
121
+ score += 30;
122
+ else if (a.severity === "warning")
123
+ score += 10;
124
+ else
125
+ score += 2;
126
+ }
127
+ return score;
128
+ }
129
+ function scoreToLevel(score) {
130
+ if (score >= 60)
131
+ return "critical";
132
+ if (score >= 30)
133
+ return "high";
134
+ if (score >= 10)
135
+ return "medium";
136
+ return "low";
137
+ }
138
+ //# sourceMappingURL=change-simulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-simulator.js","sourceRoot":"","sources":["../../../src/core/siebel/change-simulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
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 type { SiebelObject } from "../../schemas/siebel.schema.js";
7
+ import { type SifDiffResult } from "./sif-diff.js";
8
+ export interface CloneAdaptRequest {
9
+ readonly source: SiebelObject;
10
+ readonly newName: string;
11
+ readonly renames: Readonly<Record<string, string>>;
12
+ readonly addChildren?: readonly SiebelObject[];
13
+ readonly removeChildren?: readonly string[];
14
+ }
15
+ export interface CloneAdaptResult {
16
+ readonly cloned: SiebelObject;
17
+ readonly diff: SifDiffResult;
18
+ readonly renamesApplied: number;
19
+ }
20
+ export declare function cloneAndAdapt(request: CloneAdaptRequest): CloneAdaptResult;
21
+ //# sourceMappingURL=clone-adapt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone-adapt.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/clone-adapt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AA+HD,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAqD1E"}