claude-flow-novice 2.15.3 → 2.15.5

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 (473) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +29 -6
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  36. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  37. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  38. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  39. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  40. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  41. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  42. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  43. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
  45. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  46. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  47. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  48. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  49. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  50. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  51. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  52. package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
  53. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  54. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -0
  57. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  58. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  59. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  60. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  61. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  62. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  63. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  64. package/README.md +116 -475
  65. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  66. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  67. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  68. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  69. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  70. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  71. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  72. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  73. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  74. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  75. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  76. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  77. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  78. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  79. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  80. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  81. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  82. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  83. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  84. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  85. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  86. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  87. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  88. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  89. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  90. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  91. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  92. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  93. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  94. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  95. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  96. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  97. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  98. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  99. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  100. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  101. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  102. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  103. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  104. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  105. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  106. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  107. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  108. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  110. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  111. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  112. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  114. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  115. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  116. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  117. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  118. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  119. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  120. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  121. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  137. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  138. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  139. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  140. package/claude-assets/commands/cfn-loop-cli.md +29 -6
  141. package/claude-assets/commands/switch-api.md +31 -10
  142. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  143. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  144. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  145. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  146. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  147. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
  148. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
  149. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  150. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  151. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  152. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  153. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  154. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  155. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  156. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  157. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  158. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  159. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  160. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  161. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  162. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  163. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  164. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  165. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  166. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  167. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  168. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  169. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  170. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  171. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  172. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  173. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  174. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  175. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  176. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  177. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  178. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  179. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  180. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
  181. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  182. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  183. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  184. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  185. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  186. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  187. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  188. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  189. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  190. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  191. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  192. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  193. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
  194. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  195. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
  196. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  197. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -0
  198. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  199. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  200. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  201. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  202. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  203. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  204. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  205. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  206. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  207. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  208. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  209. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  210. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  211. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  212. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  213. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  214. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  215. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  216. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  217. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  218. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  219. package/claude-assets/skills/integration/agent-handoff.sh +62 -64
  220. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  221. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  222. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  223. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  224. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  225. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  226. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  227. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  228. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  229. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  230. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  231. package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
  232. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  233. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
  234. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  235. package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
  236. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  237. package/dist/ace/ace-curator.js +10 -2
  238. package/dist/ace/ace-curator.js.map +1 -1
  239. package/dist/ace/ace-generator.js +4 -0
  240. package/dist/ace/ace-generator.js.map +1 -1
  241. package/dist/ace/ace-reflector.js +1 -1
  242. package/dist/ace/ace-reflector.js.map +1 -1
  243. package/dist/ace/context-injection.js +24 -2
  244. package/dist/ace/context-injection.js.map +1 -1
  245. package/dist/agents/task-agent-integration.js +1 -1
  246. package/dist/agents/task-agent-integration.js.map +1 -1
  247. package/dist/api/health-endpoints.js +390 -0
  248. package/dist/api/health-endpoints.js.map +1 -0
  249. package/dist/cli/agent-executor.js +4 -1
  250. package/dist/cli/agent-executor.js.map +1 -1
  251. package/dist/cli/agent-prompt-builder.js +89 -1
  252. package/dist/cli/agent-prompt-builder.js.map +1 -1
  253. package/dist/cli/agent-spawn.js +130 -37
  254. package/dist/cli/agent-spawn.js.map +1 -1
  255. package/dist/cli/config-manager.js +109 -91
  256. package/dist/cli/config-manager.js.map +1 -1
  257. package/dist/cli/conversation-fork-cleanup.js +201 -0
  258. package/dist/cli/conversation-fork-cleanup.js.map +1 -0
  259. package/dist/cli/conversation-fork.js +16 -3
  260. package/dist/cli/conversation-fork.js.map +1 -1
  261. package/dist/cli/skill-cache-validator.js +412 -0
  262. package/dist/cli/skill-cache-validator.js.map +1 -0
  263. package/dist/cli/skill-cli.js +991 -0
  264. package/dist/cli/skill-cli.js.map +1 -0
  265. package/dist/cli/skill-execution-logger.js +284 -0
  266. package/dist/cli/skill-execution-logger.js.map +1 -0
  267. package/dist/cli/skill-loader.js +457 -0
  268. package/dist/cli/skill-loader.js.map +1 -0
  269. package/dist/coordination/event-bus.js +2 -2
  270. package/dist/coordination/event-bus.js.map +1 -1
  271. package/dist/coordination/fleet-manager.js +1 -1
  272. package/dist/coordination/fleet-manager.js.map +1 -1
  273. package/dist/coordination/index.js +23 -9
  274. package/dist/coordination/index.js.map +1 -1
  275. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  276. package/dist/db/migration-manager.js +483 -0
  277. package/dist/db/migration-manager.js.map +1 -0
  278. package/dist/db/skills-query.js +535 -0
  279. package/dist/db/skills-query.js.map +1 -0
  280. package/dist/integration/DatabaseHandoff.js +1 -1
  281. package/dist/integration/DatabaseHandoff.js.map +1 -1
  282. package/dist/jobs/edge-case-analyzer.js +367 -0
  283. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  284. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  285. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  286. package/dist/lib/agent-output-parser.js.map +1 -1
  287. package/dist/lib/agent-output-validator.js.map +1 -1
  288. package/dist/lib/agent-workspace.js +281 -0
  289. package/dist/lib/agent-workspace.js.map +1 -0
  290. package/dist/lib/atomic-file-writer.js +377 -0
  291. package/dist/lib/atomic-file-writer.js.map +1 -0
  292. package/dist/lib/backup-manager.js +779 -0
  293. package/dist/lib/backup-manager.js.map +1 -0
  294. package/dist/lib/checkpoint-manager.js +837 -0
  295. package/dist/lib/checkpoint-manager.js.map +1 -0
  296. package/dist/lib/circuit-breaker.js +340 -0
  297. package/dist/lib/circuit-breaker.js.map +1 -0
  298. package/dist/lib/completion-signal-handler.js +243 -0
  299. package/dist/lib/completion-signal-handler.js.map +1 -0
  300. package/dist/lib/config-manager.js +312 -0
  301. package/dist/lib/config-manager.js.map +1 -0
  302. package/dist/lib/config-migrator.js +386 -0
  303. package/dist/lib/config-migrator.js.map +1 -0
  304. package/dist/lib/config-validator.js.map +1 -1
  305. package/dist/lib/correlation-cache.js +311 -0
  306. package/dist/lib/correlation-cache.js.map +1 -0
  307. package/dist/lib/correlation.js +263 -0
  308. package/dist/lib/correlation.js.map +1 -0
  309. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  310. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  311. package/dist/lib/database-service/correlation.js +329 -0
  312. package/dist/lib/database-service/correlation.js.map +1 -0
  313. package/dist/lib/database-service/errors.js +120 -0
  314. package/dist/lib/database-service/errors.js.map +1 -0
  315. package/dist/lib/database-service/index.js +168 -0
  316. package/dist/lib/database-service/index.js.map +1 -0
  317. package/dist/lib/database-service/postgres-adapter.js +526 -0
  318. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  319. package/dist/lib/database-service/redis-adapter.js +360 -0
  320. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  321. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  322. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  323. package/dist/lib/database-service/transaction-manager.js +773 -0
  324. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  325. package/dist/lib/database-service/types.js +23 -0
  326. package/dist/lib/database-service/types.js.map +1 -0
  327. package/dist/lib/deadlock-resolver.js +292 -0
  328. package/dist/lib/deadlock-resolver.js.map +1 -0
  329. package/dist/lib/distributed-lock.js +451 -0
  330. package/dist/lib/distributed-lock.js.map +1 -0
  331. package/dist/lib/edge-case-deduplicator.js +227 -0
  332. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  333. package/dist/lib/encryption-manager.js +322 -0
  334. package/dist/lib/encryption-manager.js.map +1 -0
  335. package/dist/lib/error-aggregator.js +234 -0
  336. package/dist/lib/error-aggregator.js.map +1 -0
  337. package/dist/lib/errors.js +287 -0
  338. package/dist/lib/errors.js.map +1 -0
  339. package/dist/lib/file-lock-manager.js +578 -0
  340. package/dist/lib/file-lock-manager.js.map +1 -0
  341. package/dist/lib/file-operations.js +367 -0
  342. package/dist/lib/file-operations.js.map +1 -0
  343. package/dist/lib/idempotent-write.js +237 -0
  344. package/dist/lib/idempotent-write.js.map +1 -0
  345. package/dist/lib/integration-schema-validator.js +522 -0
  346. package/dist/lib/integration-schema-validator.js.map +1 -0
  347. package/dist/lib/lock-health-monitor.js +298 -0
  348. package/dist/lib/lock-health-monitor.js.map +1 -0
  349. package/dist/lib/log-shipper.js +422 -0
  350. package/dist/lib/log-shipper.js.map +1 -0
  351. package/dist/lib/logging.js +146 -0
  352. package/dist/lib/logging.js.map +1 -0
  353. package/dist/lib/message-deduplicator.js +439 -0
  354. package/dist/lib/message-deduplicator.js.map +1 -0
  355. package/dist/lib/multi-system-query.js +604 -0
  356. package/dist/lib/multi-system-query.js.map +1 -0
  357. package/dist/lib/orphan-detector.js +332 -0
  358. package/dist/lib/orphan-detector.js.map +1 -0
  359. package/dist/lib/password-generator.js +166 -0
  360. package/dist/lib/password-generator.js.map +1 -0
  361. package/dist/lib/path-validator.js +429 -0
  362. package/dist/lib/path-validator.js.map +1 -0
  363. package/dist/lib/query-translator.js +905 -0
  364. package/dist/lib/query-translator.js.map +1 -0
  365. package/dist/lib/queue-recovery.js +469 -0
  366. package/dist/lib/queue-recovery.js.map +1 -0
  367. package/dist/lib/redis-queue-manager.js +512 -0
  368. package/dist/lib/redis-queue-manager.js.map +1 -0
  369. package/dist/lib/reflection-archiver.js +272 -0
  370. package/dist/lib/reflection-archiver.js.map +1 -0
  371. package/dist/lib/retry-manager.js +453 -0
  372. package/dist/lib/retry-manager.js.map +1 -0
  373. package/dist/lib/retry.js +262 -0
  374. package/dist/lib/retry.js.map +1 -0
  375. package/dist/lib/schema-transform.js +695 -0
  376. package/dist/lib/schema-transform.js.map +1 -0
  377. package/dist/lib/schema-validator.js +491 -0
  378. package/dist/lib/schema-validator.js.map +1 -0
  379. package/dist/lib/skill-cache.js +297 -0
  380. package/dist/lib/skill-cache.js.map +1 -0
  381. package/dist/lib/skill-content-manager.js +337 -0
  382. package/dist/lib/skill-content-manager.js.map +1 -0
  383. package/dist/lib/skill-frontmatter-parser.js +237 -0
  384. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  385. package/dist/lib/skill-git-integration.js +275 -0
  386. package/dist/lib/skill-git-integration.js.map +1 -0
  387. package/dist/lib/skill-markdown-validator.js +396 -0
  388. package/dist/lib/skill-markdown-validator.js.map +1 -0
  389. package/dist/lib/skill-output-parser.js +312 -0
  390. package/dist/lib/skill-output-parser.js.map +1 -0
  391. package/dist/lib/unified-query-api.js +467 -0
  392. package/dist/lib/unified-query-api.js.map +1 -0
  393. package/dist/middleware/auth-middleware.js +350 -0
  394. package/dist/middleware/auth-middleware.js.map +1 -0
  395. package/dist/middleware/schema-validation.js +347 -0
  396. package/dist/middleware/schema-validation.js.map +1 -0
  397. package/dist/providers/anthropic-provider.js +1 -1
  398. package/dist/providers/anthropic-provider.js.map +1 -1
  399. package/dist/providers/provider-factory.js +2 -2
  400. package/dist/providers/provider-factory.js.map +1 -1
  401. package/dist/services/edge-case-analyzer.js +321 -0
  402. package/dist/services/edge-case-analyzer.js.map +1 -0
  403. package/dist/services/edge-case-deduplicator.js +266 -0
  404. package/dist/services/edge-case-deduplicator.js.map +1 -0
  405. package/dist/services/edge-case-detector.js +337 -0
  406. package/dist/services/edge-case-detector.js.map +1 -0
  407. package/dist/services/edge-case-tracker.js +547 -0
  408. package/dist/services/edge-case-tracker.js.map +1 -0
  409. package/dist/services/health-check-system.js +586 -0
  410. package/dist/services/health-check-system.js.map +1 -0
  411. package/dist/services/metrics-logger.js +412 -0
  412. package/dist/services/metrics-logger.js.map +1 -0
  413. package/dist/services/patch-generator.js +378 -0
  414. package/dist/services/patch-generator.js.map +1 -0
  415. package/dist/services/patch-validator.js +337 -0
  416. package/dist/services/patch-validator.js.map +1 -0
  417. package/dist/services/performance-monitor.js +811 -0
  418. package/dist/services/performance-monitor.js.map +1 -0
  419. package/dist/services/promotion-pipeline.js +918 -0
  420. package/dist/services/promotion-pipeline.js.map +1 -0
  421. package/dist/services/promotion-validator.js +394 -0
  422. package/dist/services/promotion-validator.js.map +1 -0
  423. package/dist/services/reflection-logger.js +388 -0
  424. package/dist/services/reflection-logger.js.map +1 -0
  425. package/dist/services/skill-deployment.js +472 -0
  426. package/dist/services/skill-deployment.js.map +1 -0
  427. package/dist/services/skill-loader.js +427 -0
  428. package/dist/services/skill-loader.js.map +1 -0
  429. package/dist/services/skill-promotion.js +372 -0
  430. package/dist/services/skill-promotion.js.map +1 -0
  431. package/dist/services/skill-validator.js +454 -0
  432. package/dist/services/skill-validator.js.map +1 -0
  433. package/dist/services/skill-versioning.js +244 -0
  434. package/dist/services/skill-versioning.js.map +1 -0
  435. package/dist/services/workspace-supervisor.js +597 -0
  436. package/dist/services/workspace-supervisor.js.map +1 -0
  437. package/dist/types/edge-case.js +45 -0
  438. package/dist/types/edge-case.js.map +1 -0
  439. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
  440. package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
  441. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
  442. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
  443. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
  444. package/package.json +35 -4
  445. package/readme/README.md +53 -5
  446. package/scripts/backup-cleanup.sh +627 -0
  447. package/scripts/cleanup-workspaces.sh +412 -0
  448. package/scripts/cleanup-yaml-configs.sh +141 -0
  449. package/scripts/deploy-approved-skills.sh +263 -0
  450. package/scripts/health-check.sh +447 -0
  451. package/scripts/log-aggregator.sh +554 -0
  452. package/scripts/log-monitor.sh +629 -0
  453. package/scripts/manage-agent-workspaces.sh +434 -0
  454. package/scripts/migrate-schema.sh +533 -0
  455. package/scripts/promote-staged-skills.sh +423 -0
  456. package/scripts/verify-no-secrets.sh +88 -35
  457. package/scripts/verify-redis-cleanup.sh +173 -0
  458. package/tests/README.md +84 -0
  459. package/tests/test-memory-leak-task-mode.sh +435 -0
  460. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  461. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  462. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  463. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  464. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  465. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  466. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  467. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  468. package/README.md.backup_before_replace +0 -781
  469. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  470. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  471. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  472. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  473. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -1,11 +1,25 @@
