@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,282 @@
1
+ /**
2
+ * Metadata API Format Scanner - US-080
3
+ * Supports legacy Metadata API format (package.xml + src/)
4
+ *
5
+ * @ac US-080-AC-1: Detect package.xml
6
+ * @ac US-080-AC-2: Scan src/ directory
7
+ * @ac US-080-AC-3: Parse metadata format files
8
+ * @ac US-080-AC-4: Convert to source format internally
9
+ * @ac US-080-AC-5: Handle Documents folder structure
10
+ * @ac US-080-AC-6: Handle DigitalExperience bundles
11
+ * @issue #80
12
+ */
13
+ import * as fs from 'node:fs';
14
+ import * as path from 'node:path';
15
+ import { getLogger } from '../utils/logger.js';
16
+ import { ErrorAggregator } from '../utils/error-aggregator.js';
17
+ const logger = getLogger('MetadataFormatScanner');
18
+ /**
19
+ * @ac US-080-AC-1: Detect package.xml
20
+ * @ac US-080-AC-2: Scan src/ directory
21
+ */
22
+ export class MetadataFormatScanner {
23
+ errorAggregator = new ErrorAggregator();
24
+ /**
25
+ * @ac US-080-AC-1: Detect package.xml
26
+ * Check if project uses Metadata API format
27
+ */
28
+ detectFormat(projectRoot) {
29
+ const hasPackageXml = fs.existsSync(path.join(projectRoot, 'package.xml'));
30
+ const hasSrcDir = fs.existsSync(path.join(projectRoot, 'src'));
31
+ const hasSfdxProject = fs.existsSync(path.join(projectRoot, 'sfdx-project.json'));
32
+ logger.info('Detecting project format', {
33
+ hasPackageXml,
34
+ hasSrcDir,
35
+ hasSfdxProject,
36
+ });
37
+ if (hasPackageXml && hasSrcDir && !hasSfdxProject) {
38
+ return 'metadata-api';
39
+ }
40
+ if (hasSfdxProject && !hasPackageXml) {
41
+ return 'source-format';
42
+ }
43
+ if (hasPackageXml && hasSfdxProject) {
44
+ return 'mixed';
45
+ }
46
+ return 'source-format'; // Default
47
+ }
48
+ /**
49
+ * @ac US-080-AC-2: Scan src/ directory
50
+ * Scan Metadata API format project
51
+ */
52
+ async scan(projectRoot) {
53
+ const startTime = Date.now();
54
+ const result = {
55
+ format: this.detectFormat(projectRoot),
56
+ components: [],
57
+ warnings: [],
58
+ executionTime: 0,
59
+ };
60
+ if (result.format !== 'metadata-api' && result.format !== 'mixed') {
61
+ result.warnings.push('Project is not in Metadata API format');
62
+ result.executionTime = Date.now() - startTime;
63
+ return result;
64
+ }
65
+ try {
66
+ // Find package.xml
67
+ const packageXmlPath = path.join(projectRoot, 'package.xml');
68
+ if (fs.existsSync(packageXmlPath)) {
69
+ result.packageXmlPath = packageXmlPath;
70
+ const packageEntries = this.parsePackageXml(packageXmlPath);
71
+ logger.info('Parsed package.xml', { entries: packageEntries.length });
72
+ }
73
+ // Scan src/ directory
74
+ const srcDir = path.join(projectRoot, 'src');
75
+ if (fs.existsSync(srcDir)) {
76
+ result.srcDirectory = srcDir;
77
+ const components = await this.scanSrcDirectory(srcDir);
78
+ result.components = components;
79
+ logger.info('Scanned src/ directory', { components: components.length });
80
+ }
81
+ result.executionTime = Date.now() - startTime;
82
+ logger.info('Metadata format scan complete', {
83
+ format: result.format,
84
+ components: result.components.length,
85
+ executionTime: result.executionTime,
86
+ });
87
+ return result;
88
+ }
89
+ catch (error) {
90
+ this.errorAggregator.addError({
91
+ severity: 'HIGH',
92
+ message: 'Failed to scan Metadata API format',
93
+ context: { error: error instanceof Error ? error.message : String(error) },
94
+ });
95
+ result.warnings.push('Scan failed: ' + (error instanceof Error ? error.message : String(error)));
96
+ result.executionTime = Date.now() - startTime;
97
+ return result;
98
+ }
99
+ }
100
+ /**
101
+ * @ac US-080-AC-3: Parse metadata format files
102
+ * Parse package.xml
103
+ */
104
+ parsePackageXml(packageXmlPath) {
105
+ try {
106
+ const content = fs.readFileSync(packageXmlPath, 'utf-8');
107
+ const entries = [];
108
+ // Simple XML parsing for <types> elements
109
+ const typeBlocks = content.match(/<types>[\s\S]*?<\/types>/g) ?? [];
110
+ for (const block of typeBlocks) {
111
+ const typeMatch = /<name>(.*?)<\/name>/.exec(block);
112
+ const memberMatches = block.match(/<members>(.*?)<\/members>/g) ?? [];
113
+ if (typeMatch) {
114
+ const type = typeMatch[1];
115
+ for (const memberMatch of memberMatches) {
116
+ const nameMatch = /<members>(.*?)<\/members>/.exec(memberMatch);
117
+ if (nameMatch) {
118
+ entries.push({
119
+ type,
120
+ name: nameMatch[1],
121
+ });
122
+ }
123
+ }
124
+ }
125
+ }
126
+ logger.debug('Parsed package.xml', { entries: entries.length });
127
+ return entries;
128
+ }
129
+ catch (error) {
130
+ logger.error('Failed to parse package.xml', {
131
+ error: error instanceof Error ? error.message : String(error),
132
+ });
133
+ return [];
134
+ }
135
+ }
136
+ /**
137
+ * @ac US-080-AC-2: Scan src/ directory
138
+ * @ac US-080-AC-4: Convert to source format internally
139
+ * Scan Metadata API src/ directory
140
+ */
141
+ async scanSrcDirectory(srcDir) {
142
+ const components = [];
143
+ try {
144
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
145
+ const typeComponents = await Promise.all(entries.map((entry) => {
146
+ if (!entry.isDirectory()) {
147
+ return Promise.resolve([]);
148
+ }
149
+ const typeDir = path.join(srcDir, entry.name);
150
+ const metadataType = this.mapDirectoryToType(entry.name);
151
+ if (!metadataType) {
152
+ logger.debug('Unknown metadata type directory', { dir: entry.name });
153
+ return Promise.resolve([]);
154
+ }
155
+ return this.scanTypeDirectory(typeDir, metadataType);
156
+ }));
157
+ components.push(...typeComponents.flat());
158
+ return components;
159
+ }
160
+ catch (error) {
161
+ logger.error('Failed to scan src/ directory', {
162
+ error: error instanceof Error ? error.message : String(error),
163
+ });
164
+ return [];
165
+ }
166
+ }
167
+ /**
168
+ * @ac US-080-AC-3: Parse metadata format files
169
+ * Scan specific metadata type directory
170
+ */
171
+ scanTypeDirectory(typeDir, metadataType) {
172
+ const components = [];
173
+ try {
174
+ const files = fs.readdirSync(typeDir);
175
+ for (const file of files) {
176
+ // Skip meta.xml files
177
+ if (file.endsWith('-meta.xml'))
178
+ continue;
179
+ const filePath = path.join(typeDir, file);
180
+ const stat = fs.statSync(filePath);
181
+ if (stat.isFile()) {
182
+ const name = this.extractComponentName(file, metadataType);
183
+ components.push({
184
+ name,
185
+ type: metadataType,
186
+ filePath,
187
+ dependencies: new Set(),
188
+ dependents: new Set(),
189
+ priorityBoost: 0,
190
+ });
191
+ }
192
+ else if (stat.isDirectory()) {
193
+ // Handle bundle types (e.g., Documents, DigitalExperience)
194
+ const bundleComponents = this.scanBundleDirectory(filePath, metadataType);
195
+ components.push(...bundleComponents);
196
+ }
197
+ }
198
+ return components;
199
+ }
200
+ catch (error) {
201
+ logger.error('Failed to scan type directory', {
202
+ typeDir,
203
+ error: error instanceof Error ? error.message : String(error),
204
+ });
205
+ return [];
206
+ }
207
+ }
208
+ /**
209
+ * @ac US-080-AC-5: Handle Documents folder structure
210
+ * @ac US-080-AC-6: Handle DigitalExperience bundles
211
+ * Scan bundle directory (for Documents, DigitalExperience, etc.)
212
+ */
213
+ scanBundleDirectory(bundleDir, metadataType) {
214
+ const components = [];
215
+ try {
216
+ const bundleName = path.basename(bundleDir);
217
+ // For bundles, create a single component representing the bundle
218
+ components.push({
219
+ name: bundleName,
220
+ type: metadataType,
221
+ filePath: bundleDir,
222
+ dependencies: new Set(),
223
+ dependents: new Set(),
224
+ priorityBoost: 0,
225
+ });
226
+ logger.debug('Scanned bundle directory', { bundleName, type: metadataType });
227
+ return components;
228
+ }
229
+ catch (error) {
230
+ logger.error('Failed to scan bundle directory', {
231
+ bundleDir,
232
+ error: error instanceof Error ? error.message : String(error),
233
+ });
234
+ return [];
235
+ }
236
+ }
237
+ /**
238
+ * @ac US-080-AC-4: Convert to source format internally
239
+ * Map Metadata API directory name to MetadataType
240
+ */
241
+ mapDirectoryToType(dirName) {
242
+ const mappings = {
243
+ classes: 'ApexClass',
244
+ triggers: 'ApexTrigger',
245
+ pages: 'VisualforcePage',
246
+ components: 'VisualforceComponent',
247
+ objects: 'CustomObject',
248
+ layouts: 'Layout',
249
+ profiles: 'Profile',
250
+ permissionsets: 'PermissionSet',
251
+ flows: 'Flow',
252
+ documents: 'Document',
253
+ email: 'EmailTemplate',
254
+ staticresources: 'StaticResource',
255
+ labels: 'CustomLabels',
256
+ quickActions: 'QuickAction',
257
+ flexipages: 'FlexiPage',
258
+ aura: 'AuraDefinitionBundle',
259
+ lwc: 'LightningComponentBundle',
260
+ sites: 'DigitalExperience',
261
+ experiences: 'DigitalExperience',
262
+ };
263
+ return mappings[dirName] ?? null;
264
+ }
265
+ /**
266
+ * Extract component name from filename
267
+ */
268
+ extractComponentName(filename, metadataType) {
269
+ void metadataType;
270
+ // Remove extension
271
+ const withoutExt = filename.replace(/\.[^.]+$/, '');
272
+ // For some types, remove suffix (e.g., .cls, .trigger, .page)
273
+ return withoutExt;
274
+ }
275
+ /**
276
+ * Get error report
277
+ */
278
+ getErrorReport() {
279
+ return this.errorAggregator.formatReport();
280
+ }
281
+ }
282
+ //# sourceMappingURL=metadata-format-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-format-scanner.js","sourceRoot":"","sources":["../../src/scanner/metadata-format-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Monorepo Scanner - US-082
3
+ * Support monorepo structures with multiple SF projects
4
+ *
5
+ * @ac US-082-AC-1: Detect multiple SFDX projects
6
+ * @ac US-082-AC-2: Scan each project independently
7
+ * @ac US-082-AC-3: Support shared dependencies
8
+ * @ac US-082-AC-4: Handle cross-project references
9
+ * @ac US-082-AC-5: Generate monorepo report
10
+ * @ac US-082-AC-6: Support workspace configuration
11
+ * @issue #82
12
+ */
13
+ export type SfdxProject = {
14
+ name: string;
15
+ path: string;
16
+ sfdxProjectPath: string;
17
+ packageDirectories: string[];
18
+ };
19
+ export type MonorepoStructure = {
20
+ isMonorepo: boolean;
21
+ projects: SfdxProject[];
22
+ sharedDependencies: string[];
23
+ crossProjectRefs: Array<{
24
+ from: string;
25
+ to: string;
26
+ component: string;
27
+ }>;
28
+ };
29
+ export type MonorepoReport = {
30
+ structure: MonorepoStructure;
31
+ warnings: string[];
32
+ recommendations: string[];
33
+ };
34
+ /**
35
+ * @ac US-082-AC-1: Detect multiple SFDX projects
36
+ */
37
+ export declare class MonorepoScanner {
38
+ /**
39
+ * @ac US-082-AC-1: Detect multiple SFDX projects
40
+ * Find all sfdx-project.json files in directory tree
41
+ */
42
+ detectProjects(rootDir: string, maxDepth?: number): Promise<SfdxProject[]>;
43
+ /**
44
+ * Recursively scan directory for sfdx-project.json
45
+ */
46
+ private scanDirectory;
47
+ /**
48
+ * @ac US-082-AC-3: Support shared dependencies
49
+ * Detect shared dependencies between projects
50
+ */
51
+ detectSharedDependencies(projects: SfdxProject[]): Promise<string[]>;
52
+ /**
53
+ * @ac US-082-AC-4: Handle cross-project references
54
+ * Detect cross-project references (simplified)
55
+ */
56
+ detectCrossProjectRefs(projects: SfdxProject[]): Array<{
57
+ from: string;
58
+ to: string;
59
+ component: string;
60
+ }>;
61
+ /**
62
+ * @ac US-082-AC-5: Generate monorepo report
63
+ * @ac US-082-AC-6: Support workspace configuration
64
+ * Scan monorepo and generate report
65
+ */
66
+ scanMonorepo(rootDir: string): Promise<MonorepoReport>;
67
+ /**
68
+ * Format monorepo report
69
+ */
70
+ formatReport(report: MonorepoReport): string;
71
+ }
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Monorepo Scanner - US-082
3
+ * Support monorepo structures with multiple SF projects
4
+ *
5
+ * @ac US-082-AC-1: Detect multiple SFDX projects
6
+ * @ac US-082-AC-2: Scan each project independently
7
+ * @ac US-082-AC-3: Support shared dependencies
8
+ * @ac US-082-AC-4: Handle cross-project references
9
+ * @ac US-082-AC-5: Generate monorepo report
10
+ * @ac US-082-AC-6: Support workspace configuration
11
+ * @issue #82
12
+ */
13
+ import { promises as fs } from 'node:fs';
14
+ import * as path from 'node:path';
15
+ import { getLogger } from '../utils/logger.js';
16
+ const logger = getLogger('MonorepoScanner');
17
+ /**
18
+ * @ac US-082-AC-1: Detect multiple SFDX projects
19
+ */
20
+ export class MonorepoScanner {
21
+ /**
22
+ * @ac US-082-AC-1: Detect multiple SFDX projects
23
+ * Find all sfdx-project.json files in directory tree
24
+ */
25
+ async detectProjects(rootDir, maxDepth = 3) {
26
+ logger.info('Detecting SFDX projects', { rootDir, maxDepth });
27
+ const projects = [];
28
+ await this.scanDirectory(rootDir, 0, maxDepth, projects);
29
+ logger.info('Projects detected', { count: projects.length });
30
+ return projects;
31
+ }
32
+ /**
33
+ * Recursively scan directory for sfdx-project.json
34
+ */
35
+ async scanDirectory(dir, depth, maxDepth, projects) {
36
+ if (depth > maxDepth)
37
+ return;
38
+ try {
39
+ const entries = await fs.readdir(dir, { withFileTypes: true });
40
+ // Check for sfdx-project.json
41
+ const hasSfdxProject = entries.some((e) => e.name === 'sfdx-project.json');
42
+ if (hasSfdxProject) {
43
+ const sfdxProjectPath = path.join(dir, 'sfdx-project.json');
44
+ try {
45
+ const content = await fs.readFile(sfdxProjectPath, 'utf-8');
46
+ const config = JSON.parse(content);
47
+ const packageDirs = config.packageDirectories ? config.packageDirectories.map((p) => p.path) : [];
48
+ projects.push({
49
+ name: config.name ?? path.basename(dir),
50
+ path: dir,
51
+ sfdxProjectPath,
52
+ packageDirectories: packageDirs,
53
+ });
54
+ }
55
+ catch (error) {
56
+ logger.warn('Failed to parse sfdx-project.json', {
57
+ path: sfdxProjectPath,
58
+ error: error instanceof Error ? error.message : String(error),
59
+ });
60
+ }
61
+ }
62
+ // Scan subdirectories (skip node_modules, .git, etc.)
63
+ const dirsToScan = entries.filter((e) => e.isDirectory() && !['node_modules', '.git', '.sfdx', 'dist', 'build', 'coverage'].includes(e.name));
64
+ await Promise.all(dirsToScan.map(async (entry) => this.scanDirectory(path.join(dir, entry.name), depth + 1, maxDepth, projects)));
65
+ }
66
+ catch (error) {
67
+ logger.warn('Failed to scan directory', {
68
+ dir,
69
+ error: error instanceof Error ? error.message : String(error),
70
+ });
71
+ }
72
+ }
73
+ /**
74
+ * @ac US-082-AC-3: Support shared dependencies
75
+ * Detect shared dependencies between projects
76
+ */
77
+ async detectSharedDependencies(projects) {
78
+ const sharedDeps = new Set();
79
+ await Promise.all(projects.map(async (project) => {
80
+ try {
81
+ const content = await fs.readFile(project.sfdxProjectPath, 'utf-8');
82
+ const config = JSON.parse(content);
83
+ if (config.plugins) {
84
+ for (const plugin of Object.keys(config.plugins)) {
85
+ sharedDeps.add(plugin);
86
+ }
87
+ }
88
+ if (config.packageAliases) {
89
+ for (const alias of Object.keys(config.packageAliases)) {
90
+ sharedDeps.add(alias);
91
+ }
92
+ }
93
+ }
94
+ catch {
95
+ // Skip errors
96
+ }
97
+ }));
98
+ return Array.from(sharedDeps);
99
+ }
100
+ /**
101
+ * @ac US-082-AC-4: Handle cross-project references
102
+ * Detect cross-project references (simplified)
103
+ */
104
+ detectCrossProjectRefs(projects) {
105
+ const refs = [];
106
+ // Simplified: Check if projects reference each other in config
107
+ for (const project of projects) {
108
+ for (const otherProject of projects) {
109
+ if (project !== otherProject) {
110
+ // Check if project path is mentioned in other project's package dirs
111
+ const isReferenced = otherProject.packageDirectories.some((dir) => dir.includes(path.basename(project.path)));
112
+ if (isReferenced) {
113
+ refs.push({ from: project.name, to: otherProject.name, component: 'package' });
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return refs;
119
+ }
120
+ /**
121
+ * @ac US-082-AC-5: Generate monorepo report
122
+ * @ac US-082-AC-6: Support workspace configuration
123
+ * Scan monorepo and generate report
124
+ */
125
+ async scanMonorepo(rootDir) {
126
+ logger.info('Scanning monorepo', { rootDir });
127
+ const projects = await this.detectProjects(rootDir);
128
+ const isMonorepo = projects.length > 1;
129
+ const sharedDependencies = await this.detectSharedDependencies(projects);
130
+ const crossProjectRefs = this.detectCrossProjectRefs(projects);
131
+ const warnings = [];
132
+ const recommendations = [];
133
+ // Generate warnings
134
+ if (isMonorepo && crossProjectRefs.length > 0) {
135
+ warnings.push(`Cross-project references detected: ${crossProjectRefs.length}`);
136
+ recommendations.push('Consider consolidating shared code into a shared package');
137
+ }
138
+ if (isMonorepo && projects.length > 10) {
139
+ warnings.push(`Many projects detected: ${projects.length}`);
140
+ recommendations.push('Consider organizing projects into workspaces');
141
+ }
142
+ // Check for workspace configuration
143
+ try {
144
+ const workspaceConfig = path.join(rootDir, 'workspace.json');
145
+ await fs.access(workspaceConfig);
146
+ logger.info('Workspace configuration found');
147
+ }
148
+ catch {
149
+ if (isMonorepo) {
150
+ recommendations.push('Consider adding workspace.json for better monorepo management');
151
+ }
152
+ }
153
+ const structure = {
154
+ isMonorepo,
155
+ projects,
156
+ sharedDependencies,
157
+ crossProjectRefs,
158
+ };
159
+ logger.info('Monorepo scan complete', {
160
+ isMonorepo,
161
+ projectCount: projects.length,
162
+ sharedDeps: sharedDependencies.length,
163
+ crossRefs: crossProjectRefs.length,
164
+ });
165
+ return {
166
+ structure,
167
+ warnings,
168
+ recommendations,
169
+ };
170
+ }
171
+ /**
172
+ * Format monorepo report
173
+ */
174
+ formatReport(report) {
175
+ const lines = [];
176
+ lines.push('📦 Monorepo Structure Report');
177
+ lines.push('═══════════════════════════════════════');
178
+ lines.push(`Is Monorepo: ${report.structure.isMonorepo ? 'Yes' : 'No'}`);
179
+ lines.push(`Projects: ${report.structure.projects.length}`);
180
+ lines.push('');
181
+ if (report.structure.projects.length > 0) {
182
+ lines.push('Projects:');
183
+ for (const project of report.structure.projects) {
184
+ lines.push(` • ${project.name} (${project.path})`);
185
+ lines.push(` Package Dirs: ${project.packageDirectories.length}`);
186
+ }
187
+ lines.push('');
188
+ }
189
+ if (report.structure.sharedDependencies.length > 0) {
190
+ lines.push(`Shared Dependencies: ${report.structure.sharedDependencies.length}`);
191
+ for (const dep of report.structure.sharedDependencies.slice(0, 5)) {
192
+ lines.push(` • ${dep}`);
193
+ }
194
+ if (report.structure.sharedDependencies.length > 5) {
195
+ lines.push(` ... and ${report.structure.sharedDependencies.length - 5} more`);
196
+ }
197
+ lines.push('');
198
+ }
199
+ if (report.structure.crossProjectRefs.length > 0) {
200
+ lines.push(`Cross-Project References: ${report.structure.crossProjectRefs.length}`);
201
+ for (const ref of report.structure.crossProjectRefs.slice(0, 3)) {
202
+ lines.push(` • ${ref.from} → ${ref.to} (${ref.component})`);
203
+ }
204
+ if (report.structure.crossProjectRefs.length > 3) {
205
+ lines.push(` ... and ${report.structure.crossProjectRefs.length - 3} more`);
206
+ }
207
+ lines.push('');
208
+ }
209
+ if (report.warnings.length > 0) {
210
+ lines.push('⚠️ Warnings:');
211
+ for (const warning of report.warnings) {
212
+ lines.push(` • ${warning}`);
213
+ }
214
+ lines.push('');
215
+ }
216
+ if (report.recommendations.length > 0) {
217
+ lines.push('💡 Recommendations:');
218
+ for (const rec of report.recommendations) {
219
+ lines.push(` • ${rec}`);
220
+ }
221
+ }
222
+ return lines.join('\n');
223
+ }
224
+ }
225
+ //# sourceMappingURL=monorepo-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monorepo-scanner.js","sourceRoot":"","sources":["../../src/scanner/monorepo-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Project Structure Validator - US-084
3
+ * Validates SFDX project structure
4
+ *
5
+ * @ac US-084-AC-1: Validate sfdx-project.json schema
6
+ * @ac US-084-AC-2: Validate package directories exist
7
+ * @ac US-084-AC-3: Validate metadata structure
8
+ * @ac US-084-AC-4: Check for required files
9
+ * @ac US-084-AC-5: Generate validation report
10
+ * @ac US-084-AC-6: Suggest fixes for issues
11
+ * @issue #84
12
+ */
13
+ export type ValidationIssue = {
14
+ severity: 'error' | 'warning' | 'info';
15
+ message: string;
16
+ path?: string;
17
+ suggestion?: string;
18
+ };
19
+ export type ValidationReport = {
20
+ isValid: boolean;
21
+ issues: ValidationIssue[];
22
+ checkedItems: string[];
23
+ executionTime: number;
24
+ };
25
+ /**
26
+ * @ac US-084-AC-1: Validate sfdx-project.json schema
27
+ */
28
+ export declare class ProjectValidator {
29
+ /**
30
+ * Validate project structure
31
+ */
32
+ validate(projectRoot: string): Promise<ValidationReport>;
33
+ /**
34
+ * @ac US-084-AC-1: Validate sfdx-project.json schema
35
+ */
36
+ private validateSfdxProjectJson;
37
+ /**
38
+ * @ac US-084-AC-2: Validate package directories exist
39
+ */
40
+ private validatePackageDirectories;
41
+ /**
42
+ * @ac US-084-AC-3: Validate metadata structure
43
+ */
44
+ private validateMetadataStructure;
45
+ /**
46
+ * @ac US-084-AC-4: Check for required files
47
+ */
48
+ private validateRequiredFiles;
49
+ /**
50
+ * @ac US-084-AC-5: Generate validation report
51
+ * @ac US-084-AC-6: Suggest fixes for issues
52
+ * Format validation report
53
+ */
54
+ formatReport(report: ValidationReport): string;
55
+ }