claude-flow-novice 2.15.2 → 2.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) 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 +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
  36. package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
  37. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  38. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  39. package/.claude/hooks/cfn-post-edit.config.json +44 -44
  40. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  42. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  43. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  44. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  45. package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  46. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  47. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  48. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  49. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  50. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  51. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  52. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  53. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  54. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  55. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  56. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  57. package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
  58. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  59. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  60. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  61. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  62. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  63. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  64. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  65. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  66. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  67. package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  68. package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  69. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  70. package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  71. package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  72. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  73. package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  74. package/README.md +116 -475
  75. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  76. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  77. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  78. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  79. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  80. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  81. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  82. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  83. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  84. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  85. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  86. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  87. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  88. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  89. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  90. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  91. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  92. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  93. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  94. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  95. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  96. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  97. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  98. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  99. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  100. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  101. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  102. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  103. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  104. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  105. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  106. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  107. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  108. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  109. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  110. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  111. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  112. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  113. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  114. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  115. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  116. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  117. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  118. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  119. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  120. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  121. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  122. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  123. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  124. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  125. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  126. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  127. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  128. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  129. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  130. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  131. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  147. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  148. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  149. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  150. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  151. package/claude-assets/commands/switch-api.md +31 -10
  152. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
  153. package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
  154. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  155. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  156. package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
  157. package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
  158. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  159. package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
  160. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  161. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  162. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
  163. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
  164. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  165. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  166. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  167. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  168. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  169. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  170. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  171. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  172. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  173. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  174. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  175. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
  176. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
  177. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  178. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
  179. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  180. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  181. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  182. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  183. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  184. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  185. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  186. package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
  187. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  188. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  189. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  190. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  191. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  192. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  193. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
  194. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
  195. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  196. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  197. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  198. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  199. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  200. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  201. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  202. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  203. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  204. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  205. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  206. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
  207. package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
  208. package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
  209. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
  210. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  211. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  212. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  213. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
  214. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  215. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  216. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  217. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  218. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  219. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  220. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  221. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
  222. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  223. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  224. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  225. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  226. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  227. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  228. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  229. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  230. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
  231. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  232. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  233. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
  234. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  235. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
  236. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
  237. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  238. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  239. package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
  240. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
  241. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  242. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  243. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  244. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  245. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  246. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  247. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  248. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  249. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  250. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  251. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  252. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  253. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  254. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  255. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  256. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  257. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  258. package/claude-assets/skills/docker-build/SKILL.md +96 -203
  259. package/claude-assets/skills/docker-build/build.sh +73 -73
  260. package/claude-assets/skills/integration/agent-handoff.sh +492 -0
  261. package/claude-assets/skills/integration/file-operations.sh +414 -0
  262. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  263. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  264. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  265. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  266. package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
  267. package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
  268. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  269. package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
  270. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  271. package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
  272. package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
  273. package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
  274. package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
  275. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  276. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  277. package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
  278. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  279. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  280. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  281. package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
  282. package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
  283. package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
  284. package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
  285. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  286. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
  287. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  288. package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
  289. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  290. package/dist/ace/ace-curator.js +10 -2
  291. package/dist/ace/ace-curator.js.map +1 -1
  292. package/dist/ace/ace-generator.js +4 -0
  293. package/dist/ace/ace-generator.js.map +1 -1
  294. package/dist/ace/ace-reflector.js +1 -1
  295. package/dist/ace/ace-reflector.js.map +1 -1
  296. package/dist/ace/context-injection.js +24 -2
  297. package/dist/ace/context-injection.js.map +1 -1
  298. package/dist/agents/agent-loader.js +146 -165
  299. package/dist/agents/agent-loader.js.map +1 -1
  300. package/dist/agents/task-agent-integration.js +1 -1
  301. package/dist/agents/task-agent-integration.js.map +1 -1
  302. package/dist/api/health-endpoints.js +390 -0
  303. package/dist/api/health-endpoints.js.map +1 -0
  304. package/dist/cli/agent-executor.js +4 -1
  305. package/dist/cli/agent-executor.js.map +1 -1
  306. package/dist/cli/agent-prompt-builder.js +89 -1
  307. package/dist/cli/agent-prompt-builder.js.map +1 -1
  308. package/dist/cli/agent-spawn.js +130 -37
  309. package/dist/cli/agent-spawn.js.map +1 -1
  310. package/dist/cli/config-manager.js +91 -109
  311. package/dist/cli/config-manager.js.map +1 -1
  312. package/dist/cli/skill-cache-validator.js +412 -0
  313. package/dist/cli/skill-cache-validator.js.map +1 -0
  314. package/dist/cli/skill-cli.js +991 -0
  315. package/dist/cli/skill-cli.js.map +1 -0
  316. package/dist/cli/skill-execution-logger.js +284 -0
  317. package/dist/cli/skill-execution-logger.js.map +1 -0
  318. package/dist/cli/skill-loader.js +457 -0
  319. package/dist/cli/skill-loader.js.map +1 -0
  320. package/dist/coordination/event-bus.js +2 -2
  321. package/dist/coordination/event-bus.js.map +1 -1
  322. package/dist/coordination/fleet-manager.js +1 -1
  323. package/dist/coordination/fleet-manager.js.map +1 -1
  324. package/dist/coordination/index.js +23 -9
  325. package/dist/coordination/index.js.map +1 -1
  326. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  327. package/dist/db/migration-manager.js +483 -0
  328. package/dist/db/migration-manager.js.map +1 -0
  329. package/dist/db/skills-query.js +535 -0
  330. package/dist/db/skills-query.js.map +1 -0
  331. package/dist/integration/DatabaseHandoff.js +507 -0
  332. package/dist/integration/DatabaseHandoff.js.map +1 -0
  333. package/dist/integration/StandardAdapter.js +291 -0
  334. package/dist/integration/StandardAdapter.js.map +1 -0
  335. package/dist/jobs/edge-case-analyzer.js +367 -0
  336. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  337. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  338. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  339. package/dist/lib/agent-output-parser.js +518 -0
  340. package/dist/lib/agent-output-parser.js.map +1 -0
  341. package/dist/lib/agent-output-validator.js +950 -0
  342. package/dist/lib/agent-output-validator.js.map +1 -0
  343. package/dist/lib/agent-workspace.js +281 -0
  344. package/dist/lib/agent-workspace.js.map +1 -0
  345. package/dist/lib/artifact-registry.js +443 -0
  346. package/dist/lib/artifact-registry.js.map +1 -0
  347. package/dist/lib/atomic-file-writer.js +377 -0
  348. package/dist/lib/atomic-file-writer.js.map +1 -0
  349. package/dist/lib/backup-manager.js +779 -0
  350. package/dist/lib/backup-manager.js.map +1 -0
  351. package/dist/lib/checkpoint-manager.js +837 -0
  352. package/dist/lib/checkpoint-manager.js.map +1 -0
  353. package/dist/lib/circuit-breaker.js +340 -0
  354. package/dist/lib/circuit-breaker.js.map +1 -0
  355. package/dist/lib/completion-signal-handler.js +243 -0
  356. package/dist/lib/completion-signal-handler.js.map +1 -0
  357. package/dist/lib/config-manager.js +312 -0
  358. package/dist/lib/config-manager.js.map +1 -0
  359. package/dist/lib/config-migrator.js +386 -0
  360. package/dist/lib/config-migrator.js.map +1 -0
  361. package/dist/lib/config-validator.js +687 -0
  362. package/dist/lib/config-validator.js.map +1 -0
  363. package/dist/lib/correlation-cache.js +311 -0
  364. package/dist/lib/correlation-cache.js.map +1 -0
  365. package/dist/lib/correlation.js +263 -0
  366. package/dist/lib/correlation.js.map +1 -0
  367. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  368. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  369. package/dist/lib/database-service/correlation.js +329 -0
  370. package/dist/lib/database-service/correlation.js.map +1 -0
  371. package/dist/lib/database-service/errors.js +120 -0
  372. package/dist/lib/database-service/errors.js.map +1 -0
  373. package/dist/lib/database-service/index.js +168 -0
  374. package/dist/lib/database-service/index.js.map +1 -0
  375. package/dist/lib/database-service/postgres-adapter.js +526 -0
  376. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  377. package/dist/lib/database-service/redis-adapter.js +360 -0
  378. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  379. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  380. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  381. package/dist/lib/database-service/transaction-manager.js +773 -0
  382. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  383. package/dist/lib/database-service/types.js +23 -0
  384. package/dist/lib/database-service/types.js.map +1 -0
  385. package/dist/lib/deadlock-resolver.js +292 -0
  386. package/dist/lib/deadlock-resolver.js.map +1 -0
  387. package/dist/lib/distributed-lock.js +451 -0
  388. package/dist/lib/distributed-lock.js.map +1 -0
  389. package/dist/lib/edge-case-deduplicator.js +227 -0
  390. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  391. package/dist/lib/encryption-manager.js +322 -0
  392. package/dist/lib/encryption-manager.js.map +1 -0
  393. package/dist/lib/error-aggregator.js +234 -0
  394. package/dist/lib/error-aggregator.js.map +1 -0
  395. package/dist/lib/errors.js +287 -0
  396. package/dist/lib/errors.js.map +1 -0
  397. package/dist/lib/file-lock-manager.js +578 -0
  398. package/dist/lib/file-lock-manager.js.map +1 -0
  399. package/dist/lib/file-operations.js +367 -0
  400. package/dist/lib/file-operations.js.map +1 -0
  401. package/dist/lib/idempotent-write.js +237 -0
  402. package/dist/lib/idempotent-write.js.map +1 -0
  403. package/dist/lib/integration-schema-validator.js +522 -0
  404. package/dist/lib/integration-schema-validator.js.map +1 -0
  405. package/dist/lib/lock-health-monitor.js +298 -0
  406. package/dist/lib/lock-health-monitor.js.map +1 -0
  407. package/dist/lib/log-shipper.js +422 -0
  408. package/dist/lib/log-shipper.js.map +1 -0
  409. package/dist/lib/logging.js +146 -0
  410. package/dist/lib/logging.js.map +1 -0
  411. package/dist/lib/message-deduplicator.js +439 -0
  412. package/dist/lib/message-deduplicator.js.map +1 -0
  413. package/dist/lib/multi-system-query.js +604 -0
  414. package/dist/lib/multi-system-query.js.map +1 -0
  415. package/dist/lib/orphan-detector.js +332 -0
  416. package/dist/lib/orphan-detector.js.map +1 -0
  417. package/dist/lib/password-generator.js +166 -0
  418. package/dist/lib/password-generator.js.map +1 -0
  419. package/dist/lib/path-validator.js +429 -0
  420. package/dist/lib/path-validator.js.map +1 -0
  421. package/dist/lib/query-translator.js +905 -0
  422. package/dist/lib/query-translator.js.map +1 -0
  423. package/dist/lib/queue-recovery.js +469 -0
  424. package/dist/lib/queue-recovery.js.map +1 -0
  425. package/dist/lib/redis-queue-manager.js +512 -0
  426. package/dist/lib/redis-queue-manager.js.map +1 -0
  427. package/dist/lib/reflection-archiver.js +272 -0
  428. package/dist/lib/reflection-archiver.js.map +1 -0
  429. package/dist/lib/retry-manager.js +453 -0
  430. package/dist/lib/retry-manager.js.map +1 -0
  431. package/dist/lib/retry.js +262 -0
  432. package/dist/lib/retry.js.map +1 -0
  433. package/dist/lib/schema-transform.js +695 -0
  434. package/dist/lib/schema-transform.js.map +1 -0
  435. package/dist/lib/schema-validator.js +491 -0
  436. package/dist/lib/schema-validator.js.map +1 -0
  437. package/dist/lib/skill-cache.js +297 -0
  438. package/dist/lib/skill-cache.js.map +1 -0
  439. package/dist/lib/skill-content-manager.js +337 -0
  440. package/dist/lib/skill-content-manager.js.map +1 -0
  441. package/dist/lib/skill-frontmatter-parser.js +237 -0
  442. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  443. package/dist/lib/skill-git-integration.js +275 -0
  444. package/dist/lib/skill-git-integration.js.map +1 -0
  445. package/dist/lib/skill-markdown-validator.js +396 -0
  446. package/dist/lib/skill-markdown-validator.js.map +1 -0
  447. package/dist/lib/skill-output-parser.js +312 -0
  448. package/dist/lib/skill-output-parser.js.map +1 -0
  449. package/dist/lib/unified-query-api.js +467 -0
  450. package/dist/lib/unified-query-api.js.map +1 -0
  451. package/dist/middleware/auth-middleware.js +350 -0
  452. package/dist/middleware/auth-middleware.js.map +1 -0
  453. package/dist/middleware/schema-validation.js +347 -0
  454. package/dist/middleware/schema-validation.js.map +1 -0
  455. package/dist/providers/anthropic-provider.js +1 -1
  456. package/dist/providers/anthropic-provider.js.map +1 -1
  457. package/dist/providers/provider-factory.js +2 -2
  458. package/dist/providers/provider-factory.js.map +1 -1
  459. package/dist/services/edge-case-analyzer.js +321 -0
  460. package/dist/services/edge-case-analyzer.js.map +1 -0
  461. package/dist/services/edge-case-deduplicator.js +266 -0
  462. package/dist/services/edge-case-deduplicator.js.map +1 -0
  463. package/dist/services/edge-case-detector.js +337 -0
  464. package/dist/services/edge-case-detector.js.map +1 -0
  465. package/dist/services/edge-case-tracker.js +547 -0
  466. package/dist/services/edge-case-tracker.js.map +1 -0
  467. package/dist/services/health-check-system.js +586 -0
  468. package/dist/services/health-check-system.js.map +1 -0
  469. package/dist/services/metrics-logger.js +412 -0
  470. package/dist/services/metrics-logger.js.map +1 -0
  471. package/dist/services/patch-generator.js +378 -0
  472. package/dist/services/patch-generator.js.map +1 -0
  473. package/dist/services/patch-validator.js +337 -0
  474. package/dist/services/patch-validator.js.map +1 -0
  475. package/dist/services/performance-monitor.js +811 -0
  476. package/dist/services/performance-monitor.js.map +1 -0
  477. package/dist/services/promotion-pipeline.js +918 -0
  478. package/dist/services/promotion-pipeline.js.map +1 -0
  479. package/dist/services/promotion-validator.js +394 -0
  480. package/dist/services/promotion-validator.js.map +1 -0
  481. package/dist/services/reflection-logger.js +388 -0
  482. package/dist/services/reflection-logger.js.map +1 -0
  483. package/dist/services/skill-deployment.js +472 -0
  484. package/dist/services/skill-deployment.js.map +1 -0
  485. package/dist/services/skill-loader.js +427 -0
  486. package/dist/services/skill-loader.js.map +1 -0
  487. package/dist/services/skill-promotion.js +372 -0
  488. package/dist/services/skill-promotion.js.map +1 -0
  489. package/dist/services/skill-validator.js +454 -0
  490. package/dist/services/skill-validator.js.map +1 -0
  491. package/dist/services/skill-versioning.js +244 -0
  492. package/dist/services/skill-versioning.js.map +1 -0
  493. package/dist/services/workspace-supervisor.js +597 -0
  494. package/dist/services/workspace-supervisor.js.map +1 -0
  495. package/dist/types/agent-output.js +44 -0
  496. package/dist/types/agent-output.js.map +1 -0
  497. package/dist/types/config.js +28 -0
  498. package/dist/types/config.js.map +1 -0
  499. package/dist/types/edge-case.js +45 -0
  500. package/dist/types/edge-case.js.map +1 -0
  501. package/package.json +201 -176
  502. package/readme/README.md +19 -4
  503. package/scripts/artifact-cleanup.sh +392 -0
  504. package/scripts/backup-cleanup.sh +627 -0
  505. package/scripts/cleanup-workspaces.sh +412 -0
  506. package/scripts/cleanup-yaml-configs.sh +141 -0
  507. package/scripts/deploy-approved-skills.sh +263 -0
  508. package/scripts/deploy-production.sh +355 -355
  509. package/scripts/docker-playwright-fix.sh +311 -311
  510. package/scripts/docker-rebuild-all-agents.sh +127 -127
  511. package/scripts/health-check.sh +447 -0
  512. package/scripts/log-aggregator.sh +554 -0
  513. package/scripts/log-monitor.sh +629 -0
  514. package/scripts/manage-agent-workspaces.sh +434 -0
  515. package/scripts/memory-leak-prevention.sh +305 -305
  516. package/scripts/migrate-artifacts.sh +563 -0
  517. package/scripts/migrate-schema.sh +533 -0
  518. package/scripts/migrate-yaml-to-json.sh +465 -0
  519. package/scripts/promote-staged-skills.sh +423 -0
  520. package/scripts/run-marketing-tests.sh +42 -42
  521. package/scripts/update_paths.sh +46 -46
  522. package/scripts/verify-no-secrets.sh +88 -35
  523. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  524. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  525. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  526. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  527. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  528. package/README.md.backup_before_replace +0 -781
  529. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  530. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  531. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  532. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  533. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/skill-cli.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * Skills Database CLI Tool\r\n * Phase 4: CLI Tooling with Approval Workflow\r\n *\r\n * Commands:\r\n * - list: List skills with filtering\r\n * - assign: Assign skills to agents\r\n * - create: Create new skills\r\n * - update: Update skill metadata\r\n * - deprecate: Deprecate skills\r\n * - approve: Approve pending skills\r\n * - escalate: Escalate skills for review\r\n * - pending: List pending approvals\r\n * - approval-status: Check skill approval status\r\n * - analytics: Skill effectiveness analytics\r\n */\r\n\r\nimport { createRequire } from 'module';\r\nimport { existsSync, readFileSync } from 'fs';\r\nimport { createHash } from 'crypto';\r\nimport { fileURLToPath } from 'url';\r\nimport path from 'path';\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst Database = require('better-sqlite3');\r\n\r\n// ============================================================================\r\n// Types and Interfaces\r\n// ============================================================================\r\n\r\ninterface Skill {\r\n id: number;\r\n name: string;\r\n category: string;\r\n team: string;\r\n content_path: string;\r\n content_hash: string;\r\n tags: string;\r\n version: string;\r\n status: string;\r\n approval_level: string;\r\n approval_criteria: string | null;\r\n owner: string;\r\n phase4_pattern_id: number | null;\r\n generated_by: string;\r\n created_at: string;\r\n updated_at: string;\r\n}\r\n\r\ninterface ApprovalHistory {\r\n id: number;\r\n skill_id: number;\r\n version: string;\r\n approval_level: string;\r\n approver: string | null;\r\n decision: string;\r\n reasoning: string | null;\r\n timestamp: string;\r\n}\r\n\r\ninterface AgentMapping {\r\n id: number;\r\n agent_type: string;\r\n skill_id: number;\r\n priority: number;\r\n required: number;\r\n conditions: string | null;\r\n notes: string | null;\r\n}\r\n\r\n// ============================================================================\r\n// ANSI Color Codes\r\n// ============================================================================\r\n\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bright: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n magenta: '\\x1b[35m',\r\n cyan: '\\x1b[36m',\r\n white: '\\x1b[37m'\r\n};\r\n\r\nconst chalk = {\r\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\r\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\r\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\r\n blue: (text: string) => `${colors.blue}${text}${colors.reset}`,\r\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\r\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\r\n bold: (text: string) => `${colors.bright}${text}${colors.reset}`,\r\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`\r\n};\r\n\r\n// ============================================================================\r\n// Database Connection\r\n// ============================================================================\r\n\r\nconst DB_PATH = process.env.CFN_SKILLS_DB_PATH || './.claude/skills-database/skills.db';\r\n\r\nfunction getDb(): Database.Database {\r\n if (!existsSync(DB_PATH)) {\r\n console.error(chalk.red(`Error: Skills database not found at ${DB_PATH}`));\r\n process.exit(1);\r\n }\r\n return new Database(DB_PATH);\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\nfunction calculateHash(content: string): string {\r\n return createHash('sha256').update(content).digest('hex');\r\n}\r\n\r\n// Strip ANSI escape codes for accurate string length measurement\r\nfunction stripAnsi(str: string): string {\r\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\r\n}\r\n\r\nfunction formatTable(headers: string[], rows: string[][]): string {\r\n if (rows.length === 0) {\r\n return 'No results found.';\r\n }\r\n\r\n // Calculate column widths - strip ANSI codes before measuring\r\n const colWidths = headers.map((header, i) => {\r\n const maxDataWidth = Math.max(...rows.map(row => stripAnsi((row[i] || '').toString()).length));\r\n return Math.max(stripAnsi(header).length, maxDataWidth);\r\n });\r\n\r\n // Build separator\r\n const separator = colWidths.map(w => '-'.repeat(w)).join('-+-');\r\n\r\n // Build header - use stripped length for padding calculation\r\n const headerRow = headers.map((h, i) => {\r\n const stripped = stripAnsi(h);\r\n const padding = colWidths[i] - stripped.length;\r\n return h + ' '.repeat(Math.max(0, padding));\r\n }).join(' | ');\r\n\r\n // Build data rows - use stripped length for padding calculation\r\n const dataRows = rows.map(row =>\r\n row.map((cell, i) => {\r\n const cellStr = (cell || '').toString();\r\n const stripped = stripAnsi(cellStr);\r\n const padding = colWidths[i] - stripped.length;\r\n return cellStr + ' '.repeat(Math.max(0, padding));\r\n }).join(' | ')\r\n );\r\n\r\n return [headerRow, separator, ...dataRows].join('\\n');\r\n}\r\n\r\nfunction parseArgs(args: string[]): Record<string, string | boolean> {\r\n const parsed: Record<string, string | boolean> = {};\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i];\r\n\r\n if (arg.startsWith('--')) {\r\n // Handle --key=value format\r\n if (arg.includes('=')) {\r\n const [key, ...valueParts] = arg.slice(2).split('=');\r\n parsed[key] = valueParts.join('='); // Rejoin in case value contains '='\r\n } else {\r\n // Handle --key value format\r\n const key = arg.slice(2);\r\n const nextArg = args[i + 1];\r\n\r\n if (nextArg && !nextArg.startsWith('--')) {\r\n parsed[key] = nextArg;\r\n i++;\r\n } else {\r\n parsed[key] = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\n// ============================================================================\r\n// Command: list\r\n// ============================================================================\r\n\r\nasync function cmdList(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n let query = 'SELECT * FROM skills WHERE 1=1';\r\n const params: any[] = [];\r\n\r\n // Filter by approval level\r\n if (options.approval) {\r\n query += ' AND approval_level = ?';\r\n params.push(options.approval);\r\n }\r\n\r\n // Filter by category\r\n if (options.category) {\r\n query += ' AND category = ?';\r\n params.push(options.category);\r\n }\r\n\r\n // Filter by team\r\n if (options.team) {\r\n query += ' AND team = ?';\r\n params.push(options.team);\r\n }\r\n\r\n // Filter by status\r\n if (options.status) {\r\n query += ' AND status = ?';\r\n params.push(options.status);\r\n } else {\r\n // Default to active only\r\n query += ' AND status = ?';\r\n params.push('active');\r\n }\r\n\r\n // Filter by pending approval\r\n if (options['pending-approval']) {\r\n query = `\r\n SELECT s.* FROM skills s\r\n LEFT JOIN approval_history ah ON ah.skill_id = s.id AND ah.version = s.version AND ah.decision = 'approved'\r\n WHERE ah.id IS NULL\r\n AND s.approval_level IN ('human', 'escalate')\r\n AND s.status = 'active'\r\n `;\r\n params.length = 0; // Clear params\r\n }\r\n\r\n // Filter by agent\r\n if (options.agent) {\r\n query = `\r\n SELECT s.* FROM skills s\r\n JOIN agent_skill_mappings m ON m.skill_id = s.id\r\n WHERE m.agent_type = ?\r\n AND s.status = 'active'\r\n `;\r\n params.length = 0;\r\n params.push(options.agent);\r\n }\r\n\r\n query += ' ORDER BY id ASC';\r\n\r\n const skills = db.prepare(query).all(...params) as Skill[];\r\n\r\n if (skills.length === 0) {\r\n console.log(chalk.yellow('No skills found matching criteria.'));\r\n db.close();\r\n return;\r\n }\r\n\r\n // Count agents for each skill\r\n const skillsWithAgentCount = skills.map(skill => {\r\n const count = db.prepare('SELECT COUNT(*) as count FROM agent_skill_mappings WHERE skill_id = ?')\r\n .get(skill.id) as { count: number };\r\n return { ...skill, agent_count: count.count };\r\n });\r\n\r\n // Format as table\r\n const headers = ['ID', 'Name', 'Category', 'Approval', 'Version', 'Status', 'Agents'];\r\n const rows = skillsWithAgentCount.map(s => [\r\n s.id.toString(),\r\n s.name,\r\n s.category,\r\n s.approval_level === 'auto' ? chalk.green(s.approval_level) :\r\n s.approval_level === 'escalate' ? chalk.yellow(s.approval_level) :\r\n chalk.red(s.approval_level),\r\n s.version,\r\n s.status === 'active' ? chalk.green(s.status) : chalk.dim(s.status),\r\n s.agent_count.toString()\r\n ]);\r\n\r\n console.log(formatTable(headers, rows));\r\n console.log(`\\nTotal: ${skills.length} skill(s)`);\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: assign\r\n// ============================================================================\r\n\r\nasync function cmdAssign(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { agent, skill, priority, required, condition } = options;\r\n\r\n if (!agent || !skill) {\r\n console.error(chalk.red('Error: --agent and --skill are required'));\r\n process.exit(1);\r\n }\r\n\r\n // Get skill ID\r\n const skillRecord = db.prepare('SELECT id FROM skills WHERE name = ?').get(skill as string) as Skill | undefined;\r\n\r\n if (!skillRecord) {\r\n console.error(chalk.red(`Error: Skill not found: ${skill}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Check if mapping already exists\r\n const existing = db.prepare('SELECT id FROM agent_skill_mappings WHERE agent_type = ? AND skill_id = ?')\r\n .get(agent, skillRecord.id);\r\n\r\n if (existing) {\r\n console.error(chalk.yellow(`Warning: Mapping already exists for ${agent} → ${skill}`));\r\n db.close();\r\n return;\r\n }\r\n\r\n // Insert mapping\r\n db.prepare(`\r\n INSERT INTO agent_skill_mappings (agent_type, skill_id, priority, required, conditions)\r\n VALUES (?, ?, ?, ?, ?)\r\n `).run(\r\n agent,\r\n skillRecord.id,\r\n priority ? parseInt(priority as string) : 5,\r\n required ? 1 : 0,\r\n condition ? JSON.stringify({ taskContext: [condition] }) : null\r\n );\r\n\r\n console.log(chalk.green(`✓ Assigned skill \"${skill}\" to agent \"${agent}\"`));\r\n console.log(` Priority: ${priority || 5}`);\r\n console.log(` Required: ${required ? 'Yes' : 'No'}`);\r\n if (condition) {\r\n console.log(` Condition: taskContext contains \"${condition}\"`);\r\n }\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: create\r\n// ============================================================================\r\n\r\nasync function cmdCreate(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { name, category, team, 'content-path': contentPath, tags, version, 'approval-level': approvalLevel, owner } = options;\r\n\r\n if (!name || !category || !contentPath) {\r\n console.error(chalk.red('Error: --name, --category, and --content-path are required'));\r\n process.exit(1);\r\n }\r\n\r\n // Validate content path exists\r\n const fullPath = path.resolve(contentPath as string);\r\n if (!existsSync(fullPath)) {\r\n console.error(chalk.red(`Error: Content file not found: ${fullPath}`));\r\n process.exit(1);\r\n }\r\n\r\n // Calculate hash\r\n const content = readFileSync(fullPath, 'utf-8');\r\n const hash = calculateHash(content);\r\n\r\n // Parse tags\r\n const tagArray = tags ? (tags as string).split(',').map(t => t.trim()) : [];\r\n\r\n // Insert skill\r\n try {\r\n db.prepare(`\r\n INSERT INTO skills (\r\n name, category, team, content_path, content_hash, tags, version, status,\r\n approval_level, owner, generated_by\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n `).run(\r\n name,\r\n category,\r\n team || 'default',\r\n contentPath,\r\n hash,\r\n JSON.stringify(tagArray),\r\n version || '1.0.0',\r\n 'active',\r\n approvalLevel || 'human',\r\n owner || 'unknown',\r\n 'manual'\r\n );\r\n\r\n console.log(chalk.green(`✓ Created skill: ${name}`));\r\n console.log(` Category: ${category}`);\r\n console.log(` Version: ${version || '1.0.0'}`);\r\n console.log(` Approval: ${approvalLevel || 'human'}`);\r\n console.log(` Path: ${contentPath}`);\r\n console.log(` Hash: ${hash.slice(0, 16)}...`);\r\n } catch (error: any) {\r\n if (error.message.includes('UNIQUE constraint failed')) {\r\n console.error(chalk.red(`Error: Skill \"${name}\" already exists`));\r\n } else {\r\n console.error(chalk.red(`Error: ${error.message}`));\r\n }\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: update\r\n// ============================================================================\r\n\r\nasync function cmdUpdate(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { skill, version, tags, 'recalculate-hash': recalcHash, 'approval-level': approvalLevel } = options;\r\n\r\n if (!skill) {\r\n console.error(chalk.red('Error: --skill is required'));\r\n process.exit(1);\r\n }\r\n\r\n // Get skill\r\n const skillRecord = db.prepare('SELECT * FROM skills WHERE name = ?').get(skill) as Skill | undefined;\r\n\r\n if (!skillRecord) {\r\n console.error(chalk.red(`Error: Skill not found: ${skill}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n const updates: string[] = [];\r\n const params: any[] = [];\r\n\r\n if (version) {\r\n updates.push('version = ?');\r\n params.push(version);\r\n }\r\n\r\n if (tags) {\r\n const tagArray = (tags as string).split(',').map(t => t.trim());\r\n updates.push('tags = ?');\r\n params.push(JSON.stringify(tagArray));\r\n }\r\n\r\n if (approvalLevel) {\r\n updates.push('approval_level = ?');\r\n params.push(approvalLevel);\r\n }\r\n\r\n if (recalcHash) {\r\n const content = readFileSync(skillRecord.content_path, 'utf-8');\r\n const newHash = calculateHash(content);\r\n updates.push('content_hash = ?');\r\n params.push(newHash);\r\n console.log(chalk.blue(`New hash: ${newHash.slice(0, 16)}...`));\r\n }\r\n\r\n if (updates.length === 0) {\r\n console.log(chalk.yellow('No updates specified'));\r\n db.close();\r\n return;\r\n }\r\n\r\n updates.push('updated_at = datetime(\\'now\\')');\r\n params.push(skill);\r\n\r\n db.prepare(`UPDATE skills SET ${updates.join(', ')} WHERE name = ?`).run(...params);\r\n\r\n console.log(chalk.green(`✓ Updated skill: ${skill}`));\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: deprecate\r\n// ============================================================================\r\n\r\nasync function cmdDeprecate(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { skill, replacement, note } = options;\r\n\r\n if (!skill) {\r\n console.error(chalk.red('Error: --skill is required'));\r\n process.exit(1);\r\n }\r\n\r\n // Get skill ID\r\n const skillRecord = db.prepare('SELECT id FROM skills WHERE name = ?').get(skill) as Skill | undefined;\r\n\r\n if (!skillRecord) {\r\n console.error(chalk.red(`Error: Skill not found: ${skill}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Get replacement ID if specified\r\n let replacementId: number | null = null;\r\n if (replacement) {\r\n const replacementRecord = db.prepare('SELECT id FROM skills WHERE name = ?').get(replacement) as Skill | undefined;\r\n if (replacementRecord) {\r\n replacementId = replacementRecord.id;\r\n }\r\n }\r\n\r\n // Update skill\r\n db.prepare(`\r\n UPDATE skills\r\n SET status = 'deprecated',\r\n deprecation_note = ?,\r\n replacement_id = ?,\r\n updated_at = datetime('now')\r\n WHERE id = ?\r\n `).run(note || 'Deprecated', replacementId, skillRecord.id);\r\n\r\n console.log(chalk.yellow(`⚠ Deprecated skill: ${skill}`));\r\n if (replacement) {\r\n console.log(` Replacement: ${replacement}`);\r\n }\r\n if (note) {\r\n console.log(` Note: ${note}`);\r\n }\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: approve\r\n// ============================================================================\r\n\r\nasync function cmdApprove(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { skill, version, approver, decision, reasoning } = options;\r\n\r\n if (!skill || !decision) {\r\n console.error(chalk.red('Error: --skill and --decision are required'));\r\n process.exit(1);\r\n }\r\n\r\n if (!['approved', 'rejected'].includes(decision as string)) {\r\n console.error(chalk.red('Error: --decision must be \"approved\" or \"rejected\"'));\r\n process.exit(1);\r\n }\r\n\r\n // Get skill\r\n const skillRecord = db.prepare('SELECT * FROM skills WHERE name = ?').get(skill) as Skill | undefined;\r\n\r\n if (!skillRecord) {\r\n console.error(chalk.red(`Error: Skill not found: ${skill}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Record approval\r\n db.prepare(`\r\n INSERT INTO approval_history (skill_id, version, approval_level, approver, decision, reasoning, timestamp)\r\n VALUES (?, ?, ?, ?, ?, ?, datetime('now'))\r\n `).run(\r\n skillRecord.id,\r\n version || skillRecord.version,\r\n skillRecord.approval_level,\r\n approver || 'system',\r\n decision,\r\n reasoning || null\r\n );\r\n\r\n // Update skill status\r\n if (decision === 'approved') {\r\n db.prepare('UPDATE skills SET status = ? WHERE id = ?').run('active', skillRecord.id);\r\n console.log(chalk.green(`✓ Skill approved: ${skill} (v${version || skillRecord.version})`));\r\n } else {\r\n db.prepare('UPDATE skills SET status = ? WHERE id = ?').run('archived', skillRecord.id);\r\n console.log(chalk.red(`✗ Skill rejected: ${skill}`));\r\n }\r\n\r\n if (reasoning) {\r\n console.log(` Reasoning: ${reasoning}`);\r\n }\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: escalate\r\n// ============================================================================\r\n\r\nasync function cmdEscalate(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { skill, version, reason } = options;\r\n\r\n if (!skill || !reason) {\r\n console.error(chalk.red('Error: --skill and --reason are required'));\r\n process.exit(1);\r\n }\r\n\r\n // Get skill\r\n const skillRecord = db.prepare('SELECT * FROM skills WHERE name = ?').get(skill) as Skill | undefined;\r\n\r\n if (!skillRecord) {\r\n console.error(chalk.red(`Error: Skill not found: ${skill}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n // Update approval level to escalate\r\n db.prepare('UPDATE skills SET approval_level = ? WHERE id = ?').run('escalate', skillRecord.id);\r\n\r\n // Record escalation in approval history\r\n db.prepare(`\r\n INSERT INTO approval_history (skill_id, version, approval_level, approver, decision, reasoning, timestamp)\r\n VALUES (?, ?, ?, ?, ?, ?, datetime('now'))\r\n `).run(\r\n skillRecord.id,\r\n version || skillRecord.version,\r\n 'escalate',\r\n 'system',\r\n 'escalated',\r\n reason\r\n );\r\n\r\n console.log(chalk.yellow(`⚠ Skill escalated: ${skill}`));\r\n console.log(` Reason: ${reason}`);\r\n console.log(` Awaiting expert review...`);\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: pending\r\n// ============================================================================\r\n\r\nasync function cmdPending(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const approvalLevel = options['approval-level'] as string | undefined;\r\n\r\n let query = `\r\n SELECT s.* FROM skills s\r\n LEFT JOIN approval_history ah ON ah.skill_id = s.id AND ah.version = s.version AND ah.decision = 'approved'\r\n WHERE ah.id IS NULL\r\n AND s.approval_level != 'auto'\r\n AND s.status = 'active'\r\n `;\r\n\r\n const params: any[] = [];\r\n\r\n if (approvalLevel) {\r\n query += ' AND s.approval_level = ?';\r\n params.push(approvalLevel);\r\n }\r\n\r\n query += ' ORDER BY s.created_at DESC';\r\n\r\n const skills = db.prepare(query).all(...params) as Skill[];\r\n\r\n if (skills.length === 0) {\r\n console.log(chalk.green('✓ No pending approvals'));\r\n db.close();\r\n return;\r\n }\r\n\r\n const headers = ['ID', 'Name', 'Category', 'Approval Level', 'Version', 'Created'];\r\n const rows = skills.map(s => [\r\n s.id.toString(),\r\n s.name,\r\n s.category,\r\n s.approval_level === 'escalate' ? chalk.yellow(s.approval_level) : chalk.red(s.approval_level),\r\n s.version,\r\n s.created_at.split('T')[0]\r\n ]);\r\n\r\n console.log(formatTable(headers, rows));\r\n console.log(`\\n${chalk.yellow(`Pending: ${skills.length} skill(s)`)}`);\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: approval-status\r\n// ============================================================================\r\n\r\nasync function cmdApprovalStatus(options: Record<string, string | boolean>): Promise<void> {\r\n const db = getDb();\r\n\r\n const { skill } = options;\r\n\r\n if (!skill) {\r\n console.error(chalk.red('Error: --skill is required'));\r\n process.exit(1);\r\n }\r\n\r\n // Get skill\r\n const skillRecord = db.prepare('SELECT * FROM skills WHERE name = ?').get(skill) as Skill | undefined;\r\n\r\n if (!skillRecord) {\r\n console.error(chalk.red(`Error: Skill not found: ${skill}`));\r\n db.close();\r\n process.exit(1);\r\n }\r\n\r\n console.log(chalk.bold(`\\nApproval Status: ${skill}`));\r\n console.log(`${'─'.repeat(50)}`);\r\n console.log(`Approval Level: ${skillRecord.approval_level}`);\r\n console.log(`Current Status: ${skillRecord.status}`);\r\n\r\n // Get approval history\r\n const history = db.prepare(`\r\n SELECT * FROM approval_history\r\n WHERE skill_id = ?\r\n ORDER BY timestamp DESC\r\n `).all(skillRecord.id) as ApprovalHistory[];\r\n\r\n if (history.length === 0) {\r\n console.log(chalk.yellow('\\nNo approval history'));\r\n } else {\r\n console.log(chalk.bold('\\nApproval History:'));\r\n history.forEach((entry, i) => {\r\n console.log(`\\n${i + 1}. ${entry.decision.toUpperCase()} (${entry.timestamp.split('T')[0]})`);\r\n console.log(` Version: ${entry.version}`);\r\n console.log(` Approver: ${entry.approver || 'system'}`);\r\n if (entry.reasoning) {\r\n console.log(` Reasoning: ${entry.reasoning}`);\r\n }\r\n });\r\n }\r\n\r\n db.close();\r\n}\r\n\r\n// ============================================================================\r\n// Command: analytics\r\n// ============================================================================\r\n\r\nasync function cmdAnalytics(options: Record<string, string | boolean>, subcommand?: string): Promise<void> {\r\n const db = getDb();\r\n\r\n if (!subcommand) {\r\n console.error(chalk.red('Error: Analytics subcommand required'));\r\n console.log('\\nAvailable subcommands:');\r\n console.log(' effectiveness - Skill effectiveness by approval level');\r\n console.log(' velocity - Approval velocity and SLA compliance');\r\n console.log(' bottlenecks - Identify approval bottlenecks');\r\n console.log(' by-approval - Skills grouped by approval level');\r\n console.log(' effectiveness-by-approval - Effectiveness metrics grouped by approval level');\r\n console.log(' phase4-performance - Performance of Phase4-generated skills');\r\n console.log(' approval-efficiency - Approval workflow efficiency metrics');\r\n process.exit(1);\r\n }\r\n\r\n switch (subcommand) {\r\n case 'effectiveness':\r\n await analyticsEffectiveness(db, options);\r\n break;\r\n case 'velocity':\r\n await analyticsVelocity(db, options);\r\n break;\r\n case 'bottlenecks':\r\n await analyticsBottlenecks(db, options);\r\n break;\r\n case 'by-approval':\r\n await analyticsByApproval(db, options);\r\n break;\r\n case 'effectiveness-by-approval':\r\n await analyticsEffectivenessByApproval(db, options);\r\n break;\r\n case 'phase4-performance':\r\n await analyticsPhase4Performance(db, options);\r\n break;\r\n case 'approval-efficiency':\r\n await analyticsApprovalEfficiency(db, options);\r\n break;\r\n default:\r\n console.error(chalk.red(`Error: Unknown analytics subcommand: ${subcommand}`));\r\n process.exit(1);\r\n }\r\n\r\n db.close();\r\n}\r\n\r\nasync function analyticsEffectiveness(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n const days = parseInt(options.days as string || '30');\r\n\r\n console.log(chalk.bold(`\\nSkill Effectiveness by Approval Level (${days} days)`));\r\n console.log(`${'─'.repeat(60)}`);\r\n\r\n const approvalLevels = ['auto', 'escalate', 'human'];\r\n\r\n for (const level of approvalLevels) {\r\n const stats = db.prepare(`\r\n SELECT\r\n COUNT(DISTINCT sul.skill_id) as skill_count,\r\n COUNT(*) as usage_count,\r\n AVG(sul.confidence_after - sul.confidence_before) as avg_impact,\r\n AVG(sul.execution_time_ms) as avg_time\r\n FROM skill_usage_log sul\r\n JOIN skills s ON s.id = sul.skill_id\r\n WHERE s.approval_level = ?\r\n AND sul.loaded_at >= datetime('now', '-${days} days')\r\n AND sul.confidence_before IS NOT NULL\r\n AND sul.confidence_after IS NOT NULL\r\n `).get(level) as any;\r\n\r\n console.log(`\\n${chalk.bold(level.toUpperCase())} skills:`);\r\n console.log(` Skills: ${stats.skill_count || 0}`);\r\n console.log(` Usages: ${stats.usage_count || 0}`);\r\n console.log(` Avg Confidence Impact: ${stats.avg_impact ? `+${stats.avg_impact.toFixed(3)}` : 'N/A'}`);\r\n console.log(` Avg Execution Time: ${stats.avg_time ? `${stats.avg_time.toFixed(1)}ms` : 'N/A'}`);\r\n }\r\n}\r\n\r\nasync function analyticsVelocity(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n const days = parseInt(options.days as string || '30');\r\n\r\n console.log(chalk.bold(`\\nApproval Velocity (${days} days)`));\r\n console.log(`${'─'.repeat(50)}`);\r\n\r\n const approvals = db.prepare(`\r\n SELECT approval_level, decision, COUNT(*) as count, AVG(julianday('now') - julianday(timestamp)) as avg_days\r\n FROM approval_history\r\n WHERE timestamp >= datetime('now', '-${days} days')\r\n GROUP BY approval_level, decision\r\n `).all() as any[];\r\n\r\n if (approvals.length === 0) {\r\n console.log(chalk.yellow('\\nNo approvals in the specified timeframe'));\r\n return;\r\n }\r\n\r\n approvals.forEach(stat => {\r\n console.log(`\\n${stat.approval_level.toUpperCase()} - ${stat.decision}:`);\r\n console.log(` Count: ${stat.count}`);\r\n console.log(` Avg Time: ${stat.avg_days.toFixed(1)} days`);\r\n });\r\n\r\n // SLA compliance (example: human approvals should be within 7 days)\r\n const slaTarget = 7;\r\n const humanApprovals = db.prepare(`\r\n SELECT COUNT(*) as total,\r\n SUM(CASE WHEN julianday('now') - julianday(timestamp) <= ${slaTarget} THEN 1 ELSE 0 END) as within_sla\r\n FROM approval_history\r\n WHERE approval_level = 'human'\r\n AND timestamp >= datetime('now', '-${days} days')\r\n `).get() as any;\r\n\r\n if (humanApprovals && humanApprovals.total > 0) {\r\n const compliance = (humanApprovals.within_sla / humanApprovals.total) * 100;\r\n console.log(`\\n${chalk.bold('SLA Compliance')} (${slaTarget} days):`);\r\n console.log(` Human Approvals: ${compliance.toFixed(1)}% (${humanApprovals.within_sla}/${humanApprovals.total})`);\r\n }\r\n}\r\n\r\nasync function analyticsBottlenecks(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n console.log(chalk.bold('\\nApproval Bottlenecks'));\r\n console.log(`${'─'.repeat(50)}`);\r\n\r\n // Skills waiting longest for approval\r\n const pending = db.prepare(`\r\n SELECT s.name, s.approval_level, s.created_at,\r\n julianday('now') - julianday(s.created_at) as days_waiting\r\n FROM skills s\r\n LEFT JOIN approval_history ah ON ah.skill_id = s.id AND ah.version = s.version AND ah.decision = 'approved'\r\n WHERE ah.id IS NULL\r\n AND s.approval_level != 'auto'\r\n AND s.status = 'active'\r\n ORDER BY days_waiting DESC\r\n LIMIT 10\r\n `).all() as any[];\r\n\r\n if (pending.length === 0) {\r\n console.log(chalk.green('\\n✓ No pending approvals'));\r\n return;\r\n }\r\n\r\n console.log('\\nLongest Pending Approvals:');\r\n pending.forEach((skill, i) => {\r\n console.log(`\\n${i + 1}. ${skill.name} (${skill.approval_level})`);\r\n console.log(` Waiting: ${Math.floor(skill.days_waiting)} days`);\r\n });\r\n}\r\n\r\nasync function analyticsByApproval(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n console.log(chalk.bold('\\nSkills by Approval Level'));\r\n console.log(`${'─'.repeat(50)}`);\r\n\r\n const stats = db.prepare(`\r\n SELECT approval_level, status, COUNT(*) as count\r\n FROM skills\r\n GROUP BY approval_level, status\r\n ORDER BY approval_level, status\r\n `).all() as any[];\r\n\r\n const grouped: Record<string, any[]> = {};\r\n stats.forEach(stat => {\r\n if (!grouped[stat.approval_level]) {\r\n grouped[stat.approval_level] = [];\r\n }\r\n grouped[stat.approval_level].push(stat);\r\n });\r\n\r\n Object.keys(grouped).forEach(level => {\r\n console.log(`\\n${chalk.bold(level.toUpperCase())}:`);\r\n grouped[level].forEach(stat => {\r\n console.log(` ${stat.status}: ${stat.count}`);\r\n });\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Command: analytics - Phase 6.2 New Subcommands\r\n// ============================================================================\r\n\r\nasync function analyticsEffectivenessByApproval(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n const days = parseInt(options.days as string || '30');\r\n\r\n console.log(chalk.bold(`\\nSkill Effectiveness by Approval Level (${days} days)`));\r\n console.log(`${'─'.repeat(70)}\\n`);\r\n\r\n const approvalLevels = ['auto', 'human', 'escalate'];\r\n\r\n for (const level of approvalLevels) {\r\n // Get stats for this approval level\r\n const stats = db.prepare(`\r\n SELECT\r\n COUNT(DISTINCT sul.skill_id) as skill_count,\r\n COUNT(*) as usage_count,\r\n AVG(sul.confidence_after - sul.confidence_before) as avg_confidence_impact,\r\n AVG(sul.execution_time_ms) as avg_execution_time,\r\n SUM(CASE WHEN (sul.confidence_after - sul.confidence_before) > 0.05 THEN 1 ELSE 0 END) as success_count\r\n FROM skill_usage_log sul\r\n JOIN skills s ON s.id = sul.skill_id\r\n WHERE s.approval_level = ?\r\n AND sul.loaded_at >= datetime('now', '-${days} days')\r\n AND sul.confidence_before IS NOT NULL\r\n AND sul.confidence_after IS NOT NULL\r\n `).get(level) as any;\r\n\r\n if (!stats || stats.usage_count === 0) {\r\n console.log(chalk.bold(`${level.charAt(0).toUpperCase() + level.slice(1)}-approved skills:`));\r\n console.log(chalk.dim(' No usage data available\\n'));\r\n continue;\r\n }\r\n\r\n const successRate = stats.usage_count > 0 ? (stats.success_count / stats.usage_count) * 100 : 0;\r\n\r\n console.log(chalk.bold(`${level.charAt(0).toUpperCase() + level.slice(1)}-approved skills:`));\r\n console.log(` Avg confidence impact: ${stats.avg_confidence_impact ? chalk.green(`+${stats.avg_confidence_impact.toFixed(2)}`) : 'N/A'}`);\r\n console.log(` Usage count: ${chalk.cyan(stats.usage_count.toLocaleString())}`);\r\n console.log(` Success rate: ${chalk.green(`${successRate.toFixed(1)}%`)} (${stats.success_count}/${stats.usage_count} usages)`);\r\n console.log(` Avg execution time: ${stats.avg_execution_time ? `${stats.avg_execution_time.toFixed(1)}ms` : 'N/A'}\\n`);\r\n }\r\n}\r\n\r\nasync function analyticsPhase4Performance(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n const days = parseInt(options.days as string || '30');\r\n\r\n console.log(chalk.bold(`\\nPhase 4 Generated Skills Performance (${days} days)`));\r\n console.log(`${'─'.repeat(70)}\\n`);\r\n\r\n // Get overall Phase4 stats\r\n const overallStats = db.prepare(`\r\n SELECT\r\n COUNT(DISTINCT sul.skill_id) as skill_count,\r\n COUNT(*) as total_usages,\r\n AVG(sul.execution_time_ms) as avg_execution_time,\r\n AVG(sul.confidence_after - sul.confidence_before) as avg_confidence_impact\r\n FROM skill_usage_log sul\r\n JOIN skills s ON s.id = sul.skill_id\r\n WHERE s.is_auto_generated = 1\r\n AND s.generated_by = 'phase4'\r\n AND sul.loaded_at >= datetime('now', '-${days} days')\r\n AND sul.confidence_before IS NOT NULL\r\n AND sul.confidence_after IS NOT NULL\r\n `).get() as any;\r\n\r\n if (!overallStats || overallStats.total_usages === 0) {\r\n console.log(chalk.yellow('No Phase4 skill usage data found in the specified timeframe.'));\r\n console.log(chalk.dim('Phase4 skills may not have been used recently, or usage logging may not be enabled.\\n'));\r\n return;\r\n }\r\n\r\n console.log(chalk.bold('Overall Metrics:'));\r\n console.log(` Total Phase4 skill usages: ${chalk.cyan(overallStats.total_usages.toLocaleString())}`);\r\n console.log(` Unique Phase4 skills used: ${chalk.cyan(overallStats.skill_count)}`);\r\n console.log(` Avg execution time: ${overallStats.avg_execution_time ? `${overallStats.avg_execution_time.toFixed(1)}ms` : 'N/A'}`);\r\n console.log(` Avg confidence impact: ${overallStats.avg_confidence_impact ? chalk.green(`+${overallStats.avg_confidence_impact.toFixed(2)}`) : 'N/A'}`);\r\n console.log(chalk.dim(' Cost savings: N/A (requires cost tracking implementation)\\n'));\r\n\r\n // Get top 5 Phase4 skills\r\n const topSkills = db.prepare(`\r\n SELECT\r\n s.name,\r\n COUNT(*) as usage_count,\r\n AVG(sul.confidence_after - sul.confidence_before) as avg_confidence_impact,\r\n AVG(sul.execution_time_ms) as avg_execution_time\r\n FROM skill_usage_log sul\r\n JOIN skills s ON s.id = sul.skill_id\r\n WHERE s.is_auto_generated = 1\r\n AND s.generated_by = 'phase4'\r\n AND sul.loaded_at >= datetime('now', '-${days} days')\r\n AND sul.confidence_before IS NOT NULL\r\n AND sul.confidence_after IS NOT NULL\r\n GROUP BY s.id, s.name\r\n ORDER BY usage_count DESC\r\n LIMIT 5\r\n `).all() as any[];\r\n\r\n if (topSkills.length > 0) {\r\n console.log(chalk.bold('Top 5 Phase4 Skills:'));\r\n topSkills.forEach((skill, index) => {\r\n const impact = skill.avg_confidence_impact ? `+${skill.avg_confidence_impact.toFixed(2)}` : 'N/A';\r\n console.log(` ${index + 1}. ${chalk.cyan(skill.name)} (${skill.usage_count} uses, ${chalk.green(impact)} confidence)`);\r\n });\r\n console.log('');\r\n }\r\n}\r\n\r\nasync function analyticsApprovalEfficiency(db: Database.Database, options: Record<string, string | boolean>): Promise<void> {\r\n console.log(chalk.bold('\\nApproval Workflow Efficiency'));\r\n console.log(`${'─'.repeat(70)}\\n`);\r\n\r\n // Get approval counts and timing by level\r\n const approvalStats = db.prepare(`\r\n SELECT\r\n approval_level,\r\n COUNT(*) as total_count,\r\n AVG(review_duration_minutes) as avg_review_time_minutes,\r\n SUM(CASE WHEN decision = 'approved' THEN 1 ELSE 0 END) as approved_count,\r\n SUM(CASE WHEN decision = 'rejected' THEN 1 ELSE 0 END) as rejected_count,\r\n SUM(CASE WHEN decision = 'escalated' THEN 1 ELSE 0 END) as escalated_count\r\n FROM approval_history\r\n GROUP BY approval_level\r\n ORDER BY approval_level\r\n `).all() as any[];\r\n\r\n if (approvalStats.length === 0) {\r\n console.log(chalk.yellow('No approval history found in the database.'));\r\n console.log(chalk.dim('Approvals may not have been logged yet.\\n'));\r\n return;\r\n }\r\n\r\n // Display approval stats by level\r\n console.log(chalk.bold('Approval Statistics by Level:\\n'));\r\n\r\n const slaTargets: Record<string, number> = {\r\n 'auto': 0, // instant\r\n 'human': 10080, // 7 days in minutes\r\n 'escalate': 2880 // 2 days in minutes\r\n };\r\n\r\n approvalStats.forEach(stat => {\r\n const approvalRate = stat.total_count > 0 ? (stat.approved_count / stat.total_count) * 100 : 0;\r\n const rejectionRate = stat.total_count > 0 ? (stat.rejected_count / stat.total_count) * 100 : 0;\r\n\r\n let avgTimeDisplay = 'N/A';\r\n if (stat.avg_review_time_minutes !== null) {\r\n if (stat.approval_level === 'auto') {\r\n avgTimeDisplay = 'instant';\r\n } else if (stat.avg_review_time_minutes < 60) {\r\n avgTimeDisplay = `${stat.avg_review_time_minutes.toFixed(1)} minutes`;\r\n } else if (stat.avg_review_time_minutes < 1440) {\r\n avgTimeDisplay = `${(stat.avg_review_time_minutes / 60).toFixed(1)} hours`;\r\n } else {\r\n avgTimeDisplay = `${(stat.avg_review_time_minutes / 1440).toFixed(1)} days`;\r\n }\r\n }\r\n\r\n const slaTarget = slaTargets[stat.approval_level];\r\n const slaDisplay = stat.approval_level === 'auto' ? 'instant' :\r\n stat.approval_level === 'human' ? '7 days' : '2 days';\r\n\r\n console.log(chalk.bold(`${stat.approval_level.charAt(0).toUpperCase() + stat.approval_level.slice(1)}-approved:`));\r\n console.log(` Total: ${chalk.cyan(stat.total_count.toString())} (avg time: ${avgTimeDisplay}, SLA: ${slaDisplay})`);\r\n console.log(` Approval rate: ${chalk.green(`${approvalRate.toFixed(1)}%`)} (${stat.approved_count} approved)`);\r\n if (stat.rejected_count > 0) {\r\n console.log(` Rejection rate: ${chalk.red(`${rejectionRate.toFixed(1)}%`)} (${stat.rejected_count} rejected)`);\r\n }\r\n if (stat.escalated_count > 0) {\r\n console.log(` Escalated: ${chalk.yellow(stat.escalated_count.toString())}`);\r\n }\r\n console.log('');\r\n });\r\n\r\n // Check for bottlenecks (pending approvals exceeding SLA)\r\n const bottlenecks = db.prepare(`\r\n SELECT\r\n s.name,\r\n s.approval_level,\r\n julianday('now') - julianday(s.created_at) as days_pending,\r\n s.created_at\r\n FROM skills s\r\n LEFT JOIN approval_history ah ON ah.skill_id = s.id AND ah.decision = 'approved'\r\n WHERE ah.id IS NULL\r\n AND s.approval_level != 'auto'\r\n AND s.status = 'active'\r\n AND (\r\n (s.approval_level = 'human' AND julianday('now') - julianday(s.created_at) > 7)\r\n OR\r\n (s.approval_level = 'escalate' AND julianday('now') - julianday(s.created_at) > 2)\r\n )\r\n ORDER BY days_pending DESC\r\n `).all() as any[];\r\n\r\n if (bottlenecks.length > 0) {\r\n console.log(chalk.bold('Bottlenecks (Approvals Exceeding SLA):\\n'));\r\n bottlenecks.forEach((skill, index) => {\r\n const daysOver = skill.approval_level === 'human' ? skill.days_pending - 7 : skill.days_pending - 2;\r\n console.log(` ${index + 1}. ${chalk.yellow(skill.name)} (${skill.approval_level})`);\r\n console.log(` Pending: ${Math.floor(skill.days_pending)} days (${chalk.red(`${daysOver.toFixed(1)} days over SLA`)})`);\r\n });\r\n console.log('');\r\n\r\n const humanOverdue = bottlenecks.filter(b => b.approval_level === 'human').length;\r\n const escalateOverdue = bottlenecks.filter(b => b.approval_level === 'escalate').length;\r\n\r\n if (humanOverdue > 0) {\r\n console.log(chalk.yellow(`⚠ ${humanOverdue} human approval${humanOverdue > 1 ? 's' : ''} > 7 days (escalate recommended)`));\r\n }\r\n if (escalateOverdue > 0) {\r\n console.log(chalk.red(`⚠ ${escalateOverdue} escalated approval${escalateOverdue > 1 ? 's' : ''} > 2 days (expert review needed)`));\r\n }\r\n console.log('');\r\n } else {\r\n console.log(chalk.green('✓ No bottlenecks found - all pending approvals are within SLA\\n'));\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Main CLI Entry Point\r\n// ============================================================================\r\n\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n\r\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\r\n console.log(`\r\n${chalk.bold('Skills Database CLI Tool')}\r\n\r\nUsage: npx cfn skill <command> [options]\r\n\r\nCommands:\r\n list List skills with filtering\r\n assign Assign skill to agent\r\n create Create new skill\r\n update Update skill metadata\r\n deprecate Deprecate a skill\r\n approve Approve/reject a skill\r\n escalate Escalate skill for expert review\r\n pending List pending approvals\r\n approval-status Check skill approval status\r\n analytics Skill analytics and metrics\r\n\r\nExamples:\r\n npx cfn skill list --approval=auto\r\n npx cfn skill list --pending-approval\r\n npx cfn skill assign --agent=backend-developer --skill=jwt-auth --priority=3\r\n npx cfn skill create --name=new-skill --category=domain --content-path=./skill.md\r\n npx cfn skill approve --skill=jwt-auth --decision=approved --approver=expert@example.com\r\n npx cfn skill pending --approval-level=human\r\n npx cfn skill analytics effectiveness --days=30\r\n`);\r\n process.exit(0);\r\n }\r\n\r\n const command = args[0];\r\n const options = parseArgs(args.slice(1));\r\n\r\n try {\r\n switch (command) {\r\n case 'list':\r\n await cmdList(options);\r\n break;\r\n case 'assign':\r\n await cmdAssign(options);\r\n break;\r\n case 'create':\r\n await cmdCreate(options);\r\n break;\r\n case 'update':\r\n await cmdUpdate(options);\r\n break;\r\n case 'deprecate':\r\n await cmdDeprecate(options);\r\n break;\r\n case 'approve':\r\n await cmdApprove(options);\r\n break;\r\n case 'escalate':\r\n await cmdEscalate(options);\r\n break;\r\n case 'pending':\r\n await cmdPending(options);\r\n break;\r\n case 'approval-status':\r\n await cmdApprovalStatus(options);\r\n break;\r\n case 'analytics':\r\n await cmdAnalytics(options, args[1]);\r\n break;\r\n default:\r\n console.error(chalk.red(`Error: Unknown command: ${command}`));\r\n console.log('Run \"npx cfn skill --help\" for usage information');\r\n process.exit(1);\r\n }\r\n } catch (error: any) {\r\n console.error(chalk.red(`Error: ${error.message}`));\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// Run CLI (ESM-compatible check)\r\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\r\n main().catch(error => {\r\n console.error(chalk.red(`Fatal error: ${error.message}`));\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["createRequire","existsSync","readFileSync","createHash","fileURLToPath","path","require","url","Database","colors","reset","bright","dim","red","green","yellow","blue","magenta","cyan","white","chalk","text","bold","DB_PATH","process","env","CFN_SKILLS_DB_PATH","getDb","console","error","exit","calculateHash","content","update","digest","stripAnsi","str","replace","formatTable","headers","rows","length","colWidths","map","header","i","maxDataWidth","Math","max","row","toString","separator","w","repeat","join","headerRow","h","stripped","padding","dataRows","cell","cellStr","parseArgs","args","parsed","arg","startsWith","includes","key","valueParts","slice","split","nextArg","cmdList","options","db","query","params","approval","push","category","team","status","agent","skills","prepare","all","log","close","skillsWithAgentCount","skill","count","get","id","agent_count","s","name","approval_level","version","cmdAssign","priority","required","condition","skillRecord","existing","run","parseInt","JSON","stringify","taskContext","cmdCreate","contentPath","tags","approvalLevel","owner","fullPath","resolve","hash","tagArray","t","trim","message","cmdUpdate","recalcHash","updates","content_path","newHash","cmdDeprecate","replacement","note","replacementId","replacementRecord","cmdApprove","approver","decision","reasoning","cmdEscalate","reason","cmdPending","created_at","cmdApprovalStatus","history","forEach","entry","toUpperCase","timestamp","cmdAnalytics","subcommand","analyticsEffectiveness","analyticsVelocity","analyticsBottlenecks","analyticsByApproval","analyticsEffectivenessByApproval","analyticsPhase4Performance","analyticsApprovalEfficiency","days","approvalLevels","level","stats","skill_count","usage_count","avg_impact","toFixed","avg_time","approvals","stat","avg_days","slaTarget","humanApprovals","total","compliance","within_sla","pending","floor","days_waiting","grouped","Object","keys","charAt","successRate","success_count","avg_confidence_impact","toLocaleString","avg_execution_time","overallStats","total_usages","topSkills","index","impact","approvalStats","slaTargets","approvalRate","total_count","approved_count","rejectionRate","rejected_count","avgTimeDisplay","avg_review_time_minutes","slaDisplay","escalated_count","bottlenecks","daysOver","days_pending","humanOverdue","filter","b","escalateOverdue","main","argv","command","catch"],"mappings":"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"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Skill Execution Logger - Phase 7.2
