@jterrats/smart-deployment 1.0.3

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 (395) hide show
  1. package/README.md +193 -0
  2. package/lib/ai/agentforce-error-handler.d.ts +81 -0
  3. package/lib/ai/agentforce-error-handler.js +196 -0
  4. package/lib/ai/agentforce-error-handler.js.map +1 -0
  5. package/lib/ai/agentforce-priority-service.d.ts +82 -0
  6. package/lib/ai/agentforce-priority-service.js +257 -0
  7. package/lib/ai/agentforce-priority-service.js.map +1 -0
  8. package/lib/ai/agentforce-service.d.ts +99 -0
  9. package/lib/ai/agentforce-service.js +300 -0
  10. package/lib/ai/agentforce-service.js.map +1 -0
  11. package/lib/ai/circuit-breaker.d.ts +115 -0
  12. package/lib/ai/circuit-breaker.js +277 -0
  13. package/lib/ai/circuit-breaker.js.map +1 -0
  14. package/lib/ai/dependency-inference-service.d.ts +76 -0
  15. package/lib/ai/dependency-inference-service.js +220 -0
  16. package/lib/ai/dependency-inference-service.js.map +1 -0
  17. package/lib/ai/llm-provider-factory.d.ts +15 -0
  18. package/lib/ai/llm-provider-factory.js +36 -0
  19. package/lib/ai/llm-provider-factory.js.map +1 -0
  20. package/lib/ai/llm-provider.d.ts +27 -0
  21. package/lib/ai/llm-provider.js +2 -0
  22. package/lib/ai/llm-provider.js.map +1 -0
  23. package/lib/ai/openai-service.d.ts +20 -0
  24. package/lib/ai/openai-service.js +89 -0
  25. package/lib/ai/openai-service.js.map +1 -0
  26. package/lib/ai/prompt-builder.d.ts +79 -0
  27. package/lib/ai/prompt-builder.js +180 -0
  28. package/lib/ai/prompt-builder.js.map +1 -0
  29. package/lib/ai/response-parser.d.ts +67 -0
  30. package/lib/ai/response-parser.js +234 -0
  31. package/lib/ai/response-parser.js.map +1 -0
  32. package/lib/ai/wave-validation-service.d.ts +111 -0
  33. package/lib/ai/wave-validation-service.js +381 -0
  34. package/lib/ai/wave-validation-service.js.map +1 -0
  35. package/lib/analysis/analysis-reporter.d.ts +56 -0
  36. package/lib/analysis/analysis-reporter.js +170 -0
  37. package/lib/analysis/analysis-reporter.js.map +1 -0
  38. package/lib/analytics/error-analytics.d.ts +80 -0
  39. package/lib/analytics/error-analytics.js +162 -0
  40. package/lib/analytics/error-analytics.js.map +1 -0
  41. package/lib/commands/analyze.d.ts +49 -0
  42. package/lib/commands/analyze.js +232 -0
  43. package/lib/commands/analyze.js.map +1 -0
  44. package/lib/commands/config.d.ts +42 -0
  45. package/lib/commands/config.js +219 -0
  46. package/lib/commands/config.js.map +1 -0
  47. package/lib/commands/resume.d.ts +26 -0
  48. package/lib/commands/resume.js +69 -0
  49. package/lib/commands/resume.js.map +1 -0
  50. package/lib/commands/start.d.ts +70 -0
  51. package/lib/commands/start.js +659 -0
  52. package/lib/commands/start.js.map +1 -0
  53. package/lib/commands/status.d.ts +37 -0
  54. package/lib/commands/status.js +69 -0
  55. package/lib/commands/status.js.map +1 -0
  56. package/lib/commands/validate.d.ts +33 -0
  57. package/lib/commands/validate.js +66 -0
  58. package/lib/commands/validate.js.map +1 -0
  59. package/lib/config/repo-config.d.ts +22 -0
  60. package/lib/config/repo-config.js +31 -0
  61. package/lib/config/repo-config.js.map +1 -0
  62. package/lib/constants/agentforce-limits.d.ts +174 -0
  63. package/lib/constants/agentforce-limits.js +262 -0
  64. package/lib/constants/agentforce-limits.js.map +1 -0
  65. package/lib/constants/api-version.d.ts +70 -0
  66. package/lib/constants/api-version.js +122 -0
  67. package/lib/constants/api-version.js.map +1 -0
  68. package/lib/constants/deployment-order.d.ts +68 -0
  69. package/lib/constants/deployment-order.js +162 -0
  70. package/lib/constants/deployment-order.js.map +1 -0
  71. package/lib/constants/salesforce-limits.d.ts +107 -0
  72. package/lib/constants/salesforce-limits.js +104 -0
  73. package/lib/constants/salesforce-limits.js.map +1 -0
  74. package/lib/dependencies/circular-dependency-detector.d.ts +137 -0
  75. package/lib/dependencies/circular-dependency-detector.js +329 -0
  76. package/lib/dependencies/circular-dependency-detector.js.map +1 -0
  77. package/lib/dependencies/cycle-remediation-planner.d.ts +50 -0
  78. package/lib/dependencies/cycle-remediation-planner.js +192 -0
  79. package/lib/dependencies/cycle-remediation-planner.js.map +1 -0
  80. package/lib/dependencies/dependency-cache.d.ts +134 -0
  81. package/lib/dependencies/dependency-cache.js +303 -0
  82. package/lib/dependencies/dependency-cache.js.map +1 -0
  83. package/lib/dependencies/dependency-depth-calculator.d.ts +145 -0
  84. package/lib/dependencies/dependency-depth-calculator.js +368 -0
  85. package/lib/dependencies/dependency-depth-calculator.js.map +1 -0
  86. package/lib/dependencies/dependency-graph-builder.d.ts +151 -0
  87. package/lib/dependencies/dependency-graph-builder.js +411 -0
  88. package/lib/dependencies/dependency-graph-builder.js.map +1 -0
  89. package/lib/dependencies/dependency-impact-analyzer.d.ts +145 -0
  90. package/lib/dependencies/dependency-impact-analyzer.js +330 -0
  91. package/lib/dependencies/dependency-impact-analyzer.js.map +1 -0
  92. package/lib/dependencies/dependency-merger.d.ts +122 -0
  93. package/lib/dependencies/dependency-merger.js +245 -0
  94. package/lib/dependencies/dependency-merger.js.map +1 -0
  95. package/lib/dependencies/dependency-resolver.d.ts +157 -0
  96. package/lib/dependencies/dependency-resolver.js +298 -0
  97. package/lib/dependencies/dependency-resolver.js.map +1 -0
  98. package/lib/dependencies/dependency-validator.d.ts +123 -0
  99. package/lib/dependencies/dependency-validator.js +291 -0
  100. package/lib/dependencies/dependency-validator.js.map +1 -0
  101. package/lib/dependencies/graph-visualizer.d.ts +110 -0
  102. package/lib/dependencies/graph-visualizer.js +262 -0
  103. package/lib/dependencies/graph-visualizer.js.map +1 -0
  104. package/lib/dependencies/heuristic-inference.d.ts +136 -0
  105. package/lib/dependencies/heuristic-inference.js +430 -0
  106. package/lib/dependencies/heuristic-inference.js.map +1 -0
  107. package/lib/deployment/cycle-source-editor.d.ts +34 -0
  108. package/lib/deployment/cycle-source-editor.js +121 -0
  109. package/lib/deployment/cycle-source-editor.js.map +1 -0
  110. package/lib/deployment/deployment-error-handler.d.ts +38 -0
  111. package/lib/deployment/deployment-error-handler.js +79 -0
  112. package/lib/deployment/deployment-error-handler.js.map +1 -0
  113. package/lib/deployment/deployment-reporter.d.ts +63 -0
  114. package/lib/deployment/deployment-reporter.js +150 -0
  115. package/lib/deployment/deployment-reporter.js.map +1 -0
  116. package/lib/deployment/deployment-state-summary.d.ts +38 -0
  117. package/lib/deployment/deployment-state-summary.js +209 -0
  118. package/lib/deployment/deployment-state-summary.js.map +1 -0
  119. package/lib/deployment/deployment-status-service.d.ts +36 -0
  120. package/lib/deployment/deployment-status-service.js +128 -0
  121. package/lib/deployment/deployment-status-service.js.map +1 -0
  122. package/lib/deployment/deployment-tracker.d.ts +42 -0
  123. package/lib/deployment/deployment-tracker.js +79 -0
  124. package/lib/deployment/deployment-tracker.js.map +1 -0
  125. package/lib/deployment/deployment-validation-service.d.ts +28 -0
  126. package/lib/deployment/deployment-validation-service.js +161 -0
  127. package/lib/deployment/deployment-validation-service.js.map +1 -0
  128. package/lib/deployment/retry-handler.d.ts +37 -0
  129. package/lib/deployment/retry-handler.js +86 -0
  130. package/lib/deployment/retry-handler.js.map +1 -0
  131. package/lib/deployment/sf-cli-integration.d.ts +42 -0
  132. package/lib/deployment/sf-cli-integration.js +105 -0
  133. package/lib/deployment/sf-cli-integration.js.map +1 -0
  134. package/lib/deployment/state-manager.d.ts +61 -0
  135. package/lib/deployment/state-manager.js +83 -0
  136. package/lib/deployment/state-manager.js.map +1 -0
  137. package/lib/deployment/test-executor.d.ts +41 -0
  138. package/lib/deployment/test-executor.js +87 -0
  139. package/lib/deployment/test-executor.js.map +1 -0
  140. package/lib/errors/base-error.d.ts +24 -0
  141. package/lib/errors/base-error.js +66 -0
  142. package/lib/errors/base-error.js.map +1 -0
  143. package/lib/errors/dependency-error.d.ts +37 -0
  144. package/lib/errors/dependency-error.js +76 -0
  145. package/lib/errors/dependency-error.js.map +1 -0
  146. package/lib/errors/deployment-error.d.ts +55 -0
  147. package/lib/errors/deployment-error.js +132 -0
  148. package/lib/errors/deployment-error.js.map +1 -0
  149. package/lib/errors/index.d.ts +45 -0
  150. package/lib/errors/index.js +71 -0
  151. package/lib/errors/index.js.map +1 -0
  152. package/lib/errors/network-error.d.ts +53 -0
  153. package/lib/errors/network-error.js +111 -0
  154. package/lib/errors/network-error.js.map +1 -0
  155. package/lib/errors/parsing-error.d.ts +41 -0
  156. package/lib/errors/parsing-error.js +69 -0
  157. package/lib/errors/parsing-error.js.map +1 -0
  158. package/lib/errors/validation-error-reporter.d.ts +34 -0
  159. package/lib/errors/validation-error-reporter.js +99 -0
  160. package/lib/errors/validation-error-reporter.js.map +1 -0
  161. package/lib/errors/validation-error.d.ts +58 -0
  162. package/lib/errors/validation-error.js +131 -0
  163. package/lib/errors/validation-error.js.map +1 -0
  164. package/lib/index.d.ts +2 -0
  165. package/lib/index.js +2 -0
  166. package/lib/index.js.map +1 -0
  167. package/lib/monitoring/performance-monitor.d.ts +98 -0
  168. package/lib/monitoring/performance-monitor.js +260 -0
  169. package/lib/monitoring/performance-monitor.js.map +1 -0
  170. package/lib/parsers/apex-class-parser.d.ts +47 -0
  171. package/lib/parsers/apex-class-parser.js +368 -0
  172. package/lib/parsers/apex-class-parser.js.map +1 -0
  173. package/lib/parsers/apex-trigger-parser.d.ts +48 -0
  174. package/lib/parsers/apex-trigger-parser.js +229 -0
  175. package/lib/parsers/apex-trigger-parser.js.map +1 -0
  176. package/lib/parsers/aura-parser.d.ts +55 -0
  177. package/lib/parsers/aura-parser.js +229 -0
  178. package/lib/parsers/aura-parser.js.map +1 -0
  179. package/lib/parsers/bot-parser.d.ts +65 -0
  180. package/lib/parsers/bot-parser.js +225 -0
  181. package/lib/parsers/bot-parser.js.map +1 -0
  182. package/lib/parsers/custom-metadata-parser.d.ts +94 -0
  183. package/lib/parsers/custom-metadata-parser.js +199 -0
  184. package/lib/parsers/custom-metadata-parser.js.map +1 -0
  185. package/lib/parsers/custom-object-parser.d.ts +62 -0
  186. package/lib/parsers/custom-object-parser.js +297 -0
  187. package/lib/parsers/custom-object-parser.js.map +1 -0
  188. package/lib/parsers/email-template-parser.d.ts +64 -0
  189. package/lib/parsers/email-template-parser.js +238 -0
  190. package/lib/parsers/email-template-parser.js.map +1 -0
  191. package/lib/parsers/error-resilient-parser.d.ts +110 -0
  192. package/lib/parsers/error-resilient-parser.js +277 -0
  193. package/lib/parsers/error-resilient-parser.js.map +1 -0
  194. package/lib/parsers/flexipage-parser.d.ts +64 -0
  195. package/lib/parsers/flexipage-parser.js +196 -0
  196. package/lib/parsers/flexipage-parser.js.map +1 -0
  197. package/lib/parsers/flow-parser.d.ts +54 -0
  198. package/lib/parsers/flow-parser.js +287 -0
  199. package/lib/parsers/flow-parser.js.map +1 -0
  200. package/lib/parsers/genai-prompt-parser.d.ts +67 -0
  201. package/lib/parsers/genai-prompt-parser.js +160 -0
  202. package/lib/parsers/genai-prompt-parser.js.map +1 -0
  203. package/lib/parsers/layout-parser.d.ts +64 -0
  204. package/lib/parsers/layout-parser.js +267 -0
  205. package/lib/parsers/layout-parser.js.map +1 -0
  206. package/lib/parsers/lwc-parser.d.ts +60 -0
  207. package/lib/parsers/lwc-parser.js +264 -0
  208. package/lib/parsers/lwc-parser.js.map +1 -0
  209. package/lib/parsers/permission-set-parser.d.ts +86 -0
  210. package/lib/parsers/permission-set-parser.js +152 -0
  211. package/lib/parsers/permission-set-parser.js.map +1 -0
  212. package/lib/parsers/profile-parser.d.ts +81 -0
  213. package/lib/parsers/profile-parser.js +141 -0
  214. package/lib/parsers/profile-parser.js.map +1 -0
  215. package/lib/parsers/visualforce-parser.d.ts +47 -0
  216. package/lib/parsers/visualforce-parser.js +180 -0
  217. package/lib/parsers/visualforce-parser.js.map +1 -0
  218. package/lib/provisioning/data-provisioner.d.ts +88 -0
  219. package/lib/provisioning/data-provisioner.js +257 -0
  220. package/lib/provisioning/data-provisioner.js.map +1 -0
  221. package/lib/scanner/custom-structure-scanner.d.ts +66 -0
  222. package/lib/scanner/custom-structure-scanner.js +229 -0
  223. package/lib/scanner/custom-structure-scanner.js.map +1 -0
  224. package/lib/scanner/forceignore-parser.d.ts +69 -0
  225. package/lib/scanner/forceignore-parser.js +195 -0
  226. package/lib/scanner/forceignore-parser.js.map +1 -0
  227. package/lib/scanner/metadata-format-scanner.d.ts +77 -0
  228. package/lib/scanner/metadata-format-scanner.js +282 -0
  229. package/lib/scanner/metadata-format-scanner.js.map +1 -0
  230. package/lib/scanner/monorepo-scanner.d.ts +71 -0
  231. package/lib/scanner/monorepo-scanner.js +225 -0
  232. package/lib/scanner/monorepo-scanner.js.map +1 -0
  233. package/lib/scanner/project-validator.d.ts +55 -0
  234. package/lib/scanner/project-validator.js +235 -0
  235. package/lib/scanner/project-validator.js.map +1 -0
  236. package/lib/scanner/sfdx-project-detector.d.ts +86 -0
  237. package/lib/scanner/sfdx-project-detector.js +240 -0
  238. package/lib/scanner/sfdx-project-detector.js.map +1 -0
  239. package/lib/scanner/structure-validator.d.ts +64 -0
  240. package/lib/scanner/structure-validator.js +296 -0
  241. package/lib/scanner/structure-validator.js.map +1 -0
  242. package/lib/services/metadata-scanner-service.d.ts +64 -0
  243. package/lib/services/metadata-scanner-service.js +651 -0
  244. package/lib/services/metadata-scanner-service.js.map +1 -0
  245. package/lib/types/agentforce.d.ts +157 -0
  246. package/lib/types/agentforce.js +2 -0
  247. package/lib/types/agentforce.js.map +1 -0
  248. package/lib/types/dependency.d.ts +98 -0
  249. package/lib/types/dependency.js +5 -0
  250. package/lib/types/dependency.js.map +1 -0
  251. package/lib/types/deployment-plan.d.ts +81 -0
  252. package/lib/types/deployment-plan.js +6 -0
  253. package/lib/types/deployment-plan.js.map +1 -0
  254. package/lib/types/deployment.d.ts +88 -0
  255. package/lib/types/deployment.js +5 -0
  256. package/lib/types/deployment.js.map +1 -0
  257. package/lib/types/graph.d.ts +35 -0
  258. package/lib/types/graph.js +5 -0
  259. package/lib/types/graph.js.map +1 -0
  260. package/lib/types/index.d.ts +12 -0
  261. package/lib/types/index.js +17 -0
  262. package/lib/types/index.js.map +1 -0
  263. package/lib/types/metadata.d.ts +101 -0
  264. package/lib/types/metadata.js +13 -0
  265. package/lib/types/metadata.js.map +1 -0
  266. package/lib/types/project.d.ts +156 -0
  267. package/lib/types/project.js +56 -0
  268. package/lib/types/project.js.map +1 -0
  269. package/lib/types/salesforce/apex.d.ts +94 -0
  270. package/lib/types/salesforce/apex.js +6 -0
  271. package/lib/types/salesforce/apex.js.map +1 -0
  272. package/lib/types/salesforce/aura.d.ts +150 -0
  273. package/lib/types/salesforce/aura.js +6 -0
  274. package/lib/types/salesforce/aura.js.map +1 -0
  275. package/lib/types/salesforce/bot.d.ts +293 -0
  276. package/lib/types/salesforce/bot.js +6 -0
  277. package/lib/types/salesforce/bot.js.map +1 -0
  278. package/lib/types/salesforce/common.d.ts +15 -0
  279. package/lib/types/salesforce/common.js +5 -0
  280. package/lib/types/salesforce/common.js.map +1 -0
  281. package/lib/types/salesforce/custom-metadata.d.ts +92 -0
  282. package/lib/types/salesforce/custom-metadata.js +6 -0
  283. package/lib/types/salesforce/custom-metadata.js.map +1 -0
  284. package/lib/types/salesforce/email.d.ts +56 -0
  285. package/lib/types/salesforce/email.js +6 -0
  286. package/lib/types/salesforce/email.js.map +1 -0
  287. package/lib/types/salesforce/flexipage.d.ts +149 -0
  288. package/lib/types/salesforce/flexipage.js +6 -0
  289. package/lib/types/salesforce/flexipage.js.map +1 -0
  290. package/lib/types/salesforce/flow.d.ts +516 -0
  291. package/lib/types/salesforce/flow.js +6 -0
  292. package/lib/types/salesforce/flow.js.map +1 -0
  293. package/lib/types/salesforce/genai.d.ts +67 -0
  294. package/lib/types/salesforce/genai.js +6 -0
  295. package/lib/types/salesforce/genai.js.map +1 -0
  296. package/lib/types/salesforce/index.d.ts +27 -0
  297. package/lib/types/salesforce/index.js +43 -0
  298. package/lib/types/salesforce/index.js.map +1 -0
  299. package/lib/types/salesforce/layout.d.ts +236 -0
  300. package/lib/types/salesforce/layout.js +6 -0
  301. package/lib/types/salesforce/layout.js.map +1 -0
  302. package/lib/types/salesforce/lwc.d.ts +123 -0
  303. package/lib/types/salesforce/lwc.js +6 -0
  304. package/lib/types/salesforce/lwc.js.map +1 -0
  305. package/lib/types/salesforce/object.d.ts +427 -0
  306. package/lib/types/salesforce/object.js +6 -0
  307. package/lib/types/salesforce/object.js.map +1 -0
  308. package/lib/types/salesforce/parser-types.d.ts +79 -0
  309. package/lib/types/salesforce/parser-types.js +80 -0
  310. package/lib/types/salesforce/parser-types.js.map +1 -0
  311. package/lib/types/salesforce/permission.d.ts +289 -0
  312. package/lib/types/salesforce/permission.js +6 -0
  313. package/lib/types/salesforce/permission.js.map +1 -0
  314. package/lib/types/salesforce/resource.d.ts +93 -0
  315. package/lib/types/salesforce/resource.js +6 -0
  316. package/lib/types/salesforce/resource.js.map +1 -0
  317. package/lib/types/salesforce/visualforce.d.ts +70 -0
  318. package/lib/types/salesforce/visualforce.js +6 -0
  319. package/lib/types/salesforce/visualforce.js.map +1 -0
  320. package/lib/utils/cache-manager.d.ts +158 -0
  321. package/lib/utils/cache-manager.js +429 -0
  322. package/lib/utils/cache-manager.js.map +1 -0
  323. package/lib/utils/deployment-plan-manager.d.ts +40 -0
  324. package/lib/utils/deployment-plan-manager.js +183 -0
  325. package/lib/utils/deployment-plan-manager.js.map +1 -0
  326. package/lib/utils/error-aggregator.d.ts +117 -0
  327. package/lib/utils/error-aggregator.js +268 -0
  328. package/lib/utils/error-aggregator.js.map +1 -0
  329. package/lib/utils/file-system.d.ts +62 -0
  330. package/lib/utils/file-system.js +167 -0
  331. package/lib/utils/file-system.js.map +1 -0
  332. package/lib/utils/functional.d.ts +52 -0
  333. package/lib/utils/functional.js +61 -0
  334. package/lib/utils/functional.js.map +1 -0
  335. package/lib/utils/graph-algorithms.d.ts +53 -0
  336. package/lib/utils/graph-algorithms.js +177 -0
  337. package/lib/utils/graph-algorithms.js.map +1 -0
  338. package/lib/utils/logger.d.ts +154 -0
  339. package/lib/utils/logger.js +327 -0
  340. package/lib/utils/logger.js.map +1 -0
  341. package/lib/utils/network-handler.d.ts +64 -0
  342. package/lib/utils/network-handler.js +147 -0
  343. package/lib/utils/network-handler.js.map +1 -0
  344. package/lib/utils/performance.d.ts +148 -0
  345. package/lib/utils/performance.js +294 -0
  346. package/lib/utils/performance.js.map +1 -0
  347. package/lib/utils/string.d.ts +197 -0
  348. package/lib/utils/string.js +331 -0
  349. package/lib/utils/string.js.map +1 -0
  350. package/lib/utils/xml.d.ts +97 -0
  351. package/lib/utils/xml.js +227 -0
  352. package/lib/utils/xml.js.map +1 -0
  353. package/lib/validators/xml-metadata-validator.d.ts +106 -0
  354. package/lib/validators/xml-metadata-validator.js +509 -0
  355. package/lib/validators/xml-metadata-validator.js.map +1 -0
  356. package/lib/waves/priority-wave-generator-ai.d.ts +85 -0
  357. package/lib/waves/priority-wave-generator-ai.js +191 -0
  358. package/lib/waves/priority-wave-generator-ai.js.map +1 -0
  359. package/lib/waves/priority-wave-generator.d.ts +47 -0
  360. package/lib/waves/priority-wave-generator.js +88 -0
  361. package/lib/waves/priority-wave-generator.js.map +1 -0
  362. package/lib/waves/test-optimizer.d.ts +155 -0
  363. package/lib/waves/test-optimizer.js +290 -0
  364. package/lib/waves/test-optimizer.js.map +1 -0
  365. package/lib/waves/wave-builder.d.ts +147 -0
  366. package/lib/waves/wave-builder.js +286 -0
  367. package/lib/waves/wave-builder.js.map +1 -0
  368. package/lib/waves/wave-diff-generator.d.ts +17 -0
  369. package/lib/waves/wave-diff-generator.js +6 -0
  370. package/lib/waves/wave-diff-generator.js.map +1 -0
  371. package/lib/waves/wave-executor.d.ts +33 -0
  372. package/lib/waves/wave-executor.js +50 -0
  373. package/lib/waves/wave-executor.js.map +1 -0
  374. package/lib/waves/wave-merger.d.ts +96 -0
  375. package/lib/waves/wave-merger.js +181 -0
  376. package/lib/waves/wave-merger.js.map +1 -0
  377. package/lib/waves/wave-metadata-generator.d.ts +13 -0
  378. package/lib/waves/wave-metadata-generator.js +12 -0
  379. package/lib/waves/wave-metadata-generator.js.map +1 -0
  380. package/lib/waves/wave-splitter.d.ts +154 -0
  381. package/lib/waves/wave-splitter.js +307 -0
  382. package/lib/waves/wave-splitter.js.map +1 -0
  383. package/lib/waves/wave-validator.d.ts +17 -0
  384. package/lib/waves/wave-validator.js +15 -0
  385. package/lib/waves/wave-validator.js.map +1 -0
  386. package/messages/analyze.json +18 -0
  387. package/messages/config.json +29 -0
  388. package/messages/resume.json +9 -0
  389. package/messages/start.json +24 -0
  390. package/messages/status.json +8 -0
  391. package/messages/validate.json +9 -0
  392. package/npm-shrinkwrap.json +25676 -0
  393. package/oclif.lock +11988 -0
  394. package/oclif.manifest.json +589 -0
  395. package/package.json +224 -0
