claude-flow-novice 2.15.3 → 2.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +29 -6
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  36. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  37. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  38. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  39. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  40. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  41. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  42. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  43. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
  45. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  46. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  47. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  48. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  49. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  50. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  51. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  52. package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
  53. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  54. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
  55. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  56. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -0
  57. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  58. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  59. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  60. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  61. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  62. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  63. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  64. package/README.md +116 -475
  65. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  66. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  67. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  68. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  69. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  70. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  71. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  72. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  73. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  74. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  75. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  76. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  77. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  78. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  79. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  80. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  81. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  82. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  83. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  84. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  85. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  86. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  87. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  88. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  89. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  90. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  91. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  92. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  93. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  94. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  95. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  96. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  97. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  98. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  99. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  100. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  101. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  102. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  103. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  104. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  105. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  106. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  107. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  108. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  110. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  111. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  112. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  114. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  115. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  116. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  117. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  118. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  119. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  120. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  121. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  137. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  138. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  139. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  140. package/claude-assets/commands/cfn-loop-cli.md +29 -6
  141. package/claude-assets/commands/switch-api.md +31 -10
  142. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  143. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
  144. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  145. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  146. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  147. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
  148. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
  149. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  150. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  151. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  152. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  153. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  154. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  155. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  156. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  157. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  158. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  159. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  160. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  161. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  162. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  163. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  164. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  165. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  166. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  167. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  168. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  169. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  170. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  171. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  172. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  173. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  174. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  175. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  176. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  177. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  178. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  179. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  180. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
  181. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  182. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  183. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  184. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  185. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  186. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  187. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  188. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  189. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  190. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  191. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
  192. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  193. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
  194. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  195. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
  196. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  197. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -0
  198. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  199. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  200. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  201. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  202. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  203. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  204. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  205. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  206. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  207. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  208. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  209. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  210. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  211. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
  212. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  213. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  214. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  215. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  216. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  217. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  218. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  219. package/claude-assets/skills/integration/agent-handoff.sh +62 -64
  220. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  221. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  222. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  223. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  224. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  225. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  226. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  227. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  228. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  229. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  230. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  231. package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
  232. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  233. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
  234. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  235. package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
  236. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  237. package/dist/ace/ace-curator.js +10 -2
  238. package/dist/ace/ace-curator.js.map +1 -1
  239. package/dist/ace/ace-generator.js +4 -0
  240. package/dist/ace/ace-generator.js.map +1 -1
  241. package/dist/ace/ace-reflector.js +1 -1
  242. package/dist/ace/ace-reflector.js.map +1 -1
  243. package/dist/ace/context-injection.js +24 -2
  244. package/dist/ace/context-injection.js.map +1 -1
  245. package/dist/agents/task-agent-integration.js +1 -1
  246. package/dist/agents/task-agent-integration.js.map +1 -1
  247. package/dist/api/health-endpoints.js +390 -0
  248. package/dist/api/health-endpoints.js.map +1 -0
  249. package/dist/cli/agent-executor.js +4 -1
  250. package/dist/cli/agent-executor.js.map +1 -1
  251. package/dist/cli/agent-prompt-builder.js +89 -1
  252. package/dist/cli/agent-prompt-builder.js.map +1 -1
  253. package/dist/cli/agent-spawn.js +130 -37
  254. package/dist/cli/agent-spawn.js.map +1 -1
  255. package/dist/cli/config-manager.js +109 -91
  256. package/dist/cli/config-manager.js.map +1 -1
  257. package/dist/cli/conversation-fork-cleanup.js +201 -0
  258. package/dist/cli/conversation-fork-cleanup.js.map +1 -0
  259. package/dist/cli/conversation-fork.js +16 -3
  260. package/dist/cli/conversation-fork.js.map +1 -1
  261. package/dist/cli/skill-cache-validator.js +412 -0
  262. package/dist/cli/skill-cache-validator.js.map +1 -0
  263. package/dist/cli/skill-cli.js +991 -0
  264. package/dist/cli/skill-cli.js.map +1 -0
  265. package/dist/cli/skill-execution-logger.js +284 -0
  266. package/dist/cli/skill-execution-logger.js.map +1 -0
  267. package/dist/cli/skill-loader.js +457 -0
  268. package/dist/cli/skill-loader.js.map +1 -0
  269. package/dist/coordination/event-bus.js +2 -2
  270. package/dist/coordination/event-bus.js.map +1 -1
  271. package/dist/coordination/fleet-manager.js +1 -1
  272. package/dist/coordination/fleet-manager.js.map +1 -1
  273. package/dist/coordination/index.js +23 -9
  274. package/dist/coordination/index.js.map +1 -1
  275. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  276. package/dist/db/migration-manager.js +483 -0
  277. package/dist/db/migration-manager.js.map +1 -0
  278. package/dist/db/skills-query.js +535 -0
  279. package/dist/db/skills-query.js.map +1 -0
  280. package/dist/integration/DatabaseHandoff.js +1 -1
  281. package/dist/integration/DatabaseHandoff.js.map +1 -1
  282. package/dist/jobs/edge-case-analyzer.js +367 -0
  283. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  284. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  285. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  286. package/dist/lib/agent-output-parser.js.map +1 -1
  287. package/dist/lib/agent-output-validator.js.map +1 -1
  288. package/dist/lib/agent-workspace.js +281 -0
  289. package/dist/lib/agent-workspace.js.map +1 -0
  290. package/dist/lib/atomic-file-writer.js +377 -0
  291. package/dist/lib/atomic-file-writer.js.map +1 -0
  292. package/dist/lib/backup-manager.js +779 -0
  293. package/dist/lib/backup-manager.js.map +1 -0
  294. package/dist/lib/checkpoint-manager.js +837 -0
  295. package/dist/lib/checkpoint-manager.js.map +1 -0
  296. package/dist/lib/circuit-breaker.js +340 -0
  297. package/dist/lib/circuit-breaker.js.map +1 -0
  298. package/dist/lib/completion-signal-handler.js +243 -0
  299. package/dist/lib/completion-signal-handler.js.map +1 -0
  300. package/dist/lib/config-manager.js +312 -0
  301. package/dist/lib/config-manager.js.map +1 -0
  302. package/dist/lib/config-migrator.js +386 -0
  303. package/dist/lib/config-migrator.js.map +1 -0
  304. package/dist/lib/config-validator.js.map +1 -1
  305. package/dist/lib/correlation-cache.js +311 -0
  306. package/dist/lib/correlation-cache.js.map +1 -0
  307. package/dist/lib/correlation.js +263 -0
  308. package/dist/lib/correlation.js.map +1 -0
  309. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  310. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  311. package/dist/lib/database-service/correlation.js +329 -0
  312. package/dist/lib/database-service/correlation.js.map +1 -0
  313. package/dist/lib/database-service/errors.js +120 -0
  314. package/dist/lib/database-service/errors.js.map +1 -0
  315. package/dist/lib/database-service/index.js +168 -0
  316. package/dist/lib/database-service/index.js.map +1 -0
  317. package/dist/lib/database-service/postgres-adapter.js +526 -0
  318. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  319. package/dist/lib/database-service/redis-adapter.js +360 -0
  320. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  321. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  322. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  323. package/dist/lib/database-service/transaction-manager.js +773 -0
  324. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  325. package/dist/lib/database-service/types.js +23 -0
  326. package/dist/lib/database-service/types.js.map +1 -0
  327. package/dist/lib/deadlock-resolver.js +292 -0
  328. package/dist/lib/deadlock-resolver.js.map +1 -0
  329. package/dist/lib/distributed-lock.js +451 -0
  330. package/dist/lib/distributed-lock.js.map +1 -0
  331. package/dist/lib/edge-case-deduplicator.js +227 -0
  332. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  333. package/dist/lib/encryption-manager.js +322 -0
  334. package/dist/lib/encryption-manager.js.map +1 -0
  335. package/dist/lib/error-aggregator.js +234 -0
  336. package/dist/lib/error-aggregator.js.map +1 -0
  337. package/dist/lib/errors.js +287 -0
  338. package/dist/lib/errors.js.map +1 -0
  339. package/dist/lib/file-lock-manager.js +578 -0
  340. package/dist/lib/file-lock-manager.js.map +1 -0
  341. package/dist/lib/file-operations.js +367 -0
  342. package/dist/lib/file-operations.js.map +1 -0
  343. package/dist/lib/idempotent-write.js +237 -0
  344. package/dist/lib/idempotent-write.js.map +1 -0
  345. package/dist/lib/integration-schema-validator.js +522 -0
  346. package/dist/lib/integration-schema-validator.js.map +1 -0
  347. package/dist/lib/lock-health-monitor.js +298 -0
  348. package/dist/lib/lock-health-monitor.js.map +1 -0
  349. package/dist/lib/log-shipper.js +422 -0
  350. package/dist/lib/log-shipper.js.map +1 -0
  351. package/dist/lib/logging.js +146 -0
  352. package/dist/lib/logging.js.map +1 -0
  353. package/dist/lib/message-deduplicator.js +439 -0
  354. package/dist/lib/message-deduplicator.js.map +1 -0
  355. package/dist/lib/multi-system-query.js +604 -0
  356. package/dist/lib/multi-system-query.js.map +1 -0
  357. package/dist/lib/orphan-detector.js +332 -0
  358. package/dist/lib/orphan-detector.js.map +1 -0
  359. package/dist/lib/password-generator.js +166 -0
  360. package/dist/lib/password-generator.js.map +1 -0
  361. package/dist/lib/path-validator.js +429 -0
  362. package/dist/lib/path-validator.js.map +1 -0
  363. package/dist/lib/query-translator.js +905 -0
  364. package/dist/lib/query-translator.js.map +1 -0
  365. package/dist/lib/queue-recovery.js +469 -0
  366. package/dist/lib/queue-recovery.js.map +1 -0
  367. package/dist/lib/redis-queue-manager.js +512 -0
  368. package/dist/lib/redis-queue-manager.js.map +1 -0
  369. package/dist/lib/reflection-archiver.js +272 -0
  370. package/dist/lib/reflection-archiver.js.map +1 -0
  371. package/dist/lib/retry-manager.js +453 -0
  372. package/dist/lib/retry-manager.js.map +1 -0
  373. package/dist/lib/retry.js +262 -0
  374. package/dist/lib/retry.js.map +1 -0
  375. package/dist/lib/schema-transform.js +695 -0
  376. package/dist/lib/schema-transform.js.map +1 -0
  377. package/dist/lib/schema-validator.js +491 -0
  378. package/dist/lib/schema-validator.js.map +1 -0
  379. package/dist/lib/skill-cache.js +297 -0
  380. package/dist/lib/skill-cache.js.map +1 -0
  381. package/dist/lib/skill-content-manager.js +337 -0
  382. package/dist/lib/skill-content-manager.js.map +1 -0
  383. package/dist/lib/skill-frontmatter-parser.js +237 -0
  384. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  385. package/dist/lib/skill-git-integration.js +275 -0
  386. package/dist/lib/skill-git-integration.js.map +1 -0
  387. package/dist/lib/skill-markdown-validator.js +396 -0
  388. package/dist/lib/skill-markdown-validator.js.map +1 -0
  389. package/dist/lib/skill-output-parser.js +312 -0
  390. package/dist/lib/skill-output-parser.js.map +1 -0
  391. package/dist/lib/unified-query-api.js +467 -0
  392. package/dist/lib/unified-query-api.js.map +1 -0
  393. package/dist/middleware/auth-middleware.js +350 -0
  394. package/dist/middleware/auth-middleware.js.map +1 -0
  395. package/dist/middleware/schema-validation.js +347 -0
  396. package/dist/middleware/schema-validation.js.map +1 -0
  397. package/dist/providers/anthropic-provider.js +1 -1
  398. package/dist/providers/anthropic-provider.js.map +1 -1
  399. package/dist/providers/provider-factory.js +2 -2
  400. package/dist/providers/provider-factory.js.map +1 -1
  401. package/dist/services/edge-case-analyzer.js +321 -0
  402. package/dist/services/edge-case-analyzer.js.map +1 -0
  403. package/dist/services/edge-case-deduplicator.js +266 -0
  404. package/dist/services/edge-case-deduplicator.js.map +1 -0
  405. package/dist/services/edge-case-detector.js +337 -0
  406. package/dist/services/edge-case-detector.js.map +1 -0
  407. package/dist/services/edge-case-tracker.js +547 -0
  408. package/dist/services/edge-case-tracker.js.map +1 -0
  409. package/dist/services/health-check-system.js +586 -0
  410. package/dist/services/health-check-system.js.map +1 -0
  411. package/dist/services/metrics-logger.js +412 -0
  412. package/dist/services/metrics-logger.js.map +1 -0
  413. package/dist/services/patch-generator.js +378 -0
  414. package/dist/services/patch-generator.js.map +1 -0
  415. package/dist/services/patch-validator.js +337 -0
  416. package/dist/services/patch-validator.js.map +1 -0
  417. package/dist/services/performance-monitor.js +811 -0
  418. package/dist/services/performance-monitor.js.map +1 -0
  419. package/dist/services/promotion-pipeline.js +918 -0
  420. package/dist/services/promotion-pipeline.js.map +1 -0
  421. package/dist/services/promotion-validator.js +394 -0
  422. package/dist/services/promotion-validator.js.map +1 -0
  423. package/dist/services/reflection-logger.js +388 -0
  424. package/dist/services/reflection-logger.js.map +1 -0
  425. package/dist/services/skill-deployment.js +472 -0
  426. package/dist/services/skill-deployment.js.map +1 -0
  427. package/dist/services/skill-loader.js +427 -0
  428. package/dist/services/skill-loader.js.map +1 -0
  429. package/dist/services/skill-promotion.js +372 -0
  430. package/dist/services/skill-promotion.js.map +1 -0
  431. package/dist/services/skill-validator.js +454 -0
  432. package/dist/services/skill-validator.js.map +1 -0
  433. package/dist/services/skill-versioning.js +244 -0
  434. package/dist/services/skill-versioning.js.map +1 -0
  435. package/dist/services/workspace-supervisor.js +597 -0
  436. package/dist/services/workspace-supervisor.js.map +1 -0
  437. package/dist/types/edge-case.js +45 -0
  438. package/dist/types/edge-case.js.map +1 -0
  439. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
  440. package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
  441. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
  442. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
  443. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
  444. package/package.json +35 -4
  445. package/readme/README.md +53 -5
  446. package/scripts/backup-cleanup.sh +627 -0
  447. package/scripts/cleanup-workspaces.sh +412 -0
  448. package/scripts/cleanup-yaml-configs.sh +141 -0
  449. package/scripts/deploy-approved-skills.sh +263 -0
  450. package/scripts/health-check.sh +447 -0
  451. package/scripts/log-aggregator.sh +554 -0
  452. package/scripts/log-monitor.sh +629 -0
  453. package/scripts/manage-agent-workspaces.sh +434 -0
  454. package/scripts/migrate-schema.sh +533 -0
  455. package/scripts/promote-staged-skills.sh +423 -0
  456. package/scripts/verify-no-secrets.sh +88 -35
  457. package/scripts/verify-redis-cleanup.sh +173 -0
  458. package/tests/README.md +84 -0
  459. package/tests/test-memory-leak-task-mode.sh +435 -0
  460. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  461. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  462. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  463. package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
  464. package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
  465. package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
  466. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  467. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  468. package/README.md.backup_before_replace +0 -781
  469. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  470. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  471. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  472. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  473. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Promotion SLA Enforcer
