claude-flow-novice 2.0.3 → 2.0.4

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 (272) hide show
  1. package/dist/src/cli/commands/guidance.js +487 -668
  2. package/dist/src/cli/commands/index-validate.js +18 -29
  3. package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
  4. package/dist/src/cli/commands/neural-goal-init.js +92 -125
  5. package/dist/src/cli/commands/swarm-exec.js +317 -393
  6. package/dist/src/cli/commands/swarm.js +1 -1
  7. package/dist/src/cli/commands/validate-framework.js +983 -1100
  8. package/dist/src/cli/commands/validate.js +144 -223
  9. package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
  10. package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
  11. package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
  12. package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
  13. package/dist/src/cli/simple-commands/agent.js +157 -193
  14. package/dist/src/cli/simple-commands/analysis.js +336 -446
  15. package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
  16. package/dist/src/cli/simple-commands/automation.js +481 -469
  17. package/dist/src/cli/simple-commands/batch-manager.js +261 -313
  18. package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
  19. package/dist/src/cli/simple-commands/claude-track.js +68 -90
  20. package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
  21. package/dist/src/cli/simple-commands/config.js +245 -290
  22. package/dist/src/cli/simple-commands/coordination.js +182 -234
  23. package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
  24. package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
  25. package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
  26. package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
  27. package/dist/src/cli/simple-commands/github/github-api.js +535 -574
  28. package/dist/src/cli/simple-commands/github/init.js +276 -303
  29. package/dist/src/cli/simple-commands/github.js +222 -247
  30. package/dist/src/cli/simple-commands/goal.js +51 -63
  31. package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
  32. package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
  33. package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
  34. package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
  35. package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
  36. package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
  37. package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
  38. package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
  39. package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
  40. package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
  41. package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
  42. package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
  43. package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
  44. package/dist/src/cli/simple-commands/hive.js +90 -79
  45. package/dist/src/cli/simple-commands/hook-safety.js +431 -521
  46. package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
  47. package/dist/src/cli/simple-commands/hooks.js +1064 -1204
  48. package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
  49. package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
  50. package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
  51. package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
  52. package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
  53. package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
  54. package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
  55. package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
  56. package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
  57. package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
  58. package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
  59. package/dist/src/cli/simple-commands/init/help.js +104 -107
  60. package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
  61. package/dist/src/cli/simple-commands/init/index.js +1510 -1759
  62. package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
  63. package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
  64. package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
  65. package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
  66. package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
  67. package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
  68. package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
  69. package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
  70. package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
  71. package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
  72. package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
  73. package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
  74. package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
  75. package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
  76. package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
  77. package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
  78. package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
  79. package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
  80. package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
  81. package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
  82. package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
  83. package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
  84. package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
  85. package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
  86. package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
  87. package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
  88. package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
  89. package/dist/src/cli/simple-commands/init.js +1 -2
  90. package/dist/src/cli/simple-commands/mcp-health.js +131 -158
  91. package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
  92. package/dist/src/cli/simple-commands/mcp.js +345 -400
  93. package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
  94. package/dist/src/cli/simple-commands/memory.js +247 -311
  95. package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
  96. package/dist/src/cli/simple-commands/monitor.js +294 -363
  97. package/dist/src/cli/simple-commands/neural.js +51 -65
  98. package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
  99. package/dist/src/cli/simple-commands/pair-basic.js +528 -656
  100. package/dist/src/cli/simple-commands/pair-old.js +430 -543
  101. package/dist/src/cli/simple-commands/pair-working.js +615 -751
  102. package/dist/src/cli/simple-commands/pair.js +615 -751
  103. package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
  104. package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
  105. package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
  106. package/dist/src/cli/simple-commands/process-ui.js +230 -254
  107. package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
  108. package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
  109. package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
  110. package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
  111. package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
  112. package/dist/src/cli/simple-commands/sparc/index.js +241 -298
  113. package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
  114. package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
  115. package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
  116. package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
  117. package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
  118. package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
  119. package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
  120. package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
  121. package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
  122. package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
  123. package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
  124. package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
  125. package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
  126. package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
  127. package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
  128. package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
  129. package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
  130. package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
  131. package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
  132. package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
  133. package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
  134. package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
  135. package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
  136. package/dist/src/cli/simple-commands/sparc.js +465 -493
  137. package/dist/src/cli/simple-commands/start-ui.js +108 -132
  138. package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
  139. package/dist/src/cli/simple-commands/start.js +1 -1
  140. package/dist/src/cli/simple-commands/status.js +254 -275
  141. package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
  142. package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
  143. package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
  144. package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
  145. package/dist/src/cli/simple-commands/stream-chain.js +260 -318
  146. package/dist/src/cli/simple-commands/stream-processor.js +290 -315
  147. package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
  148. package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
  149. package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
  150. package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
  151. package/dist/src/cli/simple-commands/swarm.js +887 -1082
  152. package/dist/src/cli/simple-commands/task.js +161 -206
  153. package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
  154. package/dist/src/cli/simple-commands/token-tracker.js +258 -316
  155. package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
  156. package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
  157. package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
  158. package/dist/src/cli/simple-commands/training.js +170 -227
  159. package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
  160. package/dist/src/cli/simple-commands/verification-integration.js +389 -417
  161. package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
  162. package/dist/src/cli/simple-commands/verification.js +493 -513
  163. package/dist/src/cli/simple-commands/web-server.js +766 -836
  164. package/dist/src/cli/simple-commands/webui-validator.js +106 -124
  165. package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
  166. package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
  167. package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
  168. package/dist/src/coordination/iteration-tracker.js +363 -454
  169. package/dist/src/enterprise/analytics-manager.js +1135 -0
  170. package/dist/src/enterprise/audit-manager.js +1115 -0
  171. package/dist/src/enterprise/cloud-manager.js +891 -0
  172. package/dist/src/enterprise/deployment-manager.js +966 -0
  173. package/dist/src/enterprise/index.js +6 -0
  174. package/dist/src/enterprise/project-manager.js +584 -0
  175. package/dist/src/enterprise/security-manager.js +991 -0
  176. package/dist/src/index.js +1 -1
  177. package/dist/src/mcp/DEPRECATED.js +46 -60
  178. package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
  179. package/dist/src/mcp/implementations/agent-tracker.js +114 -128
  180. package/dist/src/mcp/implementations/daa-tools.js +292 -350
  181. package/dist/src/mcp/implementations/workflow-tools.js +329 -361
  182. package/dist/src/mcp/mcp-config-manager.js +1183 -1331
  183. package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
  184. package/dist/src/mcp/mcp-server-novice.js +11 -17
  185. package/dist/src/mcp/mcp-server-sdk.js +11 -17
  186. package/dist/src/mcp/mcp-server.js +1620 -1484
  187. package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
  188. package/dist/src/memory/advanced-serializer.js +609 -589
  189. package/dist/src/memory/enhanced-examples.js +220 -305
  190. package/dist/src/memory/enhanced-memory.js +295 -336
  191. package/dist/src/memory/enhanced-session-serializer.js +408 -492
  192. package/dist/src/memory/fallback-memory-system.js +900 -1021
  193. package/dist/src/memory/fallback-store.js +93 -131
  194. package/dist/src/memory/high-performance-serialization.js +592 -730
  195. package/dist/src/memory/in-memory-store.js +161 -213
  196. package/dist/src/memory/index.js +123 -157
  197. package/dist/src/memory/lock-free-structures.js +578 -764
  198. package/dist/src/memory/memory-mapped-persistence.js +585 -766
  199. package/dist/src/memory/memory-pressure-manager.js +569 -707
  200. package/dist/src/memory/migration.js +358 -445
  201. package/dist/src/memory/shared-memory.js +641 -768
  202. package/dist/src/memory/sqlite-store.js +245 -325
  203. package/dist/src/memory/sqlite-wrapper.js +122 -151
  204. package/dist/src/memory/swarm-memory.js +470 -603
  205. package/dist/src/memory/test-example.js +126 -134
  206. package/dist/src/memory/ultra-fast-memory-store.js +622 -821
  207. package/dist/src/memory/unified-memory-manager.js +356 -437
  208. package/dist/src/migration/index.js +92 -0
  209. package/dist/src/migration/logger.js +121 -0
  210. package/dist/src/migration/migration-analyzer.js +268 -0
  211. package/dist/src/migration/migration-runner.js +522 -0
  212. package/dist/src/migration/migration-validator.js +285 -0
  213. package/dist/src/migration/progress-reporter.js +150 -0
  214. package/dist/src/migration/rollback-manager.js +321 -0
  215. package/dist/src/migration/tests/migration-system.test.js +7 -0
  216. package/dist/src/migration/types.js +3 -0
  217. package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
  218. package/dist/src/swarm/__tests__/integration.test.js +227 -0
  219. package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
  220. package/dist/src/swarm/advanced-orchestrator.js +1095 -0
  221. package/dist/src/swarm/claude-code-interface.js +961 -0
  222. package/dist/src/swarm/claude-flow-executor.js +229 -0
  223. package/dist/src/swarm/consensus-coordinator.js +475 -0
  224. package/dist/src/swarm/coordinator.js +2993 -0
  225. package/dist/src/swarm/direct-executor.js +1180 -0
  226. package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
  227. package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
  228. package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
  229. package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
  230. package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
  231. package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
  232. package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
  233. package/dist/src/swarm/executor-v2.js +322 -0
  234. package/dist/src/swarm/executor.js +815 -0
  235. package/dist/src/swarm/hive-mind-integration.js +703 -0
  236. package/dist/src/swarm/index.js +41 -0
  237. package/dist/src/swarm/json-output-aggregator.js +267 -0
  238. package/dist/src/swarm/large-scale-coordinator.js +542 -0
  239. package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
  240. package/dist/src/swarm/memory.js +1117 -0
  241. package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
  242. package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
  243. package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
  244. package/dist/src/swarm/optimizations/connection-pool.js +244 -0
  245. package/dist/src/swarm/optimizations/index.js +28 -0
  246. package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
  247. package/dist/src/swarm/optimizations/ttl-map.js +234 -0
  248. package/dist/src/swarm/prompt-cli.js +200 -0
  249. package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
  250. package/dist/src/swarm/prompt-copier.js +381 -0
  251. package/dist/src/swarm/prompt-manager.js +295 -0
  252. package/dist/src/swarm/prompt-utils.js +310 -0
  253. package/dist/src/swarm/result-aggregator.js +718 -0
  254. package/dist/src/swarm/sparc-executor.js +1568 -0
  255. package/dist/src/swarm/strategies/auto.js +758 -0
  256. package/dist/src/swarm/strategies/base.js +128 -0
  257. package/dist/src/swarm/strategies/research.js +914 -0
  258. package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
  259. package/dist/src/swarm/types.js +52 -0
  260. package/dist/src/swarm/workers/copy-worker.js +56 -0
  261. package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
  262. package/dist/src/utils/github-cli-safe.js +56 -64
  263. package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
  264. package/dist/src/utils/npx-isolated-cache.js +104 -119
  265. package/dist/src/utils/preference-manager.js +622 -652
  266. package/dist/src/utils/timezone-utils.js +86 -105
  267. package/dist/src/validators/epic-config-schema.js +214 -0
  268. package/dist/src/validators/index.js +10 -0
  269. package/dist/src/validators/swarm-init-validator.js +259 -0
  270. package/dist/src/validators/todowrite-batching-validator.js +215 -0
  271. package/dist/src/validators/todowrite-integration.js +187 -0
  272. package/package.json +2 -2