@@ -0,0 +1,429 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ /**
5
+ * Simple internal logger for CacheManager
6
+ * TODO: Replace with Logger utility when Issue #7 is completed
7
+ */
8
+ const logger = {
9
+ warn: (message, context) => {
10
+ const timestamp = new Date().toISOString();
11
+ const contextStr = context ? ` ${JSON.stringify(context)}` : '';
12
+ // eslint-disable-next-line no-console
13
+ console.warn(`[${timestamp}] [WARN] [CacheManager] ${message}${contextStr}`);
14
+ },
15
+ error: (message, context) => {
16
+ const timestamp = new Date().toISOString();
17
+ const contextStr = context ? ` ${JSON.stringify(context)}` : '';
18
+ // eslint-disable-next-line no-console
19
+ console.error(`[${timestamp}] [ERROR] [CacheManager] ${message}${contextStr}`);
20
+ },
21
+ };
22
+ /**
23
+ * Generate safe filename from cache key
24
+ */
25
+ function getCacheFileName(key) {
26
+ const hash = Buffer.from(key).toString('base64').replaceAll(/[/+=]/g, '_');
27
+ return `cache_${hash}.json`;
28
+ }
29
+ /**
30
+ * Default cache configuration
31
+ */
32
+ const DEFAULT_CONFIG = {
33
+ maxSize: 1000,
34
+ ttlMs: 3_600_000, // 1 hour
35
+ enablePersistence: false,
36
+ enableLocking: true,
37
+ };
38
+ /**
39
+ * Singleton Cache Manager with TTL, persistence, and locking
40
+ *
41
+ * **Singleton Pattern**: Ensures only one instance exists per process
42
+ * **File Locking**: Prevents concurrent access across processes
43
+ * **Thread-safe**: Safe for concurrent operations within same process
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const cache = CacheManager.getInstance();
48
+ * await cache.set('key', { data: 'value' });
49
+ * const value = await cache.get('key');
50
+ * ```
51
+ */
52
+ export class CacheManager {
53
+ static instance = null;
54
+ static lockFilePath = null;
55
+ cache;
56
+ config;
57
+ stats;
58
+ lockFileHandle = null;
59
+ /**
60
+ * Private constructor - use getInstance() instead
61
+ * Singleton pattern prevents multiple instances
62
+ */
63
+ constructor(config) {
64
+ this.config = { ...DEFAULT_CONFIG, ...config };
65
+ this.cache = new Map();
66
+ this.stats = {
67
+ hits: 0,
68
+ misses: 0,
69
+ hitRate: 0,
70
+ size: 0,
71
+ evictions: 0,
72
+ memorySizeBytes: 0,
73
+ };
74
+ }
75
+ /**
76
+ * Get singleton instance
77
+ * Thread-safe within same process
78
+ */
79
+ static getInstance(config) {
80
+ if (!CacheManager.instance) {
81
+ CacheManager.instance = new CacheManager(config);
82
+ }
83
+ return CacheManager.instance;
84
+ }
85
+ /**
86
+ * Reset singleton (for testing only)
87
+ */
88
+ static resetInstance() {
89
+ if (CacheManager.instance?.lockFileHandle) {
90
+ void CacheManager.instance.releaseLock();
91
+ }
92
+ CacheManager.instance = null;
93
+ CacheManager.lockFilePath = null;
94
+ }
95
+ /**
96
+ * Acquire file lock to prevent concurrent access across processes
97
+ *
98
+ * @param orgAlias - Salesforce org alias to lock
99
+ * @returns True if lock acquired, false if already locked
100
+ */
101
+ async acquireLock(orgAlias) {
102
+ if (!this.config.enableLocking) {
103
+ return true;
104
+ }
105
+ try {
106
+ const lockDir = path.join(os.tmpdir(), 'sf-smart-deployment-locks');
107
+ await fs.mkdir(lockDir, { recursive: true });
108
+ const lockFileName = `${orgAlias.replaceAll(/[^\w-]/g, '_')}.lock`;
109
+ CacheManager.lockFilePath = path.join(lockDir, lockFileName);
110
+ // Try to open lock file exclusively (fails if already locked)
111
+ this.lockFileHandle = await fs.open(CacheManager.lockFilePath, 'wx');
112
+ // Write process info to lock file
113
+ const lockInfo = {
114
+ pid: process.pid,
115
+ orgAlias,
116
+ timestamp: new Date().toISOString(),
117
+ hostname: os.hostname(),
118
+ };
119
+ await this.lockFileHandle.writeFile(JSON.stringify(lockInfo, null, 2));
120
+ return true;
121
+ }
122
+ catch (error) {
123
+ // Lock file already exists - another process is running
124
+ if (error.code === 'EEXIST') {
125
+ return false;
126
+ }
127
+ // Other errors - log but don't block deployments
128
+ logger.warn('Failed to acquire lock, continuing without locking', { error, orgAlias });
129
+ return true;
130
+ }
131
+ }
132
+ /**
133
+ * Release file lock
134
+ */
135
+ async releaseLock() {
136
+ if (!this.lockFileHandle || !CacheManager.lockFilePath) {
137
+ return;
138
+ }
139
+ try {
140
+ await this.lockFileHandle.close();
141
+ await fs.unlink(CacheManager.lockFilePath);
142
+ this.lockFileHandle = null;
143
+ CacheManager.lockFilePath = null;
144
+ }
145
+ catch (error) {
146
+ logger.warn('Failed to release lock', { error, lockFilePath: CacheManager.lockFilePath });
147
+ }
148
+ }
149
+ /**
150
+ * Check if another instance is running for the same org
151
+ */
152
+ async isLocked(orgAlias) {
153
+ if (!this.config.enableLocking) {
154
+ return false;
155
+ }
156
+ try {
157
+ const lockDir = path.join(os.tmpdir(), 'sf-smart-deployment-locks');
158
+ const lockFileName = `${orgAlias.replaceAll(/[^\w-]/g, '_')}.lock`;
159
+ const lockFilePath = path.join(lockDir, lockFileName);
160
+ const lockContent = await fs.readFile(lockFilePath, 'utf-8');
161
+ const lockInfo = JSON.parse(lockContent);
162
+ // Check if process is still running
163
+ try {
164
+ process.kill(lockInfo.pid, 0); // Signal 0 = check existence
165
+ return lockInfo; // Process exists
166
+ }
167
+ catch {
168
+ // Process doesn't exist - stale lock, remove it
169
+ await fs.unlink(lockFilePath);
170
+ return false;
171
+ }
172
+ }
173
+ catch {
174
+ // Lock file doesn't exist
175
+ return false;
176
+ }
177
+ }
178
+ /**
179
+ * Get value from cache
180
+ */
181
+ get(key) {
182
+ const entry = this.cache.get(key);
183
+ if (!entry) {
184
+ this.stats.misses++;
185
+ this.updateHitRate();
186
+ return null;
187
+ }
188
+ // Check if expired
189
+ if (Date.now() > entry.expiresAt) {
190
+ this.cache.delete(key);
191
+ this.stats.misses++;
192
+ this.updateHitRate();
193
+ return null;
194
+ }
195
+ // Update hit count
196
+ entry.hits++;
197
+ this.stats.hits++;
198
+ this.updateHitRate();
199
+ return entry.value;
200
+ }
201
+ /**
202
+ * Set value in cache with TTL
203
+ */
204
+ async set(key, value, ttlMs) {
205
+ const ttl = ttlMs ?? this.config.ttlMs;
206
+ const now = Date.now();
207
+ // Evict if at capacity
208
+ if (this.cache.size >= this.config.maxSize) {
209
+ this.evictOldest();
210
+ }
211
+ const entry = {
212
+ value,
213
+ expiresAt: now + ttl,
214
+ createdAt: now,
215
+ hits: 0,
216
+ };
217
+ this.cache.set(key, entry);
218
+ this.stats.size = this.cache.size;
219
+ // Persist to disk if enabled
220
+ if (this.config.enablePersistence) {
221
+ await this.persistEntry(key, entry);
222
+ }
223
+ }
224
+ /**
225
+ * Check if key exists and is not expired
226
+ */
227
+ has(key) {
228
+ const value = this.get(key);
229
+ return value !== null;
230
+ }
231
+ /**
232
+ * Delete specific key
233
+ */
234
+ async delete(key) {
235
+ const deleted = this.cache.delete(key);
236
+ this.stats.size = this.cache.size;
237
+ if (deleted && this.config.enablePersistence) {
238
+ await this.deletePersistedEntry(key);
239
+ }
240
+ return deleted;
241
+ }
242
+ /**
243
+ * Clear all cache entries
244
+ */
245
+ async clear() {
246
+ this.cache.clear();
247
+ this.stats.size = 0;
248
+ this.stats.evictions = 0;
249
+ if (this.config.enablePersistence && this.config.cacheDirectory) {
250
+ try {
251
+ await fs.rm(this.config.cacheDirectory, { recursive: true, force: true });
252
+ }
253
+ catch (error) {
254
+ logger.warn('Failed to clear cache directory', { error, cacheDirectory: this.config.cacheDirectory });
255
+ }
256
+ }
257
+ }
258
+ /**
259
+ * Get cache statistics
260
+ */
261
+ getStats() {
262
+ this.updateMemorySize();
263
+ return { ...this.stats };
264
+ }
265
+ /**
266
+ * Load cache from disk
267
+ */
268
+ async loadFromDisk() {
269
+ if (!this.config.enablePersistence || !this.config.cacheDirectory) {
270
+ return 0;
271
+ }
272
+ try {
273
+ const files = await fs.readdir(this.config.cacheDirectory);
274
+ const cacheFiles = files.filter((file) => file.startsWith('cache_'));
275
+ // Load all files in parallel
276
+ const results = await Promise.all(cacheFiles.map(async (file) => {
277
+ try {
278
+ const filePath = path.join(this.config.cacheDirectory, file);
279
+ const content = await fs.readFile(filePath, 'utf-8');
280
+ const entry = JSON.parse(content);
281
+ // Skip expired entries
282
+ if (Date.now() > entry.expiresAt) {
283
+ await fs.unlink(filePath);
284
+ return null;
285
+ }
286
+ // Reconstruct key from filename
287
+ const hash = file.replace('cache_', '').replace('.json', '');
288
+ return { hash, entry };
289
+ }
290
+ catch (error) {
291
+ logger.warn('Skipping invalid cache file', { error, file });
292
+ return null;
293
+ }
294
+ }));
295
+ // Load valid entries into cache
296
+ let loaded = 0;
297
+ for (const result of results) {
298
+ if (result) {
299
+ this.cache.set(result.hash, result.entry);
300
+ loaded++;
301
+ }
302
+ }
303
+ this.stats.size = this.cache.size;
304
+ return loaded;
305
+ }
306
+ catch (error) {
307
+ logger.error('Failed to load cache from disk', { error, cacheDirectory: this.config.cacheDirectory });
308
+ return 0;
309
+ }
310
+ }
311
+ /**
312
+ * Clean expired entries (garbage collection)
313
+ */
314
+ async cleanExpired() {
315
+ const now = Date.now();
316
+ const expiredKeys = [];
317
+ // Collect expired keys
318
+ for (const [key, entry] of this.cache.entries()) {
319
+ if (now > entry.expiresAt) {
320
+ expiredKeys.push(key);
321
+ }
322
+ }
323
+ // Delete from cache (synchronous)
324
+ for (const key of expiredKeys) {
325
+ this.cache.delete(key);
326
+ }
327
+ // Delete persisted entries in parallel
328
+ if (this.config.enablePersistence && expiredKeys.length > 0) {
329
+ await Promise.all(expiredKeys.map((key) => this.deletePersistedEntry(key)));
330
+ }
331
+ this.stats.size = this.cache.size;
332
+ return expiredKeys.length;
333
+ }
334
+ /**
335
+ * Get all keys in cache
336
+ */
337
+ keys() {
338
+ return Array.from(this.cache.keys());
339
+ }
340
+ /**
341
+ * Get cache size
342
+ */
343
+ size() {
344
+ return this.cache.size;
345
+ }
346
+ /**
347
+ * Update configuration
348
+ */
349
+ configure(config) {
350
+ this.config = { ...this.config, ...config };
351
+ }
352
+ /**
353
+ * Evict oldest entry (LRU-like)
354
+ */
355
+ evictOldest() {
356
+ let oldestKey = null;
357
+ let oldestTime = Infinity;
358
+ for (const [key, entry] of this.cache.entries()) {
359
+ if (entry.createdAt < oldestTime) {
360
+ oldestTime = entry.createdAt;
361
+ oldestKey = key;
362
+ }
363
+ }
364
+ if (oldestKey) {
365
+ this.cache.delete(oldestKey);
366
+ this.stats.evictions++;
367
+ }
368
+ }
369
+ /**
370
+ * Update hit rate calculation
371
+ */
372
+ updateHitRate() {
373
+ const total = this.stats.hits + this.stats.misses;
374
+ this.stats.hitRate = total > 0 ? this.stats.hits / total : 0;
375
+ }
376
+ /**
377
+ * Estimate memory size
378
+ */
379
+ updateMemorySize() {
380
+ let totalSize = 0;
381
+ for (const [key, entry] of this.cache.entries()) {
382
+ // Rough estimation: key + JSON stringified value
383
+ totalSize += key.length * 2; // UTF-16
384
+ totalSize += JSON.stringify(entry.value).length * 2;
385
+ totalSize += 64; // Overhead for metadata
386
+ }
387
+ this.stats.memorySizeBytes = totalSize;
388
+ }
389
+ /**
390
+ * Persist entry to disk
391
+ */
392
+ async persistEntry(key, entry) {
393
+ if (!this.config.cacheDirectory) {
394
+ return;
395
+ }
396
+ try {
397
+ await fs.mkdir(this.config.cacheDirectory, { recursive: true });
398
+ const fileName = getCacheFileName(key);
399
+ const filePath = path.join(this.config.cacheDirectory, fileName);
400
+ await fs.writeFile(filePath, JSON.stringify(entry), 'utf-8');
401
+ }
402
+ catch (error) {
403
+ logger.warn('Failed to persist cache entry', { error, key, cacheDirectory: this.config.cacheDirectory });
404
+ }
405
+ }
406
+ /**
407
+ * Delete persisted entry
408
+ */
409
+ async deletePersistedEntry(key) {
410
+ if (!this.config.cacheDirectory) {
411
+ return;
412
+ }
413
+ try {
414
+ const fileName = getCacheFileName(key);
415
+ const filePath = path.join(this.config.cacheDirectory, fileName);
416
+ await fs.unlink(filePath);
417
+ }
418
+ catch {
419
+ // Ignore if file doesn't exist
420
+ }
421
+ }
422
+ }
423
+ /**
424
+ * Get default cache instance (singleton)
425
+ */
426
+ export function getCacheManager(config) {
427
+ return CacheManager.getInstance(config);
428
+ }
429
+ //# sourceMappingURL=cache-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/utils/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAQ,EAAE;QACjE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,2BAA2B,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,OAAiC,EAAQ,EAAE;QAClE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,4BAA4B,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC3E,OAAO,SAAS,IAAI,OAAO,CAAC;AAC9B,CAAC;AAwCD;;GAEG;AACH,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,SAAS,EAAE,SAAS;IAC3B,iBAAiB,EAAE,KAAK;IACxB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAC,QAAQ,GAAwB,IAAI,CAAC;IAC5C,MAAM,CAAC,YAAY,GAAkB,IAAI,CAAC;IAE1C,KAAK,CAAmC;IACxC,MAAM,CAAc;IACpB,KAAK,CAAa;IAClB,cAAc,GAAyB,IAAI,CAAC;IAEpD;;;OAGG;IACH,YAAoB,MAA6B;QAC/C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,CAAC;YACZ,eAAe,EAAE,CAAC;SACnB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,WAAW,CAAC,MAA6B;QACrD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,aAAa;QACzB,IAAI,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC;YAC1C,KAAK,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC7B,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CAAC,QAAgB;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7C,MAAM,YAAY,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC;YACnE,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAE7D,8DAA8D;YAC9D,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YAErE,kCAAkC;YAClC,MAAM,QAAQ,GAAG;gBACf,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;aACxB,CAAC;YAEF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEvE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wDAAwD;YACxD,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,iDAAiD;YACjD,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,YAAY,CAAC,YAAY,GAAG,IAAI,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAQpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC;YACpE,MAAM,YAAY,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC;YACnE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEtD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAItC,CAAC;YAEF,oCAAoC;YACpC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,6BAA6B;gBAC5D,OAAO,QAAQ,CAAC,CAAC,iBAAiB;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;gBAChD,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACI,GAAG,CAAI,GAAW;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAA8B,CAAC;QAE/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,KAAc;QACvD,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,GAAkB;YAC3B,KAAK;YACL,SAAS,EAAE,GAAG,GAAG,GAAG;YACpB,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,CAAC;SACR,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAA4B,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAElC,6BAA6B;QAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,KAAK,KAAK,IAAI,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAElC,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAClE,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YAErE,6BAA6B;YAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC5B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAe,EAAE,IAAI,CAAC,CAAC;oBAC9D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;oBAEzD,uBAAuB;oBACvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;wBACjC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC1B,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,gCAAgC;oBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5D,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YAEF,gCAAgC;YAChC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC1C,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YACtG,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,uBAAuB;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,IAAI;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,IAAI;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,MAA4B;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,UAAU,GAAG,QAAQ,CAAC;QAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;gBACjC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC7B,SAAS,GAAG,GAAG,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,iDAAiD;YACjD,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS;YACtC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,SAAS,IAAI,EAAE,CAAC,CAAC,wBAAwB;QAC3C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAI,GAAW,EAAE,KAAoB;QAC7D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEhE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAEjE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,GAAW;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YACjE,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;;AAGH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,OAAO,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Deployment Plan Manager
3
+ * Handles loading, saving, and validating deployment plans for CI/CD
4
+ */
5
+ import type { DeploymentPlan, PlanValidationResult, PlanComparison, PriorityOverride } from '../types/deployment-plan.js';
6
+ import type { Wave } from '../waves/wave-builder.js';
7
+ export declare class DeploymentPlanManager {
8
+ private static readonly DEFAULT_PLAN_PATH;
9
+ private static readonly PLAN_VERSION;
10
+ /**
11
+ * Save deployment plan to file
12
+ */
13
+ static savePlan(plan: DeploymentPlan, filePath?: string): Promise<void>;
14
+ /**
15
+ * Load deployment plan from file
16
+ */
17
+ static loadPlan(filePath?: string): Promise<DeploymentPlan>;
18
+ /**
19
+ * Validate plan exists and is readable
20
+ */
21
+ static planExists(filePath?: string): Promise<boolean>;
22
+ /**
23
+ * Create deployment plan from waves and priorities
24
+ */
25
+ static createPlan(waves: Wave[], priorityOverrides: Record<string, PriorityOverride>, options?: {
26
+ aiEnabled?: boolean;
27
+ aiModel?: string;
28
+ orgType?: string;
29
+ industry?: string;
30
+ generatedBy?: string;
31
+ }): DeploymentPlan;
32
+ /**
33
+ * Compare current state with saved plan
34
+ */
35
+ static comparePlans(plan: DeploymentPlan, currentWaves: Wave[]): PlanComparison;
36
+ /**
37
+ * Validate plan against current state
38
+ */
39
+ static validatePlan(plan: DeploymentPlan, currentWaves: Wave[]): PlanValidationResult;
40
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Deployment Plan Manager
3
+ * Handles loading, saving, and validating deployment plans for CI/CD
4
+ */
5
+ import { readFile, writeFile, access } from 'node:fs/promises';
6
+ import { resolve } from 'node:path';
7
+ import { getLogger } from './logger.js';
8
+ const logger = getLogger('DeploymentPlanManager');
9
+ export class DeploymentPlanManager {
10
+ static DEFAULT_PLAN_PATH = '.smart-deployment/deployment-plan.json';
11
+ static PLAN_VERSION = '1.0';
12
+ /**
13
+ * Save deployment plan to file
14
+ */
15
+ static async savePlan(plan, filePath) {
16
+ const path = resolve(filePath ?? this.DEFAULT_PLAN_PATH);
17
+ logger.info('Saving deployment plan', { path });
18
+ try {
19
+ const json = JSON.stringify(plan, null, 2);
20
+ await writeFile(path, json, 'utf-8');
21
+ logger.info('Deployment plan saved successfully', {
22
+ path,
23
+ components: plan.metadata.totalComponents,
24
+ waves: plan.metadata.totalWaves,
25
+ });
26
+ }
27
+ catch (error) {
28
+ logger.error('Failed to save deployment plan', { error, path });
29
+ throw new Error(`Failed to save deployment plan: ${error instanceof Error ? error.message : String(error)}`);
30
+ }
31
+ }
32
+ /**
33
+ * Load deployment plan from file
34
+ */
35
+ static async loadPlan(filePath) {
36
+ const path = resolve(filePath ?? this.DEFAULT_PLAN_PATH);
37
+ logger.info('Loading deployment plan', { path });
38
+ try {
39
+ await access(path);
40
+ const content = await readFile(path, 'utf-8');
41
+ const plan = JSON.parse(content);
42
+ logger.info('Deployment plan loaded successfully', {
43
+ path,
44
+ version: plan.metadata.version,
45
+ components: plan.metadata.totalComponents,
46
+ waves: plan.metadata.totalWaves,
47
+ });
48
+ return plan;
49
+ }
50
+ catch (error) {
51
+ if (error.code === 'ENOENT') {
52
+ throw new Error(`Deployment plan not found: ${path}\n💡 Run 'sf smart-deployment analyze --save-plan' first`);
53
+ }
54
+ throw new Error(`Failed to load deployment plan: ${error instanceof Error ? error.message : String(error)}`);
55
+ }
56
+ }
57
+ /**
58
+ * Validate plan exists and is readable
59
+ */
60
+ static async planExists(filePath) {
61
+ const path = resolve(filePath ?? this.DEFAULT_PLAN_PATH);
62
+ try {
63
+ await access(path);
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ /**
71
+ * Create deployment plan from waves and priorities
72
+ */
73
+ static createPlan(waves, priorityOverrides, options = {}) {
74
+ const totalComponents = waves.reduce((sum, wave) => sum + wave.components.length, 0);
75
+ const estimatedTime = waves.reduce((sum, wave) => sum + wave.metadata.estimatedTime, 0);
76
+ // Group components by type
77
+ const componentsByType = {};
78
+ for (const wave of waves) {
79
+ for (const component of wave.components) {
80
+ const type = component.split(':')[0];
81
+ if (!componentsByType[type]) {
82
+ componentsByType[type] = [];
83
+ }
84
+ componentsByType[type].push(component);
85
+ }
86
+ }
87
+ return {
88
+ metadata: {
89
+ version: this.PLAN_VERSION,
90
+ generatedAt: new Date().toISOString(),
91
+ generatedBy: options.generatedBy,
92
+ aiEnabled: options.aiEnabled ?? false,
93
+ aiModel: options.aiModel,
94
+ orgType: options.orgType,
95
+ industry: options.industry,
96
+ totalComponents,
97
+ totalWaves: waves.length,
98
+ estimatedTime,
99
+ },
100
+ priorityOverrides,
101
+ waves,
102
+ componentsByType,
103
+ };
104
+ }
105
+ /**
106
+ * Compare current state with saved plan
107
+ */
108
+ static comparePlans(plan, currentWaves) {
109
+ const planComponents = new Set(plan.waves.flatMap((w) => w.components));
110
+ const currentComponents = new Set(currentWaves.flatMap((w) => w.components));
111
+ const added = [...currentComponents].filter((c) => !planComponents.has(c));
112
+ const removed = [...planComponents].filter((c) => !currentComponents.has(c));
113
+ const unchanged = [...planComponents].filter((c) => currentComponents.has(c));
114
+ // Calculate diff percentage
115
+ const totalUnique = new Set([...planComponents, ...currentComponents]).size;
116
+ const diffCount = added.length + removed.length;
117
+ const diffPercentage = totalUnique > 0 ? (diffCount / totalUnique) * 100 : 0;
118
+ // Priority differences
119
+ const priorityChanges = 0;
120
+ return {
121
+ identical: added.length === 0 && removed.length === 0,
122
+ diffPercentage,
123
+ componentDiff: {
124
+ added,
125
+ removed,
126
+ unchanged,
127
+ },
128
+ priorityDiff: {
129
+ changed: priorityChanges,
130
+ maxDiffPercentage: 0,
131
+ avgDiffPercentage: 0,
132
+ },
133
+ waveDiff: {
134
+ planWaves: plan.waves.length,
135
+ currentWaves: currentWaves.length,
136
+ difference: Math.abs(plan.waves.length - currentWaves.length),
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * Validate plan against current state
142
+ */
143
+ static validatePlan(plan, currentWaves) {
144
+ const errors = [];
145
+ const warnings = [];
146
+ // Version check
147
+ if (plan.metadata.version !== this.PLAN_VERSION) {
148
+ warnings.push(`Plan version mismatch: ${plan.metadata.version} (current: ${this.PLAN_VERSION})`);
149
+ }
150
+ // Age check (warn if older than 7 days)
151
+ const planAge = Date.now() - new Date(plan.metadata.generatedAt).getTime();
152
+ const sevenDays = 7 * 24 * 60 * 60 * 1000;
153
+ if (planAge > sevenDays) {
154
+ warnings.push(`Plan is ${Math.floor(planAge / (24 * 60 * 60 * 1000))} days old. Consider regenerating.`);
155
+ }
156
+ // Compare with current state
157
+ const comparison = this.comparePlans(plan, currentWaves);
158
+ if (!comparison.identical) {
159
+ if (comparison.componentDiff.added.length > 0) {
160
+ warnings.push(`${comparison.componentDiff.added.length} new components not in plan`);
161
+ }
162
+ if (comparison.componentDiff.removed.length > 0) {
163
+ warnings.push(`${comparison.componentDiff.removed.length} components removed since plan`);
164
+ }
165
+ }
166
+ if (comparison.diffPercentage > 20) {
167
+ errors.push(`Component diff too high: ${comparison.diffPercentage.toFixed(1)}% (max: 20%)`);
168
+ }
169
+ return {
170
+ valid: errors.length === 0,
171
+ errors,
172
+ warnings,
173
+ diff: comparison.identical
174
+ ? undefined
175
+ : {
176
+ addedComponents: comparison.componentDiff.added,
177
+ removedComponents: comparison.componentDiff.removed,
178
+ priorityChanges: [],
179
+ },
180
+ };
181
+ }
182
+ }
183
+ //# sourceMappingURL=deployment-plan-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-plan-manager.js","sourceRoot":"","sources":["../../src/utils/deployment-plan-manager.ts"],"names":[],"mappings":"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"}