claude-flow-novice 2.15.3 → 2.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -177
- package/readme/README.md +19 -4
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- 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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"}
|