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
@@ -0,0 +1,554 @@
1
+ #!/bin/bash
2
+ ################################################################################
3
+ # CFN Distributed Log Aggregator
4
+ # Task 4.4: Distributed Logging Standardization
5
+ #
6
+ # Aggregates logs from Docker containers and file system into unified
7
+ # searchable log files with structured JSON format.
8
+ #
9
+ # Usage:
10
+ # ./log-aggregator.sh [OPTIONS]
11
+ #
12
+ # Options:
13
+ # --source SOURCE Log source (docker, filesystem, all)
14
+ # --output OUTPUT_DIR Output directory (default: /var/log/cfn/aggregated)
15
+ # --pattern PATTERN Log file pattern (default: *.log)
16
+ # --correlate-by FIELD Correlate by field (correlationId, agentId, taskId)
17
+ # --since DURATION Only aggregate logs from last N hours/minutes (e.g., 24h, 2h)
18
+ # --deduplicate Remove duplicate log entries
19
+ # --validate Validate JSON structure
20
+ # --rotate Rotate aggregated logs after aggregation
21
+ # --compress Compress aggregated logs
22
+ # --debug Enable debug output
23
+ # --help Display this message
24
+ #
25
+ ################################################################################
26
+
27
+ set -euo pipefail
28
+
29
+ # Script configuration
30
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
31
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
32
+ LOG_CONFIG="${PROJECT_ROOT}/docker/logging-config.json"
33
+
34
+ # Default paths
35
+ DEFAULT_OUTPUT_DIR="/var/log/cfn/aggregated"
36
+ DEFAULT_PATTERN="*.log"
37
+ DOCKER_LOG_PATH="/var/lib/docker/containers"
38
+ FILESYSTEM_LOG_PATH="/var/log/cfn"
39
+
40
+ # Runtime variables
41
+ OUTPUT_DIR="${DEFAULT_OUTPUT_DIR}"
42
+ SOURCE="all"
43
+ PATTERN="${DEFAULT_PATTERN}"
44
+ CORRELATE_BY="correlationId"
45
+ SINCE=""
46
+ DEDUPLICATE=false
47
+ VALIDATE=false
48
+ ROTATE_AFTER=false
49
+ COMPRESS_AFTER=false
50
+ DEBUG=false
51
+ TEMP_AGGREGATE="/tmp/cfn-aggregate-$$.log"
52
+ AGGREGATION_STARTTIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
53
+ AGGREGATION_PID=$$
54
+
55
+ # Colors for output
56
+ RED='\033[0;31m'
57
+ GREEN='\033[0;32m'
58
+ YELLOW='\033[1;33m'
59
+ BLUE='\033[0;34m'
60
+ NC='\033[0m' # No Color
61
+
62
+ ################################################################################
63
+ # Utility Functions
64
+ ################################################################################
65
+
66
+ log_info() {
67
+ echo -e "${BLUE}[INFO]${NC} $*" >&2
68
+ }
69
+
70
+ log_error() {
71
+ echo -e "${RED}[ERROR]${NC} $*" >&2
72
+ }
73
+
74
+ log_success() {
75
+ echo -e "${GREEN}[SUCCESS]${NC} $*" >&2
76
+ }
77
+
78
+ log_warn() {
79
+ echo -e "${YELLOW}[WARN]${NC} $*" >&2
80
+ }
81
+
82
+ debug() {
83
+ if [ "$DEBUG" = true ]; then
84
+ echo -e "${BLUE}[DEBUG]${NC} $*" >&2
85
+ fi
86
+ }
87
+
88
+ # Display usage
89
+ usage() {
90
+ sed -n '2,/^$/p' "$0" | head -n -1
91
+ exit 0
92
+ }
93
+
94
+ # Cleanup temporary files
95
+ cleanup() {
96
+ if [ -f "$TEMP_AGGREGATE" ]; then
97
+ rm -f "$TEMP_AGGREGATE"
98
+ debug "Cleaned up temporary aggregate file"
99
+ fi
100
+ }
101
+
102
+ trap cleanup EXIT
103
+
104
+ ################################################################################
105
+ # Docker Log Processing
106
+ ################################################################################
107
+
108
+ # Extract JSON logs from Docker containers
109
+ extract_docker_logs() {
110
+ local container_logs_dir="$1"
111
+ local output_file="$2"
112
+
113
+ if [ ! -d "$container_logs_dir" ]; then
114
+ log_warn "Docker logs directory not found: $container_logs_dir"
115
+ return 1
116
+ fi
117
+
118
+ log_info "Extracting logs from Docker containers..."
119
+ local count=0
120
+ local processed=0
121
+
122
+ # Process each container's log file
123
+ while IFS= read -r -d '' log_file; do
124
+ ((count++))
125
+ debug "Processing Docker log: $log_file"
126
+
127
+ # Extract container name from path
128
+ local container_name=$(basename "$(dirname "$log_file")")
129
+
130
+ # Process the log file and add container metadata
131
+ jq --arg container "$container_name" \
132
+ --arg timestamp "$AGGREGATION_STARTTIME" \
133
+ '. + {source: $container, aggregatedAt: $timestamp}' \
134
+ "$log_file" 2>/dev/null >> "$output_file" || {
135
+ debug "Failed to process Docker log: $log_file"
136
+ }
137
+ ((processed++))
138
+ done < <(find "$container_logs_dir" -name "*-json.log" -print0 2>/dev/null)
139
+
140
+ log_info "Processed $processed of $count Docker container logs"
141
+ return 0
142
+ }
143
+
144
+ ################################################################################
145
+ # Filesystem Log Processing
146
+ ################################################################################
147
+
148
+ # Extract JSON logs from filesystem
149
+ extract_filesystem_logs() {
150
+ local fs_log_path="$1"
151
+ local pattern="$2"
152
+ local output_file="$3"
153
+
154
+ if [ ! -d "$fs_log_path" ]; then
155
+ log_warn "Filesystem logs directory not found: $fs_log_path"
156
+ return 1
157
+ fi
158
+
159
+ log_info "Extracting logs from filesystem ($fs_log_path)..."
160
+ local count=0
161
+ local processed=0
162
+
163
+ # Process each log file matching pattern
164
+ while IFS= read -r -d '' log_file; do
165
+ ((count++))
166
+ debug "Processing filesystem log: $log_file"
167
+
168
+ # Determine relative path for source identification
169
+ local relative_path="${log_file#$fs_log_path/}"
170
+
171
+ # Skip already-rotated logs (only recent ones)
172
+ if [[ "$log_file" =~ \.(gz|bz2|xz)$ ]]; then
173
+ debug "Skipping compressed log: $log_file"
174
+ continue
175
+ fi
176
+
177
+ # Process JSON logs directly
178
+ if [[ "$log_file" =~ \.json\.log$ ]] || [[ "$log_file" =~ \.json$ ]]; then
179
+ jq --arg source "$relative_path" \
180
+ --arg timestamp "$AGGREGATION_STARTTIME" \
181
+ '. + {source: $source, aggregatedAt: $timestamp}' \
182
+ "$log_file" 2>/dev/null >> "$output_file" || {
183
+ debug "Failed to parse JSON log: $log_file"
184
+ }
185
+ else
186
+ # Convert plain text logs to JSON format
187
+ while IFS= read -r line; do
188
+ [ -z "$line" ] && continue
189
+ local log_entry=$(cat <<EOF
190
+ {
191
+ "timestamp": "$AGGREGATION_STARTTIME",
192
+ "level": "info",
193
+ "message": "$line",
194
+ "source": "$relative_path",
195
+ "aggregatedAt": "$AGGREGATION_STARTTIME",
196
+ "raw": true
197
+ }
198
+ EOF
199
+ )
200
+ echo "$log_entry" >> "$output_file"
201
+ done < "$log_file"
202
+ fi
203
+ ((processed++))
204
+ done < <(find "$fs_log_path" -name "$pattern" -type f -print0 2>/dev/null)
205
+
206
+ log_info "Processed $processed of $count filesystem logs"
207
+ return 0
208
+ }
209
+
210
+ ################################################################################
211
+ # Log Filtering and Time-Based Selection
212
+ ################################################################################
213
+
214
+ # Filter logs by time (since N hours/minutes ago)
215
+ filter_logs_by_time() {
216
+ local input_file="$1"
217
+ local duration="$2"
218
+ local output_file="$3"
219
+
220
+ if [ -z "$duration" ]; then
221
+ cp "$input_file" "$output_file"
222
+ return 0
223
+ fi
224
+
225
+ log_info "Filtering logs by time: since $duration"
226
+
227
+ # Calculate cutoff timestamp
228
+ local cutoff_seconds=0
229
+ if [[ "$duration" =~ ^([0-9]+)h$ ]]; then
230
+ cutoff_seconds=$(( ${BASH_REMATCH[1]} * 3600 ))
231
+ elif [[ "$duration" =~ ^([0-9]+)m$ ]]; then
232
+ cutoff_seconds=$(( ${BASH_REMATCH[1]} * 60 ))
233
+ else
234
+ log_error "Invalid duration format: $duration (use Xh or Xm)"
235
+ return 1
236
+ fi
237
+
238
+ local cutoff_date=$(date -u -d "-${cutoff_seconds} seconds" +"%Y-%m-%dT%H:%M:%SZ")
239
+ debug "Cutoff timestamp: $cutoff_date"
240
+
241
+ # Filter logs newer than cutoff
242
+ jq --arg cutoff "$cutoff_date" \
243
+ 'select(.timestamp > $cutoff)' \
244
+ "$input_file" > "$output_file" || return 1
245
+
246
+ log_info "Filtered logs from: $cutoff_date"
247
+ }
248
+
249
+ ################################################################################
250
+ # Log Deduplication
251
+ ################################################################################
252
+
253
+ # Remove duplicate log entries based on message hash
254
+ deduplicate_logs() {
255
+ local input_file="$1"
256
+ local output_file="$2"
257
+
258
+ log_info "Deduplicating log entries..."
259
+
260
+ jq -s 'unique_by(.timestamp + .message + (.source // ""))' \
261
+ "$input_file" | \
262
+ jq -r '.[]' > "$output_file" || {
263
+ log_error "Failed to deduplicate logs"
264
+ return 1
265
+ }
266
+
267
+ local original_count=$(jq -s 'length' "$input_file")
268
+ local dedup_count=$(jq -s 'length' "$output_file")
269
+ local removed=$(( original_count - dedup_count ))
270
+
271
+ log_info "Deduplicated: removed $removed duplicate entries"
272
+ }
273
+
274
+ ################################################################################
275
+ # Log Validation
276
+ ################################################################################
277
+
278
+ # Validate JSON structure of log entries
279
+ validate_logs() {
280
+ local input_file="$1"
281
+
282
+ log_info "Validating JSON log structure..."
283
+
284
+ local valid_count=0
285
+ local invalid_count=0
286
+ local required_fields=("timestamp" "level" "message" "source")
287
+
288
+ while IFS= read -r line; do
289
+ [ -z "$line" ] && continue
290
+
291
+ # Validate JSON
292
+ if ! echo "$line" | jq . >/dev/null 2>&1; then
293
+ ((invalid_count++))
294
+ debug "Invalid JSON: $line"
295
+ continue
296
+ fi
297
+
298
+ # Check required fields
299
+ local missing_fields=()
300
+ for field in "${required_fields[@]}"; do
301
+ if ! echo "$line" | jq -e ".$field" >/dev/null 2>&1; then
302
+ missing_fields+=("$field")
303
+ fi
304
+ done
305
+
306
+ if [ ${#missing_fields[@]} -gt 0 ]; then
307
+ ((invalid_count++))
308
+ debug "Missing required fields: ${missing_fields[*]}"
309
+ else
310
+ ((valid_count++))
311
+ fi
312
+ done < "$input_file"
313
+
314
+ local total=$(( valid_count + invalid_count ))
315
+ local percentage=$(( valid_count * 100 / total ))
316
+
317
+ log_info "Validation complete: $valid_count/$total valid ($percentage%)"
318
+
319
+ if [ $percentage -lt 90 ]; then
320
+ log_warn "Only $percentage% of logs are valid (target: 90%)"
321
+ return 1
322
+ fi
323
+
324
+ return 0
325
+ }
326
+
327
+ ################################################################################
328
+ # Log Correlation and Grouping
329
+ ################################################################################
330
+
331
+ # Correlate logs by specified field
332
+ correlate_logs() {
333
+ local input_file="$1"
334
+ local correlation_field="$2"
335
+ local output_dir="$3"
336
+
337
+ log_info "Correlating logs by: $correlation_field"
338
+
339
+ mkdir -p "$output_dir/correlations"
340
+
341
+ # Group logs by correlation field
342
+ jq -s "group_by(.$correlation_field)" "$input_file" | \
343
+ jq -r '.[] as $group |
344
+ ($group[0].'$correlation_field' // "unknown") as $key |
345
+ {correlationId: $key, count: ($group | length), logs: $group}' | \
346
+ while IFS= read -r correlation_entry; do
347
+ [ -z "$correlation_entry" ] && continue
348
+
349
+ local correlation_id=$(echo "$correlation_entry" | jq -r '.correlationId')
350
+ local output_file="$output_dir/correlations/$correlation_id.log"
351
+
352
+ echo "$correlation_entry" | jq '.logs[]' >> "$output_file"
353
+ done
354
+
355
+ log_info "Correlation complete: logs grouped by $correlation_field"
356
+ }
357
+
358
+ ################################################################################
359
+ # Log Compression
360
+ ################################################################################
361
+
362
+ # Compress aggregated logs
363
+ compress_logs() {
364
+ local log_file="$1"
365
+
366
+ log_info "Compressing logs: $log_file"
367
+
368
+ if [ ! -f "$log_file" ]; then
369
+ log_error "Log file not found: $log_file"
370
+ return 1
371
+ fi
372
+
373
+ gzip -9 -f "$log_file" || {
374
+ log_error "Failed to compress logs"
375
+ return 1
376
+ }
377
+
378
+ log_success "Compressed: ${log_file}.gz"
379
+ }
380
+
381
+ ################################################################################
382
+ # Performance Metrics
383
+ ################################################################################
384
+
385
+ # Calculate and report aggregation metrics
386
+ calculate_metrics() {
387
+ local start_time="$1"
388
+ local aggregated_file="$2"
389
+
390
+ local end_time=$(date +%s%N)
391
+ local duration_ms=$(( (end_time - start_time) / 1000000 ))
392
+ local log_count=$(jq -s 'length' "$aggregated_file" 2>/dev/null || echo 0)
393
+ local file_size=$(stat -c%s "$aggregated_file" 2>/dev/null || echo 0)
394
+
395
+ cat > "${aggregated_file%.log}.metrics" <<EOF
396
+ {
397
+ "aggregationTime": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
398
+ "durationMs": $duration_ms,
399
+ "logCount": $log_count,
400
+ "fileSizeBytes": $file_size,
401
+ "logsPerSecond": $(( log_count * 1000 / max(duration_ms, 1) )),
402
+ "throughputMBps": $(( (file_size / 1048576) * 1000 / max(duration_ms, 1) ))
403
+ }
404
+ EOF
405
+
406
+ log_info "Aggregation metrics:"
407
+ log_info " Duration: ${duration_ms}ms"
408
+ log_info " Log entries: $log_count"
409
+ log_info " File size: $(numfmt --to=iec-i --suffix=B $file_size 2>/dev/null || echo $file_size)"
410
+ }
411
+
412
+ ################################################################################
413
+ # Main Aggregation Workflow
414
+ ################################################################################
415
+
416
+ main() {
417
+ local start_time=$(date +%s%N)
418
+
419
+ log_info "CFN Log Aggregator started (PID: $AGGREGATION_PID)"
420
+ log_info "Aggregation time: $AGGREGATION_STARTTIME"
421
+ debug "Configuration: source=$SOURCE, output=$OUTPUT_DIR, correlate=$CORRELATE_BY"
422
+
423
+ # Create output directory
424
+ mkdir -p "$OUTPUT_DIR"
425
+
426
+ # Aggregate logs based on source
427
+ case "$SOURCE" in
428
+ docker)
429
+ extract_docker_logs "$DOCKER_LOG_PATH" "$TEMP_AGGREGATE" || true
430
+ ;;
431
+ filesystem)
432
+ extract_filesystem_logs "$FILESYSTEM_LOG_PATH" "$PATTERN" "$TEMP_AGGREGATE" || true
433
+ ;;
434
+ all)
435
+ extract_docker_logs "$DOCKER_LOG_PATH" "$TEMP_AGGREGATE" || true
436
+ extract_filesystem_logs "$FILESYSTEM_LOG_PATH" "$PATTERN" "$TEMP_AGGREGATE" || true
437
+ ;;
438
+ *)
439
+ log_error "Unknown source: $SOURCE"
440
+ return 1
441
+ ;;
442
+ esac
443
+
444
+ if [ ! -f "$TEMP_AGGREGATE" ] || [ ! -s "$TEMP_AGGREGATE" ]; then
445
+ log_warn "No logs found to aggregate"
446
+ return 1
447
+ fi
448
+
449
+ # Apply time filter if specified
450
+ if [ -n "$SINCE" ]; then
451
+ filter_logs_by_time "$TEMP_AGGREGATE" "$SINCE" "${TEMP_AGGREGATE}.filtered"
452
+ mv "${TEMP_AGGREGATE}.filtered" "$TEMP_AGGREGATE"
453
+ fi
454
+
455
+ # Deduplicate if requested
456
+ if [ "$DEDUPLICATE" = true ]; then
457
+ deduplicate_logs "$TEMP_AGGREGATE" "${TEMP_AGGREGATE}.dedup"
458
+ mv "${TEMP_AGGREGATE}.dedup" "$TEMP_AGGREGATE"
459
+ fi
460
+
461
+ # Sort by timestamp
462
+ jq -s 'sort_by(.timestamp)' "$TEMP_AGGREGATE" > "${TEMP_AGGREGATE}.sorted"
463
+ mv "${TEMP_AGGREGATE}.sorted" "$TEMP_AGGREGATE"
464
+
465
+ # Validate if requested
466
+ if [ "$VALIDATE" = true ]; then
467
+ validate_logs "$TEMP_AGGREGATE" || log_warn "Validation warnings present"
468
+ fi
469
+
470
+ # Correlate logs if requested
471
+ if [ "$CORRELATE_BY" != "none" ]; then
472
+ correlate_logs "$TEMP_AGGREGATE" "$CORRELATE_BY" "$OUTPUT_DIR"
473
+ fi
474
+
475
+ # Move to final location
476
+ local output_file="$OUTPUT_DIR/aggregated-$(date +%Y%m%d-%H%M%S).log"
477
+ mv "$TEMP_AGGREGATE" "$output_file"
478
+ log_success "Aggregated logs: $output_file"
479
+
480
+ # Calculate metrics
481
+ calculate_metrics "$start_time" "$output_file"
482
+
483
+ # Compress if requested
484
+ if [ "$COMPRESS_AFTER" = true ]; then
485
+ compress_logs "$output_file"
486
+ fi
487
+
488
+ # Rotate if requested
489
+ if [ "$ROTATE_AFTER" = true ] && [ -x "$(command -v logrotate)" ]; then
490
+ log_info "Rotating logs with logrotate..."
491
+ logrotate -f /etc/logrotate.d/cfn-logs >/dev/null 2>&1 || log_warn "Logrotate failed"
492
+ fi
493
+
494
+ log_success "Log aggregation complete"
495
+ }
496
+
497
+ ################################################################################
498
+ # Argument Parsing
499
+ ################################################################################
500
+
501
+ while [[ $# -gt 0 ]]; do
502
+ case "$1" in
503
+ --source)
504
+ SOURCE="$2"
505
+ shift 2
506
+ ;;
507
+ --output)
508
+ OUTPUT_DIR="$2"
509
+ shift 2
510
+ ;;
511
+ --pattern)
512
+ PATTERN="$2"
513
+ shift 2
514
+ ;;
515
+ --correlate-by)
516
+ CORRELATE_BY="$2"
517
+ shift 2
518
+ ;;
519
+ --since)
520
+ SINCE="$2"
521
+ shift 2
522
+ ;;
523
+ --deduplicate)
524
+ DEDUPLICATE=true
525
+ shift
526
+ ;;
527
+ --validate)
528
+ VALIDATE=true
529
+ shift
530
+ ;;
531
+ --rotate)
532
+ ROTATE_AFTER=true
533
+ shift
534
+ ;;
535
+ --compress)
536
+ COMPRESS_AFTER=true
537
+ shift
538
+ ;;
539
+ --debug)
540
+ DEBUG=true
541
+ shift
542
+ ;;
543
+ --help)
544
+ usage
545
+ ;;
546
+ *)
547
+ log_error "Unknown option: $1"
548
+ usage
549
+ ;;
550
+ esac
551
+ done
552
+
553
+ # Run main aggregation
554
+ main "$@"