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,445 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # track-cost-savings.sh - Log skill executions and calculate ROI metrics
5
+ # Tracks cost savings from script execution vs AI agent usage
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ DB_PATH="${DB_PATH:-${SCRIPT_DIR}/workflow-codification.db}"
9
+
10
+ # Cost constants
11
+ AI_COST_PER_MILLION=0.50 # $0.50 per 1M tokens (Z.ai glm-4.6)
12
+ SCRIPT_COST=0.0001 # Negligible script execution cost
13
+ AVG_AI_INPUT_TOKENS=2000 # Average input tokens for skill-equivalent task
14
+ AVG_AI_OUTPUT_TOKENS=1000 # Average output tokens for skill-equivalent task
15
+
16
+ # Initialize database schema
17
+ init_database() {
18
+ sqlite3 "$DB_PATH" <<'EOF'
19
+ CREATE TABLE IF NOT EXISTS skill_executions (
20
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+ skill_name TEXT NOT NULL,
22
+ skill_version TEXT NOT NULL,
23
+ execution_time_ms INTEGER NOT NULL,
24
+ exit_code INTEGER NOT NULL,
25
+ tokens_avoided INTEGER NOT NULL,
26
+ cost_avoided_usd REAL NOT NULL,
27
+ timestamp TEXT DEFAULT (datetime('now')),
28
+ agent_type TEXT,
29
+ task_description TEXT,
30
+ metadata TEXT
31
+ );
32
+
33
+ CREATE INDEX IF NOT EXISTS idx_executions_skill ON skill_executions(skill_name);
34
+ CREATE INDEX IF NOT EXISTS idx_executions_timestamp ON skill_executions(timestamp);
35
+ CREATE INDEX IF NOT EXISTS idx_executions_exit_code ON skill_executions(exit_code);
36
+
37
+ CREATE TABLE IF NOT EXISTS roi_snapshots (
38
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
39
+ snapshot_date TEXT DEFAULT (date('now')),
40
+ total_executions INTEGER NOT NULL,
41
+ total_cost_avoided_usd REAL NOT NULL,
42
+ total_tokens_avoided INTEGER NOT NULL,
43
+ avg_execution_time_ms REAL NOT NULL,
44
+ top_skill_name TEXT,
45
+ top_skill_savings_usd REAL,
46
+ metadata TEXT
47
+ );
48
+
49
+ CREATE INDEX IF NOT EXISTS idx_roi_snapshots_date ON roi_snapshots(snapshot_date);
50
+ EOF
51
+ }
52
+
53
+ # Calculate AI cost based on tokens
54
+ calculate_ai_cost() {
55
+ local input_tokens="${1:-$AVG_AI_INPUT_TOKENS}"
56
+ local output_tokens="${2:-$AVG_AI_OUTPUT_TOKENS}"
57
+
58
+ local total_tokens=$((input_tokens + output_tokens))
59
+ local cost=$(echo "scale=6; ($total_tokens * $AI_COST_PER_MILLION) / 1000000" | bc)
60
+
61
+ echo "$cost"
62
+ }
63
+
64
+ # Calculate cost savings
65
+ calculate_savings() {
66
+ local ai_cost="$1"
67
+ local script_cost="${2:-$SCRIPT_COST}"
68
+
69
+ local savings=$(echo "scale=6; $ai_cost - $script_cost" | bc)
70
+ echo "$savings"
71
+ }
72
+
73
+ # Log skill execution
74
+ log_execution() {
75
+ local skill_name="$1"
76
+ local skill_version="$2"
77
+ local execution_time_ms="$3"
78
+ local exit_code="$4"
79
+ local tokens_avoided="${5:-$((AVG_AI_INPUT_TOKENS + AVG_AI_OUTPUT_TOKENS))}"
80
+ local agent_type="${6:-}"
81
+ local task_description="${7:-}"
82
+ local metadata="${8:-{}}"
83
+
84
+ # Calculate costs
85
+ local input_tokens=$((tokens_avoided * 2 / 3))
86
+ local output_tokens=$((tokens_avoided / 3))
87
+ local ai_cost
88
+ ai_cost=$(calculate_ai_cost "$input_tokens" "$output_tokens")
89
+ local cost_avoided
90
+ cost_avoided=$(calculate_savings "$ai_cost")
91
+
92
+ # Insert execution record
93
+ sqlite3 "$DB_PATH" <<EOF
94
+ INSERT INTO skill_executions (
95
+ skill_name,
96
+ skill_version,
97
+ execution_time_ms,
98
+ exit_code,
99
+ tokens_avoided,
100
+ cost_avoided_usd,
101
+ agent_type,
102
+ task_description,
103
+ metadata
104
+ ) VALUES (
105
+ '$skill_name',
106
+ '$skill_version',
107
+ $execution_time_ms,
108
+ $exit_code,
109
+ $tokens_avoided,
110
+ $cost_avoided,
111
+ '$agent_type',
112
+ '$task_description',
113
+ '$metadata'
114
+ );
115
+ EOF
116
+
117
+ echo "Logged execution: $skill_name (saved \$$cost_avoided)"
118
+ }
119
+
120
+ # Generate ROI snapshot
121
+ generate_roi_snapshot() {
122
+ local snapshot_date="${1:-$(date +%Y-%m-%d)}"
123
+
124
+ # Calculate aggregate metrics
125
+ local total_executions
126
+ total_executions=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
127
+
128
+ if [[ "$total_executions" -eq 0 ]]; then
129
+ echo "No executions found for date: $snapshot_date"
130
+ return 0
131
+ fi
132
+
133
+ local total_cost_avoided
134
+ total_cost_avoided=$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
135
+
136
+ local total_tokens_avoided
137
+ total_tokens_avoided=$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(tokens_avoided), 0) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
138
+
139
+ local avg_execution_time
140
+ avg_execution_time=$(sqlite3 "$DB_PATH" "SELECT COALESCE(AVG(execution_time_ms), 0) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
141
+
142
+ # Get top performing skill
143
+ local top_skill_data
144
+ top_skill_data=$(sqlite3 "$DB_PATH" "SELECT skill_name, SUM(cost_avoided_usd) FROM skill_executions WHERE date(timestamp) = '$snapshot_date' GROUP BY skill_name ORDER BY SUM(cost_avoided_usd) DESC LIMIT 1;")
145
+
146
+ local top_skill_name
147
+ local top_skill_savings
148
+ if [[ -n "$top_skill_data" ]]; then
149
+ top_skill_name=$(echo "$top_skill_data" | cut -d'|' -f1)
150
+ top_skill_savings=$(echo "$top_skill_data" | cut -d'|' -f2)
151
+ else
152
+ top_skill_name=""
153
+ top_skill_savings="0"
154
+ fi
155
+
156
+ # Insert snapshot
157
+ sqlite3 "$DB_PATH" <<EOF
158
+ INSERT INTO roi_snapshots (
159
+ snapshot_date,
160
+ total_executions,
161
+ total_cost_avoided_usd,
162
+ total_tokens_avoided,
163
+ avg_execution_time_ms,
164
+ top_skill_name,
165
+ top_skill_savings_usd,
166
+ metadata
167
+ ) VALUES (
168
+ '$snapshot_date',
169
+ $total_executions,
170
+ $total_cost_avoided,
171
+ $total_tokens_avoided,
172
+ $avg_execution_time,
173
+ '$top_skill_name',
174
+ $top_skill_savings,
175
+ '{}'
176
+ );
177
+ EOF
178
+
179
+ echo "Generated ROI snapshot for $snapshot_date"
180
+ echo "Total executions: $total_executions"
181
+ echo "Total cost avoided: \$$total_cost_avoided"
182
+ echo "Top skill: $top_skill_name (\$$top_skill_savings)"
183
+ }
184
+
185
+ # Query per-skill ROI ranking
186
+ query_skill_roi_ranking() {
187
+ local period="${1:-30}" # Default: last 30 days
188
+
189
+ sqlite3 -header -column "$DB_PATH" <<EOF
190
+ SELECT
191
+ skill_name,
192
+ COUNT(*) as executions,
193
+ SUM(cost_avoided_usd) as total_savings_usd,
194
+ AVG(cost_avoided_usd) as avg_savings_per_execution,
195
+ AVG(execution_time_ms) as avg_execution_time_ms,
196
+ SUM(tokens_avoided) as total_tokens_avoided
197
+ FROM skill_executions
198
+ WHERE timestamp >= datetime('now', '-$period days')
199
+ GROUP BY skill_name
200
+ ORDER BY total_savings_usd DESC;
201
+ EOF
202
+ }
203
+
204
+ # Calculate monthly/annual projections
205
+ calculate_projections() {
206
+ local period_days="${1:-30}"
207
+
208
+ # Get average daily metrics
209
+ local daily_executions
210
+ daily_executions=$(sqlite3 "$DB_PATH" "SELECT COALESCE(COUNT(*) / $period_days, 0) FROM skill_executions WHERE timestamp >= datetime('now', '-$period_days days');")
211
+
212
+ local daily_savings
213
+ daily_savings=$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd) / $period_days, 0) FROM skill_executions WHERE timestamp >= datetime('now', '-$period_days days');")
214
+
215
+ # Calculate projections
216
+ local monthly_executions=$(echo "$daily_executions * 30" | bc)
217
+ local monthly_savings=$(echo "scale=2; $daily_savings * 30" | bc)
218
+ local annual_savings=$(echo "scale=2; $daily_savings * 365" | bc)
219
+
220
+ cat <<PROJECTIONS
221
+ Cost Savings Projections (based on last $period_days days):
222
+ ---------------------------------------------------------
223
+ Daily Average:
224
+ - Executions: $daily_executions
225
+ - Savings: \$$daily_savings
226
+
227
+ Monthly Projection:
228
+ - Executions: $monthly_executions
229
+ - Savings: \$$monthly_savings
230
+
231
+ Annual Projection:
232
+ - Savings: \$$annual_savings
233
+ PROJECTIONS
234
+ }
235
+
236
+ # Export dashboard metrics
237
+ export_dashboard_metrics() {
238
+ local output_format="${1:-json}"
239
+
240
+ case "$output_format" in
241
+ json)
242
+ cat <<JSON
243
+ {
244
+ "total_executions": $(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM skill_executions;"),
245
+ "total_cost_avoided_usd": $(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions;"),
246
+ "total_tokens_avoided": $(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(tokens_avoided), 0) FROM skill_executions;"),
247
+ "avg_execution_time_ms": $(sqlite3 "$DB_PATH" "SELECT COALESCE(AVG(execution_time_ms), 0) FROM skill_executions;"),
248
+ "success_rate": $(sqlite3 "$DB_PATH" "SELECT COALESCE(CAST(SUM(CASE WHEN exit_code = 0 THEN 1 ELSE 0 END) AS REAL) / COUNT(*), 0) FROM skill_executions;"),
249
+ "last_30_days": {
250
+ "executions": $(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM skill_executions WHERE timestamp >= datetime('now', '-30 days');"),
251
+ "cost_avoided_usd": $(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions WHERE timestamp >= datetime('now', '-30 days');")
252
+ }
253
+ }
254
+ JSON
255
+ ;;
256
+ table)
257
+ sqlite3 -header -column "$DB_PATH" <<SQL
258
+ SELECT
259
+ 'All Time' as period,
260
+ COUNT(*) as executions,
261
+ SUM(cost_avoided_usd) as cost_avoided_usd,
262
+ AVG(execution_time_ms) as avg_time_ms
263
+ FROM skill_executions
264
+ UNION ALL
265
+ SELECT
266
+ 'Last 30 Days' as period,
267
+ COUNT(*) as executions,
268
+ SUM(cost_avoided_usd) as cost_avoided_usd,
269
+ AVG(execution_time_ms) as avg_time_ms
270
+ FROM skill_executions
271
+ WHERE timestamp >= datetime('now', '-30 days')
272
+ UNION ALL
273
+ SELECT
274
+ 'Last 7 Days' as period,
275
+ COUNT(*) as executions,
276
+ SUM(cost_avoided_usd) as cost_avoided_usd,
277
+ AVG(execution_time_ms) as avg_time_ms
278
+ FROM skill_executions
279
+ WHERE timestamp >= datetime('now', '-7 days');
280
+ SQL
281
+ ;;
282
+ *)
283
+ echo "Unknown format: $output_format" >&2
284
+ exit 1
285
+ ;;
286
+ esac
287
+ }
288
+
289
+ # Main execution
290
+ main() {
291
+ # Initialize database
292
+ init_database
293
+
294
+ # Parse arguments
295
+ local action=""
296
+ local skill_name=""
297
+ local skill_version=""
298
+ local execution_time_ms=""
299
+ local exit_code=""
300
+ local tokens_avoided=""
301
+ local agent_type=""
302
+ local task_description=""
303
+ local metadata="{}"
304
+ local period="30"
305
+ local output_format="json"
306
+
307
+ while [[ $# -gt 0 ]]; do
308
+ case $1 in
309
+ --action)
310
+ action="$2"
311
+ shift 2
312
+ ;;
313
+ --skill-name)
314
+ skill_name="$2"
315
+ shift 2
316
+ ;;
317
+ --skill-version)
318
+ skill_version="$2"
319
+ shift 2
320
+ ;;
321
+ --execution-time-ms)
322
+ execution_time_ms="$2"
323
+ shift 2
324
+ ;;
325
+ --exit-code)
326
+ exit_code="$2"
327
+ shift 2
328
+ ;;
329
+ --tokens-avoided)
330
+ tokens_avoided="$2"
331
+ shift 2
332
+ ;;
333
+ --agent-type)
334
+ agent_type="$2"
335
+ shift 2
336
+ ;;
337
+ --task-description)
338
+ task_description="$2"
339
+ shift 2
340
+ ;;
341
+ --metadata)
342
+ metadata="$2"
343
+ shift 2
344
+ ;;
345
+ --period)
346
+ period="$2"
347
+ shift 2
348
+ ;;
349
+ --format)
350
+ output_format="$2"
351
+ shift 2
352
+ ;;
353
+ --help)
354
+ cat <<HELP
355
+ Usage: track-cost-savings.sh --action <ACTION> [OPTIONS]
356
+
357
+ Actions:
358
+ log Log skill execution
359
+ snapshot Generate ROI snapshot
360
+ ranking Query per-skill ROI ranking
361
+ projections Calculate monthly/annual projections
362
+ dashboard Export dashboard metrics
363
+
364
+ Log Options:
365
+ --skill-name STRING Skill name (required)
366
+ --skill-version STRING Skill version (required)
367
+ --execution-time-ms INTEGER Execution time in milliseconds (required)
368
+ --exit-code INTEGER Exit code (required)
369
+ --tokens-avoided INTEGER Tokens avoided (default: 3000)
370
+ --agent-type STRING Agent type (optional)
371
+ --task-description STRING Task description (optional)
372
+ --metadata JSON Additional metadata (optional)
373
+
374
+ Ranking/Projections Options:
375
+ --period INTEGER Analysis period in days (default: 30)
376
+
377
+ Dashboard Options:
378
+ --format STRING Output format: json|table (default: json)
379
+
380
+ Environment Variables:
381
+ DB_PATH Path to SQLite database (default: ./workflow-codification.db)
382
+
383
+ Examples:
384
+ # Log execution
385
+ track-cost-savings.sh --action log \\
386
+ --skill-name "cfn-coordination" \\
387
+ --skill-version "1.0.0" \\
388
+ --execution-time-ms 150 \\
389
+ --exit-code 0 \\
390
+ --tokens-avoided 3000
391
+
392
+ # Generate daily ROI snapshot
393
+ track-cost-savings.sh --action snapshot
394
+
395
+ # Query skill ROI ranking (last 30 days)
396
+ track-cost-savings.sh --action ranking --period 30
397
+
398
+ # Calculate projections
399
+ track-cost-savings.sh --action projections --period 30
400
+
401
+ # Export dashboard metrics
402
+ track-cost-savings.sh --action dashboard --format json
403
+ HELP
404
+ exit 0
405
+ ;;
406
+ *)
407
+ echo "Unknown argument: $1" >&2
408
+ exit 1
409
+ ;;
410
+ esac
411
+ done
412
+
413
+ # Execute action
414
+ case "$action" in
415
+ log)
416
+ if [[ -z "$skill_name" || -z "$skill_version" || -z "$execution_time_ms" || -z "$exit_code" ]]; then
417
+ echo "Error: --skill-name, --skill-version, --execution-time-ms, and --exit-code are required" >&2
418
+ exit 1
419
+ fi
420
+ log_execution "$skill_name" "$skill_version" "$execution_time_ms" "$exit_code" \
421
+ "$tokens_avoided" "$agent_type" "$task_description" "$metadata"
422
+ ;;
423
+ snapshot)
424
+ generate_roi_snapshot
425
+ ;;
426
+ ranking)
427
+ query_skill_roi_ranking "$period"
428
+ ;;
429
+ projections)
430
+ calculate_projections "$period"
431
+ ;;
432
+ dashboard)
433
+ export_dashboard_metrics "$output_format"
434
+ ;;
435
+ *)
436
+ echo "Error: Invalid action. Use --help for usage information." >&2
437
+ exit 1
438
+ ;;
439
+ esac
440
+ }
441
+
442
+ # Execute main if not sourced
443
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
444
+ main "$@"
445
+ fi
@@ -5,6 +5,10 @@ set -euo pipefail
5
5
  # Records edge cases, detects patterns, and triggers skill update proposals