3
+ *
4
+ * Dual logging system that logs skill executions to:
5
+ * 1. SQLite (Skills DB) - ALL skills
6
+ * 2. PostgreSQL (Phase 4 DB) - ONLY Phase4-generated skills
7
+ *
8
+ * Features:
9
+ * - Automatic skill ID lookup and caching
10
+ * - Phase4 skill detection based on generated_by='phase4' or phase4_pattern_id
11
+ * - Graceful PostgreSQL fallback (non-blocking)
12
+ * - Connection pooling for performance
13
+ * - Environment variable configuration
14
+ * - <50ms logging performance target
15
+ *
16
+ * Usage:
17
+ * const logger = new SkillExecutionLogger();
18
+ * await logger.logSkillExecution({
19
+ * agentId: 'backend-dev-1',
20
+ * agentType: 'backend-developer',
21
+ * skillName: 'jwt-authentication',
22
+ * executionTimeMs: 12,
23
+ * exitCode: 0
24
+ * });
25
+ * await logger.close();
26
+ */ import Database from 'better-sqlite3';
27
+ import { Pool } from 'pg';
28
+ import { existsSync } from 'fs';
29
+ import path from 'path';
30
+ // ============================================================================
31
+ // SkillExecutionLogger Class
32
+ // ============================================================================
33
+ export class SkillExecutionLogger {
34
+ sqliteDb;
35
+ postgresPool;
36
+ config;
37
+ skillCache = new Map();
38
+ POSTGRES_TIMEOUT_MS = 5000;
39
+ /**
40
+ * Initialize logger with optional configuration
41
+ * Falls back to environment variables if not provided
42
+ */ constructor(config){
43
+ // Merge config with environment variables and defaults
44
+ this.config = {
45
+ sqliteDbPath: config?.sqliteDbPath || process.env.CFN_SKILLS_DB_PATH || './.claude/skills-database/skills.db',
46
+ postgresHost: config?.postgresHost || process.env.PHASE4_POSTGRES_HOST,
47
+ postgresPort: config?.postgresPort || parseInt(process.env.PHASE4_POSTGRES_PORT || '5432', 10),
48
+ postgresDb: config?.postgresDb || process.env.PHASE4_POSTGRES_DB || 'workflow_codification',
49
+ postgresUser: config?.postgresUser || process.env.PHASE4_POSTGRES_USER || 'postgres',
50
+ postgresPass: config?.postgresPass || process.env.PHASE4_POSTGRES_PASS || '',
51
+ enablePostgres: config?.enablePostgres !== undefined ? config.enablePostgres : process.env.ENABLE_PHASE4_LOGGING === 'true'
52
+ };
53
+ // Initialize SQLite connection
54
+ const dbPath = path.resolve(this.config.sqliteDbPath);
55
+ if (!existsSync(dbPath)) {
56
+ throw new Error(`Skills database not found at: ${dbPath}`);
57
+ }
58
+ this.sqliteDb = new Database(dbPath);
59
+ // Initialize PostgreSQL connection pool (if enabled)
60
+ if (this.config.enablePostgres && this.config.postgresHost) {
61
+ try {
62
+ const poolConfig = {
63
+ host: this.config.postgresHost,
64
+ port: this.config.postgresPort,
65
+ database: this.config.postgresDb,
66
+ user: this.config.postgresUser,
67
+ password: this.config.postgresPass,
68
+ max: 10,
69
+ idleTimeoutMillis: 30000,
70
+ connectionTimeoutMillis: this.POSTGRES_TIMEOUT_MS
71
+ };
72
+ this.postgresPool = new Pool(poolConfig);
73
+ // Test connection (don't fail if it doesn't work)
74
+ this.postgresPool.query('SELECT 1').then(()=>{
75
+ console.log('[SkillExecutionLogger] PostgreSQL connection pool established');
76
+ }).catch((err)=>{
77
+ console.warn(`[SkillExecutionLogger] PostgreSQL connection failed, will fallback to SQLite only:`, err.message);
78
+ });
79
+ } catch (err) {
80
+ console.warn(`[SkillExecutionLogger] Failed to create PostgreSQL pool, using SQLite only:`, err instanceof Error ? err.message : String(err));
81
+ this.postgresPool = undefined;
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * Log skill execution to appropriate databases
87
+ * - SQLite: ALL skills
88
+ * - PostgreSQL: ONLY Phase4-generated skills (if enabled)
89
+ */ async logSkillExecution(metrics) {
90
+ const startTime = Date.now();
91
+ try {
92
+ // Step 1: Get skill ID and metadata
93
+ const skillId = metrics.skillId || await this.getSkillIdByName(metrics.skillName);
94
+ if (!skillId) {
95
+ throw new Error(`Skill not found: ${metrics.skillName}`);
96
+ }
97
+ // Step 2: Get skill metadata (with caching)
98
+ const skillMetadata = await this.getSkillMetadata(metrics.skillName, skillId);
99
+ // Step 3: Log to SQLite (always, critical operation)
100
+ await this.logToSQLite(metrics, skillId, skillMetadata);
101
+ // Step 4: Log to PostgreSQL (if Phase4 skill and PostgreSQL enabled)
102
+ if (skillMetadata.isPhase4Generated && this.postgresPool) {
103
+ // Non-blocking PostgreSQL log (don't wait, don't fail)
104
+ this.logToPostgreSQL(metrics, skillId, skillMetadata).catch((err)=>{
105
+ console.warn(`[SkillExecutionLogger] PostgreSQL logging failed for skill ${metrics.skillName}:`, err.message);
106
+ });
107
+ }
108
+ const duration = Date.now() - startTime;
109
+ if (duration > 50) {
110
+ console.warn(`[SkillExecutionLogger] Logging took ${duration}ms (target: <50ms) for skill ${metrics.skillName}`);
111
+ }
112
+ } catch (err) {
113
+ console.error(`[SkillExecutionLogger] Failed to log skill execution:`, err instanceof Error ? err.message : String(err));
114
+ throw err;
115
+ }
116
+ }
117
+ /**
118
+ * Log execution to SQLite (Skills DB)
119
+ * This is the primary, critical logging operation
120
+ */ async logToSQLite(metrics, skillId, skillMetadata) {
121
+ try {
122
+ const stmt = this.sqliteDb.prepare(`
123
+ INSERT INTO skill_usage_log (
124
+ agent_id,
125
+ agent_type,
126
+ skill_id,
127
+ task_id,
128
+ phase,
129
+ loaded_at,
130
+ execution_time_ms,
131
+ confidence_before,
132
+ confidence_after,
133
+ success_indicator,
134
+ approval_level,
135
+ phase4_generated,
136
+ exit_code
137
+ ) VALUES (?, ?, ?, ?, ?, datetime('now'), ?, ?, ?, ?, ?, ?, ?)
138
+ `);
139
+ stmt.run(metrics.agentId, metrics.agentType, skillId, metrics.taskId || null, metrics.phase || null, metrics.executionTimeMs, metrics.confidenceBefore || null, metrics.confidenceAfter || null, metrics.exitCode === 0 ? 1 : 0, skillMetadata.approvalLevel, skillMetadata.isPhase4Generated ? 1 : 0, metrics.exitCode);
140
+ } catch (err) {
141
+ throw new Error(`SQLite logging failed: ${err instanceof Error ? err.message : String(err)}`);
142
+ }
143
+ }
144
+ /**
145
+ * Log execution to PostgreSQL (Phase 4 DB)
146
+ * This is a non-critical, best-effort operation
147
+ *
148
+ * PostgreSQL schema:
149
+ * CREATE TABLE skill_executions (
150
+ * id SERIAL PRIMARY KEY,
151
+ * skill_id INTEGER NOT NULL,
152
+ * team_id VARCHAR(100) NOT NULL,
153
+ * task_id VARCHAR(100),
154
+ * execution_time_ms INTEGER,
155
+ * exit_code INTEGER,
156
+ * cost_avoided_usd DECIMAL(10,4),
157
+ * tokens_avoided INTEGER,
158
+ * timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
159
+ * );
160
+ */ async logToPostgreSQL(metrics, skillId, skillMetadata) {
161
+ if (!this.postgresPool) {
162
+ return; // Silently skip if pool not available
163
+ }
164
+ try {
165
+ // Use phase4_pattern_id as the skill_id in PostgreSQL
166
+ const phase4SkillId = skillMetadata.phase4PatternId || skillId;
167
+ const query = `
168
+ INSERT INTO skill_executions (
169
+ skill_id,
170
+ team_id,
171
+ task_id,
172
+ execution_time_ms,
173
+ exit_code,
174
+ cost_avoided_usd,
175
+ tokens_avoided,
176
+ timestamp
177
+ ) VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())
178
+ `;
179
+ const values = [
180
+ phase4SkillId,
181
+ metrics.agentType,
182
+ metrics.taskId || null,
183
+ metrics.executionTimeMs,
184
+ metrics.exitCode,
185
+ metrics.costAvoidedUsd || null,
186
+ metrics.tokensAvoided || null
187
+ ];
188
+ // Execute with timeout
189
+ await Promise.race([
190
+ this.postgresPool.query(query, values),
191
+ new Promise((_, reject)=>setTimeout(()=>reject(new Error('PostgreSQL query timeout')), this.POSTGRES_TIMEOUT_MS))
192
+ ]);
193
+ } catch (err) {
194
+ // Don't throw, just log warning
195
+ console.warn(`[SkillExecutionLogger] PostgreSQL insert failed:`, err instanceof Error ? err.message : String(err));
196
+ }
197
+ }
198
+ /**
199
+ * Get skill ID by name with caching
200
+ */ async getSkillIdByName(skillName) {
201
+ // Check cache first
202
+ if (this.skillCache.has(skillName)) {
203
+ return this.skillCache.get(skillName).skillId;
204
+ }
205
+ // Query database
206
+ try {
207
+ const row = this.sqliteDb.prepare(`
208
+ SELECT
209
+ id,
210
+ approval_level,
211
+ generated_by,
212
+ phase4_pattern_id
213
+ FROM skills
214
+ WHERE name = ?
215
+ `).get(skillName);
216
+ if (!row) {
217
+ return null;
218
+ }
219
+ // Cache the result
220
+ this.skillCache.set(skillName, {
221
+ skillId: row.id,
222
+ approvalLevel: row.approval_level,
223
+ isPhase4Generated: row.generated_by === 'phase4' || row.phase4_pattern_id !== null,
224
+ phase4PatternId: row.phase4_pattern_id
225
+ });
226
+ return row.id;
227
+ } catch (err) {
228
+ throw new Error(`Failed to lookup skill ID: ${err instanceof Error ? err.message : String(err)}`);
229
+ }
230
+ }
231
+ /**
232
+ * Get skill metadata (approval level, Phase4 status) with caching
233
+ */ async getSkillMetadata(skillName, skillId) {
234
+ // Check cache first
235
+ if (this.skillCache.has(skillName)) {
236
+ return this.skillCache.get(skillName);
237
+ }
238
+ // Query database
239
+ try {
240
+ const row = this.sqliteDb.prepare(`
241
+ SELECT
242
+ approval_level,
243
+ generated_by,
244
+ phase4_pattern_id
245
+ FROM skills
246
+ WHERE id = ?
247
+ `).get(skillId);
248
+ if (!row) {
249
+ throw new Error(`Skill not found with ID: ${skillId}`);
250
+ }
251
+ // Cache the result
252
+ const metadata = {
253
+ skillId,
254
+ approvalLevel: row.approval_level,
255
+ isPhase4Generated: row.generated_by === 'phase4' || row.phase4_pattern_id !== null,
256
+ phase4PatternId: row.phase4_pattern_id
257
+ };
258
+ this.skillCache.set(skillName, metadata);
259
+ return metadata;
260
+ } catch (err) {
261
+ throw new Error(`Failed to get skill metadata: ${err instanceof Error ? err.message : String(err)}`);
262
+ }
263
+ }
264
+ /**
265
+ * Close database connections and cleanup
266
+ */ async close() {
267
+ try {
268
+ // Close SQLite
269
+ if (this.sqliteDb) {
270
+ this.sqliteDb.close();
271
+ }
272
+ // Close PostgreSQL pool
273
+ if (this.postgresPool) {
274
+ await this.postgresPool.end();
275
+ }
276
+ // Clear cache
277
+ this.skillCache.clear();
278
+ } catch (err) {
279
+ console.error(`[SkillExecutionLogger] Error during cleanup:`, err instanceof Error ? err.message : String(err));
280
+ }
281
+ }
282
+ }
283
+
284
+ //# sourceMappingURL=skill-execution-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/skill-execution-logger.ts"],"sourcesContent":["/**\r\n * Skill Execution Logger - Phase 7.2\r\n *\r\n * Dual logging system that logs skill executions to:\r\n * 1. SQLite (Skills DB) - ALL skills\r\n * 2. PostgreSQL (Phase 4 DB) - ONLY Phase4-generated skills\r\n *\r\n * Features:\r\n * - Automatic skill ID lookup and caching\r\n * - Phase4 skill detection based on generated_by='phase4' or phase4_pattern_id\r\n * - Graceful PostgreSQL fallback (non-blocking)\r\n * - Connection pooling for performance\r\n * - Environment variable configuration\r\n * - <50ms logging performance target\r\n *\r\n * Usage:\r\n * const logger = new SkillExecutionLogger();\r\n * await logger.logSkillExecution({\r\n * agentId: 'backend-dev-1',\r\n * agentType: 'backend-developer',\r\n * skillName: 'jwt-authentication',\r\n * executionTimeMs: 12,\r\n * exitCode: 0\r\n * });\r\n * await logger.close();\r\n */\r\n\r\nimport Database from 'better-sqlite3';\r\nimport { Pool, PoolConfig } from 'pg';\r\nimport { existsSync } from 'fs';\r\nimport path from 'path';\r\n\r\n// ============================================================================\r\n// Interfaces\r\n// ============================================================================\r\n\r\nexport interface SkillExecutionMetrics {\r\n agentId: string;\r\n agentType: string;\r\n skillName: string;\r\n skillId?: number; // Optional, will be looked up if not provided\r\n taskId?: string;\r\n phase?: string;\r\n confidenceBefore?: number;\r\n confidenceAfter?: number;\r\n executionTimeMs: number;\r\n exitCode: number;\r\n\r\n // Phase 4 specific (optional)\r\n costAvoidedUsd?: number;\r\n tokensAvoided?: number;\r\n approvalLevel?: string;\r\n phase4Generated?: boolean;\r\n}\r\n\r\nexport interface LoggerConfig {\r\n sqliteDbPath?: string;\r\n postgresHost?: string;\r\n postgresPort?: number;\r\n postgresDb?: string;\r\n postgresUser?: string;\r\n postgresPass?: string;\r\n enablePostgres?: boolean;\r\n}\r\n\r\ninterface SkillCacheEntry {\r\n skillId: number;\r\n approvalLevel: string;\r\n isPhase4Generated: boolean;\r\n phase4PatternId: number | null;\r\n}\r\n\r\n// ============================================================================\r\n// SkillExecutionLogger Class\r\n// ============================================================================\r\n\r\nexport class SkillExecutionLogger {\r\n private sqliteDb: Database.Database;\r\n private postgresPool?: Pool;\r\n private config: LoggerConfig;\r\n private skillCache: Map<string, SkillCacheEntry> = new Map();\r\n private readonly POSTGRES_TIMEOUT_MS = 5000; // 5s timeout for PostgreSQL operations\r\n\r\n /**\r\n * Initialize logger with optional configuration\r\n * Falls back to environment variables if not provided\r\n */\r\n constructor(config?: LoggerConfig) {\r\n // Merge config with environment variables and defaults\r\n this.config = {\r\n sqliteDbPath:\r\n config?.sqliteDbPath ||\r\n process.env.CFN_SKILLS_DB_PATH ||\r\n './.claude/skills-database/skills.db',\r\n postgresHost: config?.postgresHost || process.env.PHASE4_POSTGRES_HOST,\r\n postgresPort:\r\n config?.postgresPort ||\r\n parseInt(process.env.PHASE4_POSTGRES_PORT || '5432', 10),\r\n postgresDb: config?.postgresDb || process.env.PHASE4_POSTGRES_DB || 'workflow_codification',\r\n postgresUser: config?.postgresUser || process.env.PHASE4_POSTGRES_USER || 'postgres',\r\n postgresPass: config?.postgresPass || process.env.PHASE4_POSTGRES_PASS || '',\r\n enablePostgres:\r\n config?.enablePostgres !== undefined\r\n ? config.enablePostgres\r\n : process.env.ENABLE_PHASE4_LOGGING === 'true',\r\n };\r\n\r\n // Initialize SQLite connection\r\n const dbPath = path.resolve(this.config.sqliteDbPath);\r\n if (!existsSync(dbPath)) {\r\n throw new Error(`Skills database not found at: ${dbPath}`);\r\n }\r\n this.sqliteDb = new Database(dbPath);\r\n\r\n // Initialize PostgreSQL connection pool (if enabled)\r\n if (this.config.enablePostgres && this.config.postgresHost) {\r\n try {\r\n const poolConfig: PoolConfig = {\r\n host: this.config.postgresHost,\r\n port: this.config.postgresPort,\r\n database: this.config.postgresDb,\r\n user: this.config.postgresUser,\r\n password: this.config.postgresPass,\r\n max: 10, // Maximum pool size\r\n idleTimeoutMillis: 30000,\r\n connectionTimeoutMillis: this.POSTGRES_TIMEOUT_MS,\r\n };\r\n\r\n this.postgresPool = new Pool(poolConfig);\r\n\r\n // Test connection (don't fail if it doesn't work)\r\n this.postgresPool\r\n .query('SELECT 1')\r\n .then(() => {\r\n console.log('[SkillExecutionLogger] PostgreSQL connection pool established');\r\n })\r\n .catch((err) => {\r\n console.warn(\r\n `[SkillExecutionLogger] PostgreSQL connection failed, will fallback to SQLite only:`,\r\n err.message\r\n );\r\n });\r\n } catch (err) {\r\n console.warn(\r\n `[SkillExecutionLogger] Failed to create PostgreSQL pool, using SQLite only:`,\r\n err instanceof Error ? err.message : String(err)\r\n );\r\n this.postgresPool = undefined;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Log skill execution to appropriate databases\r\n * - SQLite: ALL skills\r\n * - PostgreSQL: ONLY Phase4-generated skills (if enabled)\r\n */\r\n async logSkillExecution(metrics: SkillExecutionMetrics): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n // Step 1: Get skill ID and metadata\r\n const skillId = metrics.skillId || (await this.getSkillIdByName(metrics.skillName));\r\n if (!skillId) {\r\n throw new Error(`Skill not found: ${metrics.skillName}`);\r\n }\r\n\r\n // Step 2: Get skill metadata (with caching)\r\n const skillMetadata = await this.getSkillMetadata(metrics.skillName, skillId);\r\n\r\n // Step 3: Log to SQLite (always, critical operation)\r\n await this.logToSQLite(metrics, skillId, skillMetadata);\r\n\r\n // Step 4: Log to PostgreSQL (if Phase4 skill and PostgreSQL enabled)\r\n if (skillMetadata.isPhase4Generated && this.postgresPool) {\r\n // Non-blocking PostgreSQL log (don't wait, don't fail)\r\n this.logToPostgreSQL(metrics, skillId, skillMetadata).catch((err) => {\r\n console.warn(\r\n `[SkillExecutionLogger] PostgreSQL logging failed for skill ${metrics.skillName}:`,\r\n err.message\r\n );\r\n });\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n if (duration > 50) {\r\n console.warn(\r\n `[SkillExecutionLogger] Logging took ${duration}ms (target: <50ms) for skill ${metrics.skillName}`\r\n );\r\n }\r\n } catch (err) {\r\n console.error(\r\n `[SkillExecutionLogger] Failed to log skill execution:`,\r\n err instanceof Error ? err.message : String(err)\r\n );\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Log execution to SQLite (Skills DB)\r\n * This is the primary, critical logging operation\r\n */\r\n private async logToSQLite(\r\n metrics: SkillExecutionMetrics,\r\n skillId: number,\r\n skillMetadata: SkillCacheEntry\r\n ): Promise<void> {\r\n try {\r\n const stmt = this.sqliteDb.prepare(`\r\n INSERT INTO skill_usage_log (\r\n agent_id,\r\n agent_type,\r\n skill_id,\r\n task_id,\r\n phase,\r\n loaded_at,\r\n execution_time_ms,\r\n confidence_before,\r\n confidence_after,\r\n success_indicator,\r\n approval_level,\r\n phase4_generated,\r\n exit_code\r\n ) VALUES (?, ?, ?, ?, ?, datetime('now'), ?, ?, ?, ?, ?, ?, ?)\r\n `);\r\n\r\n stmt.run(\r\n metrics.agentId,\r\n metrics.agentType,\r\n skillId,\r\n metrics.taskId || null,\r\n metrics.phase || null,\r\n metrics.executionTimeMs,\r\n metrics.confidenceBefore || null,\r\n metrics.confidenceAfter || null,\r\n metrics.exitCode === 0 ? 1 : 0, // success_indicator\r\n skillMetadata.approvalLevel,\r\n skillMetadata.isPhase4Generated ? 1 : 0,\r\n metrics.exitCode\r\n );\r\n } catch (err) {\r\n throw new Error(\r\n `SQLite logging failed: ${err instanceof Error ? err.message : String(err)}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Log execution to PostgreSQL (Phase 4 DB)\r\n * This is a non-critical, best-effort operation\r\n *\r\n * PostgreSQL schema:\r\n * CREATE TABLE skill_executions (\r\n * id SERIAL PRIMARY KEY,\r\n * skill_id INTEGER NOT NULL,\r\n * team_id VARCHAR(100) NOT NULL,\r\n * task_id VARCHAR(100),\r\n * execution_time_ms INTEGER,\r\n * exit_code INTEGER,\r\n * cost_avoided_usd DECIMAL(10,4),\r\n * tokens_avoided INTEGER,\r\n * timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP\r\n * );\r\n */\r\n private async logToPostgreSQL(\r\n metrics: SkillExecutionMetrics,\r\n skillId: number,\r\n skillMetadata: SkillCacheEntry\r\n ): Promise<void> {\r\n if (!this.postgresPool) {\r\n return; // Silently skip if pool not available\r\n }\r\n\r\n try {\r\n // Use phase4_pattern_id as the skill_id in PostgreSQL\r\n const phase4SkillId = skillMetadata.phase4PatternId || skillId;\r\n\r\n const query = `\r\n INSERT INTO skill_executions (\r\n skill_id,\r\n team_id,\r\n task_id,\r\n execution_time_ms,\r\n exit_code,\r\n cost_avoided_usd,\r\n tokens_avoided,\r\n timestamp\r\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())\r\n `;\r\n\r\n const values = [\r\n phase4SkillId,\r\n metrics.agentType, // Use agent_type as team_id\r\n metrics.taskId || null,\r\n metrics.executionTimeMs,\r\n metrics.exitCode,\r\n metrics.costAvoidedUsd || null,\r\n metrics.tokensAvoided || null,\r\n ];\r\n\r\n // Execute with timeout\r\n await Promise.race([\r\n this.postgresPool.query(query, values),\r\n new Promise((_, reject) =>\r\n setTimeout(\r\n () => reject(new Error('PostgreSQL query timeout')),\r\n this.POSTGRES_TIMEOUT_MS\r\n )\r\n ),\r\n ]);\r\n } catch (err) {\r\n // Don't throw, just log warning\r\n console.warn(\r\n `[SkillExecutionLogger] PostgreSQL insert failed:`,\r\n err instanceof Error ? err.message : String(err)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get skill ID by name with caching\r\n */\r\n private async getSkillIdByName(skillName: string): Promise<number | null> {\r\n // Check cache first\r\n if (this.skillCache.has(skillName)) {\r\n return this.skillCache.get(skillName)!.skillId;\r\n }\r\n\r\n // Query database\r\n try {\r\n const row = this.sqliteDb\r\n .prepare(\r\n `\r\n SELECT\r\n id,\r\n approval_level,\r\n generated_by,\r\n phase4_pattern_id\r\n FROM skills\r\n WHERE name = ?\r\n `\r\n )\r\n .get(skillName) as\r\n | {\r\n id: number;\r\n approval_level: string;\r\n generated_by: string | null;\r\n phase4_pattern_id: number | null;\r\n }\r\n | undefined;\r\n\r\n if (!row) {\r\n return null;\r\n }\r\n\r\n // Cache the result\r\n this.skillCache.set(skillName, {\r\n skillId: row.id,\r\n approvalLevel: row.approval_level,\r\n isPhase4Generated: row.generated_by === 'phase4' || row.phase4_pattern_id !== null,\r\n phase4PatternId: row.phase4_pattern_id,\r\n });\r\n\r\n return row.id;\r\n } catch (err) {\r\n throw new Error(\r\n `Failed to lookup skill ID: ${err instanceof Error ? err.message : String(err)}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get skill metadata (approval level, Phase4 status) with caching\r\n */\r\n private async getSkillMetadata(\r\n skillName: string,\r\n skillId: number\r\n ): Promise<SkillCacheEntry> {\r\n // Check cache first\r\n if (this.skillCache.has(skillName)) {\r\n return this.skillCache.get(skillName)!;\r\n }\r\n\r\n // Query database\r\n try {\r\n const row = this.sqliteDb\r\n .prepare(\r\n `\r\n SELECT\r\n approval_level,\r\n generated_by,\r\n phase4_pattern_id\r\n FROM skills\r\n WHERE id = ?\r\n `\r\n )\r\n .get(skillId) as\r\n | {\r\n approval_level: string;\r\n generated_by: string | null;\r\n phase4_pattern_id: number | null;\r\n }\r\n | undefined;\r\n\r\n if (!row) {\r\n throw new Error(`Skill not found with ID: ${skillId}`);\r\n }\r\n\r\n // Cache the result\r\n const metadata: SkillCacheEntry = {\r\n skillId,\r\n approvalLevel: row.approval_level,\r\n isPhase4Generated: row.generated_by === 'phase4' || row.phase4_pattern_id !== null,\r\n phase4PatternId: row.phase4_pattern_id,\r\n };\r\n\r\n this.skillCache.set(skillName, metadata);\r\n return metadata;\r\n } catch (err) {\r\n throw new Error(\r\n `Failed to get skill metadata: ${err instanceof Error ? err.message : String(err)}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Close database connections and cleanup\r\n */\r\n async close(): Promise<void> {\r\n try {\r\n // Close SQLite\r\n if (this.sqliteDb) {\r\n this.sqliteDb.close();\r\n }\r\n\r\n // Close PostgreSQL pool\r\n if (this.postgresPool) {\r\n await this.postgresPool.end();\r\n }\r\n\r\n // Clear cache\r\n this.skillCache.clear();\r\n } catch (err) {\r\n console.error(\r\n `[SkillExecutionLogger] Error during cleanup:`,\r\n err instanceof Error ? err.message : String(err)\r\n );\r\n }\r\n }\r\n}\r\n"],"names":["Database","Pool","existsSync","path","SkillExecutionLogger","sqliteDb","postgresPool","config","skillCache","Map","POSTGRES_TIMEOUT_MS","sqliteDbPath","process","env","CFN_SKILLS_DB_PATH","postgresHost","PHASE4_POSTGRES_HOST","postgresPort","parseInt","PHASE4_POSTGRES_PORT","postgresDb","PHASE4_POSTGRES_DB","postgresUser","PHASE4_POSTGRES_USER","postgresPass","PHASE4_POSTGRES_PASS","enablePostgres","undefined","ENABLE_PHASE4_LOGGING","dbPath","resolve","Error","poolConfig","host","port","database","user","password","max","idleTimeoutMillis","connectionTimeoutMillis","query","then","console","log","catch","err","warn","message","String","logSkillExecution","metrics","startTime","Date","now","skillId","getSkillIdByName","skillName","skillMetadata","getSkillMetadata","logToSQLite","isPhase4Generated","logToPostgreSQL","duration","error","stmt","prepare","run","agentId","agentType","taskId","phase","executionTimeMs","confidenceBefore","confidenceAfter","exitCode","approvalLevel","phase4SkillId","phase4PatternId","values","costAvoidedUsd","tokensAvoided","Promise","race","_","reject","setTimeout","has","get","row","set","id","approval_level","generated_by","phase4_pattern_id","metadata","close","end","clear"],"mappings":"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"}