1
- // Redis Coordination Components
2
- export * from './redis-messaging-infrastructure.js';
3
- export * from './transparency-middleware.js';
4
- export * from './agent-state-management.js';
5
- export * from './enhanced-progress-tracker.js';
6
- export * from './redis-pubsub-helpers.js';
7
- export * from './redis-coordination.js';
8
- export * from './redis-coordinator.js';
9
- export * from './collaboration-integration.js';
1
+ // Redis Coordination Components - Basic stub for performance testing
2
+ // Note: Full implementation modules may not exist yet; using mock implementations
3
+ /**
4
+ * Mock RedisCoordination class for performance testing
5
+ */ export class RedisCoordination {
6
+ host;
7
+ port;
8
+ connected = false;
9
+ constructor(config){
10
+ this.host = config.host;
11
+ this.port = config.port;
12
+ }
13
+ async connect() {
14
+ // Mock connection with minimal overhead
15
+ this.connected = true;
16
+ }
17
+ async disconnect() {
18
+ this.connected = false;
19
+ }
20
+ isConnected() {
21
+ return this.connected;
22
+ }
23
+ }
10
24
 
11
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/coordination/index.ts"],"sourcesContent":["// Redis Coordination Components\nexport * from './redis-messaging-infrastructure.js';\nexport * from './transparency-middleware.js';\nexport * from './agent-state-management.js';\nexport * from './enhanced-progress-tracker.js';\nexport * from './redis-pubsub-helpers.js';\nexport * from './redis-coordination.js';\nexport * from './redis-coordinator.js';\nexport * from './collaboration-integration.js';\n\n// Type-safe exports for easier import\nexport type {\n // Add key types from various files\n // Example (replace with actual types from the files):\n // RedisMessagingConfig,\n // AgentState,\n // CoordinationOptions\n} from './types.js';\n"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,cAAc,sCAAsC;AACpD,cAAc,+BAA+B;AAC7C,cAAc,8BAA8B;AAC5C,cAAc,iCAAiC;AAC/C,cAAc,4BAA4B;AAC1C,cAAc,0BAA0B;AACxC,cAAc,yBAAyB;AACvC,cAAc,iCAAiC"}
1
+ {"version":3,"sources":["../../src/coordination/index.ts"],"sourcesContent":["// Redis Coordination Components - Basic stub for performance testing\n// Note: Full implementation modules may not exist yet; using mock implementations\n\n/**\n * Mock RedisCoordination class for performance testing\n */\nexport class RedisCoordination {\n private host: string;\n private port: number;\n private connected: boolean = false;\n\n constructor(config: { host: string; port: number }) {\n this.host = config.host;\n this.port = config.port;\n }\n\n async connect(): Promise<void> {\n // Mock connection with minimal overhead\n this.connected = true;\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n}\n"],"names":["RedisCoordination","host","port","connected","config","connect","disconnect","isConnected"],"mappings":"AAAA,qEAAqE;AACrE,kFAAkF;AAElF;;CAEC,GACD,OAAO,MAAMA;IACHC,KAAa;IACbC,KAAa;IACbC,YAAqB,MAAM;IAEnC,YAAYC,MAAsC,CAAE;QAClD,IAAI,CAACH,IAAI,GAAGG,OAAOH,IAAI;QACvB,IAAI,CAACC,IAAI,GAAGE,OAAOF,IAAI;IACzB;IAEA,MAAMG,UAAyB;QAC7B,wCAAwC;QACxC,IAAI,CAACF,SAAS,GAAG;IACnB;IAEA,MAAMG,aAA4B;QAChC,IAAI,CAACH,SAAS,GAAG;IACnB;IAEAI,cAAuB;QACrB,OAAO,IAAI,CAACJ,SAAS;IACvB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/coordination/types/fleet-manager.types.ts"],"sourcesContent":["import { AgentId } from '../../agents/agent-registry.types';\r\n\r\nexport enum ResourceTier {\r\n Shared = 'shared',\r\n Dedicated = 'dedicated',\r\n Premium = 'premium'\r\n}\r\n\r\nexport interface AgentResourceRequirements {\r\n cpu: number;\r\n memory: number;\r\n network: number;\r\n storageIO: number;\r\n}\r\n\r\nexport interface AgentPerformanceMetrics {\r\n cpuUtilization: number;\r\n memoryUsage: number;\r\n networkThroughput: number;\r\n storageIOPS: number;\r\n timestamp: number;\r\n}\r\n\r\nexport interface AgentResourceAllocation {\r\n agentId: AgentId;\r\n tier: ResourceTier;\r\n allocatedResources: AgentResourceRequirements;\r\n currentMetrics: AgentPerformanceMetrics;\r\n}\r\n\r\nexport interface FleetManagerConfig {\r\n maxAgents: number;\r\n resourceAllocationStrategy: 'round-robin' | 'least-loaded' | 'weighted';\r\n}\r\n\r\nexport interface LoadBalancingResult {\r\n rebalancedAgents: AgentId[];\r\n migrationPlan: Record<AgentId, AgentId>;\r\n}"],"names":["ResourceTier"],"mappings":"AAEA,OAAO,IAAA,AAAKA,sCAAAA;;;;WAAAA;MAIX"}
1
+ {"version":3,"sources":["../../../src/coordination/types/fleet-manager.types.ts"],"sourcesContent":["import { AgentId } from '../../agents/agent-registry.types.js';\r\n\r\nexport enum ResourceTier {\r\n Shared = 'shared',\r\n Dedicated = 'dedicated',\r\n Premium = 'premium'\r\n}\r\n\r\nexport interface AgentResourceRequirements {\r\n cpu: number;\r\n memory: number;\r\n network: number;\r\n storageIO: number;\r\n}\r\n\r\nexport interface AgentPerformanceMetrics {\r\n cpuUtilization: number;\r\n memoryUsage: number;\r\n networkThroughput: number;\r\n storageIOPS: number;\r\n timestamp: number;\r\n}\r\n\r\nexport interface AgentResourceAllocation {\r\n agentId: AgentId;\r\n tier: ResourceTier;\r\n allocatedResources: AgentResourceRequirements;\r\n currentMetrics: AgentPerformanceMetrics;\r\n}\r\n\r\nexport interface FleetManagerConfig {\r\n maxAgents: number;\r\n resourceAllocationStrategy: 'round-robin' | 'least-loaded' | 'weighted';\r\n}\r\n\r\nexport interface LoadBalancingResult {\r\n rebalancedAgents: AgentId[];\r\n migrationPlan: Record<AgentId, AgentId>;\r\n}"],"names":["ResourceTier"],"mappings":"AAEA,OAAO,IAAA,AAAKA,sCAAAA;;;;WAAAA;MAIX"}
@@ -0,0 +1,483 @@
1
+ /**
2
+ * Database Migration Manager with Rollback Support
3
+ *
4
+ * Provides comprehensive database migration management with:
5
+ * - Forward (up) and backward (down) migrations
6
+ * - Migration versioning and history tracking
7
+ * - Rollback to specific versions
8
+ * - Transaction support for atomic operations
9
+ * - Dry-run mode for testing
10
+ * - Idempotent rollback operations
11
+ * - Detailed logging with timestamps
12
+ *
13
+ * @module migration-manager
14
+ * @version 1.0.0
15
+ */ import sqlite3 from 'sqlite3';
16
+ import { open } from 'sqlite';
17
+ import * as fs from 'fs/promises';
18
+ import * as path from 'path';
19
+ import { createHash } from 'crypto';
20
+ // ============================================================================
21
+ // Migration Manager Class
22
+ // ============================================================================
23
+ export class MigrationManager {
24
+ db = null;
25
+ config;
26
+ constructor(config){
27
+ this.config = {
28
+ dryRun: false,
29
+ verbose: false,
30
+ operator: 'system',
31
+ ...config
32
+ };
33
+ }
34
+ // ==========================================================================
35
+ // Initialization & Connection
36
+ // ==========================================================================
37
+ /**
38
+ * Initialize database connection and create migration tracking tables
39
+ */ async initialize() {
40
+ try {
41
+ this.db = await open({
42
+ filename: this.config.databasePath,
43
+ driver: sqlite3.Database
44
+ });
45
+ await this.createMigrationTables();
46
+ this.log('Migration manager initialized');
47
+ } catch (error) {
48
+ throw new Error(`Failed to initialize migration manager: ${error instanceof Error ? error.message : String(error)}`);
49
+ }
50
+ }
51
+ /**
52
+ * Create migration tracking tables if they don't exist
53
+ */ async createMigrationTables() {
54
+ if (!this.db) throw new Error('Database not initialized');
55
+ // Schema migrations table (tracks applied migrations)
56
+ await this.db.exec(`
57
+ CREATE TABLE IF NOT EXISTS schema_migrations (
58
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
59
+ version TEXT NOT NULL UNIQUE,
60
+ name TEXT NOT NULL,
61
+ applied_at DATETIME DEFAULT CURRENT_TIMESTAMP,
62
+ checksum TEXT NOT NULL,
63
+ execution_time_ms INTEGER NOT NULL,
64
+ applied_by TEXT DEFAULT 'system'
65
+ );
66
+
67
+ CREATE INDEX IF NOT EXISTS idx_schema_migrations_version
68
+ ON schema_migrations(version);
69
+
70
+ CREATE INDEX IF NOT EXISTS idx_schema_migrations_applied_at
71
+ ON schema_migrations(applied_at DESC);
72
+ `);
73
+ // Rollback history table (tracks all rollback operations)
74
+ await this.db.exec(`
75
+ CREATE TABLE IF NOT EXISTS migration_rollback_history (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ version TEXT NOT NULL,
78
+ name TEXT NOT NULL,
79
+ rolled_back_at DATETIME DEFAULT CURRENT_TIMESTAMP,
80
+ reason TEXT,
81
+ execution_time_ms INTEGER NOT NULL,
82
+ rolled_back_by TEXT DEFAULT 'system',
83
+ success BOOLEAN NOT NULL DEFAULT 1,
84
+ error_message TEXT
85
+ );
86
+
87
+ CREATE INDEX IF NOT EXISTS idx_rollback_history_version
88
+ ON migration_rollback_history(version);
89
+
90
+ CREATE INDEX IF NOT EXISTS idx_rollback_history_rolled_back_at
91
+ ON migration_rollback_history(rolled_back_at DESC);
92
+ `);
93
+ }
94
+ /**
95
+ * Close database connection
96
+ */ async close() {
97
+ if (this.db) {
98
+ await this.db.close();
99
+ this.db = null;
100
+ this.log('Migration manager closed');
101
+ }
102
+ }
103
+ // ==========================================================================
104
+ // Migration Discovery
105
+ // ==========================================================================
106
+ /**
107
+ * Discover all migration files (both up and down)
108
+ */ async discoverMigrations() {
109
+ const upMigrationsDir = path.join(this.config.migrationsDir, 'up');
110
+ const downMigrationsDir = path.join(this.config.migrationsDir, 'down');
111
+ // Get all up migration files
112
+ const upFiles = await this.getMigrationFiles(upMigrationsDir);
113
+ // Match with down migration files
114
+ const migrations = [];
115
+ for (const upFile of upFiles){
116
+ const parsed = this.parseMigrationFilename(upFile);
117
+ if (!parsed) continue;
118
+ const downPath = path.join(downMigrationsDir, upFile);
119
+ migrations.push({
120
+ version: parsed.version,
121
+ name: parsed.name,
122
+ upPath: path.join(upMigrationsDir, upFile),
123
+ downPath
124
+ });
125
+ }
126
+ // Sort by version
127
+ migrations.sort((a, b)=>this.compareVersions(a.version, b.version));
128
+ return migrations;
129
+ }
130
+ /**
131
+ * Get all SQL migration files from a directory
132
+ */ async getMigrationFiles(dir) {
133
+ try {
134
+ const files = await fs.readdir(dir);
135
+ return files.filter((f)=>f.endsWith('.sql')).sort();
136
+ } catch (error) {
137
+ // Directory doesn't exist yet
138
+ return [];
139
+ }
140
+ }
141
+ /**
142
+ * Parse migration filename to extract version and name
143
+ * Format: 001-migration-name.sql
144
+ */ parseMigrationFilename(filename) {
145
+ const match = filename.match(/^(\d+)-(.+)\.sql$/);
146
+ if (!match) return null;
147
+ return {
148
+ version: match[1],
149
+ name: match[2]
150
+ };
151
+ }
152
+ /**
153
+ * Compare two version strings (numeric comparison)
154
+ */ compareVersions(a, b) {
155
+ return parseInt(a, 10) - parseInt(b, 10);
156
+ }
157
+ // ==========================================================================
158
+ // Migration Application
159
+ // ==========================================================================
160
+ /**
161
+ * Apply all pending migrations
162
+ */ async migrateUp() {
163
+ if (!this.db) throw new Error('Database not initialized');
164
+ const migrations = await this.discoverMigrations();
165
+ const applied = await this.getAppliedMigrations();
166
+ const appliedVersions = new Set(applied.map((m)=>m.version));
167
+ const pending = migrations.filter((m)=>!appliedVersions.has(m.version));
168
+ if (pending.length === 0) {
169
+ this.log('No pending migrations');
170
+ return [];
171
+ }
172
+ this.log(`Found ${pending.length} pending migration(s)`);
173
+ const results = [];
174
+ for (const migration of pending){
175
+ const result = await this.applyMigration(migration);
176
+ results.push(result);
177
+ if (!result.success) {
178
+ this.log(`Migration failed: ${migration.version} - ${migration.name}`, 'error');
179
+ break; // Stop on first failure
180
+ }
181
+ }
182
+ return results;
183
+ }
184
+ /**
185
+ * Apply a single migration
186
+ */ async applyMigration(migration) {
187
+ if (!this.db) throw new Error('Database not initialized');
188
+ const startTime = Date.now();
189
+ try {
190
+ // Read migration SQL
191
+ const sql = await fs.readFile(migration.upPath, 'utf-8');
192
+ const checksum = this.calculateChecksum(sql);
193
+ if (this.config.dryRun) {
194
+ this.log(`[DRY RUN] Would apply migration: ${migration.version} - ${migration.name}`);
195
+ return {
196
+ success: true,
197
+ version: migration.version,
198
+ name: migration.name,
199
+ executionTimeMs: Date.now() - startTime,
200
+ dryRun: true
201
+ };
202
+ }
203
+ // Execute migration in transaction
204
+ await this.db.exec('BEGIN TRANSACTION');
205
+ try {
206
+ // Execute migration SQL
207
+ await this.db.exec(sql);
208
+ // Record migration
209
+ await this.db.run(`INSERT INTO schema_migrations (version, name, checksum, execution_time_ms, applied_by)
210
+ VALUES (?, ?, ?, ?, ?)`, [
211
+ migration.version,
212
+ migration.name,
213
+ checksum,
214
+ Date.now() - startTime,
215
+ this.config.operator
216
+ ]);
217
+ await this.db.exec('COMMIT');
218
+ this.log(`Applied migration: ${migration.version} - ${migration.name}`);
219
+ return {
220
+ success: true,
221
+ version: migration.version,
222
+ name: migration.name,
223
+ executionTimeMs: Date.now() - startTime
224
+ };
225
+ } catch (error) {
226
+ await this.db.exec('ROLLBACK');
227
+ throw error;
228
+ }
229
+ } catch (error) {
230
+ return {
231
+ success: false,
232
+ version: migration.version,
233
+ name: migration.name,
234
+ executionTimeMs: Date.now() - startTime,
235
+ error: error instanceof Error ? error.message : String(error)
236
+ };
237
+ }
238
+ }
239
+ // ==========================================================================
240
+ // Migration Rollback
241
+ // ==========================================================================
242
+ /**
243
+ * Rollback the last N migrations
244
+ */ async rollbackLast(count = 1, reason) {
245
+ if (!this.db) throw new Error('Database not initialized');
246
+ const applied = await this.getAppliedMigrations();
247
+ if (applied.length === 0) {
248
+ this.log('No migrations to rollback');
249
+ return [];
250
+ }
251
+ const toRollback = applied.slice(-count).reverse();
252
+ this.log(`Rolling back ${toRollback.length} migration(s)`);
253
+ const results = [];
254
+ for (const migration of toRollback){
255
+ const result = await this.rollbackMigration(migration, reason);
256
+ results.push(result);
257
+ if (!result.success) {
258
+ this.log(`Rollback failed: ${migration.version} - ${migration.name}`, 'error');
259
+ break; // Stop on first failure
260
+ }
261
+ }
262
+ return results;
263
+ }
264
+ /**
265
+ * Rollback to a specific version (exclusive)
266
+ * All migrations after the target version will be rolled back
267
+ */ async rollbackTo(targetVersion, reason) {
268
+ if (!this.db) throw new Error('Database not initialized');
269
+ const applied = await this.getAppliedMigrations();
270
+ const targetIndex = applied.findIndex((m)=>m.version === targetVersion);
271
+ if (targetIndex === -1) {
272
+ throw new Error(`Target version ${targetVersion} not found in applied migrations`);
273
+ }
274
+ // Rollback all migrations after target (in reverse order)
275
+ const toRollback = applied.slice(targetIndex + 1).reverse();
276
+ if (toRollback.length === 0) {
277
+ this.log(`Already at version ${targetVersion}`);
278
+ return [];
279
+ }
280
+ this.log(`Rolling back ${toRollback.length} migration(s) to version ${targetVersion}`);
281
+ const results = [];
282
+ for (const migration of toRollback){
283
+ const result = await this.rollbackMigration(migration, reason);
284
+ results.push(result);
285
+ if (!result.success) {
286
+ this.log(`Rollback failed: ${migration.version} - ${migration.name}`, 'error');
287
+ break; // Stop on first failure
288
+ }
289
+ }
290
+ return results;
291
+ }
292
+ /**
293
+ * Rollback all migrations (reset database to initial state)
294
+ */ async rollbackAll(reason) {
295
+ if (!this.db) throw new Error('Database not initialized');
296
+ const applied = await this.getAppliedMigrations();
297
+ if (applied.length === 0) {
298
+ this.log('No migrations to rollback');
299
+ return [];
300
+ }
301
+ this.log(`Rolling back all ${applied.length} migration(s)`);
302
+ const results = [];
303
+ // Rollback in reverse order
304
+ for (const migration of applied.reverse()){
305
+ const result = await this.rollbackMigration(migration, reason);
306
+ results.push(result);
307
+ if (!result.success) {
308
+ this.log(`Rollback failed: ${migration.version} - ${migration.name}`, 'error');
309
+ break; // Stop on first failure
310
+ }
311
+ }
312
+ return results;
313
+ }
314
+ /**
315
+ * Rollback a single migration (idempotent)
316
+ */ async rollbackMigration(migration, reason) {
317
+ if (!this.db) throw new Error('Database not initialized');
318
+ const startTime = Date.now();
319
+ try {
320
+ // Find the migration file
321
+ const migrations = await this.discoverMigrations();
322
+ const migrationFile = migrations.find((m)=>m.version === migration.version);
323
+ if (!migrationFile) {
324
+ throw new Error(`Migration file not found for version ${migration.version}`);
325
+ }
326
+ // Check if down migration exists
327
+ try {
328
+ await fs.access(migrationFile.downPath);
329
+ } catch {
330
+ throw new Error(`Down migration not found: ${migrationFile.downPath}`);
331
+ }
332
+ // Read rollback SQL
333
+ const sql = await fs.readFile(migrationFile.downPath, 'utf-8');
334
+ if (this.config.dryRun) {
335
+ this.log(`[DRY RUN] Would rollback migration: ${migration.version} - ${migration.name}`);
336
+ return {
337
+ success: true,
338
+ version: migration.version,
339
+ name: migration.name,
340
+ executionTimeMs: Date.now() - startTime,
341
+ dryRun: true
342
+ };
343
+ }
344
+ // Execute rollback in transaction
345
+ await this.db.exec('BEGIN TRANSACTION');
346
+ try {
347
+ // Execute rollback SQL
348
+ await this.db.exec(sql);
349
+ // Remove migration record
350
+ await this.db.run(`DELETE FROM schema_migrations WHERE version = ?`, [
351
+ migration.version
352
+ ]);
353
+ // Record rollback in history
354
+ await this.db.run(`INSERT INTO migration_rollback_history
355
+ (version, name, reason, execution_time_ms, rolled_back_by, success)
356
+ VALUES (?, ?, ?, ?, ?, 1)`, [
357
+ migration.version,
358
+ migration.name,
359
+ reason || 'Manual rollback',
360
+ Date.now() - startTime,
361
+ this.config.operator
362
+ ]);
363
+ await this.db.exec('COMMIT');
364
+ this.log(`Rolled back migration: ${migration.version} - ${migration.name}`);
365
+ return {
366
+ success: true,
367
+ version: migration.version,
368
+ name: migration.name,
369
+ executionTimeMs: Date.now() - startTime
370
+ };
371
+ } catch (error) {
372
+ await this.db.exec('ROLLBACK');
373
+ throw error;
374
+ }
375
+ } catch (error) {
376
+ // Record failed rollback
377
+ const errorMessage = error instanceof Error ? error.message : String(error);
378
+ if (!this.config.dryRun) {
379
+ await this.db.run(`INSERT INTO migration_rollback_history
380
+ (version, name, reason, execution_time_ms, rolled_back_by, success, error_message)
381
+ VALUES (?, ?, ?, ?, ?, 0, ?)`, [
382
+ migration.version,
383
+ migration.name,
384
+ reason || 'Manual rollback',
385
+ Date.now() - startTime,
386
+ this.config.operator,
387
+ errorMessage
388
+ ]);
389
+ }
390
+ return {
391
+ success: false,
392
+ version: migration.version,
393
+ name: migration.name,
394
+ executionTimeMs: Date.now() - startTime,
395
+ error: errorMessage
396
+ };
397
+ }
398
+ }
399
+ // ==========================================================================
400
+ // Query Methods
401
+ // ==========================================================================
402
+ /**
403
+ * Get all applied migrations (ordered by version)
404
+ */ async getAppliedMigrations() {
405
+ if (!this.db) throw new Error('Database not initialized');
406
+ return this.db.all(`SELECT * FROM schema_migrations ORDER BY version ASC`);
407
+ }
408
+ /**
409
+ * Get rollback history (most recent first)
410
+ */ async getRollbackHistory() {
411
+ if (!this.db) throw new Error('Database not initialized');
412
+ return this.db.all(`SELECT * FROM migration_rollback_history ORDER BY rolled_back_at DESC`);
413
+ }
414
+ /**
415
+ * Get current database version (latest applied migration)
416
+ */ async getCurrentVersion() {
417
+ if (!this.db) throw new Error('Database not initialized');
418
+ const result = await this.db.get(`SELECT version FROM schema_migrations ORDER BY version DESC LIMIT 1`);
419
+ return result?.version || null;
420
+ }
421
+ /**
422
+ * Check if a specific migration is applied
423
+ */ async isMigrationApplied(version) {
424
+ if (!this.db) throw new Error('Database not initialized');
425
+ const result = await this.db.get(`SELECT COUNT(*) as count FROM schema_migrations WHERE version = ?`, [
426
+ version
427
+ ]);
428
+ return (result?.count || 0) > 0;
429
+ }
430
+ /**
431
+ * Validate migration integrity (check checksums)
432
+ */ async validateMigrations() {
433
+ if (!this.db) throw new Error('Database not initialized');
434
+ const applied = await this.getAppliedMigrations();
435
+ const migrations = await this.discoverMigrations();
436
+ const errors = [];
437
+ for (const appliedMigration of applied){
438
+ const migrationFile = migrations.find((m)=>m.version === appliedMigration.version);
439
+ if (!migrationFile) {
440
+ errors.push(`Migration file not found for version ${appliedMigration.version}`);
441
+ continue;
442
+ }
443
+ // Verify checksum
444
+ const sql = await fs.readFile(migrationFile.upPath, 'utf-8');
445
+ const checksum = this.calculateChecksum(sql);
446
+ if (checksum !== appliedMigration.checksum) {
447
+ errors.push(`Checksum mismatch for version ${appliedMigration.version}: ` + `expected ${appliedMigration.checksum}, got ${checksum}`);
448
+ }
449
+ }
450
+ return {
451
+ valid: errors.length === 0,
452
+ errors
453
+ };
454
+ }
455
+ // ==========================================================================
456
+ // Utility Methods
457
+ // ==========================================================================
458
+ /**
459
+ * Calculate SHA256 checksum of SQL content
460
+ */ calculateChecksum(content) {
461
+ return createHash('sha256').update(content).digest('hex');
462
+ }
463
+ /**
464
+ * Log message (if verbose mode enabled)
465
+ */ log(message, level = 'info') {
466
+ if (this.config.verbose || level === 'error') {
467
+ const timestamp = new Date().toISOString();
468
+ console.log(`[${timestamp}] [MigrationManager] ${message}`);
469
+ }
470
+ }
471
+ }
472
+ // ============================================================================
473
+ // Convenience Functions
474
+ // ============================================================================
475
+ /**
476
+ * Create and initialize a migration manager
477
+ */ export async function createMigrationManager(config) {
478
+ const manager = new MigrationManager(config);
479
+ await manager.initialize();
480
+ return manager;
481
+ }
482
+
483
+ //# sourceMappingURL=migration-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/db/migration-manager.ts"],"sourcesContent":["/**\r\n * Database Migration Manager with Rollback Support\r\n *\r\n * Provides comprehensive database migration management with:\r\n * - Forward (up) and backward (down) migrations\r\n * - Migration versioning and history tracking\r\n * - Rollback to specific versions\r\n * - Transaction support for atomic operations\r\n * - Dry-run mode for testing\r\n * - Idempotent rollback operations\r\n * - Detailed logging with timestamps\r\n *\r\n * @module migration-manager\r\n * @version 1.0.0\r\n */\r\n\r\nimport { Database } from 'sqlite';\r\nimport sqlite3 from 'sqlite3';\r\nimport { open } from 'sqlite';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport { createHash } from 'crypto';\r\n\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n\r\nexport interface MigrationFile {\r\n version: string;\r\n name: string;\r\n upPath: string;\r\n downPath: string;\r\n}\r\n\r\nexport interface MigrationRecord {\r\n id: number;\r\n version: string;\r\n name: string;\r\n applied_at: string;\r\n checksum: string;\r\n execution_time_ms: number;\r\n}\r\n\r\nexport interface RollbackRecord {\r\n id: number;\r\n version: string;\r\n name: string;\r\n rolled_back_at: string;\r\n reason: string;\r\n execution_time_ms: number;\r\n rolled_back_by: string;\r\n}\r\n\r\nexport interface MigrationResult {\r\n success: boolean;\r\n version: string;\r\n name: string;\r\n executionTimeMs: number;\r\n error?: string;\r\n dryRun?: boolean;\r\n}\r\n\r\nexport interface MigrationManagerConfig {\r\n databasePath: string;\r\n migrationsDir: string;\r\n dryRun?: boolean;\r\n verbose?: boolean;\r\n operator?: string; // Who is performing the migration/rollback\r\n}\r\n\r\n// ============================================================================\r\n// Migration Manager Class\r\n// ============================================================================\r\n\r\nexport class MigrationManager {\r\n private db: Database | null = null;\r\n private config: MigrationManagerConfig;\r\n\r\n constructor(config: MigrationManagerConfig) {\r\n this.config = {\r\n dryRun: false,\r\n verbose: false,\r\n operator: 'system',\r\n ...config,\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // Initialization & Connection\r\n // ==========================================================================\r\n\r\n /**\r\n * Initialize database connection and create migration tracking tables\r\n */\r\n async initialize(): Promise<void> {\r\n try {\r\n this.db = await open({\r\n filename: this.config.databasePath,\r\n driver: sqlite3.Database,\r\n });\r\n\r\n await this.createMigrationTables();\r\n this.log('Migration manager initialized');\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to initialize migration manager: ${error instanceof Error ? error.message : String(error)}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Create migration tracking tables if they don't exist\r\n */\r\n private async createMigrationTables(): Promise<void> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n // Schema migrations table (tracks applied migrations)\r\n await this.db.exec(`\r\n CREATE TABLE IF NOT EXISTS schema_migrations (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n version TEXT NOT NULL UNIQUE,\r\n name TEXT NOT NULL,\r\n applied_at DATETIME DEFAULT CURRENT_TIMESTAMP,\r\n checksum TEXT NOT NULL,\r\n execution_time_ms INTEGER NOT NULL,\r\n applied_by TEXT DEFAULT 'system'\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_schema_migrations_version\r\n ON schema_migrations(version);\r\n\r\n CREATE INDEX IF NOT EXISTS idx_schema_migrations_applied_at\r\n ON schema_migrations(applied_at DESC);\r\n `);\r\n\r\n // Rollback history table (tracks all rollback operations)\r\n await this.db.exec(`\r\n CREATE TABLE IF NOT EXISTS migration_rollback_history (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n version TEXT NOT NULL,\r\n name TEXT NOT NULL,\r\n rolled_back_at DATETIME DEFAULT CURRENT_TIMESTAMP,\r\n reason TEXT,\r\n execution_time_ms INTEGER NOT NULL,\r\n rolled_back_by TEXT DEFAULT 'system',\r\n success BOOLEAN NOT NULL DEFAULT 1,\r\n error_message TEXT\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_rollback_history_version\r\n ON migration_rollback_history(version);\r\n\r\n CREATE INDEX IF NOT EXISTS idx_rollback_history_rolled_back_at\r\n ON migration_rollback_history(rolled_back_at DESC);\r\n `);\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n async close(): Promise<void> {\r\n if (this.db) {\r\n await this.db.close();\r\n this.db = null;\r\n this.log('Migration manager closed');\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Migration Discovery\r\n // ==========================================================================\r\n\r\n /**\r\n * Discover all migration files (both up and down)\r\n */\r\n async discoverMigrations(): Promise<MigrationFile[]> {\r\n const upMigrationsDir = path.join(this.config.migrationsDir, 'up');\r\n const downMigrationsDir = path.join(this.config.migrationsDir, 'down');\r\n\r\n // Get all up migration files\r\n const upFiles = await this.getMigrationFiles(upMigrationsDir);\r\n\r\n // Match with down migration files\r\n const migrations: MigrationFile[] = [];\r\n\r\n for (const upFile of upFiles) {\r\n const parsed = this.parseMigrationFilename(upFile);\r\n if (!parsed) continue;\r\n\r\n const downPath = path.join(downMigrationsDir, upFile);\r\n\r\n migrations.push({\r\n version: parsed.version,\r\n name: parsed.name,\r\n upPath: path.join(upMigrationsDir, upFile),\r\n downPath,\r\n });\r\n }\r\n\r\n // Sort by version\r\n migrations.sort((a, b) => this.compareVersions(a.version, b.version));\r\n\r\n return migrations;\r\n }\r\n\r\n /**\r\n * Get all SQL migration files from a directory\r\n */\r\n private async getMigrationFiles(dir: string): Promise<string[]> {\r\n try {\r\n const files = await fs.readdir(dir);\r\n return files.filter((f) => f.endsWith('.sql')).sort();\r\n } catch (error) {\r\n // Directory doesn't exist yet\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Parse migration filename to extract version and name\r\n * Format: 001-migration-name.sql\r\n */\r\n private parseMigrationFilename(filename: string): { version: string; name: string } | null {\r\n const match = filename.match(/^(\\d+)-(.+)\\.sql$/);\r\n if (!match) return null;\r\n\r\n return {\r\n version: match[1],\r\n name: match[2],\r\n };\r\n }\r\n\r\n /**\r\n * Compare two version strings (numeric comparison)\r\n */\r\n private compareVersions(a: string, b: string): number {\r\n return parseInt(a, 10) - parseInt(b, 10);\r\n }\r\n\r\n // ==========================================================================\r\n // Migration Application\r\n // ==========================================================================\r\n\r\n /**\r\n * Apply all pending migrations\r\n */\r\n async migrateUp(): Promise<MigrationResult[]> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const migrations = await this.discoverMigrations();\r\n const applied = await this.getAppliedMigrations();\r\n const appliedVersions = new Set(applied.map((m) => m.version));\r\n\r\n const pending = migrations.filter((m) => !appliedVersions.has(m.version));\r\n\r\n if (pending.length === 0) {\r\n this.log('No pending migrations');\r\n return [];\r\n }\r\n\r\n this.log(`Found ${pending.length} pending migration(s)`);\r\n\r\n const results: MigrationResult[] = [];\r\n\r\n for (const migration of pending) {\r\n const result = await this.applyMigration(migration);\r\n results.push(result);\r\n\r\n if (!result.success) {\r\n this.log(`Migration failed: ${migration.version} - ${migration.name}`, 'error');\r\n break; // Stop on first failure\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Apply a single migration\r\n */\r\n private async applyMigration(migration: MigrationFile): Promise<MigrationResult> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Read migration SQL\r\n const sql = await fs.readFile(migration.upPath, 'utf-8');\r\n const checksum = this.calculateChecksum(sql);\r\n\r\n if (this.config.dryRun) {\r\n this.log(`[DRY RUN] Would apply migration: ${migration.version} - ${migration.name}`);\r\n return {\r\n success: true,\r\n version: migration.version,\r\n name: migration.name,\r\n executionTimeMs: Date.now() - startTime,\r\n dryRun: true,\r\n };\r\n }\r\n\r\n // Execute migration in transaction\r\n await this.db.exec('BEGIN TRANSACTION');\r\n\r\n try {\r\n // Execute migration SQL\r\n await this.db.exec(sql);\r\n\r\n // Record migration\r\n await this.db.run(\r\n `INSERT INTO schema_migrations (version, name, checksum, execution_time_ms, applied_by)\r\n VALUES (?, ?, ?, ?, ?)`,\r\n [migration.version, migration.name, checksum, Date.now() - startTime, this.config.operator]\r\n );\r\n\r\n await this.db.exec('COMMIT');\r\n\r\n this.log(`Applied migration: ${migration.version} - ${migration.name}`);\r\n\r\n return {\r\n success: true,\r\n version: migration.version,\r\n name: migration.name,\r\n executionTimeMs: Date.now() - startTime,\r\n };\r\n } catch (error) {\r\n await this.db.exec('ROLLBACK');\r\n throw error;\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n version: migration.version,\r\n name: migration.name,\r\n executionTimeMs: Date.now() - startTime,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Migration Rollback\r\n // ==========================================================================\r\n\r\n /**\r\n * Rollback the last N migrations\r\n */\r\n async rollbackLast(count: number = 1, reason?: string): Promise<MigrationResult[]> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const applied = await this.getAppliedMigrations();\r\n\r\n if (applied.length === 0) {\r\n this.log('No migrations to rollback');\r\n return [];\r\n }\r\n\r\n const toRollback = applied.slice(-count).reverse();\r\n\r\n this.log(`Rolling back ${toRollback.length} migration(s)`);\r\n\r\n const results: MigrationResult[] = [];\r\n\r\n for (const migration of toRollback) {\r\n const result = await this.rollbackMigration(migration, reason);\r\n results.push(result);\r\n\r\n if (!result.success) {\r\n this.log(`Rollback failed: ${migration.version} - ${migration.name}`, 'error');\r\n break; // Stop on first failure\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Rollback to a specific version (exclusive)\r\n * All migrations after the target version will be rolled back\r\n */\r\n async rollbackTo(targetVersion: string, reason?: string): Promise<MigrationResult[]> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const applied = await this.getAppliedMigrations();\r\n const targetIndex = applied.findIndex((m) => m.version === targetVersion);\r\n\r\n if (targetIndex === -1) {\r\n throw new Error(`Target version ${targetVersion} not found in applied migrations`);\r\n }\r\n\r\n // Rollback all migrations after target (in reverse order)\r\n const toRollback = applied.slice(targetIndex + 1).reverse();\r\n\r\n if (toRollback.length === 0) {\r\n this.log(`Already at version ${targetVersion}`);\r\n return [];\r\n }\r\n\r\n this.log(`Rolling back ${toRollback.length} migration(s) to version ${targetVersion}`);\r\n\r\n const results: MigrationResult[] = [];\r\n\r\n for (const migration of toRollback) {\r\n const result = await this.rollbackMigration(migration, reason);\r\n results.push(result);\r\n\r\n if (!result.success) {\r\n this.log(`Rollback failed: ${migration.version} - ${migration.name}`, 'error');\r\n break; // Stop on first failure\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Rollback all migrations (reset database to initial state)\r\n */\r\n async rollbackAll(reason?: string): Promise<MigrationResult[]> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const applied = await this.getAppliedMigrations();\r\n\r\n if (applied.length === 0) {\r\n this.log('No migrations to rollback');\r\n return [];\r\n }\r\n\r\n this.log(`Rolling back all ${applied.length} migration(s)`);\r\n\r\n const results: MigrationResult[] = [];\r\n\r\n // Rollback in reverse order\r\n for (const migration of applied.reverse()) {\r\n const result = await this.rollbackMigration(migration, reason);\r\n results.push(result);\r\n\r\n if (!result.success) {\r\n this.log(`Rollback failed: ${migration.version} - ${migration.name}`, 'error');\r\n break; // Stop on first failure\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Rollback a single migration (idempotent)\r\n */\r\n private async rollbackMigration(\r\n migration: MigrationRecord,\r\n reason?: string\r\n ): Promise<MigrationResult> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Find the migration file\r\n const migrations = await this.discoverMigrations();\r\n const migrationFile = migrations.find((m) => m.version === migration.version);\r\n\r\n if (!migrationFile) {\r\n throw new Error(`Migration file not found for version ${migration.version}`);\r\n }\r\n\r\n // Check if down migration exists\r\n try {\r\n await fs.access(migrationFile.downPath);\r\n } catch {\r\n throw new Error(`Down migration not found: ${migrationFile.downPath}`);\r\n }\r\n\r\n // Read rollback SQL\r\n const sql = await fs.readFile(migrationFile.downPath, 'utf-8');\r\n\r\n if (this.config.dryRun) {\r\n this.log(`[DRY RUN] Would rollback migration: ${migration.version} - ${migration.name}`);\r\n return {\r\n success: true,\r\n version: migration.version,\r\n name: migration.name,\r\n executionTimeMs: Date.now() - startTime,\r\n dryRun: true,\r\n };\r\n }\r\n\r\n // Execute rollback in transaction\r\n await this.db.exec('BEGIN TRANSACTION');\r\n\r\n try {\r\n // Execute rollback SQL\r\n await this.db.exec(sql);\r\n\r\n // Remove migration record\r\n await this.db.run(`DELETE FROM schema_migrations WHERE version = ?`, [migration.version]);\r\n\r\n // Record rollback in history\r\n await this.db.run(\r\n `INSERT INTO migration_rollback_history\r\n (version, name, reason, execution_time_ms, rolled_back_by, success)\r\n VALUES (?, ?, ?, ?, ?, 1)`,\r\n [\r\n migration.version,\r\n migration.name,\r\n reason || 'Manual rollback',\r\n Date.now() - startTime,\r\n this.config.operator,\r\n ]\r\n );\r\n\r\n await this.db.exec('COMMIT');\r\n\r\n this.log(`Rolled back migration: ${migration.version} - ${migration.name}`);\r\n\r\n return {\r\n success: true,\r\n version: migration.version,\r\n name: migration.name,\r\n executionTimeMs: Date.now() - startTime,\r\n };\r\n } catch (error) {\r\n await this.db.exec('ROLLBACK');\r\n throw error;\r\n }\r\n } catch (error) {\r\n // Record failed rollback\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n\r\n if (!this.config.dryRun) {\r\n await this.db.run(\r\n `INSERT INTO migration_rollback_history\r\n (version, name, reason, execution_time_ms, rolled_back_by, success, error_message)\r\n VALUES (?, ?, ?, ?, ?, 0, ?)`,\r\n [\r\n migration.version,\r\n migration.name,\r\n reason || 'Manual rollback',\r\n Date.now() - startTime,\r\n this.config.operator,\r\n errorMessage,\r\n ]\r\n );\r\n }\r\n\r\n return {\r\n success: false,\r\n version: migration.version,\r\n name: migration.name,\r\n executionTimeMs: Date.now() - startTime,\r\n error: errorMessage,\r\n };\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // Query Methods\r\n // ==========================================================================\r\n\r\n /**\r\n * Get all applied migrations (ordered by version)\r\n */\r\n async getAppliedMigrations(): Promise<MigrationRecord[]> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n return this.db.all<MigrationRecord[]>(\r\n `SELECT * FROM schema_migrations ORDER BY version ASC`\r\n );\r\n }\r\n\r\n /**\r\n * Get rollback history (most recent first)\r\n */\r\n async getRollbackHistory(): Promise<RollbackRecord[]> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n return this.db.all<RollbackRecord[]>(\r\n `SELECT * FROM migration_rollback_history ORDER BY rolled_back_at DESC`\r\n );\r\n }\r\n\r\n /**\r\n * Get current database version (latest applied migration)\r\n */\r\n async getCurrentVersion(): Promise<string | null> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const result = await this.db.get<{ version: string }>(\r\n `SELECT version FROM schema_migrations ORDER BY version DESC LIMIT 1`\r\n );\r\n\r\n return result?.version || null;\r\n }\r\n\r\n /**\r\n * Check if a specific migration is applied\r\n */\r\n async isMigrationApplied(version: string): Promise<boolean> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const result = await this.db.get<{ count: number }>(\r\n `SELECT COUNT(*) as count FROM schema_migrations WHERE version = ?`,\r\n [version]\r\n );\r\n\r\n return (result?.count || 0) > 0;\r\n }\r\n\r\n /**\r\n * Validate migration integrity (check checksums)\r\n */\r\n async validateMigrations(): Promise<{ valid: boolean; errors: string[] }> {\r\n if (!this.db) throw new Error('Database not initialized');\r\n\r\n const applied = await this.getAppliedMigrations();\r\n const migrations = await this.discoverMigrations();\r\n\r\n const errors: string[] = [];\r\n\r\n for (const appliedMigration of applied) {\r\n const migrationFile = migrations.find((m) => m.version === appliedMigration.version);\r\n\r\n if (!migrationFile) {\r\n errors.push(`Migration file not found for version ${appliedMigration.version}`);\r\n continue;\r\n }\r\n\r\n // Verify checksum\r\n const sql = await fs.readFile(migrationFile.upPath, 'utf-8');\r\n const checksum = this.calculateChecksum(sql);\r\n\r\n if (checksum !== appliedMigration.checksum) {\r\n errors.push(\r\n `Checksum mismatch for version ${appliedMigration.version}: ` +\r\n `expected ${appliedMigration.checksum}, got ${checksum}`\r\n );\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // Utility Methods\r\n // ==========================================================================\r\n\r\n /**\r\n * Calculate SHA256 checksum of SQL content\r\n */\r\n private calculateChecksum(content: string): string {\r\n return createHash('sha256').update(content).digest('hex');\r\n }\r\n\r\n /**\r\n * Log message (if verbose mode enabled)\r\n */\r\n private log(message: string, level: 'info' | 'error' = 'info'): void {\r\n if (this.config.verbose || level === 'error') {\r\n const timestamp = new Date().toISOString();\r\n console.log(`[${timestamp}] [MigrationManager] ${message}`);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Convenience Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create and initialize a migration manager\r\n */\r\nexport async function createMigrationManager(\r\n config: MigrationManagerConfig\r\n): Promise<MigrationManager> {\r\n const manager = new MigrationManager(config);\r\n await manager.initialize();\r\n return manager;\r\n}\r\n"],"names":["sqlite3","open","fs","path","createHash","MigrationManager","db","config","dryRun","verbose","operator","initialize","filename","databasePath","driver","Database","createMigrationTables","log","error","Error","message","String","exec","close","discoverMigrations","upMigrationsDir","join","migrationsDir","downMigrationsDir","upFiles","getMigrationFiles","migrations","upFile","parsed","parseMigrationFilename","downPath","push","version","name","upPath","sort","a","b","compareVersions","dir","files","readdir","filter","f","endsWith","match","parseInt","migrateUp","applied","getAppliedMigrations","appliedVersions","Set","map","m","pending","has","length","results","migration","result","applyMigration","success","startTime","Date","now","sql","readFile","checksum","calculateChecksum","executionTimeMs","run","rollbackLast","count","reason","toRollback","slice","reverse","rollbackMigration","rollbackTo","targetVersion","targetIndex","findIndex","rollbackAll","migrationFile","find","access","errorMessage","all","getRollbackHistory","getCurrentVersion","get","isMigrationApplied","validateMigrations","errors","appliedMigration","valid","content","update","digest","level","timestamp","toISOString","console","createMigrationManager","manager"],"mappings":"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"}