6
6
 
7
7
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+
9
+ # Source parameterized query library for SQL injection prevention
10
+ source "${SCRIPT_DIR}/../bootstrap/sqlite-params.sh"
11
+
8
12
  DB_PATH="${DB_PATH:-${SCRIPT_DIR}/workflow-codification.db}"
9
13
  RECURRENCE_THRESHOLD=3
10
14
 
@@ -57,21 +61,16 @@ record_edge_case() {
57
61
  local edge_case_hash
58
62
  edge_case_hash=$(generate_edge_case_hash "$skill_name" "$exit_code" "$input_params")
59
63
 
60
- # Check if edge case already exists
64
+ # Check if edge case already exists (parameterized query)
61
65
  local existing_count
62
- existing_count=$(sqlite3 "$DB_PATH" "SELECT occurrence_count FROM edge_cases WHERE edge_case_hash = '$edge_case_hash';" 2>/dev/null || echo "0")
66
+ existing_count=$(sqlite_select "$DB_PATH" "SELECT occurrence_count FROM edge_cases WHERE edge_case_hash = ?1" "$edge_case_hash" 2>/dev/null || echo "0")
63
67
 
64
68
  if [[ -n "$existing_count" && "$existing_count" != "0" ]]; then
65
- # Update existing edge case
69
+ # Update existing edge case (parameterized query)
66
70
  local new_count=$((existing_count + 1))
67
- sqlite3 "$DB_PATH" <<EOF
68
- UPDATE edge_cases
69
- SET occurrence_count = $new_count,
70
- timestamp = datetime('now'),
71
- actual_output = '$actual_output',
72
- error_message = '$error_message'
73
- WHERE edge_case_hash = '$edge_case_hash';
74
- EOF
71
+ sqlite_update "$DB_PATH" \
72
+ "UPDATE edge_cases SET occurrence_count = ?1, timestamp = datetime('now'), actual_output = ?2, error_message = ?3 WHERE edge_case_hash = ?4" \
73
+ "$new_count" "$actual_output" "$error_message" "$edge_case_hash"
75
74
  echo "Updated edge case (occurrence: $new_count): $edge_case_hash"
76
75
 
77
76
  # Check if threshold reached
@@ -86,30 +85,10 @@ EOF
86
85
  --occurrence-count "$new_count"
87
86
  fi
88
87
  else
89
- # Insert new edge case
90
- sqlite3 "$DB_PATH" <<EOF
91
- INSERT INTO edge_cases (
92
- skill_name,
93
- skill_version,
94
- exit_code,
95
- input_params,
96
- expected_output,
97
- actual_output,
98
- error_message,
99
- edge_case_hash,
100
- metadata
101
- ) VALUES (
102
- '$skill_name',
103
- '$skill_version',
104
- $exit_code,
105
- '$input_params',
106
- '$expected_output',
107
- '$actual_output',
108
- '$error_message',
109
- '$edge_case_hash',
110
- '$metadata'
111
- );
112
- EOF
88
+ # Insert new edge case (parameterized query)
89
+ sqlite_insert "$DB_PATH" \
90
+ "INSERT INTO edge_cases (skill_name, skill_version, exit_code, input_params, expected_output, actual_output, error_message, edge_case_hash, metadata) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)" \
91
+ "$skill_name" "$skill_version" "$exit_code" "$input_params" "$expected_output" "$actual_output" "$error_message" "$edge_case_hash" "$metadata"
113
92
  echo "Recorded new edge case: $edge_case_hash"
114
93
  fi
115
94
  }