@@ -0,0 +1,966 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ import { EventEmitter } from "events";
15
+ import { writeFile, readFile, mkdir, readdir } from "node:fs/promises";
16
+ import { join } from "path";
17
+ import { spawn } from "child_process";
18
+ import { Logger } from "../core/logger.js";
19
+ import { ConfigManager } from "../core/config.js";
20
+ export class DeploymentManager extends EventEmitter {
21
+ async initialize() {
22
+ try {
23
+ await mkdir(this.deploymentsPath, {
24
+ recursive: true
25
+ });
26
+ await mkdir(join(this.deploymentsPath, 'environments'), {
27
+ recursive: true
28
+ });
29
+ await mkdir(join(this.deploymentsPath, 'strategies'), {
30
+ recursive: true
31
+ });
32
+ await mkdir(join(this.deploymentsPath, 'pipelines'), {
33
+ recursive: true
34
+ });
35
+ await this.loadConfigurations();
36
+ await this.initializeDefaultStrategies();
37
+ this.logger.info('Deployment Manager initialized successfully');
38
+ } catch (error) {
39
+ this.logger.error('Failed to initialize Deployment Manager', {
40
+ error
41
+ });
42
+ throw error;
43
+ }
44
+ }
45
+ async createEnvironment(environmentData) {
46
+ const environment = {
47
+ id: environmentData.id || `env-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
48
+ name: environmentData.name || 'Unnamed Environment',
49
+ type: environmentData.type || 'development',
50
+ status: 'inactive',
51
+ configuration: {
52
+ region: 'us-east-1',
53
+ provider: 'aws',
54
+ endpoints: [],
55
+ secrets: {},
56
+ environment_variables: {},
57
+ resources: {
58
+ cpu: '1',
59
+ memory: '1Gi',
60
+ storage: '10Gi',
61
+ replicas: 1
62
+ },
63
+ ...environmentData.configuration
64
+ },
65
+ healthCheck: {
66
+ url: '/health',
67
+ method: 'GET',
68
+ expectedStatus: 200,
69
+ timeout: 30000,
70
+ interval: 60000,
71
+ retries: 3,
72
+ ...environmentData.healthCheck
73
+ },
74
+ monitoring: {
75
+ enabled: true,
76
+ alerts: [],
77
+ metrics: [
78
+ 'cpu',
79
+ 'memory',
80
+ 'requests',
81
+ 'errors'
82
+ ],
83
+ logs: {
84
+ level: 'info',
85
+ retention: '30d',
86
+ aggregation: true
87
+ },
88
+ ...environmentData.monitoring
89
+ },
90
+ security: {
91
+ tls: true,
92
+ authentication: true,
93
+ authorization: [
94
+ 'admin',
95
+ 'deploy'
96
+ ],
97
+ compliance: [],
98
+ scanning: {
99
+ vulnerabilities: true,
100
+ secrets: true,
101
+ licenses: true
102
+ },
103
+ ...environmentData.security
104
+ },
105
+ createdAt: new Date(),
106
+ updatedAt: new Date()
107
+ };
108
+ this.environments.set(environment.id, environment);
109
+ await this.saveEnvironment(environment);
110
+ this.emit('environment:created', environment);
111
+ this.logger.info(`Environment created: ${environment.name} (${environment.id})`);
112
+ return environment;
113
+ }
114
+ async createDeployment(deploymentData) {
115
+ const environment = this.environments.get(deploymentData.environmentId);
116
+ if (!environment) {
117
+ throw new Error(`Environment not found: ${deploymentData.environmentId}`);
118
+ }
119
+ const strategy = this.strategies.get(deploymentData.strategyId);
120
+ if (!strategy) {
121
+ throw new Error(`Strategy not found: ${deploymentData.strategyId}`);
122
+ }
123
+ const deployment = {
124
+ id: `deploy-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
125
+ name: deploymentData.name,
126
+ version: deploymentData.version,
127
+ projectId: deploymentData.projectId,
128
+ environmentId: deploymentData.environmentId,
129
+ strategyId: deploymentData.strategyId,
130
+ status: 'pending',
131
+ initiatedBy: deploymentData.initiatedBy,
132
+ source: deploymentData.source,
133
+ artifacts: {
134
+ files: [],
135
+ ...deploymentData.artifacts
136
+ },
137
+ metrics: {
138
+ startTime: new Date(),
139
+ deploymentSize: 0,
140
+ successRate: 0,
141
+ errorRate: 0,
142
+ performanceMetrics: {}
143
+ },
144
+ stages: strategy.stages.map((stage)=>({
145
+ ...stage,
146
+ status: 'pending',
147
+ logs: []
148
+ })),
149
+ approvals: [],
150
+ notifications: [],
151
+ auditLog: [],
152
+ createdAt: new Date(),
153
+ updatedAt: new Date()
154
+ };
155
+ this.addAuditEntry(deployment, deploymentData.initiatedBy, 'deployment_created', 'deployment', {
156
+ deploymentId: deployment.id,
157
+ environment: environment.name,
158
+ strategy: strategy.name
159
+ });
160
+ this.deployments.set(deployment.id, deployment);
161
+ await this.saveDeployment(deployment);
162
+ this.emit('deployment:created', deployment);
163
+ this.logger.info(`Deployment created: ${deployment.name} (${deployment.id})`);
164
+ return deployment;
165
+ }
166
+ async executeDeployment(deploymentId) {
167
+ const deployment = this.deployments.get(deploymentId);
168
+ if (!deployment) {
169
+ throw new Error(`Deployment not found: ${deploymentId}`);
170
+ }
171
+ if (deployment.status !== 'pending') {
172
+ throw new Error(`Deployment ${deploymentId} is not in pending status`);
173
+ }
174
+ deployment.status = 'running';
175
+ deployment.metrics.startTime = new Date();
176
+ deployment.updatedAt = new Date();
177
+ this.addAuditEntry(deployment, 'system', 'deployment_started', 'deployment', {
178
+ deploymentId
179
+ });
180
+ await this.saveDeployment(deployment);
181
+ this.emit('deployment:started', deployment);
182
+ try {
183
+ for (const stage of deployment.stages){
184
+ await this.executeStage(deployment, stage);
185
+ if (stage.status === 'failed') {
186
+ await this.handleDeploymentFailure(deployment, stage);
187
+ return;
188
+ }
189
+ }
190
+ await this.completeDeployment(deployment);
191
+ } catch (error) {
192
+ await this.handleDeploymentError(deployment, error);
193
+ }
194
+ }
195
+ async executeStage(deployment, stage) {
196
+ stage.status = 'running';
197
+ stage.startTime = new Date();
198
+ this.addLog(stage, 'info', `Starting stage: ${stage.name}`, 'system');
199
+ try {
200
+ // Check conditions
201
+ if (!this.evaluateStageConditions(deployment, stage)) {
202
+ stage.status = 'skipped';
203
+ this.addLog(stage, 'info', 'Stage skipped due to conditions', 'system');
204
+ return;
205
+ }
206
+ // Handle approvals
207
+ if (stage.type === 'deploy' && await this.requiresApproval(deployment, stage)) {
208
+ await this.requestApproval(deployment, stage);
209
+ // Wait for approval
210
+ while(await this.isPendingApproval(deployment, stage)){
211
+ await new Promise((resolve)=>setTimeout(resolve, 10000)); // Check every 10 seconds
212
+ }
213
+ if (!await this.isApproved(deployment, stage)) {
214
+ stage.status = 'failed';
215
+ this.addLog(stage, 'error', 'Stage rejected by approver', 'system');
216
+ return;
217
+ }
218
+ }
219
+ // Execute commands
220
+ for (const command of stage.commands){
221
+ await this.executeCommand(deployment, stage, command);
222
+ }
223
+ stage.status = 'success';
224
+ stage.endTime = new Date();
225
+ stage.duration = stage.endTime.getTime() - stage.startTime.getTime();
226
+ this.addLog(stage, 'info', `Stage completed successfully in ${stage.duration}ms`, 'system');
227
+ } catch (error) {
228
+ stage.status = 'failed';
229
+ stage.endTime = new Date();
230
+ this.addLog(stage, 'error', `Stage failed: ${error instanceof Error ? error.message : String(error)}`, 'system');
231
+ // Retry logic
232
+ if (stage.retryPolicy.maxRetries > 0) {
233
+ await this.retryStage(deployment, stage);
234
+ }
235
+ }
236
+ await this.saveDeployment(deployment);
237
+ this.emit('stage:completed', {
238
+ deployment,
239
+ stage
240
+ });
241
+ }
242
+ async executeCommand(deployment, stage, command) {
243
+ return new Promise((resolve, reject)=>{
244
+ const environment = this.environments.get(deployment.environmentId);
245
+ const processEnv = {
246
+ ...process.env,
247
+ ...environment?.configuration.environment_variables,
248
+ ...command.environment,
249
+ DEPLOYMENT_ID: deployment.id,
250
+ DEPLOYMENT_VERSION: deployment.version,
251
+ ENVIRONMENT_ID: deployment.environmentId
252
+ };
253
+ this.addLog(stage, 'info', `Executing: ${command.command} ${command.args.join(' ')}`, 'command');
254
+ const childProcess = spawn(command.command, command.args, {
255
+ cwd: command.workingDirectory || process.cwd(),
256
+ env: processEnv,
257
+ stdio: [
258
+ 'pipe',
259
+ 'pipe',
260
+ 'pipe'
261
+ ]
262
+ });
263
+ this.activeProcesses.set(`${deployment.id}-${stage.id}-${command.id}`, childProcess);
264
+ let stdout = '';
265
+ let stderr = '';
266
+ childProcess.stdout?.on('data', (data)=>{
267
+ const output = data.toString();
268
+ stdout += output;
269
+ this.addLog(stage, 'info', output.trim(), 'stdout');
270
+ });
271
+ childProcess.stderr?.on('data', (data)=>{
272
+ const output = data.toString();
273
+ stderr += output;
274
+ this.addLog(stage, 'error', output.trim(), 'stderr');
275
+ });
276
+ const timeout = setTimeout(()=>{
277
+ childProcess.kill('SIGTERM');
278
+ reject(new Error(`Command timed out after ${command.timeout}ms`));
279
+ }, command.timeout);
280
+ childProcess.on('close', (code)=>{
281
+ clearTimeout(timeout);
282
+ this.activeProcesses.delete(`${deployment.id}-${stage.id}-${command.id}`);
283
+ // Check success criteria
284
+ const success = this.evaluateCommandSuccess(command, code, stdout, stderr);
285
+ if (success) {
286
+ this.addLog(stage, 'info', `Command completed successfully (exit code: ${code})`, 'command');
287
+ resolve();
288
+ } else {
289
+ this.addLog(stage, 'error', `Command failed (exit code: ${code})`, 'command');
290
+ reject(new Error(`Command failed with exit code ${code}`));
291
+ }
292
+ });
293
+ childProcess.on('error', (error)=>{
294
+ clearTimeout(timeout);
295
+ this.activeProcesses.delete(`${deployment.id}-${stage.id}-${command.id}`);
296
+ this.addLog(stage, 'error', `Command error: ${error instanceof Error ? error.message : String(error)}`, 'command');
297
+ reject(error);
298
+ });
299
+ });
300
+ }
301
+ async rollbackDeployment(deploymentId, reason, userId = 'system') {
302
+ const deployment = this.deployments.get(deploymentId);
303
+ if (!deployment) {
304
+ throw new Error(`Deployment not found: ${deploymentId}`);
305
+ }
306
+ // Find previous successful deployment
307
+ const previousDeployment = await this.getPreviousSuccessfulDeployment(deployment.projectId, deployment.environmentId, deploymentId);
308
+ if (!previousDeployment) {
309
+ throw new Error('No previous successful deployment found for rollback');
310
+ }
311
+ const rollbackStartTime = new Date();
312
+ deployment.rollback = {
313
+ triggered: true,
314
+ reason,
315
+ timestamp: rollbackStartTime,
316
+ previousDeploymentId: previousDeployment.id,
317
+ rollbackDuration: 0
318
+ };
319
+ deployment.status = 'rolled-back';
320
+ deployment.updatedAt = new Date();
321
+ this.addAuditEntry(deployment, userId, 'rollback_initiated', 'deployment', {
322
+ deploymentId,
323
+ previousDeploymentId: previousDeployment.id,
324
+ reason
325
+ });
326
+ try {
327
+ // Execute rollback strategy
328
+ await this.executeRollbackStrategy(deployment, previousDeployment);
329
+ deployment.rollback.rollbackDuration = Date.now() - rollbackStartTime.getTime();
330
+ this.addAuditEntry(deployment, userId, 'rollback_completed', 'deployment', {
331
+ deploymentId,
332
+ rollbackDuration: deployment.rollback.rollbackDuration
333
+ });
334
+ this.emit('deployment:rolled-back', deployment);
335
+ this.logger.info(`Deployment rolled back: ${deploymentId}`);
336
+ } catch (error) {
337
+ this.addAuditEntry(deployment, userId, 'rollback_failed', 'deployment', {
338
+ deploymentId,
339
+ error: error instanceof Error ? error.message : String(error)
340
+ });
341
+ this.logger.error(`Rollback failed for deployment ${deploymentId}`, {
342
+ error
343
+ });
344
+ throw error;
345
+ }
346
+ await this.saveDeployment(deployment);
347
+ }
348
+ async getDeploymentMetrics(filters) {
349
+ let deployments = Array.from(this.deployments.values());
350
+ // Apply filters
351
+ if (filters) {
352
+ if (filters.projectId) {
353
+ deployments = deployments.filter((d)=>d.projectId === filters.projectId);
354
+ }
355
+ if (filters.environmentId) {
356
+ deployments = deployments.filter((d)=>d.environmentId === filters.environmentId);
357
+ }
358
+ if (filters.strategyId) {
359
+ deployments = deployments.filter((d)=>d.strategyId === filters.strategyId);
360
+ }
361
+ if (filters.timeRange) {
362
+ deployments = deployments.filter((d)=>d.createdAt >= filters.timeRange.start && d.createdAt <= filters.timeRange.end);
363
+ }
364
+ }
365
+ const totalDeployments = deployments.length;
366
+ const successfulDeployments = deployments.filter((d)=>d.status === 'success').length;
367
+ const failedDeployments = deployments.filter((d)=>d.status === 'failed').length;
368
+ const rolledBackDeployments = deployments.filter((d)=>d.status === 'rolled-back').length;
369
+ const completedDeployments = deployments.filter((d)=>d.metrics.endTime && d.metrics.startTime);
370
+ const averageDeploymentTime = completedDeployments.length > 0 ? completedDeployments.reduce((sum, d)=>sum + (d.metrics.endTime.getTime() - d.metrics.startTime.getTime()), 0) / completedDeployments.length : 0;
371
+ // Calculate environment metrics
372
+ const environmentMetrics = {};
373
+ for (const env of this.environments.values()){
374
+ const envDeployments = deployments.filter((d)=>d.environmentId === env.id);
375
+ const envSuccessful = envDeployments.filter((d)=>d.status === 'success').length;
376
+ environmentMetrics[env.id] = {
377
+ deployments: envDeployments.length,
378
+ successRate: envDeployments.length > 0 ? envSuccessful / envDeployments.length * 100 : 0,
379
+ averageTime: envDeployments.length > 0 ? envDeployments.reduce((sum, d)=>sum + (d.metrics.duration || 0), 0) / envDeployments.length : 0
380
+ };
381
+ }
382
+ // Calculate strategy metrics
383
+ const strategyMetrics = {};
384
+ for (const strategy of this.strategies.values()){
385
+ const strategyDeployments = deployments.filter((d)=>d.strategyId === strategy.id);
386
+ const strategySuccessful = strategyDeployments.filter((d)=>d.status === 'success').length;
387
+ const strategyRolledBack = strategyDeployments.filter((d)=>d.status === 'rolled-back').length;
388
+ strategyMetrics[strategy.id] = {
389
+ deployments: strategyDeployments.length,
390
+ successRate: strategyDeployments.length > 0 ? strategySuccessful / strategyDeployments.length * 100 : 0,
391
+ rollbackRate: strategyDeployments.length > 0 ? strategyRolledBack / strategyDeployments.length * 100 : 0
392
+ };
393
+ }
394
+ return {
395
+ totalDeployments,
396
+ successfulDeployments,
397
+ failedDeployments,
398
+ rolledBackDeployments,
399
+ averageDeploymentTime,
400
+ deploymentFrequency: this.calculateDeploymentFrequency(deployments),
401
+ meanTimeToRecovery: this.calculateMTTR(deployments),
402
+ changeFailureRate: (failedDeployments + rolledBackDeployments) / Math.max(totalDeployments, 1) * 100,
403
+ leadTime: this.calculateLeadTime(deployments),
404
+ environmentMetrics,
405
+ strategyMetrics
406
+ };
407
+ }
408
+ // Private helper methods
409
+ async loadConfigurations() {
410
+ // Load environments, strategies, and pipelines from disk
411
+ try {
412
+ const envFiles = await readdir(join(this.deploymentsPath, 'environments'));
413
+ for (const file of envFiles.filter((f)=>f.endsWith('.json'))){
414
+ const content = await readFile(join(this.deploymentsPath, 'environments', file), 'utf-8');
415
+ const env = JSON.parse(content);
416
+ this.environments.set(env.id, env);
417
+ }
418
+ const strategyFiles = await readdir(join(this.deploymentsPath, 'strategies'));
419
+ for (const file of strategyFiles.filter((f)=>f.endsWith('.json'))){
420
+ const content = await readFile(join(this.deploymentsPath, 'strategies', file), 'utf-8');
421
+ const strategy = JSON.parse(content);
422
+ this.strategies.set(strategy.id, strategy);
423
+ }
424
+ const pipelineFiles = await readdir(join(this.deploymentsPath, 'pipelines'));
425
+ for (const file of pipelineFiles.filter((f)=>f.endsWith('.json'))){
426
+ const content = await readFile(join(this.deploymentsPath, 'pipelines', file), 'utf-8');
427
+ const pipeline = JSON.parse(content);
428
+ this.pipelines.set(pipeline.id, pipeline);
429
+ }
430
+ this.logger.info(`Loaded ${this.environments.size} environments, ${this.strategies.size} strategies, ${this.pipelines.size} pipelines`);
431
+ } catch (error) {
432
+ this.logger.warn('Failed to load some configurations', {
433
+ error
434
+ });
435
+ }
436
+ }
437
+ async initializeDefaultStrategies() {
438
+ const defaultStrategies = [
439
+ {
440
+ name: 'Blue-Green Deployment',
441
+ type: 'blue-green',
442
+ configuration: {
443
+ monitoringDuration: 300000,
444
+ automatedRollback: true,
445
+ rollbackThreshold: 5
446
+ },
447
+ stages: [
448
+ {
449
+ id: 'build',
450
+ name: 'Build',
451
+ order: 1,
452
+ type: 'build',
453
+ status: 'pending',
454
+ commands: [],
455
+ conditions: {
456
+ runIf: [],
457
+ skipIf: []
458
+ },
459
+ timeout: 600000,
460
+ retryPolicy: {
461
+ maxRetries: 2,
462
+ backoffMultiplier: 2,
463
+ initialDelay: 1000
464
+ },
465
+ artifacts: {
466
+ inputs: [],
467
+ outputs: []
468
+ },
469
+ logs: []
470
+ },
471
+ {
472
+ id: 'deploy-green',
473
+ name: 'Deploy to Green',
474
+ order: 2,
475
+ type: 'deploy',
476
+ status: 'pending',
477
+ commands: [],
478
+ conditions: {
479
+ runIf: [],
480
+ skipIf: []
481
+ },
482
+ timeout: 900000,
483
+ retryPolicy: {
484
+ maxRetries: 1,
485
+ backoffMultiplier: 2,
486
+ initialDelay: 5000
487
+ },
488
+ artifacts: {
489
+ inputs: [],
490
+ outputs: []
491
+ },
492
+ logs: []
493
+ },
494
+ {
495
+ id: 'verify',
496
+ name: 'Verify Green',
497
+ order: 3,
498
+ type: 'verify',
499
+ status: 'pending',
500
+ commands: [],
501
+ conditions: {
502
+ runIf: [],
503
+ skipIf: []
504
+ },
505
+ timeout: 300000,
506
+ retryPolicy: {
507
+ maxRetries: 3,
508
+ backoffMultiplier: 1.5,
509
+ initialDelay: 2000
510
+ },
511
+ artifacts: {
512
+ inputs: [],
513
+ outputs: []
514
+ },
515
+ logs: []
516
+ },
517
+ {
518
+ id: 'switch-traffic',
519
+ name: 'Switch Traffic',
520
+ order: 4,
521
+ type: 'promote',
522
+ status: 'pending',
523
+ commands: [],
524
+ conditions: {
525
+ runIf: [],
526
+ skipIf: []
527
+ },
528
+ timeout: 60000,
529
+ retryPolicy: {
530
+ maxRetries: 1,
531
+ backoffMultiplier: 1,
532
+ initialDelay: 1000
533
+ },
534
+ artifacts: {
535
+ inputs: [],
536
+ outputs: []
537
+ },
538
+ logs: []
539
+ }
540
+ ],
541
+ rollbackStrategy: {
542
+ automatic: true,
543
+ conditions: [
544
+ {
545
+ metric: 'error_rate',
546
+ threshold: 5,
547
+ operator: '>',
548
+ duration: 60000,
549
+ description: 'Error rate exceeds 5%'
550
+ }
551
+ ],
552
+ timeout: 300000
553
+ }
554
+ },
555
+ {
556
+ name: 'Canary Deployment',
557
+ type: 'canary',
558
+ configuration: {
559
+ trafficSplitPercentage: 10,
560
+ monitoringDuration: 600000,
561
+ automatedRollback: true,
562
+ rollbackThreshold: 2
563
+ },
564
+ stages: [
565
+ {
566
+ id: 'build',
567
+ name: 'Build',
568
+ order: 1,
569
+ type: 'build',
570
+ status: 'pending',
571
+ commands: [],
572
+ conditions: {
573
+ runIf: [],
574
+ skipIf: []
575
+ },
576
+ timeout: 600000,
577
+ retryPolicy: {
578
+ maxRetries: 2,
579
+ backoffMultiplier: 2,
580
+ initialDelay: 1000
581
+ },
582
+ artifacts: {
583
+ inputs: [],
584
+ outputs: []
585
+ },
586
+ logs: []
587
+ },
588
+ {
589
+ id: 'deploy-canary',
590
+ name: 'Deploy Canary (10%)',
591
+ order: 2,
592
+ type: 'deploy',
593
+ status: 'pending',
594
+ commands: [],
595
+ conditions: {
596
+ runIf: [],
597
+ skipIf: []
598
+ },
599
+ timeout: 900000,
600
+ retryPolicy: {
601
+ maxRetries: 1,
602
+ backoffMultiplier: 2,
603
+ initialDelay: 5000
604
+ },
605
+ artifacts: {
606
+ inputs: [],
607
+ outputs: []
608
+ },
609
+ logs: []
610
+ },
611
+ {
612
+ id: 'monitor-canary',
613
+ name: 'Monitor Canary',
614
+ order: 3,
615
+ type: 'verify',
616
+ status: 'pending',
617
+ commands: [],
618
+ conditions: {
619
+ runIf: [],
620
+ skipIf: []
621
+ },
622
+ timeout: 600000,
623
+ retryPolicy: {
624
+ maxRetries: 1,
625
+ backoffMultiplier: 1,
626
+ initialDelay: 10000
627
+ },
628
+ artifacts: {
629
+ inputs: [],
630
+ outputs: []
631
+ },
632
+ logs: []
633
+ },
634
+ {
635
+ id: 'promote-full',
636
+ name: 'Promote to 100%',
637
+ order: 4,
638
+ type: 'promote',
639
+ status: 'pending',
640
+ commands: [],
641
+ conditions: {
642
+ runIf: [],
643
+ skipIf: []
644
+ },
645
+ timeout: 300000,
646
+ retryPolicy: {
647
+ maxRetries: 1,
648
+ backoffMultiplier: 1,
649
+ initialDelay: 1000
650
+ },
651
+ artifacts: {
652
+ inputs: [],
653
+ outputs: []
654
+ },
655
+ logs: []
656
+ }
657
+ ],
658
+ rollbackStrategy: {
659
+ automatic: true,
660
+ conditions: [
661
+ {
662
+ metric: 'error_rate',
663
+ threshold: 2,
664
+ operator: '>',
665
+ duration: 120000,
666
+ description: 'Canary error rate exceeds 2%'
667
+ },
668
+ {
669
+ metric: 'response_time',
670
+ threshold: 500,
671
+ operator: '>',
672
+ duration: 180000,
673
+ description: 'Response time exceeds 500ms'
674
+ }
675
+ ],
676
+ timeout: 180000
677
+ }
678
+ },
679
+ {
680
+ name: 'Rolling Deployment',
681
+ type: 'rolling',
682
+ configuration: {
683
+ maxUnavailable: 1,
684
+ maxSurge: 1,
685
+ monitoringDuration: 120000,
686
+ automatedRollback: false
687
+ },
688
+ stages: [
689
+ {
690
+ id: 'build',
691
+ name: 'Build',
692
+ order: 1,
693
+ type: 'build',
694
+ status: 'pending',
695
+ commands: [],
696
+ conditions: {
697
+ runIf: [],
698
+ skipIf: []
699
+ },
700
+ timeout: 600000,
701
+ retryPolicy: {
702
+ maxRetries: 2,
703
+ backoffMultiplier: 2,
704
+ initialDelay: 1000
705
+ },
706
+ artifacts: {
707
+ inputs: [],
708
+ outputs: []
709
+ },
710
+ logs: []
711
+ },
712
+ {
713
+ id: 'rolling-update',
714
+ name: 'Rolling Update',
715
+ order: 2,
716
+ type: 'deploy',
717
+ status: 'pending',
718
+ commands: [],
719
+ conditions: {
720
+ runIf: [],
721
+ skipIf: []
722
+ },
723
+ timeout: 1200000,
724
+ retryPolicy: {
725
+ maxRetries: 1,
726
+ backoffMultiplier: 2,
727
+ initialDelay: 5000
728
+ },
729
+ artifacts: {
730
+ inputs: [],
731
+ outputs: []
732
+ },
733
+ logs: []
734
+ },
735
+ {
736
+ id: 'health-check',
737
+ name: 'Health Check',
738
+ order: 3,
739
+ type: 'verify',
740
+ status: 'pending',
741
+ commands: [],
742
+ conditions: {
743
+ runIf: [],
744
+ skipIf: []
745
+ },
746
+ timeout: 300000,
747
+ retryPolicy: {
748
+ maxRetries: 3,
749
+ backoffMultiplier: 1.5,
750
+ initialDelay: 5000
751
+ },
752
+ artifacts: {
753
+ inputs: [],
754
+ outputs: []
755
+ },
756
+ logs: []
757
+ }
758
+ ],
759
+ rollbackStrategy: {
760
+ automatic: false,
761
+ conditions: [],
762
+ timeout: 600000
763
+ }
764
+ }
765
+ ];
766
+ for (const strategyData of defaultStrategies){
767
+ if (!Array.from(this.strategies.values()).some((s)=>s.name === strategyData.name)) {
768
+ const strategy = {
769
+ id: `strategy-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
770
+ notifications: {
771
+ channels: [],
772
+ events: [
773
+ 'deployment:started',
774
+ 'deployment:completed',
775
+ 'deployment:failed'
776
+ ]
777
+ },
778
+ ...strategyData
779
+ };
780
+ this.strategies.set(strategy.id, strategy);
781
+ await this.saveStrategy(strategy);
782
+ }
783
+ }
784
+ }
785
+ async saveEnvironment(environment) {
786
+ const filePath = join(this.deploymentsPath, 'environments', `${environment.id}.json`);
787
+ await writeFile(filePath, JSON.stringify(environment, null, 2));
788
+ }
789
+ async saveStrategy(strategy) {
790
+ const filePath = join(this.deploymentsPath, 'strategies', `${strategy.id}.json`);
791
+ await writeFile(filePath, JSON.stringify(strategy, null, 2));
792
+ }
793
+ async saveDeployment(deployment) {
794
+ const filePath = join(this.deploymentsPath, `${deployment.id}.json`);
795
+ await writeFile(filePath, JSON.stringify(deployment, null, 2));
796
+ }
797
+ addAuditEntry(deployment, userId, action, target, details) {
798
+ const entry = {
799
+ id: `audit-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
800
+ timestamp: new Date(),
801
+ userId,
802
+ action,
803
+ target,
804
+ details
805
+ };
806
+ deployment.auditLog.push(entry);
807
+ }
808
+ addLog(stage, level, message, source, metadata) {
809
+ const log = {
810
+ timestamp: new Date(),
811
+ level,
812
+ message,
813
+ source,
814
+ metadata
815
+ };
816
+ stage.logs.push(log);
817
+ }
818
+ evaluateStageConditions(deployment, stage) {
819
+ // Implement condition evaluation logic
820
+ return true; // Simplified for now
821
+ }
822
+ async requiresApproval(deployment, stage) {
823
+ const strategy = this.strategies.get(deployment.strategyId);
824
+ return strategy?.configuration.approvalRequired || false;
825
+ }
826
+ async requestApproval(deployment, stage) {
827
+ // Implement approval request logic
828
+ this.emit('approval:requested', {
829
+ deployment,
830
+ stage
831
+ });
832
+ }
833
+ async isPendingApproval(deployment, stage) {
834
+ // Check if there are pending approvals for this stage
835
+ return false; // Simplified for now
836
+ }
837
+ async isApproved(deployment, stage) {
838
+ // Check if stage is approved
839
+ return true; // Simplified for now
840
+ }
841
+ evaluateCommandSuccess(command, exitCode, stdout, stderr) {
842
+ if (command.successCriteria.exitCode !== undefined && exitCode !== command.successCriteria.exitCode) {
843
+ return false;
844
+ }
845
+ if (command.successCriteria.outputContains) {
846
+ for (const pattern of command.successCriteria.outputContains){
847
+ if (!stdout.includes(pattern)) {
848
+ return false;
849
+ }
850
+ }
851
+ }
852
+ if (command.successCriteria.outputNotContains) {
853
+ for (const pattern of command.successCriteria.outputNotContains){
854
+ if (stdout.includes(pattern) || stderr.includes(pattern)) {
855
+ return false;
856
+ }
857
+ }
858
+ }
859
+ return true;
860
+ }
861
+ async retryStage(deployment, stage) {
862
+ // Implement retry logic
863
+ this.logger.info(`Retrying stage: ${stage.name}`);
864
+ }
865
+ async handleDeploymentFailure(deployment, failedStage) {
866
+ deployment.status = 'failed';
867
+ deployment.metrics.endTime = new Date();
868
+ deployment.updatedAt = new Date();
869
+ this.addAuditEntry(deployment, 'system', 'deployment_failed', 'deployment', {
870
+ deploymentId: deployment.id,
871
+ failedStage: failedStage.name,
872
+ reason: 'Stage execution failed'
873
+ });
874
+ await this.saveDeployment(deployment);
875
+ this.emit('deployment:failed', {
876
+ deployment,
877
+ failedStage
878
+ });
879
+ // Check if automatic rollback is enabled
880
+ const strategy = this.strategies.get(deployment.strategyId);
881
+ if (strategy?.rollbackStrategy.automatic) {
882
+ await this.rollbackDeployment(deployment.id, 'Automatic rollback due to deployment failure');
883
+ }
884
+ }
885
+ async handleDeploymentError(deployment, error) {
886
+ deployment.status = 'failed';
887
+ deployment.metrics.endTime = new Date();
888
+ deployment.updatedAt = new Date();
889
+ this.addAuditEntry(deployment, 'system', 'deployment_error', 'deployment', {
890
+ deploymentId: deployment.id,
891
+ error: error instanceof Error ? error.message : String(error)
892
+ });
893
+ await this.saveDeployment(deployment);
894
+ this.emit('deployment:error', {
895
+ deployment,
896
+ error
897
+ });
898
+ this.logger.error(`Deployment error: ${deployment.id}`, {
899
+ error
900
+ });
901
+ }
902
+ async completeDeployment(deployment) {
903
+ deployment.status = 'success';
904
+ deployment.metrics.endTime = new Date();
905
+ deployment.metrics.duration = deployment.metrics.endTime.getTime() - deployment.metrics.startTime.getTime();
906
+ deployment.updatedAt = new Date();
907
+ this.addAuditEntry(deployment, 'system', 'deployment_completed', 'deployment', {
908
+ deploymentId: deployment.id,
909
+ duration: deployment.metrics.duration
910
+ });
911
+ await this.saveDeployment(deployment);
912
+ this.emit('deployment:completed', deployment);
913
+ this.logger.info(`Deployment completed: ${deployment.id} in ${deployment.metrics.duration}ms`);
914
+ }
915
+ async getPreviousSuccessfulDeployment(projectId, environmentId, currentDeploymentId) {
916
+ const deployments = Array.from(this.deployments.values()).filter((d)=>d.projectId === projectId && d.environmentId === environmentId && d.status === 'success' && d.id !== currentDeploymentId).sort((a, b)=>b.createdAt.getTime() - a.createdAt.getTime());
917
+ return deployments[0] || null;
918
+ }
919
+ async executeRollbackStrategy(deployment, previousDeployment) {
920
+ // Implement rollback execution logic
921
+ this.logger.info(`Executing rollback from ${deployment.id} to ${previousDeployment.id}`);
922
+ // This would typically involve:
923
+ // 1. Switching traffic back to previous version
924
+ // 2. Updating load balancer configuration
925
+ // 3. Rolling back container deployments
926
+ // 4. Reverting database migrations if needed
927
+ // 5. Updating DNS records
928
+ this.emit('rollback:executed', {
929
+ deployment,
930
+ previousDeployment
931
+ });
932
+ }
933
+ calculateDeploymentFrequency(deployments) {
934
+ if (deployments.length === 0) return 0;
935
+ const sortedDeployments = deployments.sort((a, b)=>a.createdAt.getTime() - b.createdAt.getTime());
936
+ const firstDeployment = sortedDeployments[0];
937
+ const lastDeployment = sortedDeployments[sortedDeployments.length - 1];
938
+ const timeSpan = lastDeployment.createdAt.getTime() - firstDeployment.createdAt.getTime();
939
+ const days = timeSpan / (1000 * 60 * 60 * 24);
940
+ return deployments.length / Math.max(days, 1);
941
+ }
942
+ calculateMTTR(deployments) {
943
+ const failedDeployments = deployments.filter((d)=>d.status === 'failed' || d.status === 'rolled-back');
944
+ if (failedDeployments.length === 0) return 0;
945
+ const recoveryTimes = failedDeployments.map((d)=>d.rollback?.rollbackDuration || 0).filter((time)=>time > 0);
946
+ if (recoveryTimes.length === 0) return 0;
947
+ return recoveryTimes.reduce((sum, time)=>sum + time, 0) / recoveryTimes.length;
948
+ }
949
+ calculateLeadTime(deployments) {
950
+ // This would typically calculate from commit to production
951
+ // For now, return average deployment time
952
+ const completedDeployments = deployments.filter((d)=>d.metrics.duration);
953
+ if (completedDeployments.length === 0) return 0;
954
+ return completedDeployments.reduce((sum, d)=>sum + (d.metrics.duration || 0), 0) / completedDeployments.length;
955
+ }
956
+ constructor(deploymentsPath = './deployments', logger, config){
957
+ super(), _define_property(this, "deployments", new Map()), _define_property(this, "environments", new Map()), _define_property(this, "strategies", new Map()), _define_property(this, "pipelines", new Map()), _define_property(this, "activeProcesses", new Map()), _define_property(this, "deploymentsPath", void 0), _define_property(this, "logger", void 0), _define_property(this, "config", void 0);
958
+ this.deploymentsPath = deploymentsPath;
959
+ this.logger = logger || new Logger({
960
+ level: 'info',
961
+ format: 'text',
962
+ destination: 'console'
963
+ });
964
+ this.config = config || ConfigManager.getInstance();
965
+ }
966
+ }