3
+ *
4
+ * Background job to enforce 48-hour SLA for skill promotion.
5
+ * Checks for stale skills in staging and auto-promotes or notifies based on config.
6
+ * Part of Task 1.2: Staging → Production Promotion Workflow
7
+ *
8
+ * Features:
9
+ * - Detects skills >48h in staging
10
+ * - Auto-promotes stale skills (optional)
11
+ * - Sends notifications for SLA breaches
12
+ * - Cron-job compatible
13
+ * - Monitoring dashboard data
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Run as cron job
18
+ * const enforcer = new PromotionSLAEnforcer(dbService, {
19
+ * autoPromote: true,
20
+ * notifyStale: true,
21
+ * });
22
+ *
23
+ * await enforcer.enforceSLA();
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```bash
28
+ * # Cron job (daily at 9am)
29
+ * 0 9 * * * cd /path/to/project && npx ts-node src/jobs/promotion-sla-enforcer.ts
30
+ * ```
31
+ */ import { DatabaseService } from '../lib/database-service.js';
32
+ import { createLogger } from '../lib/logging.js';
33
+ import { SkillPromotionService } from '../services/skill-promotion.js';
34
+ const logger = createLogger('promotion-sla-enforcer');
35
+ /**
36
+ * Promotion SLA Enforcer
37
+ */ export class PromotionSLAEnforcer {
38
+ dbService;
39
+ promotionService;
40
+ config;
41
+ constructor(dbService, config = {}){
42
+ this.dbService = dbService;
43
+ this.promotionService = new SkillPromotionService(dbService, {
44
+ slaThresholdHours: config.slaThresholdHours || 48
45
+ });
46
+ // Default configuration
47
+ this.config = {
48
+ autoPromote: config.autoPromote ?? false,
49
+ notifyStale: config.notifyStale ?? true,
50
+ slaThresholdHours: config.slaThresholdHours ?? 48,
51
+ dryRun: config.dryRun ?? false,
52
+ enableGitCommit: config.enableGitCommit ?? true,
53
+ enableAutoDeploy: config.enableAutoDeploy ?? false
54
+ };
55
+ logger.info('SLA Enforcer initialized', {
56
+ config: this.config
57
+ });
58
+ }
59
+ /**
60
+ * Enforce SLA for skill promotions
61
+ */ async enforceSLA() {
62
+ const startTime = Date.now();
63
+ logger.info('Starting SLA enforcement', {
64
+ slaThresholdHours: this.config.slaThresholdHours,
65
+ autoPromote: this.config.autoPromote,
66
+ dryRun: this.config.dryRun
67
+ });
68
+ try {
69
+ // 1. Find stale skills (>48 hours in staging)
70
+ const staleSkills = await this.promotionService.checkStaleness();
71
+ if (staleSkills.length === 0) {
72
+ logger.info('No stale skills found');
73
+ return {
74
+ staleSkillsFound: 0,
75
+ promoted: 0,
76
+ notified: 0,
77
+ enforcedAt: new Date(),
78
+ durationMs: Date.now() - startTime
79
+ };
80
+ }
81
+ logger.warn('Stale skills detected', {
82
+ count: staleSkills.length,
83
+ skills: staleSkills.map((s)=>({
84
+ name: s.name,
85
+ ageHours: s.ageHours,
86
+ slaBreachHours: s.slaBreachHours
87
+ }))
88
+ });
89
+ // 2. Process each stale skill
90
+ let promoted = 0;
91
+ let notified = 0;
92
+ const errors = [];
93
+ for (const skill of staleSkills){
94
+ try {
95
+ await this.processStaleSkill(skill);
96
+ // Track promotion count
97
+ if (this.config.autoPromote && !this.config.dryRun) {
98
+ promoted++;
99
+ }
100
+ // Track notification count
101
+ if (this.config.notifyStale) {
102
+ notified++;
103
+ }
104
+ } catch (error) {
105
+ logger.error('Failed to process stale skill', {
106
+ skillName: skill.name,
107
+ error
108
+ });
109
+ errors.push({
110
+ skillName: skill.name,
111
+ error: error instanceof Error ? error.message : String(error)
112
+ });
113
+ }
114
+ }
115
+ // 3. Record enforcement in database
116
+ await this.recordEnforcement(staleSkills.length, promoted, notified);
117
+ const result = {
118
+ staleSkillsFound: staleSkills.length,
119
+ promoted,
120
+ notified,
121
+ errors: errors.length > 0 ? errors : undefined,
122
+ enforcedAt: new Date(),
123
+ durationMs: Date.now() - startTime
124
+ };
125
+ logger.info('SLA enforcement complete', result);
126
+ // 4. Generate summary report
127
+ this.printSummary(result);
128
+ return result;
129
+ } catch (error) {
130
+ logger.error('SLA enforcement failed', {
131
+ error
132
+ });
133
+ throw error;
134
+ }
135
+ }
136
+ /**
137
+ * Process a single stale skill
138
+ */ async processStaleSkill(skill) {
139
+ logger.info('Processing stale skill', {
140
+ skillName: skill.name,
141
+ ageHours: skill.ageHours,
142
+ slaBreachHours: skill.slaBreachHours
143
+ });
144
+ // 1. Send notification if enabled
145
+ if (this.config.notifyStale) {
146
+ await this.notifyStaleSkill(skill);
147
+ }
148
+ // 2. Auto-promote if enabled
149
+ if (this.config.autoPromote) {
150
+ if (this.config.dryRun) {
151
+ logger.info('DRY RUN: Would auto-promote stale skill', {
152
+ skillName: skill.name
153
+ });
154
+ } else {
155
+ logger.info('Auto-promoting stale skill', {
156
+ skillName: skill.name
157
+ });
158
+ const result = await this.promotionService.promoteSkill(skill.stagingPath, {
159
+ autoDeploy: this.config.enableAutoDeploy,
160
+ gitCommit: this.config.enableGitCommit,
161
+ notify: false,
162
+ promotedBy: 'sla-enforcer'
163
+ });
164
+ if (!result.success) {
165
+ logger.error('Auto-promotion failed', {
166
+ skillName: skill.name,
167
+ error: result.error
168
+ });
169
+ throw new Error(result.error);
170
+ }
171
+ logger.info('Auto-promotion successful', {
172
+ skillName: skill.name,
173
+ productionPath: result.productionPath,
174
+ deploymentId: result.deploymentId
175
+ });
176
+ }
177
+ }
178
+ }
179
+ /**
180
+ * Send notification for stale skill
181
+ */ async notifyStaleSkill(skill) {
182
+ // Console notification
183
+ console.log(`
184
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
185
+ ⚠️ SLA BREACH DETECTED
186
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
187
+ Skill: ${skill.name}
188
+ Age: ${skill.ageHours} hours
189
+ SLA Threshold: ${this.config.slaThresholdHours} hours
190
+ SLA Breach: ${skill.slaBreachHours} hours over threshold
191
+ Location: ${skill.stagingPath}
192
+ Auto-Promote: ${this.config.autoPromote ? 'YES' : 'NO'}
193
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
194
+ `);
195
+ // Future: Add webhook, email, Slack notifications
196
+ logger.info('Stale skill notification sent', {
197
+ skillName: skill.name
198
+ });
199
+ }
200
+ /**
201
+ * Record enforcement in database
202
+ */ async recordEnforcement(staleSkillsFound, promoted, notified) {
203
+ try {
204
+ const query = `
205
+ INSERT INTO sla_enforcements (enforced_at, stale_skills_found, promoted, notified)
206
+ VALUES (?, ?, ?, ?)
207
+ `;
208
+ const adapter = this.dbService.getAdapter('sqlite');
209
+ await adapter.query(query, [
210
+ new Date().toISOString(),
211
+ staleSkillsFound,
212
+ promoted,
213
+ notified
214
+ ]);
215
+ logger.debug('Enforcement recorded in database', {
216
+ staleSkillsFound,
217
+ promoted,
218
+ notified
219
+ });
220
+ } catch (error) {
221
+ // Log error but don't fail enforcement
222
+ logger.error('Failed to record enforcement in database', {
223
+ error
224
+ });
225
+ }
226
+ }
227
+ /**
228
+ * Print summary report
229
+ */ printSummary(result) {
230
+ console.log(`
231
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
232
+ SLA ENFORCEMENT SUMMARY
233
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
234
+ Stale Skills Found: ${result.staleSkillsFound}
235
+ Auto-Promoted: ${result.promoted}
236
+ Notifications Sent: ${result.notified}
237
+ Errors: ${result.errors?.length || 0}
238
+ Duration: ${result.durationMs}ms
239
+ Enforced At: ${result.enforcedAt.toISOString()}
240
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
241
+ `);
242
+ if (result.errors && result.errors.length > 0) {
243
+ console.log('Errors:');
244
+ for (const error of result.errors){
245
+ console.log(` - ${error.skillName}: ${error.error}`);
246
+ }
247
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
248
+ }
249
+ }
250
+ }
251
+ /**
252
+ * CLI entry point for running as standalone job
253
+ */ async function main() {
254
+ // Parse command line arguments
255
+ const args = process.argv.slice(2);
256
+ const config = {
257
+ autoPromote: args.includes('--auto-promote'),
258
+ notifyStale: !args.includes('--no-notify'),
259
+ dryRun: args.includes('--dry-run'),
260
+ enableGitCommit: !args.includes('--no-git-commit'),
261
+ enableAutoDeploy: args.includes('--auto-deploy')
262
+ };
263
+ // Initialize database service
264
+ const dbService = new DatabaseService({
265
+ type: 'sqlite',
266
+ path: process.env.CFN_DB_PATH || './data/cfn.db'
267
+ });
268
+ // Run SLA enforcer
269
+ const enforcer = new PromotionSLAEnforcer(dbService, config);
270
+ try {
271
+ const result = await enforcer.enforceSLA();
272
+ process.exit(result.errors && result.errors.length > 0 ? 1 : 0);
273
+ } catch (error) {
274
+ logger.error('SLA enforcer failed', {
275
+ error
276
+ });
277
+ process.exit(1);
278
+ }
279
+ }
280
+ // Run if executed directly
281
+ if (require.main === module) {
282
+ main().catch((error)=>{
283
+ console.error('Fatal error:', error);
284
+ process.exit(1);
285
+ });
286
+ }
287
+
288
+ //# sourceMappingURL=promotion-sla-enforcer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/jobs/promotion-sla-enforcer.ts"],"sourcesContent":["/**\r\n * Promotion SLA Enforcer\r\n *\r\n * Background job to enforce 48-hour SLA for skill promotion.\r\n * Checks for stale skills in staging and auto-promotes or notifies based on config.\r\n * Part of Task 1.2: Staging → Production Promotion Workflow\r\n *\r\n * Features:\r\n * - Detects skills >48h in staging\r\n * - Auto-promotes stale skills (optional)\r\n * - Sends notifications for SLA breaches\r\n * - Cron-job compatible\r\n * - Monitoring dashboard data\r\n *\r\n * @example\r\n * ```typescript\r\n * // Run as cron job\r\n * const enforcer = new PromotionSLAEnforcer(dbService, {\r\n * autoPromote: true,\r\n * notifyStale: true,\r\n * });\r\n *\r\n * await enforcer.enforceSLA();\r\n * ```\r\n *\r\n * @example\r\n * ```bash\r\n * # Cron job (daily at 9am)\r\n * 0 9 * * * cd /path/to/project && npx ts-node src/jobs/promotion-sla-enforcer.ts\r\n * ```\r\n */\r\n\r\nimport { DatabaseService } from '../lib/database-service.js';\r\nimport { createLogger } from '../lib/logging.js';\r\nimport { SkillPromotionService, StaleSkill } from '../services/skill-promotion.js';\r\n\r\nconst logger = createLogger('promotion-sla-enforcer');\r\n\r\n/**\r\n * SLA enforcer configuration\r\n */\r\nexport interface SLAEnforcerConfig {\r\n /** Automatically promote stale skills */\r\n autoPromote?: boolean;\r\n /** Send notifications for stale skills */\r\n notifyStale?: boolean;\r\n /** SLA threshold in hours (default: 48) */\r\n slaThresholdHours?: number;\r\n /** Dry run mode (don't actually promote) */\r\n dryRun?: boolean;\r\n /** Enable git commits for auto-promotions */\r\n enableGitCommit?: boolean;\r\n /** Enable auto-deployment for promotions */\r\n enableAutoDeploy?: boolean;\r\n}\r\n\r\n/**\r\n * SLA enforcement result\r\n */\r\nexport interface SLAEnforcementResult {\r\n /** Number of stale skills found */\r\n staleSkillsFound: number;\r\n /** Number of skills auto-promoted */\r\n promoted: number;\r\n /** Number of notifications sent */\r\n notified: number;\r\n /** Promotion errors (if any) */\r\n errors?: Array<{\r\n skillName: string;\r\n error: string;\r\n }>;\r\n /** Enforcement timestamp */\r\n enforcedAt: Date;\r\n /** Execution duration (ms) */\r\n durationMs: number;\r\n}\r\n\r\n/**\r\n * Promotion SLA Enforcer\r\n */\r\nexport class PromotionSLAEnforcer {\r\n private dbService: DatabaseService;\r\n private promotionService: SkillPromotionService;\r\n private config: Required<SLAEnforcerConfig>;\r\n\r\n constructor(dbService: DatabaseService, config: SLAEnforcerConfig = {}) {\r\n this.dbService = dbService;\r\n this.promotionService = new SkillPromotionService(dbService, {\r\n slaThresholdHours: config.slaThresholdHours || 48,\r\n });\r\n\r\n // Default configuration\r\n this.config = {\r\n autoPromote: config.autoPromote ?? false,\r\n notifyStale: config.notifyStale ?? true,\r\n slaThresholdHours: config.slaThresholdHours ?? 48,\r\n dryRun: config.dryRun ?? false,\r\n enableGitCommit: config.enableGitCommit ?? true,\r\n enableAutoDeploy: config.enableAutoDeploy ?? false,\r\n };\r\n\r\n logger.info('SLA Enforcer initialized', { config: this.config });\r\n }\r\n\r\n /**\r\n * Enforce SLA for skill promotions\r\n */\r\n async enforceSLA(): Promise<SLAEnforcementResult> {\r\n const startTime = Date.now();\r\n logger.info('Starting SLA enforcement', {\r\n slaThresholdHours: this.config.slaThresholdHours,\r\n autoPromote: this.config.autoPromote,\r\n dryRun: this.config.dryRun,\r\n });\r\n\r\n try {\r\n // 1. Find stale skills (>48 hours in staging)\r\n const staleSkills = await this.promotionService.checkStaleness();\r\n\r\n if (staleSkills.length === 0) {\r\n logger.info('No stale skills found');\r\n return {\r\n staleSkillsFound: 0,\r\n promoted: 0,\r\n notified: 0,\r\n enforcedAt: new Date(),\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n logger.warn('Stale skills detected', {\r\n count: staleSkills.length,\r\n skills: staleSkills.map((s) => ({\r\n name: s.name,\r\n ageHours: s.ageHours,\r\n slaBreachHours: s.slaBreachHours,\r\n })),\r\n });\r\n\r\n // 2. Process each stale skill\r\n let promoted = 0;\r\n let notified = 0;\r\n const errors: Array<{ skillName: string; error: string }> = [];\r\n\r\n for (const skill of staleSkills) {\r\n try {\r\n await this.processStaleSkill(skill);\r\n\r\n // Track promotion count\r\n if (this.config.autoPromote && !this.config.dryRun) {\r\n promoted++;\r\n }\r\n\r\n // Track notification count\r\n if (this.config.notifyStale) {\r\n notified++;\r\n }\r\n } catch (error) {\r\n logger.error('Failed to process stale skill', {\r\n skillName: skill.name,\r\n error,\r\n });\r\n\r\n errors.push({\r\n skillName: skill.name,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n }\r\n\r\n // 3. Record enforcement in database\r\n await this.recordEnforcement(staleSkills.length, promoted, notified);\r\n\r\n const result: SLAEnforcementResult = {\r\n staleSkillsFound: staleSkills.length,\r\n promoted,\r\n notified,\r\n errors: errors.length > 0 ? errors : undefined,\r\n enforcedAt: new Date(),\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n logger.info('SLA enforcement complete', result);\r\n\r\n // 4. Generate summary report\r\n this.printSummary(result);\r\n\r\n return result;\r\n } catch (error) {\r\n logger.error('SLA enforcement failed', { error });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Process a single stale skill\r\n */\r\n private async processStaleSkill(skill: StaleSkill): Promise<void> {\r\n logger.info('Processing stale skill', {\r\n skillName: skill.name,\r\n ageHours: skill.ageHours,\r\n slaBreachHours: skill.slaBreachHours,\r\n });\r\n\r\n // 1. Send notification if enabled\r\n if (this.config.notifyStale) {\r\n await this.notifyStaleSkill(skill);\r\n }\r\n\r\n // 2. Auto-promote if enabled\r\n if (this.config.autoPromote) {\r\n if (this.config.dryRun) {\r\n logger.info('DRY RUN: Would auto-promote stale skill', {\r\n skillName: skill.name,\r\n });\r\n } else {\r\n logger.info('Auto-promoting stale skill', { skillName: skill.name });\r\n\r\n const result = await this.promotionService.promoteSkill(skill.stagingPath, {\r\n autoDeploy: this.config.enableAutoDeploy,\r\n gitCommit: this.config.enableGitCommit,\r\n notify: false, // Already notified above\r\n promotedBy: 'sla-enforcer',\r\n });\r\n\r\n if (!result.success) {\r\n logger.error('Auto-promotion failed', {\r\n skillName: skill.name,\r\n error: result.error,\r\n });\r\n throw new Error(result.error);\r\n }\r\n\r\n logger.info('Auto-promotion successful', {\r\n skillName: skill.name,\r\n productionPath: result.productionPath,\r\n deploymentId: result.deploymentId,\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Send notification for stale skill\r\n */\r\n private async notifyStaleSkill(skill: StaleSkill): Promise<void> {\r\n // Console notification\r\n console.log(`\r\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n ⚠️ SLA BREACH DETECTED\r\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n Skill: ${skill.name}\r\n Age: ${skill.ageHours} hours\r\n SLA Threshold: ${this.config.slaThresholdHours} hours\r\n SLA Breach: ${skill.slaBreachHours} hours over threshold\r\n Location: ${skill.stagingPath}\r\n Auto-Promote: ${this.config.autoPromote ? 'YES' : 'NO'}\r\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n`);\r\n\r\n // Future: Add webhook, email, Slack notifications\r\n logger.info('Stale skill notification sent', { skillName: skill.name });\r\n }\r\n\r\n /**\r\n * Record enforcement in database\r\n */\r\n private async recordEnforcement(\r\n staleSkillsFound: number,\r\n promoted: number,\r\n notified: number\r\n ): Promise<void> {\r\n try {\r\n const query = `\r\n INSERT INTO sla_enforcements (enforced_at, stale_skills_found, promoted, notified)\r\n VALUES (?, ?, ?, ?)\r\n `;\r\n\r\n const adapter = this.dbService.getAdapter('sqlite');\r\n await adapter.query(query, [\r\n new Date().toISOString(),\r\n staleSkillsFound,\r\n promoted,\r\n notified,\r\n ]);\r\n\r\n logger.debug('Enforcement recorded in database', {\r\n staleSkillsFound,\r\n promoted,\r\n notified,\r\n });\r\n } catch (error) {\r\n // Log error but don't fail enforcement\r\n logger.error('Failed to record enforcement in database', { error });\r\n }\r\n }\r\n\r\n /**\r\n * Print summary report\r\n */\r\n private printSummary(result: SLAEnforcementResult): void {\r\n console.log(`\r\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n SLA ENFORCEMENT SUMMARY\r\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n Stale Skills Found: ${result.staleSkillsFound}\r\n Auto-Promoted: ${result.promoted}\r\n Notifications Sent: ${result.notified}\r\n Errors: ${result.errors?.length || 0}\r\n Duration: ${result.durationMs}ms\r\n Enforced At: ${result.enforcedAt.toISOString()}\r\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\r\n`);\r\n\r\n if (result.errors && result.errors.length > 0) {\r\n console.log('Errors:');\r\n for (const error of result.errors) {\r\n console.log(` - ${error.skillName}: ${error.error}`);\r\n }\r\n console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * CLI entry point for running as standalone job\r\n */\r\nasync function main() {\r\n // Parse command line arguments\r\n const args = process.argv.slice(2);\r\n const config: SLAEnforcerConfig = {\r\n autoPromote: args.includes('--auto-promote'),\r\n notifyStale: !args.includes('--no-notify'),\r\n dryRun: args.includes('--dry-run'),\r\n enableGitCommit: !args.includes('--no-git-commit'),\r\n enableAutoDeploy: args.includes('--auto-deploy'),\r\n };\r\n\r\n // Initialize database service\r\n const dbService = new DatabaseService({\r\n type: 'sqlite',\r\n path: process.env.CFN_DB_PATH || './data/cfn.db',\r\n });\r\n\r\n // Run SLA enforcer\r\n const enforcer = new PromotionSLAEnforcer(dbService, config);\r\n\r\n try {\r\n const result = await enforcer.enforceSLA();\r\n process.exit(result.errors && result.errors.length > 0 ? 1 : 0);\r\n } catch (error) {\r\n logger.error('SLA enforcer failed', { error });\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// Run if executed directly\r\nif (require.main === module) {\r\n main().catch((error) => {\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n });\r\n}\r\n"],"names":["DatabaseService","createLogger","SkillPromotionService","logger","PromotionSLAEnforcer","dbService","promotionService","config","slaThresholdHours","autoPromote","notifyStale","dryRun","enableGitCommit","enableAutoDeploy","info","enforceSLA","startTime","Date","now","staleSkills","checkStaleness","length","staleSkillsFound","promoted","notified","enforcedAt","durationMs","warn","count","skills","map","s","name","ageHours","slaBreachHours","errors","skill","processStaleSkill","error","skillName","push","Error","message","String","recordEnforcement","result","undefined","printSummary","notifyStaleSkill","promoteSkill","stagingPath","autoDeploy","gitCommit","notify","promotedBy","success","productionPath","deploymentId","console","log","query","adapter","getAdapter","toISOString","debug","main","args","process","argv","slice","includes","type","path","env","CFN_DB_PATH","enforcer","exit","require","module","catch"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/agent-output-parser.ts"],"sourcesContent":["/**\r\n * Agent Output Parser\r\n * Legacy stdout parser for backward compatibility\r\n *\r\n * @version 1.0.0\r\n * @description Converts unstructured text output to structured JSON\r\n */\r\n\r\nimport type {\r\n AgentOutput,\r\n Loop3Output,\r\n Loop2Output,\r\n ProductOwnerOutput,\r\n ParseResult,\r\n Deliverable,\r\n Issue,\r\n AgentError,\r\n} from '../types/agent-output';\r\n\r\n// ============================================================================\r\n// Parser Class\r\n// ============================================================================\r\n\r\n/**\r\n * AgentOutputParser: Legacy text output parser\r\n * Provides best-effort parsing of unstructured stdout\r\n */\r\nexport class AgentOutputParser {\r\n /**\r\n * Parse stdout text to structured agent output\r\n */\r\n public parse(text: string): ParseResult {\r\n const errors: string[] = [];\r\n let confidence = 0.5; // Default confidence for legacy parsing\r\n\r\n try {\r\n // Attempt to parse as JSON first\r\n const jsonOutput = this.tryParseJSON(text);\r\n if (jsonOutput) {\r\n return {\r\n success: true,\r\n output: jsonOutput,\r\n errors: [],\r\n confidence: 0.95,\r\n };\r\n }\r\n\r\n // Detect output type from text patterns\r\n const outputType = this.detectOutputType(text);\r\n\r\n // Parse based on detected type\r\n switch (outputType) {\r\n case 'loop3':\r\n return this.parseLoop3Text(text);\r\n case 'loop2':\r\n return this.parseLoop2Text(text);\r\n case 'product_owner':\r\n return this.parseProductOwnerText(text);\r\n default:\r\n return {\r\n success: false,\r\n errors: ['Unable to detect agent output type from text'],\r\n confidence: 0.0,\r\n };\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n errors: [\r\n `Parse error: ${error instanceof Error ? error.message : String(error)}`,\r\n ],\r\n confidence: 0.0,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Attempt to parse text as JSON\r\n */\r\n private tryParseJSON(text: string): AgentOutput | null {\r\n try {\r\n // Try parsing the entire text\r\n const obj = JSON.parse(text);\r\n if (this.isValidAgentOutput(obj)) {\r\n return obj as AgentOutput;\r\n }\r\n\r\n // Try extracting JSON from markdown code blocks\r\n const jsonMatch = text.match(/```json\\s*\\n([\\s\\S]*?)\\n```/);\r\n if (jsonMatch) {\r\n const obj = JSON.parse(jsonMatch[1]);\r\n if (this.isValidAgentOutput(obj)) {\r\n return obj as AgentOutput;\r\n }\r\n }\r\n\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Basic validation for agent output structure\r\n */\r\n private isValidAgentOutput(obj: unknown): boolean {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n const record = obj as Record<string, unknown>;\r\n return (\r\n typeof record.success === 'boolean' &&\r\n typeof record.confidence === 'number' &&\r\n typeof record.output_type === 'string' &&\r\n (record.output_type === 'loop3' ||\r\n record.output_type === 'loop2' ||\r\n record.output_type === 'product_owner')\r\n );\r\n }\r\n\r\n /**\r\n * Detect output type from text patterns\r\n */\r\n private detectOutputType(text: string): string {\r\n const lower = text.toLowerCase();\r\n\r\n // Check for Product Owner decision keywords\r\n if (\r\n /\\b(PROCEED|ITERATE|ABORT)\\b/.test(text) &&\r\n /\\b(decision|rationale)\\b/i.test(lower)\r\n ) {\r\n return 'product_owner';\r\n }\r\n\r\n // Check for Loop 2 validation keywords\r\n if (\r\n /\\b(approved|rejected|consensus|validation)\\b/i.test(lower) &&\r\n /\\b(issues?|recommendations?)\\b/i.test(lower)\r\n ) {\r\n return 'loop2';\r\n }\r\n\r\n // Check for Loop 3 implementation keywords\r\n if (\r\n /\\b(deliverables?|implementation|created|modified)\\b/i.test(lower) ||\r\n /\\b(files? (created|modified))\\b/i.test(lower)\r\n ) {\r\n return 'loop3';\r\n }\r\n\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Parse Loop 3 implementer text output\r\n */\r\n private parseLoop3Text(text: string): ParseResult {\r\n const output: Loop3Output = {\r\n output_type: 'loop3',\r\n success: true,\r\n confidence: this.extractConfidence(text),\r\n iteration: this.extractIteration(text),\r\n deliverables: this.extractDeliverables(text),\r\n errors: this.extractErrors(text),\r\n metadata: {\r\n agent_type: this.extractAgentType(text) || 'unknown',\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n\r\n // Extract optional fields\r\n const summary = this.extractSummary(text);\r\n if (summary) {\r\n output.summary = summary;\r\n }\r\n\r\n const metrics = this.extractMetrics(text);\r\n if (Object.keys(metrics).length > 0) {\r\n output.metrics = metrics;\r\n }\r\n\r\n return {\r\n success: true,\r\n output,\r\n errors: [],\r\n confidence: 0.7,\r\n };\r\n }\r\n\r\n /**\r\n * Parse Loop 2 validator text output\r\n */\r\n private parseLoop2Text(text: string): ParseResult {\r\n const output: Loop2Output = {\r\n output_type: 'loop2',\r\n success: true,\r\n confidence: this.extractConfidence(text),\r\n iteration: this.extractIteration(text),\r\n validation_type: this.extractValidationType(text),\r\n issues: this.extractIssues(text),\r\n recommendations: this.extractRecommendations(text),\r\n approved: this.extractApproval(text),\r\n errors: this.extractErrors(text),\r\n metadata: {\r\n agent_type: this.extractAgentType(text) || 'reviewer',\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n\r\n const summary = this.extractSummary(text);\r\n if (summary) {\r\n output.summary = summary;\r\n }\r\n\r\n return {\r\n success: true,\r\n output,\r\n errors: [],\r\n confidence: 0.7,\r\n };\r\n }\r\n\r\n /**\r\n * Parse Product Owner text output\r\n */\r\n private parseProductOwnerText(text: string): ParseResult {\r\n const decision = this.extractDecision(text);\r\n if (!decision) {\r\n return {\r\n success: false,\r\n errors: ['Unable to extract Product Owner decision'],\r\n confidence: 0.0,\r\n };\r\n }\r\n\r\n const output: ProductOwnerOutput = {\r\n output_type: 'product_owner',\r\n success: true,\r\n confidence: this.extractConfidence(text),\r\n iteration: this.extractIteration(text),\r\n decision,\r\n rationale: this.extractRationale(text),\r\n deliverables_validated: this.extractDeliverablesValidated(text),\r\n next_action: this.extractNextAction(text),\r\n errors: this.extractErrors(text),\r\n metadata: {\r\n agent_type: 'product-owner',\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n\r\n const consensusScore = this.extractConsensusScore(text);\r\n if (consensusScore !== null) {\r\n output.consensus_score = consensusScore;\r\n }\r\n\r\n const gateScore = this.extractGateScore(text);\r\n if (gateScore !== null) {\r\n output.gate_score = gateScore;\r\n }\r\n\r\n return {\r\n success: true,\r\n output,\r\n errors: [],\r\n confidence: 0.75,\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // Extraction Helper Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Extract confidence score from text\r\n */\r\n private extractConfidence(text: string): number {\r\n // Look for explicit confidence score (fixed regex to match only valid decimals)\r\n const match =\r\n text.match(/confidence[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i) ||\r\n text.match(/confidence score[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n // Handle both 0.0-1.0 and 0-100 formats\r\n if (value >= 0 && value <= 1) {\r\n return value;\r\n }\r\n if (value > 1 && value <= 100) {\r\n return value / 100;\r\n }\r\n }\r\n\r\n // Default confidence for parsed text\r\n return 0.7;\r\n }\r\n\r\n /**\r\n * Extract iteration number from text\r\n */\r\n private extractIteration(text: string): number {\r\n const match =\r\n text.match(/iteration[:\\s]+(\\d+)/i) ||\r\n text.match(/iteration (\\d+)/i);\r\n\r\n if (match) {\r\n return parseInt(match[1], 10);\r\n }\r\n\r\n return 1; // Default to iteration 1\r\n }\r\n\r\n /**\r\n * Extract agent type from text\r\n */\r\n private extractAgentType(text: string): string | null {\r\n const match =\r\n text.match(/agent[_\\s]?type[:\\s]+([a-z-]+)/i) ||\r\n text.match(/agent[:\\s]+([a-z-]+)/i);\r\n\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Extract summary from text\r\n */\r\n private extractSummary(text: string): string | null {\r\n const match =\r\n text.match(/summary[:\\s]+(.+?)(?:\\n\\n|\\n[A-Z]|$)/is) ||\r\n text.match(/## Summary\\s*\\n(.+?)(?:\\n\\n|\\n#|$)/is);\r\n\r\n return match ? match[1].trim() : null;\r\n }\r\n\r\n /**\r\n * Extract deliverables from text\r\n */\r\n private extractDeliverables(text: string): Deliverable[] {\r\n const deliverables: Deliverable[] = [];\r\n\r\n // Look for file listings\r\n const filePatterns = [\r\n /(?:created|modified|deleted)[:\\s]+([^\\n]+)/gi,\r\n /[-*]\\s+(?:created|modified|deleted)[:\\s]+([^\\n]+)/gi,\r\n /[-*]\\s+`([^`]+)`\\s+-\\s+(created|modified|deleted)/gi,\r\n ];\r\n\r\n for (const pattern of filePatterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n const path = match[1].trim().replace(/`/g, '');\r\n const status = this.extractDeliverableStatus(match[0]);\r\n\r\n deliverables.push({\r\n path,\r\n type: this.guessDeliverableType(path),\r\n status: status || 'created',\r\n });\r\n }\r\n }\r\n\r\n return deliverables;\r\n }\r\n\r\n /**\r\n * Extract deliverable status from text\r\n */\r\n private extractDeliverableStatus(\r\n text: string\r\n ): 'created' | 'modified' | 'deleted' | null {\r\n const lower = text.toLowerCase();\r\n if (lower.includes('created')) return 'created';\r\n if (lower.includes('modified')) return 'modified';\r\n if (lower.includes('deleted')) return 'deleted';\r\n return null;\r\n }\r\n\r\n /**\r\n * Guess deliverable type from file path\r\n */\r\n private guessDeliverableType(path: string): Deliverable['type'] {\r\n const lower = path.toLowerCase();\r\n\r\n if (lower.match(/\\.test\\.|\\.spec\\.|test\\/|tests\\//)) return 'test';\r\n if (lower.match(/\\.md$|readme|docs?\\//)) return 'documentation';\r\n if (lower.match(/\\.json$|\\.ya?ml$|\\.toml$|\\.ini$/)) return 'config';\r\n if (lower.match(/schema|\\.graphql$/)) return 'schema';\r\n if (lower.match(/\\.sh$|\\.bash$|scripts?\\//)) return 'script';\r\n if (lower.match(/\\.ts$|\\.js$|\\.py$|src\\//)) return 'implementation';\r\n\r\n return 'other';\r\n }\r\n\r\n /**\r\n * Extract metrics from text\r\n */\r\n private extractMetrics(text: string): Record<string, number> {\r\n const metrics: Record<string, number> = {};\r\n\r\n const patterns = [\r\n { key: 'files_created', pattern: /(\\d+)\\s+files?\\s+created/i },\r\n { key: 'files_modified', pattern: /(\\d+)\\s+files?\\s+modified/i },\r\n { key: 'lines_of_code', pattern: /(\\d+)\\s+lines?\\s+of\\s+code/i },\r\n {\r\n key: 'test_coverage',\r\n pattern: /(?:coverage|test coverage)[:\\s]+([0-9]+(?:\\.[0-9]+)?)%?/i,\r\n },\r\n { key: 'tests_passed', pattern: /(\\d+)\\s+tests?\\s+passed/i },\r\n { key: 'tests_failed', pattern: /(\\d+)\\s+tests?\\s+failed/i },\r\n ];\r\n\r\n for (const { key, pattern } of patterns) {\r\n const match = text.match(pattern);\r\n if (match) {\r\n let value = parseFloat(match[1]);\r\n // Convert percentage to 0.0-1.0 for test_coverage\r\n if (key === 'test_coverage' && value > 1) {\r\n value = value / 100;\r\n }\r\n metrics[key] = value;\r\n }\r\n }\r\n\r\n return metrics;\r\n }\r\n\r\n /**\r\n * Extract validation type from text\r\n */\r\n private extractValidationType(text: string): Loop2Output['validation_type'] {\r\n const lower = text.toLowerCase();\r\n\r\n if (lower.includes('security')) return 'security';\r\n if (lower.includes('test')) return 'test';\r\n if (lower.includes('architecture')) return 'architecture';\r\n if (lower.includes('performance')) return 'performance';\r\n if (lower.includes('compliance')) return 'compliance';\r\n\r\n return 'review'; // Default\r\n }\r\n\r\n /**\r\n * Extract issues from text\r\n */\r\n private extractIssues(text: string): Issue[] {\r\n const issues: Issue[] = [];\r\n\r\n // Look for issue listings\r\n const issuePatterns = [\r\n /[-*]\\s+\\[([^\\]]+)\\]\\s+([^\\n]+)/g,\r\n /[-*]\\s+(critical|high|medium|low|info)[:\\s]+([^\\n]+)/gi,\r\n ];\r\n\r\n for (const pattern of issuePatterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n const severity = this.parseSeverity(match[1]);\r\n const message = match[2].trim();\r\n\r\n issues.push({\r\n severity,\r\n category: 'other',\r\n message,\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * Parse severity from text\r\n */\r\n private parseSeverity(text: string): Issue['severity'] {\r\n const lower = text.toLowerCase();\r\n\r\n if (lower.includes('critical')) return 'critical';\r\n if (lower.includes('high')) return 'high';\r\n if (lower.includes('medium')) return 'medium';\r\n if (lower.includes('low')) return 'low';\r\n\r\n return 'info';\r\n }\r\n\r\n /**\r\n * Extract recommendations from text\r\n */\r\n private extractRecommendations(text: string): string[] {\r\n const recommendations: string[] = [];\r\n\r\n // Look for recommendation listings\r\n const patterns = [\r\n /recommendation[s]?[:\\s]+([^\\n]+)/gi,\r\n /[-*]\\s+(?:recommend|suggestion)[:\\s]+([^\\n]+)/gi,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n recommendations.push(match[1].trim());\r\n }\r\n }\r\n\r\n return recommendations;\r\n }\r\n\r\n /**\r\n * Extract approval status from text\r\n */\r\n private extractApproval(text: string): boolean {\r\n const lower = text.toLowerCase();\r\n\r\n // Explicit approval/rejection\r\n if (/\\bapproved\\b/i.test(text)) return true;\r\n if (/\\brejected\\b/i.test(text)) return false;\r\n\r\n // Implicit approval from consensus (fixed regex to match only valid decimals)\r\n if (/consensus[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i.test(text)) {\r\n const match = text.match(/consensus[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n if (match) {\r\n const score = parseFloat(match[1]);\r\n return score >= 0.9; // Default threshold\r\n }\r\n }\r\n\r\n return false; // Default to not approved\r\n }\r\n\r\n /**\r\n * Extract Product Owner decision\r\n */\r\n private extractDecision(\r\n text: string\r\n ): ProductOwnerOutput['decision'] | null {\r\n const match = text.match(/\\b(PROCEED|ITERATE|ABORT)\\b/);\r\n return match ? (match[1] as ProductOwnerOutput['decision']) : null;\r\n }\r\n\r\n /**\r\n * Extract rationale from text\r\n */\r\n private extractRationale(text: string): string {\r\n const match =\r\n text.match(/rationale[:\\s]+(.+?)(?:\\n\\n|\\n[A-Z]|$)/is) ||\r\n text.match(/reason[:\\s]+(.+?)(?:\\n\\n|\\n[A-Z]|$)/is);\r\n\r\n return match\r\n ? match[1].trim()\r\n : 'No rationale provided in legacy output';\r\n }\r\n\r\n /**\r\n * Extract deliverables validated status\r\n */\r\n private extractDeliverablesValidated(text: string): boolean {\r\n const lower = text.toLowerCase();\r\n return (\r\n lower.includes('deliverables validated') ||\r\n lower.includes('all deliverables') ||\r\n lower.includes('deliverables complete')\r\n );\r\n }\r\n\r\n /**\r\n * Extract next action from text\r\n */\r\n private extractNextAction(text: string): string {\r\n const match =\r\n text.match(/next[_\\s]action[:\\s]+([^\\n]+)/i) ||\r\n text.match(/action[:\\s]+([^\\n]+)/i);\r\n\r\n if (match) {\r\n return match[1].trim();\r\n }\r\n\r\n // Infer from decision\r\n const decision = this.extractDecision(text);\r\n if (decision === 'PROCEED') return 'mark_task_complete';\r\n if (decision === 'ITERATE') return 'start_next_iteration';\r\n if (decision === 'ABORT') return 'abort_task';\r\n\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Extract consensus score from text\r\n */\r\n private extractConsensusScore(text: string): number | null {\r\n const match =\r\n text.match(/consensus[_\\s]score[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i) ||\r\n text.match(/consensus[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n return value >= 0 && value <= 1 ? value : value / 100;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract gate score from text\r\n */\r\n private extractGateScore(text: string): number | null {\r\n const match =\r\n text.match(/gate[_\\s]score[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i) ||\r\n text.match(/gate[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n return value >= 0 && value <= 1 ? value : value / 100;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract errors from text\r\n */\r\n private extractErrors(text: string): AgentError[] {\r\n const errors: AgentError[] = [];\r\n\r\n // Look for error listings\r\n const errorPatterns = [\r\n /error[:\\s]+\\[([^\\]]+)\\]\\s+([^\\n]+)/gi,\r\n /\\[ERROR\\]\\s+([^\\n]+)/gi,\r\n ];\r\n\r\n for (const pattern of errorPatterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n const code = match[1] || 'UNKNOWN_ERROR';\r\n const message = match[2] || match[1];\r\n\r\n errors.push({\r\n code: code.trim(),\r\n message: message.trim(),\r\n });\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Singleton Instance and Convenience Functions\r\n// ============================================================================\r\n\r\nlet parserInstance: AgentOutputParser | null = null;\r\n\r\n/**\r\n * Get or create parser instance\r\n */\r\nexport function getParser(): AgentOutputParser {\r\n if (!parserInstance) {\r\n parserInstance = new AgentOutputParser();\r\n }\r\n return parserInstance;\r\n}\r\n\r\n/**\r\n * Parse text output to structured agent output\r\n */\r\nexport function parseAgentOutput(text: string): ParseResult {\r\n return getParser().parse(text);\r\n}\r\n\r\n/**\r\n * Reset parser instance (useful for testing)\r\n */\r\nexport function resetParser(): void {\r\n parserInstance = null;\r\n}\r\n\r\nexport default AgentOutputParser;\r\n"],"names":["AgentOutputParser","parse","text","errors","confidence","jsonOutput","tryParseJSON","success","output","outputType","detectOutputType","parseLoop3Text","parseLoop2Text","parseProductOwnerText","error","Error","message","String","obj","JSON","isValidAgentOutput","jsonMatch","match","record","output_type","lower","toLowerCase","test","extractConfidence","iteration","extractIteration","deliverables","extractDeliverables","extractErrors","metadata","agent_type","extractAgentType","timestamp","Date","toISOString","summary","extractSummary","metrics","extractMetrics","Object","keys","length","validation_type","extractValidationType","issues","extractIssues","recommendations","extractRecommendations","approved","extractApproval","decision","extractDecision","rationale","extractRationale","deliverables_validated","extractDeliverablesValidated","next_action","extractNextAction","consensusScore","extractConsensusScore","consensus_score","gateScore","extractGateScore","gate_score","value","parseFloat","parseInt","trim","filePatterns","pattern","exec","path","replace","status","extractDeliverableStatus","push","type","guessDeliverableType","includes","patterns","key","issuePatterns","severity","parseSeverity","category","score","errorPatterns","code","parserInstance","getParser","parseAgentOutput","resetParser"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/agent-output-parser.ts"],"sourcesContent":["/**\r\n * Agent Output Parser\r\n * Legacy stdout parser for backward compatibility\r\n *\r\n * @version 1.0.0\r\n * @description Converts unstructured text output to structured JSON\r\n */\r\n\r\nimport type {\r\n AgentOutput,\r\n Loop3Output,\r\n Loop2Output,\r\n ProductOwnerOutput,\r\n ParseResult,\r\n Deliverable,\r\n Issue,\r\n AgentError,\r\n} from '../types/agent-output.js';\r\n\r\n// ============================================================================\r\n// Parser Class\r\n// ============================================================================\r\n\r\n/**\r\n * AgentOutputParser: Legacy text output parser\r\n * Provides best-effort parsing of unstructured stdout\r\n */\r\nexport class AgentOutputParser {\r\n /**\r\n * Parse stdout text to structured agent output\r\n */\r\n public parse(text: string): ParseResult {\r\n const errors: string[] = [];\r\n let confidence = 0.5; // Default confidence for legacy parsing\r\n\r\n try {\r\n // Attempt to parse as JSON first\r\n const jsonOutput = this.tryParseJSON(text);\r\n if (jsonOutput) {\r\n return {\r\n success: true,\r\n output: jsonOutput,\r\n errors: [],\r\n confidence: 0.95,\r\n };\r\n }\r\n\r\n // Detect output type from text patterns\r\n const outputType = this.detectOutputType(text);\r\n\r\n // Parse based on detected type\r\n switch (outputType) {\r\n case 'loop3':\r\n return this.parseLoop3Text(text);\r\n case 'loop2':\r\n return this.parseLoop2Text(text);\r\n case 'product_owner':\r\n return this.parseProductOwnerText(text);\r\n default:\r\n return {\r\n success: false,\r\n errors: ['Unable to detect agent output type from text'],\r\n confidence: 0.0,\r\n };\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n errors: [\r\n `Parse error: ${error instanceof Error ? error.message : String(error)}`,\r\n ],\r\n confidence: 0.0,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Attempt to parse text as JSON\r\n */\r\n private tryParseJSON(text: string): AgentOutput | null {\r\n try {\r\n // Try parsing the entire text\r\n const obj = JSON.parse(text);\r\n if (this.isValidAgentOutput(obj)) {\r\n return obj as AgentOutput;\r\n }\r\n\r\n // Try extracting JSON from markdown code blocks\r\n const jsonMatch = text.match(/```json\\s*\\n([\\s\\S]*?)\\n```/);\r\n if (jsonMatch) {\r\n const obj = JSON.parse(jsonMatch[1]);\r\n if (this.isValidAgentOutput(obj)) {\r\n return obj as AgentOutput;\r\n }\r\n }\r\n\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Basic validation for agent output structure\r\n */\r\n private isValidAgentOutput(obj: unknown): boolean {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n const record = obj as Record<string, unknown>;\r\n return (\r\n typeof record.success === 'boolean' &&\r\n typeof record.confidence === 'number' &&\r\n typeof record.output_type === 'string' &&\r\n (record.output_type === 'loop3' ||\r\n record.output_type === 'loop2' ||\r\n record.output_type === 'product_owner')\r\n );\r\n }\r\n\r\n /**\r\n * Detect output type from text patterns\r\n */\r\n private detectOutputType(text: string): string {\r\n const lower = text.toLowerCase();\r\n\r\n // Check for Product Owner decision keywords\r\n if (\r\n /\\b(PROCEED|ITERATE|ABORT)\\b/.test(text) &&\r\n /\\b(decision|rationale)\\b/i.test(lower)\r\n ) {\r\n return 'product_owner';\r\n }\r\n\r\n // Check for Loop 2 validation keywords\r\n if (\r\n /\\b(approved|rejected|consensus|validation)\\b/i.test(lower) &&\r\n /\\b(issues?|recommendations?)\\b/i.test(lower)\r\n ) {\r\n return 'loop2';\r\n }\r\n\r\n // Check for Loop 3 implementation keywords\r\n if (\r\n /\\b(deliverables?|implementation|created|modified)\\b/i.test(lower) ||\r\n /\\b(files? (created|modified))\\b/i.test(lower)\r\n ) {\r\n return 'loop3';\r\n }\r\n\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Parse Loop 3 implementer text output\r\n */\r\n private parseLoop3Text(text: string): ParseResult {\r\n const output: Loop3Output = {\r\n output_type: 'loop3',\r\n success: true,\r\n confidence: this.extractConfidence(text),\r\n iteration: this.extractIteration(text),\r\n deliverables: this.extractDeliverables(text),\r\n errors: this.extractErrors(text),\r\n metadata: {\r\n agent_type: this.extractAgentType(text) || 'unknown',\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n\r\n // Extract optional fields\r\n const summary = this.extractSummary(text);\r\n if (summary) {\r\n output.summary = summary;\r\n }\r\n\r\n const metrics = this.extractMetrics(text);\r\n if (Object.keys(metrics).length > 0) {\r\n output.metrics = metrics;\r\n }\r\n\r\n return {\r\n success: true,\r\n output,\r\n errors: [],\r\n confidence: 0.7,\r\n };\r\n }\r\n\r\n /**\r\n * Parse Loop 2 validator text output\r\n */\r\n private parseLoop2Text(text: string): ParseResult {\r\n const output: Loop2Output = {\r\n output_type: 'loop2',\r\n success: true,\r\n confidence: this.extractConfidence(text),\r\n iteration: this.extractIteration(text),\r\n validation_type: this.extractValidationType(text),\r\n issues: this.extractIssues(text),\r\n recommendations: this.extractRecommendations(text),\r\n approved: this.extractApproval(text),\r\n errors: this.extractErrors(text),\r\n metadata: {\r\n agent_type: this.extractAgentType(text) || 'reviewer',\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n\r\n const summary = this.extractSummary(text);\r\n if (summary) {\r\n output.summary = summary;\r\n }\r\n\r\n return {\r\n success: true,\r\n output,\r\n errors: [],\r\n confidence: 0.7,\r\n };\r\n }\r\n\r\n /**\r\n * Parse Product Owner text output\r\n */\r\n private parseProductOwnerText(text: string): ParseResult {\r\n const decision = this.extractDecision(text);\r\n if (!decision) {\r\n return {\r\n success: false,\r\n errors: ['Unable to extract Product Owner decision'],\r\n confidence: 0.0,\r\n };\r\n }\r\n\r\n const output: ProductOwnerOutput = {\r\n output_type: 'product_owner',\r\n success: true,\r\n confidence: this.extractConfidence(text),\r\n iteration: this.extractIteration(text),\r\n decision,\r\n rationale: this.extractRationale(text),\r\n deliverables_validated: this.extractDeliverablesValidated(text),\r\n next_action: this.extractNextAction(text),\r\n errors: this.extractErrors(text),\r\n metadata: {\r\n agent_type: 'product-owner',\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n\r\n const consensusScore = this.extractConsensusScore(text);\r\n if (consensusScore !== null) {\r\n output.consensus_score = consensusScore;\r\n }\r\n\r\n const gateScore = this.extractGateScore(text);\r\n if (gateScore !== null) {\r\n output.gate_score = gateScore;\r\n }\r\n\r\n return {\r\n success: true,\r\n output,\r\n errors: [],\r\n confidence: 0.75,\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // Extraction Helper Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Extract confidence score from text\r\n */\r\n private extractConfidence(text: string): number {\r\n // Look for explicit confidence score (fixed regex to match only valid decimals)\r\n const match =\r\n text.match(/confidence[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i) ||\r\n text.match(/confidence score[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n // Handle both 0.0-1.0 and 0-100 formats\r\n if (value >= 0 && value <= 1) {\r\n return value;\r\n }\r\n if (value > 1 && value <= 100) {\r\n return value / 100;\r\n }\r\n }\r\n\r\n // Default confidence for parsed text\r\n return 0.7;\r\n }\r\n\r\n /**\r\n * Extract iteration number from text\r\n */\r\n private extractIteration(text: string): number {\r\n const match =\r\n text.match(/iteration[:\\s]+(\\d+)/i) ||\r\n text.match(/iteration (\\d+)/i);\r\n\r\n if (match) {\r\n return parseInt(match[1], 10);\r\n }\r\n\r\n return 1; // Default to iteration 1\r\n }\r\n\r\n /**\r\n * Extract agent type from text\r\n */\r\n private extractAgentType(text: string): string | null {\r\n const match =\r\n text.match(/agent[_\\s]?type[:\\s]+([a-z-]+)/i) ||\r\n text.match(/agent[:\\s]+([a-z-]+)/i);\r\n\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Extract summary from text\r\n */\r\n private extractSummary(text: string): string | null {\r\n const match =\r\n text.match(/summary[:\\s]+(.+?)(?:\\n\\n|\\n[A-Z]|$)/is) ||\r\n text.match(/## Summary\\s*\\n(.+?)(?:\\n\\n|\\n#|$)/is);\r\n\r\n return match ? match[1].trim() : null;\r\n }\r\n\r\n /**\r\n * Extract deliverables from text\r\n */\r\n private extractDeliverables(text: string): Deliverable[] {\r\n const deliverables: Deliverable[] = [];\r\n\r\n // Look for file listings\r\n const filePatterns = [\r\n /(?:created|modified|deleted)[:\\s]+([^\\n]+)/gi,\r\n /[-*]\\s+(?:created|modified|deleted)[:\\s]+([^\\n]+)/gi,\r\n /[-*]\\s+`([^`]+)`\\s+-\\s+(created|modified|deleted)/gi,\r\n ];\r\n\r\n for (const pattern of filePatterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n const path = match[1].trim().replace(/`/g, '');\r\n const status = this.extractDeliverableStatus(match[0]);\r\n\r\n deliverables.push({\r\n path,\r\n type: this.guessDeliverableType(path),\r\n status: status || 'created',\r\n });\r\n }\r\n }\r\n\r\n return deliverables;\r\n }\r\n\r\n /**\r\n * Extract deliverable status from text\r\n */\r\n private extractDeliverableStatus(\r\n text: string\r\n ): 'created' | 'modified' | 'deleted' | null {\r\n const lower = text.toLowerCase();\r\n if (lower.includes('created')) return 'created';\r\n if (lower.includes('modified')) return 'modified';\r\n if (lower.includes('deleted')) return 'deleted';\r\n return null;\r\n }\r\n\r\n /**\r\n * Guess deliverable type from file path\r\n */\r\n private guessDeliverableType(path: string): Deliverable['type'] {\r\n const lower = path.toLowerCase();\r\n\r\n if (lower.match(/\\.test\\.|\\.spec\\.|test\\/|tests\\//)) return 'test';\r\n if (lower.match(/\\.md$|readme|docs?\\//)) return 'documentation';\r\n if (lower.match(/\\.json$|\\.ya?ml$|\\.toml$|\\.ini$/)) return 'config';\r\n if (lower.match(/schema|\\.graphql$/)) return 'schema';\r\n if (lower.match(/\\.sh$|\\.bash$|scripts?\\//)) return 'script';\r\n if (lower.match(/\\.ts$|\\.js$|\\.py$|src\\//)) return 'implementation';\r\n\r\n return 'other';\r\n }\r\n\r\n /**\r\n * Extract metrics from text\r\n */\r\n private extractMetrics(text: string): Record<string, number> {\r\n const metrics: Record<string, number> = {};\r\n\r\n const patterns = [\r\n { key: 'files_created', pattern: /(\\d+)\\s+files?\\s+created/i },\r\n { key: 'files_modified', pattern: /(\\d+)\\s+files?\\s+modified/i },\r\n { key: 'lines_of_code', pattern: /(\\d+)\\s+lines?\\s+of\\s+code/i },\r\n {\r\n key: 'test_coverage',\r\n pattern: /(?:coverage|test coverage)[:\\s]+([0-9]+(?:\\.[0-9]+)?)%?/i,\r\n },\r\n { key: 'tests_passed', pattern: /(\\d+)\\s+tests?\\s+passed/i },\r\n { key: 'tests_failed', pattern: /(\\d+)\\s+tests?\\s+failed/i },\r\n ];\r\n\r\n for (const { key, pattern } of patterns) {\r\n const match = text.match(pattern);\r\n if (match) {\r\n let value = parseFloat(match[1]);\r\n // Convert percentage to 0.0-1.0 for test_coverage\r\n if (key === 'test_coverage' && value > 1) {\r\n value = value / 100;\r\n }\r\n metrics[key] = value;\r\n }\r\n }\r\n\r\n return metrics;\r\n }\r\n\r\n /**\r\n * Extract validation type from text\r\n */\r\n private extractValidationType(text: string): Loop2Output['validation_type'] {\r\n const lower = text.toLowerCase();\r\n\r\n if (lower.includes('security')) return 'security';\r\n if (lower.includes('test')) return 'test';\r\n if (lower.includes('architecture')) return 'architecture';\r\n if (lower.includes('performance')) return 'performance';\r\n if (lower.includes('compliance')) return 'compliance';\r\n\r\n return 'review'; // Default\r\n }\r\n\r\n /**\r\n * Extract issues from text\r\n */\r\n private extractIssues(text: string): Issue[] {\r\n const issues: Issue[] = [];\r\n\r\n // Look for issue listings\r\n const issuePatterns = [\r\n /[-*]\\s+\\[([^\\]]+)\\]\\s+([^\\n]+)/g,\r\n /[-*]\\s+(critical|high|medium|low|info)[:\\s]+([^\\n]+)/gi,\r\n ];\r\n\r\n for (const pattern of issuePatterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n const severity = this.parseSeverity(match[1]);\r\n const message = match[2].trim();\r\n\r\n issues.push({\r\n severity,\r\n category: 'other',\r\n message,\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * Parse severity from text\r\n */\r\n private parseSeverity(text: string): Issue['severity'] {\r\n const lower = text.toLowerCase();\r\n\r\n if (lower.includes('critical')) return 'critical';\r\n if (lower.includes('high')) return 'high';\r\n if (lower.includes('medium')) return 'medium';\r\n if (lower.includes('low')) return 'low';\r\n\r\n return 'info';\r\n }\r\n\r\n /**\r\n * Extract recommendations from text\r\n */\r\n private extractRecommendations(text: string): string[] {\r\n const recommendations: string[] = [];\r\n\r\n // Look for recommendation listings\r\n const patterns = [\r\n /recommendation[s]?[:\\s]+([^\\n]+)/gi,\r\n /[-*]\\s+(?:recommend|suggestion)[:\\s]+([^\\n]+)/gi,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n recommendations.push(match[1].trim());\r\n }\r\n }\r\n\r\n return recommendations;\r\n }\r\n\r\n /**\r\n * Extract approval status from text\r\n */\r\n private extractApproval(text: string): boolean {\r\n const lower = text.toLowerCase();\r\n\r\n // Explicit approval/rejection\r\n if (/\\bapproved\\b/i.test(text)) return true;\r\n if (/\\brejected\\b/i.test(text)) return false;\r\n\r\n // Implicit approval from consensus (fixed regex to match only valid decimals)\r\n if (/consensus[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i.test(text)) {\r\n const match = text.match(/consensus[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n if (match) {\r\n const score = parseFloat(match[1]);\r\n return score >= 0.9; // Default threshold\r\n }\r\n }\r\n\r\n return false; // Default to not approved\r\n }\r\n\r\n /**\r\n * Extract Product Owner decision\r\n */\r\n private extractDecision(\r\n text: string\r\n ): ProductOwnerOutput['decision'] | null {\r\n const match = text.match(/\\b(PROCEED|ITERATE|ABORT)\\b/);\r\n return match ? (match[1] as ProductOwnerOutput['decision']) : null;\r\n }\r\n\r\n /**\r\n * Extract rationale from text\r\n */\r\n private extractRationale(text: string): string {\r\n const match =\r\n text.match(/rationale[:\\s]+(.+?)(?:\\n\\n|\\n[A-Z]|$)/is) ||\r\n text.match(/reason[:\\s]+(.+?)(?:\\n\\n|\\n[A-Z]|$)/is);\r\n\r\n return match\r\n ? match[1].trim()\r\n : 'No rationale provided in legacy output';\r\n }\r\n\r\n /**\r\n * Extract deliverables validated status\r\n */\r\n private extractDeliverablesValidated(text: string): boolean {\r\n const lower = text.toLowerCase();\r\n return (\r\n lower.includes('deliverables validated') ||\r\n lower.includes('all deliverables') ||\r\n lower.includes('deliverables complete')\r\n );\r\n }\r\n\r\n /**\r\n * Extract next action from text\r\n */\r\n private extractNextAction(text: string): string {\r\n const match =\r\n text.match(/next[_\\s]action[:\\s]+([^\\n]+)/i) ||\r\n text.match(/action[:\\s]+([^\\n]+)/i);\r\n\r\n if (match) {\r\n return match[1].trim();\r\n }\r\n\r\n // Infer from decision\r\n const decision = this.extractDecision(text);\r\n if (decision === 'PROCEED') return 'mark_task_complete';\r\n if (decision === 'ITERATE') return 'start_next_iteration';\r\n if (decision === 'ABORT') return 'abort_task';\r\n\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Extract consensus score from text\r\n */\r\n private extractConsensusScore(text: string): number | null {\r\n const match =\r\n text.match(/consensus[_\\s]score[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i) ||\r\n text.match(/consensus[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n return value >= 0 && value <= 1 ? value : value / 100;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract gate score from text\r\n */\r\n private extractGateScore(text: string): number | null {\r\n const match =\r\n text.match(/gate[_\\s]score[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i) ||\r\n text.match(/gate[:\\s]+([0-9]+(?:\\.[0-9]+)?)/i);\r\n\r\n if (match) {\r\n const value = parseFloat(match[1]);\r\n return value >= 0 && value <= 1 ? value : value / 100;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract errors from text\r\n */\r\n private extractErrors(text: string): AgentError[] {\r\n const errors: AgentError[] = [];\r\n\r\n // Look for error listings\r\n const errorPatterns = [\r\n /error[:\\s]+\\[([^\\]]+)\\]\\s+([^\\n]+)/gi,\r\n /\\[ERROR\\]\\s+([^\\n]+)/gi,\r\n ];\r\n\r\n for (const pattern of errorPatterns) {\r\n let match;\r\n while ((match = pattern.exec(text)) !== null) {\r\n const code = match[1] || 'UNKNOWN_ERROR';\r\n const message = match[2] || match[1];\r\n\r\n errors.push({\r\n code: code.trim(),\r\n message: message.trim(),\r\n });\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Singleton Instance and Convenience Functions\r\n// ============================================================================\r\n\r\nlet parserInstance: AgentOutputParser | null = null;\r\n\r\n/**\r\n * Get or create parser instance\r\n */\r\nexport function getParser(): AgentOutputParser {\r\n if (!parserInstance) {\r\n parserInstance = new AgentOutputParser();\r\n }\r\n return parserInstance;\r\n}\r\n\r\n/**\r\n * Parse text output to structured agent output\r\n */\r\nexport function parseAgentOutput(text: string): ParseResult {\r\n return getParser().parse(text);\r\n}\r\n\r\n/**\r\n * Reset parser instance (useful for testing)\r\n */\r\nexport function resetParser(): void {\r\n parserInstance = null;\r\n}\r\n\r\nexport default AgentOutputParser;\r\n"],"names":["AgentOutputParser","parse","text","errors","confidence","jsonOutput","tryParseJSON","success","output","outputType","detectOutputType","parseLoop3Text","parseLoop2Text","parseProductOwnerText","error","Error","message","String","obj","JSON","isValidAgentOutput","jsonMatch","match","record","output_type","lower","toLowerCase","test","extractConfidence","iteration","extractIteration","deliverables","extractDeliverables","extractErrors","metadata","agent_type","extractAgentType","timestamp","Date","toISOString","summary","extractSummary","metrics","extractMetrics","Object","keys","length","validation_type","extractValidationType","issues","extractIssues","recommendations","extractRecommendations","approved","extractApproval","decision","extractDecision","rationale","extractRationale","deliverables_validated","extractDeliverablesValidated","next_action","extractNextAction","consensusScore","extractConsensusScore","consensus_score","gateScore","extractGateScore","gate_score","value","parseFloat","parseInt","trim","filePatterns","pattern","exec","path","replace","status","extractDeliverableStatus","push","type","guessDeliverableType","includes","patterns","key","issuePatterns","severity","parseSeverity","category","score","errorPatterns","code","parserInstance","getParser","parseAgentOutput","resetParser"],"mappings":"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"}