@@ -118,35 +97,24 @@ EOF
118
97
  query_recurring_edge_cases() {
119
98
  local skill_name="${1:-}"
120
99
 
121
- local where_clause=""
100
+ # Use parameterized query for filtering by skill_name
122
101
  if [[ -n "$skill_name" ]]; then
123
- where_clause="WHERE skill_name = '$skill_name' AND"
102
+ sqlite_select "$DB_PATH" \
103
+ "SELECT skill_name, skill_version, exit_code, occurrence_count, status, timestamp, edge_case_hash FROM edge_cases WHERE skill_name = ?1 AND occurrence_count >= ?2 ORDER BY occurrence_count DESC, timestamp DESC" \
104
+ "$skill_name" "$RECURRENCE_THRESHOLD" | sqlite3 -header -column "$DB_PATH" ".mode column"
124
105
  else
125
- where_clause="WHERE"
106
+ sqlite_select "$DB_PATH" \
107
+ "SELECT skill_name, skill_version, exit_code, occurrence_count, status, timestamp, edge_case_hash FROM edge_cases WHERE occurrence_count >= ?1 ORDER BY occurrence_count DESC, timestamp DESC" \
108
+ "$RECURRENCE_THRESHOLD" | sqlite3 -header -column "$DB_PATH" ".mode column"
126
109
  fi
127
-
128
- sqlite3 -header -column "$DB_PATH" <<EOF
129
- SELECT
130
- skill_name,
131
- skill_version,
132
- exit_code,
133
- occurrence_count,
134
- status,
135
- timestamp,
136
- edge_case_hash
137
- FROM edge_cases
138
- $where_clause occurrence_count >= $RECURRENCE_THRESHOLD
139
- ORDER BY occurrence_count DESC, timestamp DESC;
140
- EOF
141
110
  }
