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