142
111
 
143
112
  # Get edge case details
144
113
  get_edge_case_details() {
145
114
  local edge_case_hash="$1"
146
115
 
147
- sqlite3 -json "$DB_PATH" <<EOF
148
- SELECT * FROM edge_cases WHERE edge_case_hash = '$edge_case_hash';
149
- EOF
116
+ # Use parameterized query with JSON output mode
117
+ sqlite_select "$DB_PATH" "SELECT * FROM edge_cases WHERE edge_case_hash = ?1" "$edge_case_hash" | sqlite3 -json "$DB_PATH" ".mode json"
150
118
  }
151
119
 
152
120
  # Update edge case status
@@ -154,11 +122,10 @@ update_edge_case_status() {
154
122
  local edge_case_hash="$1"
155
123
  local status="$2"
156
124
 
157
- sqlite3 "$DB_PATH" <<EOF
158
- UPDATE edge_cases
159
- SET status = '$status'
160
- WHERE edge_case_hash = '$edge_case_hash';
161
- EOF
125
+ # Use parameterized query for status update
126
+ sqlite_update "$DB_PATH" \
127
+ "UPDATE edge_cases SET status = ?1 WHERE edge_case_hash = ?2" \
128
+ "$status" "$edge_case_hash"
162
129
  echo "Updated edge case status to: $status"
163
130
  }
164
131
 
@@ -27,8 +27,16 @@ let DefaultMergeStrategy = class DefaultMergeStrategy {
27
27
  prioritize(reflections) {
28
28
  // Prioritize based on complexity, recency, and insights
29
29
  return reflections.reduce((priority, reflection)=>{
30
- const priorityScore = reflection.complexity * 0.5 + (Date.now() - reflection.timestamp) / 1000000 * 0.3 + reflection.insights.length * 0.2;
31
- const currentPriorityScore = priority ? priority.complexity * 0.5 + (Date.now() - priority.timestamp) / 1000000 * 0.3 + priority.insights.length * 0.2 : -1;
30
+ // Recency: Higher score for more recent (lower age)
31
+ // Invert the age calculation so recent = higher score
32
+ const ageInSeconds = (Date.now() - reflection.timestamp) / 1000;
33
+ const recencyScore = Math.max(0, 1000000 - ageInSeconds) / 1000000;
34
+ const priorityScore = reflection.complexity * 0.5 + recencyScore * 0.3 + reflection.insights.length * 0.2;
35
+ const currentPriorityScore = priority ? (()=>{
36
+ const currentAgeInSeconds = (Date.now() - priority.timestamp) / 1000;
37
+ const currentRecencyScore = Math.max(0, 1000000 - currentAgeInSeconds) / 1000000;
38
+ return priority.complexity * 0.5 + currentRecencyScore * 0.3 + priority.insights.length * 0.2;
39
+ })() : -1;
32
40
  return priorityScore > currentPriorityScore ? reflection : priority;
33
41
  }, null);
34
42
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ace/ace-curator.ts"],"sourcesContent":["import { CognitiveReflection } from './ace-reflector.js';\r\nimport { DualWriteManager } from '../memory/dual-write-pattern.js';\r\n\r\nexport interface ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any>;\r\n prioritize(contexts: CognitiveReflection[]): CognitiveReflection;\r\n}\r\n\r\nexport class ACECurator {\r\n private dualWriteManager: DualWriteManager;\r\n\r\n constructor(\r\n redisConfig: Record<string, any> = {},\r\n sqlitePath: string = './ace-curation.sqlite'\r\n ) {\r\n this.dualWriteManager = new DualWriteManager(\r\n redisConfig,\r\n sqlitePath\r\n );\r\n }\r\n\r\n async mergeContexts(\r\n contexts: Record<string, any>[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<Record<string, any>> {\r\n const mergedContext = strategy.merge(contexts);\r\n\r\n // Store merged context\r\n await this.dualWriteManager.write(\r\n `merged-context-${Date.now()}`,\r\n mergedContext\r\n );\r\n\r\n return mergedContext;\r\n }\r\n\r\n async prioritizeReflections(\r\n reflections: CognitiveReflection[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<CognitiveReflection> {\r\n const prioritizedReflection = strategy.prioritize(reflections);\r\n\r\n // Store prioritized reflection\r\n await this.dualWriteManager.write(\r\n `prioritized-reflection-${prioritizedReflection.id}`,\r\n prioritizedReflection\r\n );\r\n\r\n return prioritizedReflection;\r\n }\r\n}\r\n\r\nclass DefaultMergeStrategy implements ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any> {\r\n // Recursive deep merge with priority and deduplication\r\n return contexts.reduce((merged, context) => {\r\n return this.deepMerge(merged, context);\r\n }, {});\r\n }\r\n\r\n prioritize(reflections: CognitiveReflection[]): CognitiveReflection {\r\n // Prioritize based on complexity, recency, and insights\r\n return reflections.reduce((priority, reflection) => {\r\n const priorityScore = (\r\n reflection.complexity * 0.5 +\r\n (Date.now() - reflection.timestamp) / 1000000 * 0.3 +\r\n reflection.insights.length * 0.2\r\n );\r\n\r\n const currentPriorityScore = priority ? (\r\n priority.complexity * 0.5 +\r\n (Date.now() - priority.timestamp) / 1000000 * 0.3 +\r\n priority.insights.length * 0.2\r\n ) : -1;\r\n\r\n return priorityScore > currentPriorityScore ? reflection : priority;\r\n }, null as CognitiveReflection | null)!;\r\n }\r\n\r\n private deepMerge(\r\n target: Record<string, any>,\r\n source: Record<string, any>\r\n ): Record<string, any> {\r\n for (const key in source) {\r\n if (source.hasOwnProperty(key)) {\r\n if (\r\n source[key] instanceof Object &&\r\n !(source[key] instanceof Array)\r\n ) {\r\n target[key] = this.deepMerge(\r\n target[key] || {},\r\n source[key]\r\n );\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n}\r\n\r\nexport default ACECurator;"],"names":["DualWriteManager","ACECurator","dualWriteManager","redisConfig","sqlitePath","mergeContexts","contexts","strategy","DefaultMergeStrategy","mergedContext","merge","write","Date","now","prioritizeReflections","reflections","prioritizedReflection","prioritize","id","reduce","merged","context","deepMerge","priority","reflection","priorityScore","complexity","timestamp","insights","length","currentPriorityScore","target","source","key","hasOwnProperty","Object","Array"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,kCAAkC;AAOnE,OAAO,MAAMC;IACHC,iBAAmC;IAE3C,YACEC,cAAmC,CAAC,CAAC,EACrCC,aAAqB,uBAAuB,CAC5C;QACA,IAAI,CAACF,gBAAgB,GAAG,IAAIF,iBAC1BG,aACAC;IAEJ;IAEA,MAAMC,cACJC,QAA+B,EAC/BC,WAAiC,IAAIC,sBAAsB,EAC7B;QAC9B,MAAMC,gBAAgBF,SAASG,KAAK,CAACJ;QAErC,uBAAuB;QACvB,MAAM,IAAI,CAACJ,gBAAgB,CAACS,KAAK,CAC/B,CAAC,eAAe,EAAEC,KAAKC,GAAG,IAAI,EAC9BJ;QAGF,OAAOA;IACT;IAEA,MAAMK,sBACJC,WAAkC,EAClCR,WAAiC,IAAIC,sBAAsB,EAC7B;QAC9B,MAAMQ,wBAAwBT,SAASU,UAAU,CAACF;QAElD,+BAA+B;QAC/B,MAAM,IAAI,CAACb,gBAAgB,CAACS,KAAK,CAC/B,CAAC,uBAAuB,EAAEK,sBAAsBE,EAAE,EAAE,EACpDF;QAGF,OAAOA;IACT;AACF;AAEA,IAAA,AAAMR,uBAAN,MAAMA;IACJE,MAAMJ,QAA+B,EAAuB;QAC1D,uDAAuD;QACvD,OAAOA,SAASa,MAAM,CAAC,CAACC,QAAQC;YAC9B,OAAO,IAAI,CAACC,SAAS,CAACF,QAAQC;QAChC,GAAG,CAAC;IACN;IAEAJ,WAAWF,WAAkC,EAAuB;QAClE,wDAAwD;QACxD,OAAOA,YAAYI,MAAM,CAAC,CAACI,UAAUC;YACnC,MAAMC,gBACJD,WAAWE,UAAU,GAAG,MACxB,AAACd,CAAAA,KAAKC,GAAG,KAAKW,WAAWG,SAAS,AAAD,IAAK,UAAU,MAChDH,WAAWI,QAAQ,CAACC,MAAM,GAAG;YAG/B,MAAMC,uBAAuBP,WAC3BA,SAASG,UAAU,GAAG,MACtB,AAACd,CAAAA,KAAKC,GAAG,KAAKU,SAASI,SAAS,AAAD,IAAK,UAAU,MAC9CJ,SAASK,QAAQ,CAACC,MAAM,GAAG,MACzB,CAAC;YAEL,OAAOJ,gBAAgBK,uBAAuBN,aAAaD;QAC7D,GAAG;IACL;IAEQD,UACNS,MAA2B,EAC3BC,MAA2B,EACN;QACrB,IAAK,MAAMC,OAAOD,OAAQ;YACxB,IAAIA,OAAOE,cAAc,CAACD,MAAM;gBAC9B,IACED,MAAM,CAACC,IAAI,YAAYE,UACvB,CAAEH,CAAAA,MAAM,CAACC,IAAI,YAAYG,KAAI,GAC7B;oBACAL,MAAM,CAACE,IAAI,GAAG,IAAI,CAACX,SAAS,CAC1BS,MAAM,CAACE,IAAI,IAAI,CAAC,GAChBD,MAAM,CAACC,IAAI;gBAEf,OAAO;oBACLF,MAAM,CAACE,IAAI,GAAGD,MAAM,CAACC,IAAI;gBAC3B;YACF;QACF;QACA,OAAOF;IACT;AACF;AAEA,eAAe9B,WAAW"}
1
+ {"version":3,"sources":["../../src/ace/ace-curator.ts"],"sourcesContent":["import { CognitiveReflection } from './ace-reflector.js';\r\nimport { DualWriteManager } from '../memory/dual-write-pattern.js';\r\n\r\nexport interface ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any>;\r\n prioritize(contexts: CognitiveReflection[]): CognitiveReflection;\r\n}\r\n\r\nexport class ACECurator {\r\n private dualWriteManager: DualWriteManager;\r\n\r\n constructor(\r\n redisConfig: Record<string, any> = {},\r\n sqlitePath: string = './ace-curation.sqlite'\r\n ) {\r\n this.dualWriteManager = new DualWriteManager(\r\n redisConfig,\r\n sqlitePath\r\n );\r\n }\r\n\r\n async mergeContexts(\r\n contexts: Record<string, any>[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<Record<string, any>> {\r\n const mergedContext = strategy.merge(contexts);\r\n\r\n // Store merged context\r\n await this.dualWriteManager.write(\r\n `merged-context-${Date.now()}`,\r\n mergedContext\r\n );\r\n\r\n return mergedContext;\r\n }\r\n\r\n async prioritizeReflections(\r\n reflections: CognitiveReflection[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<CognitiveReflection> {\r\n const prioritizedReflection = strategy.prioritize(reflections);\r\n\r\n // Store prioritized reflection\r\n await this.dualWriteManager.write(\r\n `prioritized-reflection-${prioritizedReflection.id}`,\r\n prioritizedReflection\r\n );\r\n\r\n return prioritizedReflection;\r\n }\r\n}\r\n\r\nclass DefaultMergeStrategy implements ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any> {\r\n // Recursive deep merge with priority and deduplication\r\n return contexts.reduce((merged, context) => {\r\n return this.deepMerge(merged, context);\r\n }, {});\r\n }\r\n\r\n prioritize(reflections: CognitiveReflection[]): CognitiveReflection {\r\n // Prioritize based on complexity, recency, and insights\r\n return reflections.reduce((priority, reflection) => {\r\n // Recency: Higher score for more recent (lower age)\r\n // Invert the age calculation so recent = higher score\r\n const ageInSeconds = (Date.now() - reflection.timestamp) / 1000;\r\n const recencyScore = Math.max(0, 1000000 - ageInSeconds) / 1000000;\r\n\r\n const priorityScore = (\r\n reflection.complexity * 0.5 +\r\n recencyScore * 0.3 +\r\n reflection.insights.length * 0.2\r\n );\r\n\r\n const currentPriorityScore = priority ? (\r\n (() => {\r\n const currentAgeInSeconds = (Date.now() - priority.timestamp) / 1000;\r\n const currentRecencyScore = Math.max(0, 1000000 - currentAgeInSeconds) / 1000000;\r\n return (\r\n priority.complexity * 0.5 +\r\n currentRecencyScore * 0.3 +\r\n priority.insights.length * 0.2\r\n );\r\n })()\r\n ) : -1;\r\n\r\n return priorityScore > currentPriorityScore ? reflection : priority;\r\n }, null as CognitiveReflection | null)!;\r\n }\r\n\r\n private deepMerge(\r\n target: Record<string, any>,\r\n source: Record<string, any>\r\n ): Record<string, any> {\r\n for (const key in source) {\r\n if (source.hasOwnProperty(key)) {\r\n if (\r\n source[key] instanceof Object &&\r\n !(source[key] instanceof Array)\r\n ) {\r\n target[key] = this.deepMerge(\r\n target[key] || {},\r\n source[key]\r\n );\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n}\r\n\r\nexport default ACECurator;"],"names":["DualWriteManager","ACECurator","dualWriteManager","redisConfig","sqlitePath","mergeContexts","contexts","strategy","DefaultMergeStrategy","mergedContext","merge","write","Date","now","prioritizeReflections","reflections","prioritizedReflection","prioritize","id","reduce","merged","context","deepMerge","priority","reflection","ageInSeconds","timestamp","recencyScore","Math","max","priorityScore","complexity","insights","length","currentPriorityScore","currentAgeInSeconds","currentRecencyScore","target","source","key","hasOwnProperty","Object","Array"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,kCAAkC;AAOnE,OAAO,MAAMC;IACHC,iBAAmC;IAE3C,YACEC,cAAmC,CAAC,CAAC,EACrCC,aAAqB,uBAAuB,CAC5C;QACA,IAAI,CAACF,gBAAgB,GAAG,IAAIF,iBAC1BG,aACAC;IAEJ;IAEA,MAAMC,cACJC,QAA+B,EAC/BC,WAAiC,IAAIC,sBAAsB,EAC7B;QAC9B,MAAMC,gBAAgBF,SAASG,KAAK,CAACJ;QAErC,uBAAuB;QACvB,MAAM,IAAI,CAACJ,gBAAgB,CAACS,KAAK,CAC/B,CAAC,eAAe,EAAEC,KAAKC,GAAG,IAAI,EAC9BJ;QAGF,OAAOA;IACT;IAEA,MAAMK,sBACJC,WAAkC,EAClCR,WAAiC,IAAIC,sBAAsB,EAC7B;QAC9B,MAAMQ,wBAAwBT,SAASU,UAAU,CAACF;QAElD,+BAA+B;QAC/B,MAAM,IAAI,CAACb,gBAAgB,CAACS,KAAK,CAC/B,CAAC,uBAAuB,EAAEK,sBAAsBE,EAAE,EAAE,EACpDF;QAGF,OAAOA;IACT;AACF;AAEA,IAAA,AAAMR,uBAAN,MAAMA;IACJE,MAAMJ,QAA+B,EAAuB;QAC1D,uDAAuD;QACvD,OAAOA,SAASa,MAAM,CAAC,CAACC,QAAQC;YAC9B,OAAO,IAAI,CAACC,SAAS,CAACF,QAAQC;QAChC,GAAG,CAAC;IACN;IAEAJ,WAAWF,WAAkC,EAAuB;QAClE,wDAAwD;QACxD,OAAOA,YAAYI,MAAM,CAAC,CAACI,UAAUC;YACnC,oDAAoD;YACpD,sDAAsD;YACtD,MAAMC,eAAe,AAACb,CAAAA,KAAKC,GAAG,KAAKW,WAAWE,SAAS,AAAD,IAAK;YAC3D,MAAMC,eAAeC,KAAKC,GAAG,CAAC,GAAG,UAAUJ,gBAAgB;YAE3D,MAAMK,gBACJN,WAAWO,UAAU,GAAG,MACxBJ,eAAe,MACfH,WAAWQ,QAAQ,CAACC,MAAM,GAAG;YAG/B,MAAMC,uBAAuBX,WAC3B,AAAC,CAAA;gBACC,MAAMY,sBAAsB,AAACvB,CAAAA,KAAKC,GAAG,KAAKU,SAASG,SAAS,AAAD,IAAK;gBAChE,MAAMU,sBAAsBR,KAAKC,GAAG,CAAC,GAAG,UAAUM,uBAAuB;gBACzE,OACEZ,SAASQ,UAAU,GAAG,MACtBK,sBAAsB,MACtBb,SAASS,QAAQ,CAACC,MAAM,GAAG;YAE/B,CAAA,MACE,CAAC;YAEL,OAAOH,gBAAgBI,uBAAuBV,aAAaD;QAC7D,GAAG;IACL;IAEQD,UACNe,MAA2B,EAC3BC,MAA2B,EACN;QACrB,IAAK,MAAMC,OAAOD,OAAQ;YACxB,IAAIA,OAAOE,cAAc,CAACD,MAAM;gBAC9B,IACED,MAAM,CAACC,IAAI,YAAYE,UACvB,CAAEH,CAAAA,MAAM,CAACC,IAAI,YAAYG,KAAI,GAC7B;oBACAL,MAAM,CAACE,IAAI,GAAG,IAAI,CAACjB,SAAS,CAC1Be,MAAM,CAACE,IAAI,IAAI,CAAC,GAChBD,MAAM,CAACC,IAAI;gBAEf,OAAO;oBACLF,MAAM,CAACE,IAAI,GAAGD,MAAM,CAACC,IAAI;gBAC3B;YACF;QACF;QACA,OAAOF;IACT;AACF;AAEA,eAAepC,WAAW"}
@@ -8,6 +8,10 @@ export class ACEGenerator {
8
8
  this.curator = new ACECurator();
9
9
  }
10
10
  async generateContext(baseContext, options = {}) {
11
+ // Validate baseContext is not null or undefined
12
+ if (baseContext === null || baseContext === undefined) {
13
+ throw new Error('baseContext cannot be null or undefined');
14
+ }
11
15
  const { maxComplexity = 5, allowAdaptation = true, fallbackStrategy = this.defaultFallbackStrategy } = options;
12
16
  try {
13
17
  // Initial reflection
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ace/ace-generator.ts"],"sourcesContent":["import { ACEReflector, CognitiveReflection } from './ace-reflector.js';\r\nimport { ACECurator } from './ace-curator.js';\r\n\r\nexport interface ContextGenerationOptions {\r\n maxComplexity?: number;\r\n allowAdaptation?: boolean;\r\n fallbackStrategy?: (context: any) => any;\r\n}\r\n\r\nexport class ACEGenerator {\r\n private reflector: ACEReflector;\r\n private curator: ACECurator;\r\n\r\n constructor() {\r\n this.reflector = new ACEReflector();\r\n this.curator = new ACECurator();\r\n }\r\n\r\n async generateContext(\r\n baseContext: Record<string, any>,\r\n options: ContextGenerationOptions = {}\r\n ): Promise<Record<string, any>> {\r\n const {\r\n maxComplexity = 5,\r\n allowAdaptation = true,\r\n fallbackStrategy = this.defaultFallbackStrategy\r\n } = options;\r\n\r\n try {\r\n // Initial reflection\r\n const reflection = await this.reflector.reflect(\r\n baseContext,\r\n { complexity: this.calculateComplexity(baseContext) }\r\n );\r\n\r\n // Check complexity\r\n if (reflection.complexity > maxComplexity) {\r\n if (!allowAdaptation) {\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n // Context adaptation\r\n const adaptedContext = await this.adaptContext(reflection);\r\n\r\n return adaptedContext;\r\n } catch (error) {\r\n console.error('Context generation failed:', error);\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private async adaptContext(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>> {\r\n // Advanced context adaptation\r\n const contexts = [\r\n reflection.context,\r\n // Optional: fetch previous similar contexts\r\n await this.fetchSimilarContexts(reflection)\r\n ].filter(Boolean);\r\n\r\n return this.curator.mergeContexts(contexts);\r\n }\r\n\r\n private async fetchSimilarContexts(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>[]> {\r\n // Placeholder for advanced context similarity search\r\n // In production, implement semantic similarity algorithm\r\n return [];\r\n }\r\n\r\n private defaultFallbackStrategy(\r\n context: Record<string, any>\r\n ): Record<string, any> {\r\n return {\r\n ...context,\r\n adaptationWarning: 'Context generation limited'\r\n };\r\n }\r\n}\r\n\r\nexport default ACEGenerator;"],"names":["ACEReflector","ACECurator","ACEGenerator","reflector","curator","generateContext","baseContext","options","maxComplexity","allowAdaptation","fallbackStrategy","defaultFallbackStrategy","reflection","reflect","complexity","calculateComplexity","adaptedContext","adaptContext","error","console","context","keyCount","Object","keys","length","contentLength","JSON","stringify","Math","log","contexts","fetchSimilarContexts","filter","Boolean","mergeContexts","adaptationWarning"],"mappings":"AAAA,SAASA,YAAY,QAA6B,qBAAqB;AACvE,SAASC,UAAU,QAAQ,mBAAmB;AAQ9C,OAAO,MAAMC;IACHC,UAAwB;IACxBC,QAAoB;IAE5B,aAAc;QACZ,IAAI,CAACD,SAAS,GAAG,IAAIH;QACrB,IAAI,CAACI,OAAO,GAAG,IAAIH;IACrB;IAEA,MAAMI,gBACJC,WAAgC,EAChCC,UAAoC,CAAC,CAAC,EACR;QAC9B,MAAM,EACJC,gBAAgB,CAAC,EACjBC,kBAAkB,IAAI,EACtBC,mBAAmB,IAAI,CAACC,uBAAuB,EAChD,GAAGJ;QAEJ,IAAI;YACF,qBAAqB;YACrB,MAAMK,aAAa,MAAM,IAAI,CAACT,SAAS,CAACU,OAAO,CAC7CP,aACA;gBAAEQ,YAAY,IAAI,CAACC,mBAAmB,CAACT;YAAa;YAGtD,mBAAmB;YACnB,IAAIM,WAAWE,UAAU,GAAGN,eAAe;gBACzC,IAAI,CAACC,iBAAiB;oBACpB,OAAOC,iBAAiBJ;gBAC1B;YACF;YAEA,qBAAqB;YACrB,MAAMU,iBAAiB,MAAM,IAAI,CAACC,YAAY,CAACL;YAE/C,OAAOI;QACT,EAAE,OAAOE,OAAO;YACdC,QAAQD,KAAK,CAAC,8BAA8BA;YAC5C,OAAOR,iBAAiBJ;QAC1B;IACF;IAEQS,oBACNK,OAA4B,EACpB;QACR,MAAMC,WAAWC,OAAOC,IAAI,CAACH,SAASI,MAAM;QAC5C,MAAMC,gBAAgBC,KAAKC,SAAS,CAACP,SAASI,MAAM;QACpD,OAAOI,KAAKC,GAAG,CAACR,WAAWI,iBAAiBG,KAAKC,GAAG,CAAC;IACvD;IAEA,MAAcZ,aACZL,UAA+B,EACD;QAC9B,8BAA8B;QAC9B,MAAMkB,WAAW;YACflB,WAAWQ,OAAO;YAClB,4CAA4C;YAC5C,MAAM,IAAI,CAACW,oBAAoB,CAACnB;SACjC,CAACoB,MAAM,CAACC;QAET,OAAO,IAAI,CAAC7B,OAAO,CAAC8B,aAAa,CAACJ;IACpC;IAEA,MAAcC,qBACZnB,UAA+B,EACC;QAChC,qDAAqD;QACrD,yDAAyD;QACzD,OAAO,EAAE;IACX;IAEQD,wBACNS,OAA4B,EACP;QACrB,OAAO;YACL,GAAGA,OAAO;YACVe,mBAAmB;QACrB;IACF;AACF;AAEA,eAAejC,aAAa"}
1
+ {"version":3,"sources":["../../src/ace/ace-generator.ts"],"sourcesContent":["import { ACEReflector, CognitiveReflection } from './ace-reflector.js';\r\nimport { ACECurator } from './ace-curator.js';\r\n\r\nexport interface ContextGenerationOptions {\r\n maxComplexity?: number;\r\n allowAdaptation?: boolean;\r\n fallbackStrategy?: (context: any) => any;\r\n}\r\n\r\nexport class ACEGenerator {\r\n private reflector: ACEReflector;\r\n private curator: ACECurator;\r\n\r\n constructor() {\r\n this.reflector = new ACEReflector();\r\n this.curator = new ACECurator();\r\n }\r\n\r\n async generateContext(\r\n baseContext: Record<string, any>,\r\n options: ContextGenerationOptions = {}\r\n ): Promise<Record<string, any>> {\r\n // Validate baseContext is not null or undefined\r\n if (baseContext === null || baseContext === undefined) {\r\n throw new Error('baseContext cannot be null or undefined');\r\n }\r\n\r\n const {\r\n maxComplexity = 5,\r\n allowAdaptation = true,\r\n fallbackStrategy = this.defaultFallbackStrategy\r\n } = options;\r\n\r\n try {\r\n // Initial reflection\r\n const reflection = await this.reflector.reflect(\r\n baseContext,\r\n { complexity: this.calculateComplexity(baseContext) }\r\n );\r\n\r\n // Check complexity\r\n if (reflection.complexity > maxComplexity) {\r\n if (!allowAdaptation) {\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n // Context adaptation\r\n const adaptedContext = await this.adaptContext(reflection);\r\n\r\n return adaptedContext;\r\n } catch (error) {\r\n console.error('Context generation failed:', error);\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private async adaptContext(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>> {\r\n // Advanced context adaptation\r\n const contexts = [\r\n reflection.context,\r\n // Optional: fetch previous similar contexts\r\n await this.fetchSimilarContexts(reflection)\r\n ].filter(Boolean);\r\n\r\n return this.curator.mergeContexts(contexts);\r\n }\r\n\r\n private async fetchSimilarContexts(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>[]> {\r\n // Placeholder for advanced context similarity search\r\n // In production, implement semantic similarity algorithm\r\n return [];\r\n }\r\n\r\n private defaultFallbackStrategy(\r\n context: Record<string, any>\r\n ): Record<string, any> {\r\n return {\r\n ...context,\r\n adaptationWarning: 'Context generation limited'\r\n };\r\n }\r\n}\r\n\r\nexport default ACEGenerator;"],"names":["ACEReflector","ACECurator","ACEGenerator","reflector","curator","generateContext","baseContext","options","undefined","Error","maxComplexity","allowAdaptation","fallbackStrategy","defaultFallbackStrategy","reflection","reflect","complexity","calculateComplexity","adaptedContext","adaptContext","error","console","context","keyCount","Object","keys","length","contentLength","JSON","stringify","Math","log","contexts","fetchSimilarContexts","filter","Boolean","mergeContexts","adaptationWarning"],"mappings":"AAAA,SAASA,YAAY,QAA6B,qBAAqB;AACvE,SAASC,UAAU,QAAQ,mBAAmB;AAQ9C,OAAO,MAAMC;IACHC,UAAwB;IACxBC,QAAoB;IAE5B,aAAc;QACZ,IAAI,CAACD,SAAS,GAAG,IAAIH;QACrB,IAAI,CAACI,OAAO,GAAG,IAAIH;IACrB;IAEA,MAAMI,gBACJC,WAAgC,EAChCC,UAAoC,CAAC,CAAC,EACR;QAC9B,gDAAgD;QAChD,IAAID,gBAAgB,QAAQA,gBAAgBE,WAAW;YACrD,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAM,EACJC,gBAAgB,CAAC,EACjBC,kBAAkB,IAAI,EACtBC,mBAAmB,IAAI,CAACC,uBAAuB,EAChD,GAAGN;QAEJ,IAAI;YACF,qBAAqB;YACrB,MAAMO,aAAa,MAAM,IAAI,CAACX,SAAS,CAACY,OAAO,CAC7CT,aACA;gBAAEU,YAAY,IAAI,CAACC,mBAAmB,CAACX;YAAa;YAGtD,mBAAmB;YACnB,IAAIQ,WAAWE,UAAU,GAAGN,eAAe;gBACzC,IAAI,CAACC,iBAAiB;oBACpB,OAAOC,iBAAiBN;gBAC1B;YACF;YAEA,qBAAqB;YACrB,MAAMY,iBAAiB,MAAM,IAAI,CAACC,YAAY,CAACL;YAE/C,OAAOI;QACT,EAAE,OAAOE,OAAO;YACdC,QAAQD,KAAK,CAAC,8BAA8BA;YAC5C,OAAOR,iBAAiBN;QAC1B;IACF;IAEQW,oBACNK,OAA4B,EACpB;QACR,MAAMC,WAAWC,OAAOC,IAAI,CAACH,SAASI,MAAM;QAC5C,MAAMC,gBAAgBC,KAAKC,SAAS,CAACP,SAASI,MAAM;QACpD,OAAOI,KAAKC,GAAG,CAACR,WAAWI,iBAAiBG,KAAKC,GAAG,CAAC;IACvD;IAEA,MAAcZ,aACZL,UAA+B,EACD;QAC9B,8BAA8B;QAC9B,MAAMkB,WAAW;YACflB,WAAWQ,OAAO;YAClB,4CAA4C;YAC5C,MAAM,IAAI,CAACW,oBAAoB,CAACnB;SACjC,CAACoB,MAAM,CAACC;QAET,OAAO,IAAI,CAAC/B,OAAO,CAACgC,aAAa,CAACJ;IACpC;IAEA,MAAcC,qBACZnB,UAA+B,EACC;QAChC,qDAAqD;QACrD,yDAAyD;QACzD,OAAO,EAAE;IACX;IAEQD,wBACNS,OAA4B,EACP;QACrB,OAAO;YACL,GAAGA,OAAO;YACVe,mBAAmB;QACrB;IACF;AACF;AAEA,eAAenC,aAAa"}