claude-flow-novice 2.15.11 → 2.16.1
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/agents/cfn-v3-coordinator.md +517 -0
- package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/.claude/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/.claude/commands/cfn-loop-cli.md +214 -442
- package/.claude/commands/cfn-loop-frontend.md +1 -1
- package/.claude/commands/cfn-loop-task.md +2 -2
- package/.claude/commands/cfn-loop-trigger.md +114 -0
- package/.claude/commands/deprecated/cfn-loop.md +2 -2
- package/.claude/hooks/cfn-invoke-post-edit-ts.sh +100 -0
- package/.claude/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
- package/.claude/hooks/cfn-invoke-post-edit.sh +53 -5
- package/.claude/hooks/cfn-invoke-post-edit.sh.backup +87 -0
- package/.claude/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
- package/.claude/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
- package/.claude/hooks/cfn-invoke-pre-edit.sh +22 -0
- package/.claude/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
- package/.claude/hooks/cfn-post-edit.config.json +9 -2
- package/.claude/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/.claude/skills/cfn-agent-spawning/SKILL.md +48 -1
- package/.claude/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
- package/.claude/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
- package/.claude/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
- package/.claude/skills/{cfn-redis-coordination/check-dependencies.sh → cfn-agent-spawning/check-dependencies.sh.backup} +3 -5
- package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
- package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
- package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
- package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
- package/.claude/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
- package/.claude/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
- package/.claude/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
- package/.claude/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
- package/.claude/skills/cfn-backlog-management/SKILL.md +1 -1
- package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
- package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
- package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
- package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
- package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
- package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
- package/.claude/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
- package/.claude/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
- package/.claude/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
- package/.claude/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
- package/.claude/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
- package/.claude/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
- package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
- package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
- package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
- package/.claude/skills/cfn-loop-orchestration/SKILL.md +159 -48
- package/.claude/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
- package/.claude/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
- package/.claude/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
- package/.claude/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
- package/.claude/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
- package/.claude/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
- package/.claude/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
- package/.claude/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
- package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
- package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
- package/.claude/skills/cfn-loop-orchestration/{orchestrate-wrapper.sh → archive/legacy-bash/orchestrate-wrapper.sh} +11 -1
- package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
- package/.claude/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
- package/.claude/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
- package/.claude/skills/cfn-loop-orchestration/package-lock.json +3 -0
- package/.claude/skills/cfn-loop-orchestration/package.json +4 -0
- package/.claude/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
- package/.claude/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
- package/.claude/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
- package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
- package/.claude/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
- package/.claude/skills/cfn-loop-orchestration/src/index.ts +2 -0
- package/.claude/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
- package/.claude/skills/cfn-loop-orchestration/src/types.ts +56 -0
- package/.claude/skills/cfn-loop-orchestration/test-cli.sh +92 -0
- package/.claude/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
- package/.claude/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
- package/.claude/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
- package/.claude/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
- package/.claude/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
- package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
- package/.claude/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
- package/.claude/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
- package/.claude/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
- package/.claude/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
- package/.claude/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
- package/.claude/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
- package/.claude/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
- package/.claude/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
- package/.claude/skills/cfn-loop-validation/INDEX.md +531 -0
- package/.claude/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
- package/.claude/skills/cfn-loop-validation/SKILL.md +48 -1
- package/.claude/skills/cfn-loop-validation/SKILL.md.backup +353 -0
- package/.claude/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
- package/.claude/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
- package/.claude/skills/cfn-loop-validation/check-dependencies.sh +22 -0
- package/{claude-assets/skills/cfn-redis-coordination/check-dependencies.sh → .claude/skills/cfn-loop-validation/check-dependencies.sh.backup} +4 -5
- package/.claude/skills/cfn-loop-validation/detect-vapor.sh +59 -0
- package/.claude/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
- package/.claude/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
- package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/types.d.ts +156 -0
- package/.claude/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/types.js +66 -0
- package/.claude/skills/cfn-loop-validation/dist/types.js.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
- package/.claude/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
- package/.claude/skills/cfn-loop-validation/dist/validator.js +411 -0
- package/.claude/skills/cfn-loop-validation/dist/validator.js.map +1 -0
- package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
- package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
- package/.claude/skills/cfn-loop-validation/package.json +93 -0
- package/.claude/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
- package/.claude/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
- package/.claude/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
- package/.claude/skills/cfn-loop-validation/src/types.ts +215 -0
- package/.claude/skills/cfn-loop-validation/src/validator.ts +503 -0
- package/.claude/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
- package/.claude/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
- package/.claude/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
- package/.claude/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
- package/.claude/skills/cfn-loop-validation/validate-gate.sh +63 -0
- package/.claude/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
- package/.claude/skills/cfn-loop-validation/validate-iteration.sh +22 -0
- package/.claude/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
- package/.claude/skills/cfn-product-owner-decision/SKILL.md +479 -147
- package/.claude/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
- package/.claude/skills/cfn-product-owner-decision/{execute-decision.sh → archive/legacy-bash/execute-decision.sh} +24 -2
- package/.claude/skills/pre-edit-backup/SKILL.md +324 -0
- package/.claude/skills/pre-edit-backup/SKILL.md.backup +277 -0
- package/.claude/skills/pre-edit-backup/backup.sh +22 -0
- package/.claude/skills/pre-edit-backup/backup.sh.backup +107 -0
- package/claude-assets/agents/cfn-dev-team/analysts/root-cause-analyst.md +2 -2
- package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +3 -2
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +1 -0
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +2 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +1 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +11 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +58 -35
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +47 -37
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +18 -18
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +40 -58
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +19 -21
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +20 -29
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -19
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -10
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +16 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +16 -26
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +18 -22
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +17 -21
- package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/product-owner.md +1 -5
- package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +20 -51
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +22 -71
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +21 -64
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +22 -67
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +24 -68
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +8 -36
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +9 -38
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +17 -55
- 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 +18 -56
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +9 -37
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +18 -56
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +18 -49
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +8 -37
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +7 -27
- package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +11 -0
- package/claude-assets/agents/cfn-dev-team/utility/analyst.md +13 -29
- package/claude-assets/agents/cfn-dev-team/utility/claude-code-expert.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +13 -13
- package/claude-assets/agents/cfn-dev-team/utility/context-curator.md +7 -2
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +6 -11
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +121 -715
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +13 -22
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +147 -573
- package/claude-assets/agents/custom/cfn-docker-expert.md +103 -0
- package/claude-assets/agents/custom/cfn-loops-cli-expert.md +438 -0
- package/claude-assets/agents/custom/cfn-redis-operations.md +529 -529
- package/claude-assets/agents/custom/cfn-system-expert.md +1 -1
- package/claude-assets/agents/custom/trigger-dev-expert.md +369 -0
- package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -747
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/agents/cfn-v3-coordinator.md +517 -0
- package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/claude-assets/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/claude-assets/commands/cfn-loop-cli.md +214 -442
- package/claude-assets/commands/cfn-loop-frontend.md +1 -1
- package/claude-assets/commands/cfn-loop-task.md +2 -2
- package/claude-assets/commands/cfn-loop-trigger.md +114 -0
- package/claude-assets/commands/deprecated/cfn-loop.md +2 -2
- package/claude-assets/hooks/GIT-HOOKS-USAGE-EXAMPLES.md +116 -0
- package/claude-assets/hooks/README-GIT-HOOKS.md +443 -0
- package/claude-assets/hooks/SKILL.md +518 -0
- package/claude-assets/hooks/SKILL.md.backup +471 -0
- package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh +100 -0
- package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
- package/claude-assets/hooks/cfn-invoke-post-edit.sh +53 -5
- package/claude-assets/hooks/cfn-invoke-post-edit.sh.backup +87 -0
- package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
- package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
- package/claude-assets/hooks/cfn-invoke-pre-edit.sh +22 -0
- package/claude-assets/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
- package/claude-assets/hooks/cfn-post-edit.config.json +9 -2
- package/claude-assets/hooks/install-git-hooks.sh +243 -0
- package/claude-assets/hooks/subagent-start.sh +98 -0
- package/claude-assets/hooks/subagent-stop.sh +93 -0
- package/claude-assets/hooks/validators/credential-scanner.sh +172 -0
- package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/claude-assets/skills/cfn-agent-selection-with-fallback/DELIVERABLES.md +409 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/IMPLEMENTATION_SUMMARY.md +396 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_GUIDE.md +308 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/QUICK_REFERENCE.md +239 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +107 -1
- package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md.backup +302 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/TYPESCRIPT_MIGRATION.md +295 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.cjs +297 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.js +297 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.cjs +96 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.js +96 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh +45 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh.backup +23 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +22 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh.backup +173 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.test.ts +357 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.ts +350 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/src/cli.ts +74 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +22 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh.backup +71 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/tsconfig.json +18 -0
- package/claude-assets/skills/cfn-agent-spawning/SKILL.md +48 -1
- package/claude-assets/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
- package/claude-assets/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
- package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
- package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh.backup +30 -0
- package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
- package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
- package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
- package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
- package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
- package/claude-assets/skills/cfn-backlog-management/SKILL.md +1 -1
- package/claude-assets/skills/cfn-coordination/agent-completion.sh.backup +36 -0
- package/claude-assets/skills/cfn-coordination/coordination-signal.sh.backup +36 -0
- package/claude-assets/skills/cfn-coordination/coordination-wait.sh.backup +36 -0
- package/claude-assets/skills/cfn-dependency-ingestion/README.md +101 -0
- package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +397 -0
- package/claude-assets/skills/cfn-dependency-ingestion/build.sh +23 -0
- package/claude-assets/skills/cfn-dependency-ingestion/dist/ingest-dependencies.js +478 -0
- package/claude-assets/skills/cfn-dependency-ingestion/ingest-dependencies.sh +295 -0
- package/claude-assets/skills/cfn-dependency-ingestion/ingest.sh +237 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/cli-mode-dependencies.txt +73 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/shared-dependencies.txt +57 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-dev-dependencies.txt +82 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-mode-dependencies.txt +80 -0
- package/claude-assets/skills/cfn-dependency-ingestion/src/ingest-dependencies.ts +563 -0
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +14 -4
- package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
- package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
- package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
- package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
- package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
- package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
- package/claude-assets/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
- package/claude-assets/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
- package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
- package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
- package/claude-assets/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
- package/claude-assets/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
- package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
- package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
- package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
- package/claude-assets/skills/cfn-loop-orchestration/SKILL.md +159 -48
- package/claude-assets/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
- package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
- package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
- package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
- package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
- package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
- package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
- package/claude-assets/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
- package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
- package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
- package/claude-assets/skills/cfn-loop-orchestration/{orchestrate-wrapper.sh → archive/legacy-bash/orchestrate-wrapper.sh} +11 -1
- package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
- package/claude-assets/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
- package/claude-assets/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
- package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +3 -0
- package/claude-assets/skills/cfn-loop-orchestration/package.json +4 -0
- package/claude-assets/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +2 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
- package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +56 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-cli.sh +92 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
- package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
- package/claude-assets/skills/cfn-loop-output-processing/.eslintrc.json +33 -0
- package/claude-assets/skills/cfn-loop-output-processing/DELIVERY_SUMMARY.txt +462 -0
- package/claude-assets/skills/cfn-loop-output-processing/DEPRECATION_NOTICE.md +183 -0
- package/claude-assets/skills/cfn-loop-output-processing/EXAMPLES.md +609 -0
- package/claude-assets/skills/cfn-loop-output-processing/IMPLEMENTATION_SUMMARY.md +418 -0
- package/claude-assets/skills/cfn-loop-output-processing/INDEX.md +531 -0
- package/claude-assets/skills/cfn-loop-output-processing/MIGRATION.md +362 -0
- package/claude-assets/skills/cfn-loop-output-processing/README.md +114 -0
- package/claude-assets/skills/cfn-loop-output-processing/SKILL.md +633 -0
- package/{.claude/skills/cfn-docker-redis-coordination → claude-assets/skills/cfn-loop-output-processing}/jest.config.js +7 -15
- package/claude-assets/skills/cfn-loop-output-processing/package.json +50 -0
- package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop2.ts +195 -0
- package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop3.ts +157 -0
- package/claude-assets/skills/cfn-loop-output-processing/src/output-processor.ts +632 -0
- package/claude-assets/skills/cfn-loop-output-processing/tests/output-processor.test.ts +617 -0
- package/claude-assets/skills/{cfn-docker-redis-coordination → cfn-loop-output-processing}/tsconfig.json +16 -7
- package/claude-assets/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
- package/claude-assets/skills/cfn-loop-validation/INDEX.md +531 -0
- package/claude-assets/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
- package/claude-assets/skills/cfn-loop-validation/SKILL.md +48 -1
- package/claude-assets/skills/cfn-loop-validation/SKILL.md.backup +353 -0
- package/claude-assets/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
- package/claude-assets/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
- package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh +22 -0
- package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh.backup +31 -0
- package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh +59 -0
- package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
- package/claude-assets/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
- package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts +156 -0
- package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/types.js +66 -0
- package/claude-assets/skills/cfn-loop-validation/dist/types.js.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
- package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/dist/validator.js +411 -0
- package/claude-assets/skills/cfn-loop-validation/dist/validator.js.map +1 -0
- package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
- package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
- package/claude-assets/skills/cfn-loop-validation/package.json +93 -0
- package/claude-assets/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
- package/claude-assets/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
- package/claude-assets/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
- package/claude-assets/skills/cfn-loop-validation/src/types.ts +215 -0
- package/claude-assets/skills/cfn-loop-validation/src/validator.ts +503 -0
- package/claude-assets/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
- package/claude-assets/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
- package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
- package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
- package/claude-assets/skills/cfn-loop-validation/validate-gate.sh +63 -0
- package/claude-assets/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
- package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh +22 -0
- package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
- package/claude-assets/skills/cfn-product-owner-decision/SKILL.md +479 -147
- package/claude-assets/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
- package/claude-assets/skills/cfn-product-owner-decision/{execute-decision.sh → archive/legacy-bash/execute-decision.sh} +24 -2
- package/claude-assets/skills/cfn-provider-routing/README.md +129 -0
- package/claude-assets/skills/cfn-provider-routing/SKILL.md +215 -0
- package/claude-assets/skills/cfn-provider-routing/resolve-provider-model.ts +223 -0
- package/claude-assets/skills/docker-build/build.sh +1 -1
- package/claude-assets/skills/pre-edit-backup/SKILL.md +324 -0
- package/claude-assets/skills/pre-edit-backup/SKILL.md.backup +277 -0
- package/claude-assets/skills/pre-edit-backup/backup.sh +22 -0
- package/claude-assets/skills/pre-edit-backup/backup.sh.backup +107 -0
- package/dist/agent/skill-mcp-selector.js +2 -1
- package/dist/agent/skill-mcp-selector.js.map +1 -1
- package/dist/api/auth-endpoints.js +415 -0
- package/dist/api/auth-endpoints.js.map +1 -0
- package/dist/api/task-endpoints.js +562 -0
- package/dist/api/task-endpoints.js.map +1 -0
- package/dist/backend/server.js +418 -0
- package/dist/backend/server.js.map +1 -0
- package/dist/cfn-loop/product-owner/decision-parser.js +356 -0
- package/dist/cfn-loop/product-owner/decision-parser.js.map +1 -0
- package/dist/cfn-loop/product-owner/index.js +1 -0
- package/dist/cfn-loop/product-owner/index.js.map +1 -1
- package/dist/cli/agent-command.js +1 -1
- package/dist/cli/agent-command.js.map +1 -1
- package/dist/cli/agent-completion.js +273 -0
- package/dist/cli/agent-completion.js.map +1 -0
- package/dist/cli/agent-executor.js +470 -26
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +83 -48
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +7 -4
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/agent-spawner.js +546 -0
- package/dist/cli/agent-spawner.js.map +1 -0
- package/dist/cli/agent-token-manager.js +2 -1
- package/dist/cli/agent-token-manager.js.map +1 -1
- package/dist/cli/anthropic-client.js +127 -14
- package/dist/cli/anthropic-client.js.map +1 -1
- package/dist/cli/cfn-context.js +2 -1
- package/dist/cli/cfn-context.js.map +1 -1
- package/dist/cli/cfn-metrics.js +2 -1
- package/dist/cli/cfn-metrics.js.map +1 -1
- package/dist/cli/cfn-redis.js +2 -1
- package/dist/cli/cfn-redis.js.map +1 -1
- package/dist/cli/cli-agent-context.js +2 -0
- package/dist/cli/cli-agent-context.js.map +1 -1
- package/dist/cli/config-manager.js +90 -356
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +2 -1
- package/dist/cli/conversation-fork-cleanup.js.map +1 -1
- package/dist/cli/conversation-fork.js +2 -1
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/coordination/agent-messaging.js +415 -0
- package/dist/cli/coordination/agent-messaging.js.map +1 -0
- package/dist/cli/coordination/wait-for-threshold.js +232 -0
- package/dist/cli/coordination/wait-for-threshold.js.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/iteration-history.js +2 -1
- package/dist/cli/iteration-history.js.map +1 -1
- package/dist/cli/parse-decision-cli.js +268 -0
- package/dist/cli/parse-decision-cli.js.map +1 -0
- package/dist/cli/post-edit-hook.js +83 -0
- package/dist/cli/post-edit-hook.js.map +1 -0
- package/dist/cli/pre-edit-hook.js +77 -0
- package/dist/cli/pre-edit-hook.js.map +1 -0
- package/dist/cli/process-lifecycle.js +5 -1
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/spawn-agent-cli.js +244 -0
- package/dist/cli/spawn-agent-cli.js.map +1 -0
- package/dist/coordination/coordination-wrapper.js +383 -0
- package/dist/coordination/coordination-wrapper.js.map +1 -0
- package/dist/coordination/redis-waiting-mode.js +4 -0
- package/dist/coordination/redis-waiting-mode.js.map +1 -1
- package/dist/coordination/store-success-criteria.js +68 -0
- package/dist/coordination/store-success-criteria.js.map +1 -0
- package/dist/coordination/store-task-context.js +65 -0
- package/dist/coordination/store-task-context.js.map +1 -0
- package/dist/hooks/backup-manager.js +273 -0
- package/dist/hooks/backup-manager.js.map +1 -0
- package/dist/hooks/post-edit-validator.js +388 -0
- package/dist/hooks/post-edit-validator.js.map +1 -0
- package/dist/integration/index.js +19 -0
- package/dist/integration/index.js.map +1 -0
- package/dist/integration/task-mode-adapter.js +297 -0
- package/dist/integration/task-mode-adapter.js.map +1 -0
- package/dist/integration/trigger-dev-client.js +253 -0
- package/dist/integration/trigger-dev-client.js.map +1 -0
- package/dist/integration/trigger-dev-webhooks.js +362 -0
- package/dist/integration/trigger-dev-webhooks.js.map +1 -0
- package/dist/lib/artifact-registry.js +4 -0
- package/dist/lib/artifact-registry.js.map +1 -1
- package/dist/lib/connection-pool.js +390 -0
- package/dist/lib/connection-pool.js.map +1 -0
- package/dist/lib/environment-contract.js +258 -0
- package/dist/lib/environment-contract.js.map +1 -0
- package/dist/lib/path-validator.js +14 -5
- package/dist/lib/path-validator.js.map +1 -1
- package/dist/lib/query-optimizer.js +388 -0
- package/dist/lib/query-optimizer.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +5 -1
- package/dist/lib/redis-queue-manager.js.map +1 -1
- package/dist/lib/result-cache.js +285 -0
- package/dist/lib/result-cache.js.map +1 -0
- package/dist/mcp/auth-middleware.js +2 -1
- package/dist/mcp/auth-middleware.js.map +1 -1
- package/dist/mcp/playwright-mcp-server-auth.js +2 -1
- package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
- package/dist/middleware/authentication.js +317 -0
- package/dist/middleware/authentication.js.map +1 -0
- package/dist/services/authentication.js +669 -0
- package/dist/services/authentication.js.map +1 -0
- package/dist/services/session-management.js +436 -0
- package/dist/services/session-management.js.map +1 -0
- package/dist/services/skill-deployment.js +8 -6
- package/dist/services/skill-deployment.js.map +1 -1
- package/dist/services/user-service.js +710 -0
- package/dist/services/user-service.js.map +1 -0
- package/dist/types/trigger-dev-events.d.js +10 -0
- package/dist/types/trigger-dev-events.d.js.map +1 -0
- package/docs/README.md +240 -0
- package/package.json +15 -4
- package/scripts/build-agent-image.sh +1 -1
- package/scripts/compare-workflow-performance.sh +556 -0
- package/scripts/cost-allocation-tracker.sh +632 -0
- package/scripts/docker-rebuild-all-agents.sh +2 -2
- package/scripts/migrate-to-optimized-workflows.sh +438 -0
- package/scripts/organize-docs.sh +338 -0
- package/scripts/reorganize-tests.sh +280 -0
- package/scripts/trigger-dev-setup.sh +279 -0
- package/tests/README.md +45 -0
- package/.claude/commands/cost-savings-status.md +0 -34
- package/.claude/commands/metrics-summary.md +0 -58
- package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
- package/.claude/skills/cfn-docker-redis-coordination/README.md +0 -294
- package/.claude/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
- package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
- package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
- package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
- package/.claude/skills/cfn-docker-redis-coordination/package.json +0 -40
- package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
- package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
- package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
- package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
- package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +0 -30
- package/.claude/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
- package/.claude/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
- package/.claude/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
- package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
- package/.claude/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
- package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
- package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
- package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
- package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
- package/.claude/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
- package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
- package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
- package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
- package/.claude/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
- package/.claude/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
- package/.claude/skills/cfn-redis-coordination/config.json +0 -61
- package/.claude/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
- package/.claude/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
- package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
- package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
- package/.claude/skills/cfn-redis-coordination/jest.config.js +0 -23
- package/.claude/skills/cfn-redis-coordination/package-lock.json +0 -5272
- package/.claude/skills/cfn-redis-coordination/package.json +0 -45
- package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
- package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
- package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
- package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
- package/.claude/skills/cfn-redis-coordination/src/index.ts +0 -82
- package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
- package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
- package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
- package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
- package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
- package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
- package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
- package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
- package/.claude/skills/cfn-redis-coordination/src/types.ts +0 -235
- package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
- package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
- package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
- package/.claude/skills/cfn-redis-coordination/test-redis-check.js +0 -84
- package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
- package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +0 -980
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +0 -759
- package/claude-assets/agents/custom/test-mcp-access.md +0 -24
- package/claude-assets/agents/typescript-specialist.md +0 -280
- package/claude-assets/commands/cost-savings-status.md +0 -34
- package/claude-assets/commands/metrics-summary.md +0 -58
- package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
- package/claude-assets/skills/cfn-docker-redis-coordination/README.md +0 -294
- package/claude-assets/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
- package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
- package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
- package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +0 -37
- package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
- package/claude-assets/skills/cfn-docker-redis-coordination/package.json +0 -40
- package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
- package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
- package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
- package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
- package/claude-assets/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
- package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
- package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
- package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
- package/claude-assets/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
- package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
- package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
- package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
- package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
- package/claude-assets/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
- package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
- package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
- package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
- package/claude-assets/skills/cfn-redis-cleanup/cleanup-redis.sh +0 -130
- package/claude-assets/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
- package/claude-assets/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
- package/claude-assets/skills/cfn-redis-coordination/config.json +0 -61
- package/claude-assets/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
- package/claude-assets/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
- package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
- package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
- package/claude-assets/skills/cfn-redis-coordination/jest.config.js +0 -23
- package/claude-assets/skills/cfn-redis-coordination/package-lock.json +0 -5272
- package/claude-assets/skills/cfn-redis-coordination/package.json +0 -45
- package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
- package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
- package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
- package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
- package/claude-assets/skills/cfn-redis-coordination/src/index.ts +0 -82
- package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
- package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
- package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
- package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
- package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
- package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
- package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
- package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
- package/claude-assets/skills/cfn-redis-coordination/src/types.ts +0 -235
- package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
- package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
- package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
- package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +0 -84
- package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
- package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
- package/claude-assets/skills/cfn-redis-data-extraction/SKILL.md +0 -442
- package/claude-assets/skills/cfn-redis-data-extraction/extract.sh +0 -306
- package/dist/coordination/index.js +0 -25
- package/dist/coordination/index.js.map +0 -1
- package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +0 -405
- package/docs/MEMORY_CLEANUP_GUIDE.md +0 -358
- package/docs/MEMORY_LEAK_FIX_SUMMARY.md +0 -322
- package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +0 -319
- package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +0 -574
- package/tests/test-memory-leak-task-mode.sh +0 -435
- /package/.claude/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
- /package/.claude/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
- /package/.claude/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
- /package/claude-assets/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
- /package/claude-assets/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trigger.dev Webhook Handlers for CFN Loop Integration
|
|
3
|
+
*
|
|
4
|
+
* Express router providing secure webhook endpoints for:
|
|
5
|
+
* - Agent completion events
|
|
6
|
+
* - Gate check results
|
|
7
|
+
* - Consensus collection results
|
|
8
|
+
* - Product Owner decisions
|
|
9
|
+
*
|
|
10
|
+
* Configuration:
|
|
11
|
+
* - WEBHOOK_SECRET: Shared secret for HMAC signature verification
|
|
12
|
+
* - WEBHOOK_ALGORITHM: Hash algorithm (default: sha256)
|
|
13
|
+
*/ import { Router } from 'express';
|
|
14
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
15
|
+
/**
|
|
16
|
+
* Webhook validation error class
|
|
17
|
+
*/ export class WebhookValidationError extends Error {
|
|
18
|
+
reason;
|
|
19
|
+
statusCode;
|
|
20
|
+
constructor(message, reason, statusCode = 401){
|
|
21
|
+
super(message), this.reason = reason, this.statusCode = statusCode;
|
|
22
|
+
this.name = 'WebhookValidationError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* TriggerDevWebhooks - Express router for secure webhook handling
|
|
27
|
+
*
|
|
28
|
+
* Provides endpoints:
|
|
29
|
+
* - POST /webhooks/agent-complete
|
|
30
|
+
* - POST /webhooks/gate-result
|
|
31
|
+
* - POST /webhooks/consensus-result
|
|
32
|
+
* - POST /webhooks/po-decision
|
|
33
|
+
*/ export class TriggerDevWebhooks {
|
|
34
|
+
router;
|
|
35
|
+
config;
|
|
36
|
+
verificationOptions;
|
|
37
|
+
// Handler maps for dependency injection
|
|
38
|
+
agentCompleteHandler;
|
|
39
|
+
gateResultHandler;
|
|
40
|
+
consensusResultHandler;
|
|
41
|
+
poDecisionHandler;
|
|
42
|
+
constructor(config){
|
|
43
|
+
this.router = Router();
|
|
44
|
+
this.config = {
|
|
45
|
+
secret: config?.secret || process.env.WEBHOOK_SECRET || 'default-secret',
|
|
46
|
+
algorithm: config?.algorithm || process.env.WEBHOOK_ALGORITHM || 'sha256',
|
|
47
|
+
verifySignature: config?.verifySignature !== false
|
|
48
|
+
};
|
|
49
|
+
this.verificationOptions = {
|
|
50
|
+
algorithmType: this.config.algorithm || 'sha256',
|
|
51
|
+
headerName: 'x-trigger-signature'
|
|
52
|
+
};
|
|
53
|
+
this.setupRoutes();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Register handler for agent completion events
|
|
57
|
+
*/ onAgentComplete(handler) {
|
|
58
|
+
this.agentCompleteHandler = handler;
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Register handler for gate result events
|
|
63
|
+
*/ onGateResult(handler) {
|
|
64
|
+
this.gateResultHandler = handler;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Register handler for consensus result events
|
|
69
|
+
*/ onConsensusResult(handler) {
|
|
70
|
+
this.consensusResultHandler = handler;
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Register handler for Product Owner decision events
|
|
75
|
+
*/ onPODecision(handler) {
|
|
76
|
+
this.poDecisionHandler = handler;
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get Express router for mounting
|
|
81
|
+
*/ getRouter() {
|
|
82
|
+
return this.router;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Setup all webhook routes
|
|
86
|
+
*
|
|
87
|
+
* @private
|
|
88
|
+
*/ setupRoutes() {
|
|
89
|
+
// Middleware for signature verification
|
|
90
|
+
this.router.use(this.signatureVerificationMiddleware.bind(this));
|
|
91
|
+
// Agent completion endpoint
|
|
92
|
+
this.router.post('/agent-complete', this.handleAgentComplete.bind(this));
|
|
93
|
+
// Gate result endpoint
|
|
94
|
+
this.router.post('/gate-result', this.handleGateResult.bind(this));
|
|
95
|
+
// Consensus result endpoint
|
|
96
|
+
this.router.post('/consensus-result', this.handleConsensusResult.bind(this));
|
|
97
|
+
// PO decision endpoint
|
|
98
|
+
this.router.post('/po-decision', this.handlePODecision.bind(this));
|
|
99
|
+
// Error handling middleware
|
|
100
|
+
this.router.use(this.errorHandler.bind(this));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Signature verification middleware
|
|
104
|
+
*
|
|
105
|
+
* TODO: RUNTIME_TEST: Verify HMAC signature validation with valid/invalid keys
|
|
106
|
+
*
|
|
107
|
+
* @private
|
|
108
|
+
*/ async signatureVerificationMiddleware(req, res, next) {
|
|
109
|
+
try {
|
|
110
|
+
if (!this.config.verifySignature) {
|
|
111
|
+
return next();
|
|
112
|
+
}
|
|
113
|
+
const signature = req.headers[this.verificationOptions.headerName];
|
|
114
|
+
if (!signature) {
|
|
115
|
+
throw new WebhookValidationError('Missing webhook signature', 'MISSING_SIGNATURE');
|
|
116
|
+
}
|
|
117
|
+
const body = JSON.stringify(req.body);
|
|
118
|
+
const isValid = await this.verifySignature(body, signature);
|
|
119
|
+
if (!isValid) {
|
|
120
|
+
throw new WebhookValidationError('Invalid webhook signature', 'INVALID_SIGNATURE');
|
|
121
|
+
}
|
|
122
|
+
next();
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (error instanceof WebhookValidationError) {
|
|
125
|
+
return res.status(error.statusCode).json({
|
|
126
|
+
success: false,
|
|
127
|
+
message: error.message,
|
|
128
|
+
reason: error.reason
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return res.status(500).json({
|
|
132
|
+
success: false,
|
|
133
|
+
message: 'Signature verification failed',
|
|
134
|
+
reason: 'INTERNAL_ERROR'
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Handle agent completion webhook
|
|
140
|
+
*
|
|
141
|
+
* @private
|
|
142
|
+
*/ async handleAgentComplete(req, res) {
|
|
143
|
+
try {
|
|
144
|
+
const payload = req.body;
|
|
145
|
+
// Validate required fields
|
|
146
|
+
if (!payload.agentId || !payload.taskId) {
|
|
147
|
+
return res.status(400).json({
|
|
148
|
+
success: false,
|
|
149
|
+
message: 'Missing required fields',
|
|
150
|
+
data: null
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const context = {
|
|
154
|
+
payload,
|
|
155
|
+
isVerified: this.config.verifySignature,
|
|
156
|
+
timestamp: Date.now(),
|
|
157
|
+
signature: req.headers[this.verificationOptions.headerName]
|
|
158
|
+
};
|
|
159
|
+
if (this.agentCompleteHandler) {
|
|
160
|
+
const result = await this.agentCompleteHandler(context);
|
|
161
|
+
return res.status(200).json(result);
|
|
162
|
+
}
|
|
163
|
+
res.status(200).json({
|
|
164
|
+
success: true,
|
|
165
|
+
message: 'Agent completion event received',
|
|
166
|
+
data: {
|
|
167
|
+
agentId: payload.agentId
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return res.status(500).json({
|
|
172
|
+
success: false,
|
|
173
|
+
message: 'Failed to handle agent completion',
|
|
174
|
+
data: null
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Handle gate result webhook
|
|
180
|
+
*
|
|
181
|
+
* @private
|
|
182
|
+
*/ async handleGateResult(req, res) {
|
|
183
|
+
try {
|
|
184
|
+
const payload = req.body;
|
|
185
|
+
if (!payload.taskId || payload.gateType === undefined) {
|
|
186
|
+
return res.status(400).json({
|
|
187
|
+
success: false,
|
|
188
|
+
message: 'Missing required fields',
|
|
189
|
+
data: null
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const context = {
|
|
193
|
+
payload,
|
|
194
|
+
isVerified: this.config.verifySignature,
|
|
195
|
+
timestamp: Date.now(),
|
|
196
|
+
signature: req.headers[this.verificationOptions.headerName]
|
|
197
|
+
};
|
|
198
|
+
if (this.gateResultHandler) {
|
|
199
|
+
const result = await this.gateResultHandler(context);
|
|
200
|
+
return res.status(200).json(result);
|
|
201
|
+
}
|
|
202
|
+
res.status(200).json({
|
|
203
|
+
success: true,
|
|
204
|
+
message: 'Gate result received',
|
|
205
|
+
data: {
|
|
206
|
+
taskId: payload.taskId,
|
|
207
|
+
passed: payload.passed
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
} catch (error) {
|
|
211
|
+
return res.status(500).json({
|
|
212
|
+
success: false,
|
|
213
|
+
message: 'Failed to handle gate result',
|
|
214
|
+
data: null
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Handle consensus result webhook
|
|
220
|
+
*
|
|
221
|
+
* @private
|
|
222
|
+
*/ async handleConsensusResult(req, res) {
|
|
223
|
+
try {
|
|
224
|
+
const payload = req.body;
|
|
225
|
+
if (!payload.taskId || payload.validatorCount === undefined) {
|
|
226
|
+
return res.status(400).json({
|
|
227
|
+
success: false,
|
|
228
|
+
message: 'Missing required fields',
|
|
229
|
+
data: null
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
const context = {
|
|
233
|
+
payload,
|
|
234
|
+
isVerified: this.config.verifySignature,
|
|
235
|
+
timestamp: Date.now(),
|
|
236
|
+
signature: req.headers[this.verificationOptions.headerName]
|
|
237
|
+
};
|
|
238
|
+
if (this.consensusResultHandler) {
|
|
239
|
+
const result = await this.consensusResultHandler(context);
|
|
240
|
+
return res.status(200).json(result);
|
|
241
|
+
}
|
|
242
|
+
res.status(200).json({
|
|
243
|
+
success: true,
|
|
244
|
+
message: 'Consensus result received',
|
|
245
|
+
data: {
|
|
246
|
+
taskId: payload.taskId,
|
|
247
|
+
consensusScore: payload.consensusScore
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
} catch (error) {
|
|
251
|
+
return res.status(500).json({
|
|
252
|
+
success: false,
|
|
253
|
+
message: 'Failed to handle consensus result',
|
|
254
|
+
data: null
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Handle Product Owner decision webhook
|
|
260
|
+
*
|
|
261
|
+
* @private
|
|
262
|
+
*/ async handlePODecision(req, res) {
|
|
263
|
+
try {
|
|
264
|
+
const payload = req.body;
|
|
265
|
+
if (!payload.taskId || !payload.decision) {
|
|
266
|
+
return res.status(400).json({
|
|
267
|
+
success: false,
|
|
268
|
+
message: 'Missing required fields',
|
|
269
|
+
data: null
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
// Validate decision enum
|
|
273
|
+
if (![
|
|
274
|
+
'PROCEED',
|
|
275
|
+
'ITERATE',
|
|
276
|
+
'ABORT'
|
|
277
|
+
].includes(payload.decision)) {
|
|
278
|
+
return res.status(400).json({
|
|
279
|
+
success: false,
|
|
280
|
+
message: 'Invalid decision value',
|
|
281
|
+
data: null
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
const context = {
|
|
285
|
+
payload,
|
|
286
|
+
isVerified: this.config.verifySignature,
|
|
287
|
+
timestamp: Date.now(),
|
|
288
|
+
signature: req.headers[this.verificationOptions.headerName]
|
|
289
|
+
};
|
|
290
|
+
if (this.poDecisionHandler) {
|
|
291
|
+
const result = await this.poDecisionHandler(context);
|
|
292
|
+
return res.status(200).json(result);
|
|
293
|
+
}
|
|
294
|
+
res.status(200).json({
|
|
295
|
+
success: true,
|
|
296
|
+
message: 'PO decision received',
|
|
297
|
+
data: {
|
|
298
|
+
taskId: payload.taskId,
|
|
299
|
+
decision: payload.decision
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
} catch (error) {
|
|
303
|
+
return res.status(500).json({
|
|
304
|
+
success: false,
|
|
305
|
+
message: 'Failed to handle PO decision',
|
|
306
|
+
data: null
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Verify HMAC signature of webhook payload
|
|
312
|
+
*
|
|
313
|
+
* @private
|
|
314
|
+
* @param payload Raw request body as string
|
|
315
|
+
* @param signature Signature header value
|
|
316
|
+
* @returns Promise resolving to true if signature is valid
|
|
317
|
+
*/ async verifySignature(payload, signature) {
|
|
318
|
+
try {
|
|
319
|
+
const hmac = createHmac(this.verificationOptions.algorithmType, this.config.secret);
|
|
320
|
+
hmac.update(payload, 'utf8');
|
|
321
|
+
const expectedSignature = hmac.digest('hex');
|
|
322
|
+
// Use timing-safe comparison
|
|
323
|
+
return timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.error('Signature verification error:', error);
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Error handling middleware
|
|
331
|
+
*
|
|
332
|
+
* @private
|
|
333
|
+
*/ errorHandler(error, req, res, next) {
|
|
334
|
+
console.error('Webhook error:', error);
|
|
335
|
+
res.status(500).json({
|
|
336
|
+
success: false,
|
|
337
|
+
message: 'Internal server error',
|
|
338
|
+
data: null
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Create webhook router with optional handlers
|
|
344
|
+
*/ export const createWebhookRouter = (config, handlers)=>{
|
|
345
|
+
const webhooks = new TriggerDevWebhooks(config);
|
|
346
|
+
if (handlers?.onAgentComplete) {
|
|
347
|
+
webhooks.onAgentComplete(handlers.onAgentComplete);
|
|
348
|
+
}
|
|
349
|
+
if (handlers?.onGateResult) {
|
|
350
|
+
webhooks.onGateResult(handlers.onGateResult);
|
|
351
|
+
}
|
|
352
|
+
if (handlers?.onConsensusResult) {
|
|
353
|
+
webhooks.onConsensusResult(handlers.onConsensusResult);
|
|
354
|
+
}
|
|
355
|
+
if (handlers?.onPODecision) {
|
|
356
|
+
webhooks.onPODecision(handlers.onPODecision);
|
|
357
|
+
}
|
|
358
|
+
return webhooks.getRouter();
|
|
359
|
+
};
|
|
360
|
+
export default TriggerDevWebhooks;
|
|
361
|
+
|
|
362
|
+
//# sourceMappingURL=trigger-dev-webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/integration/trigger-dev-webhooks.ts"],"sourcesContent":["/**\r\n * Trigger.dev Webhook Handlers for CFN Loop Integration\r\n *\r\n * Express router providing secure webhook endpoints for:\r\n * - Agent completion events\r\n * - Gate check results\r\n * - Consensus collection results\r\n * - Product Owner decisions\r\n *\r\n * Configuration:\r\n * - WEBHOOK_SECRET: Shared secret for HMAC signature verification\r\n * - WEBHOOK_ALGORITHM: Hash algorithm (default: sha256)\r\n */\r\n\r\nimport { Router } from 'express';\r\nimport type { Request, Response, NextFunction } from 'express';\r\nimport { createHmac, timingSafeEqual } from 'node:crypto';\r\n\r\nimport type {\r\n AgentCompletePayload,\r\n GateResultPayload,\r\n ConsensusResultPayload,\r\n PODecisionPayload,\r\n WebhookContext,\r\n WebhookHandlerResult,\r\n WebhookVerificationOptions,\r\n} from '../types/trigger-dev-events.d.js';\r\n\r\n/**\r\n * Webhook validation error class\r\n */\r\nexport class WebhookValidationError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly reason: string,\r\n public readonly statusCode: number = 401\r\n ) {\r\n super(message);\r\n this.name = 'WebhookValidationError';\r\n }\r\n}\r\n\r\n/**\r\n * Webhook handler type\r\n */\r\nexport type WebhookHandler<T> = (\r\n context: WebhookContext<T>\r\n) => Promise<WebhookHandlerResult>;\r\n\r\n/**\r\n * Configuration for webhook handlers\r\n */\r\nexport interface WebhookConfig {\r\n secret?: string;\r\n algorithm?: string;\r\n verifySignature?: boolean;\r\n}\r\n\r\n/**\r\n * TriggerDevWebhooks - Express router for secure webhook handling\r\n *\r\n * Provides endpoints:\r\n * - POST /webhooks/agent-complete\r\n * - POST /webhooks/gate-result\r\n * - POST /webhooks/consensus-result\r\n * - POST /webhooks/po-decision\r\n */\r\nexport class TriggerDevWebhooks {\r\n private readonly router: Router;\r\n private readonly config: Required<WebhookConfig>;\r\n private readonly verificationOptions: WebhookVerificationOptions;\r\n\r\n // Handler maps for dependency injection\r\n private agentCompleteHandler?: WebhookHandler<AgentCompletePayload>;\r\n private gateResultHandler?: WebhookHandler<GateResultPayload>;\r\n private consensusResultHandler?: WebhookHandler<ConsensusResultPayload>;\r\n private poDecisionHandler?: WebhookHandler<PODecisionPayload>;\r\n\r\n constructor(config?: WebhookConfig) {\r\n this.router = Router();\r\n this.config = {\r\n secret: config?.secret || process.env.WEBHOOK_SECRET || 'default-secret',\r\n algorithm: config?.algorithm || process.env.WEBHOOK_ALGORITHM || 'sha256',\r\n verifySignature: config?.verifySignature !== false,\r\n };\r\n\r\n this.verificationOptions = {\r\n algorithmType: (this.config.algorithm as 'sha256' | 'sha512') || 'sha256',\r\n headerName: 'x-trigger-signature',\r\n };\r\n\r\n this.setupRoutes();\r\n }\r\n\r\n /**\r\n * Register handler for agent completion events\r\n */\r\n onAgentComplete(handler: WebhookHandler<AgentCompletePayload>): this {\r\n this.agentCompleteHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register handler for gate result events\r\n */\r\n onGateResult(handler: WebhookHandler<GateResultPayload>): this {\r\n this.gateResultHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register handler for consensus result events\r\n */\r\n onConsensusResult(handler: WebhookHandler<ConsensusResultPayload>): this {\r\n this.consensusResultHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register handler for Product Owner decision events\r\n */\r\n onPODecision(handler: WebhookHandler<PODecisionPayload>): this {\r\n this.poDecisionHandler = handler;\r\n return this;\r\n }\r\n\r\n /**\r\n * Get Express router for mounting\r\n */\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n /**\r\n * Setup all webhook routes\r\n *\r\n * @private\r\n */\r\n private setupRoutes(): void {\r\n // Middleware for signature verification\r\n this.router.use(this.signatureVerificationMiddleware.bind(this));\r\n\r\n // Agent completion endpoint\r\n this.router.post('/agent-complete', this.handleAgentComplete.bind(this));\r\n\r\n // Gate result endpoint\r\n this.router.post('/gate-result', this.handleGateResult.bind(this));\r\n\r\n // Consensus result endpoint\r\n this.router.post('/consensus-result', this.handleConsensusResult.bind(this));\r\n\r\n // PO decision endpoint\r\n this.router.post('/po-decision', this.handlePODecision.bind(this));\r\n\r\n // Error handling middleware\r\n this.router.use(this.errorHandler.bind(this));\r\n }\r\n\r\n /**\r\n * Signature verification middleware\r\n *\r\n * TODO: RUNTIME_TEST: Verify HMAC signature validation with valid/invalid keys\r\n *\r\n * @private\r\n */\r\n private async signatureVerificationMiddleware(\r\n req: Request,\r\n res: Response,\r\n next: NextFunction\r\n ): Promise<void> {\r\n try {\r\n if (!this.config.verifySignature) {\r\n return next();\r\n }\r\n\r\n const signature = req.headers[this.verificationOptions.headerName];\r\n\r\n if (!signature) {\r\n throw new WebhookValidationError(\r\n 'Missing webhook signature',\r\n 'MISSING_SIGNATURE'\r\n );\r\n }\r\n\r\n const body = JSON.stringify(req.body);\r\n const isValid = await this.verifySignature(body, signature as string);\r\n\r\n if (!isValid) {\r\n throw new WebhookValidationError(\r\n 'Invalid webhook signature',\r\n 'INVALID_SIGNATURE'\r\n );\r\n }\r\n\r\n next();\r\n } catch (error) {\r\n if (error instanceof WebhookValidationError) {\r\n return res.status(error.statusCode).json({\r\n success: false,\r\n message: error.message,\r\n reason: error.reason,\r\n });\r\n }\r\n\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Signature verification failed',\r\n reason: 'INTERNAL_ERROR',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle agent completion webhook\r\n *\r\n * @private\r\n */\r\n private async handleAgentComplete(\r\n req: Request,\r\n res: Response\r\n ): Promise<void> {\r\n try {\r\n const payload = req.body as AgentCompletePayload;\r\n\r\n // Validate required fields\r\n if (!payload.agentId || !payload.taskId) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<AgentCompletePayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.agentCompleteHandler) {\r\n const result = await this.agentCompleteHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'Agent completion event received',\r\n data: { agentId: payload.agentId },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle agent completion',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle gate result webhook\r\n *\r\n * @private\r\n */\r\n private async handleGateResult(req: Request, res: Response): Promise<void> {\r\n try {\r\n const payload = req.body as GateResultPayload;\r\n\r\n if (!payload.taskId || payload.gateType === undefined) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<GateResultPayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.gateResultHandler) {\r\n const result = await this.gateResultHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'Gate result received',\r\n data: { taskId: payload.taskId, passed: payload.passed },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle gate result',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle consensus result webhook\r\n *\r\n * @private\r\n */\r\n private async handleConsensusResult(\r\n req: Request,\r\n res: Response\r\n ): Promise<void> {\r\n try {\r\n const payload = req.body as ConsensusResultPayload;\r\n\r\n if (!payload.taskId || payload.validatorCount === undefined) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<ConsensusResultPayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.consensusResultHandler) {\r\n const result = await this.consensusResultHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'Consensus result received',\r\n data: {\r\n taskId: payload.taskId,\r\n consensusScore: payload.consensusScore,\r\n },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle consensus result',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle Product Owner decision webhook\r\n *\r\n * @private\r\n */\r\n private async handlePODecision(req: Request, res: Response): Promise<void> {\r\n try {\r\n const payload = req.body as PODecisionPayload;\r\n\r\n if (!payload.taskId || !payload.decision) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Missing required fields',\r\n data: null,\r\n });\r\n }\r\n\r\n // Validate decision enum\r\n if (!['PROCEED', 'ITERATE', 'ABORT'].includes(payload.decision)) {\r\n return res.status(400).json({\r\n success: false,\r\n message: 'Invalid decision value',\r\n data: null,\r\n });\r\n }\r\n\r\n const context: WebhookContext<PODecisionPayload> = {\r\n payload,\r\n isVerified: this.config.verifySignature,\r\n timestamp: Date.now(),\r\n signature: req.headers[this.verificationOptions.headerName] as string,\r\n };\r\n\r\n if (this.poDecisionHandler) {\r\n const result = await this.poDecisionHandler(context);\r\n return res.status(200).json(result);\r\n }\r\n\r\n res.status(200).json({\r\n success: true,\r\n message: 'PO decision received',\r\n data: { taskId: payload.taskId, decision: payload.decision },\r\n });\r\n } catch (error) {\r\n return res.status(500).json({\r\n success: false,\r\n message: 'Failed to handle PO decision',\r\n data: null,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Verify HMAC signature of webhook payload\r\n *\r\n * @private\r\n * @param payload Raw request body as string\r\n * @param signature Signature header value\r\n * @returns Promise resolving to true if signature is valid\r\n */\r\n private async verifySignature(\r\n payload: string,\r\n signature: string\r\n ): Promise<boolean> {\r\n try {\r\n const hmac = createHmac(\r\n this.verificationOptions.algorithmType,\r\n this.config.secret\r\n );\r\n hmac.update(payload, 'utf8');\r\n const expectedSignature = hmac.digest('hex');\r\n\r\n // Use timing-safe comparison\r\n return timingSafeEqual(\r\n Buffer.from(signature),\r\n Buffer.from(expectedSignature)\r\n );\r\n } catch (error) {\r\n console.error('Signature verification error:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Error handling middleware\r\n *\r\n * @private\r\n */\r\n private errorHandler(\r\n error: Error,\r\n req: Request,\r\n res: Response,\r\n next: NextFunction\r\n ): void {\r\n console.error('Webhook error:', error);\r\n\r\n res.status(500).json({\r\n success: false,\r\n message: 'Internal server error',\r\n data: null,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Create webhook router with optional handlers\r\n */\r\nexport const createWebhookRouter = (\r\n config?: WebhookConfig,\r\n handlers?: {\r\n onAgentComplete?: WebhookHandler<AgentCompletePayload>;\r\n onGateResult?: WebhookHandler<GateResultPayload>;\r\n onConsensusResult?: WebhookHandler<ConsensusResultPayload>;\r\n onPODecision?: WebhookHandler<PODecisionPayload>;\r\n }\r\n): Router => {\r\n const webhooks = new TriggerDevWebhooks(config);\r\n\r\n if (handlers?.onAgentComplete) {\r\n webhooks.onAgentComplete(handlers.onAgentComplete);\r\n }\r\n if (handlers?.onGateResult) {\r\n webhooks.onGateResult(handlers.onGateResult);\r\n }\r\n if (handlers?.onConsensusResult) {\r\n webhooks.onConsensusResult(handlers.onConsensusResult);\r\n }\r\n if (handlers?.onPODecision) {\r\n webhooks.onPODecision(handlers.onPODecision);\r\n }\r\n\r\n return webhooks.getRouter();\r\n};\r\n\r\nexport default TriggerDevWebhooks;\r\n"],"names":["Router","createHmac","timingSafeEqual","WebhookValidationError","Error","message","reason","statusCode","name","TriggerDevWebhooks","router","config","verificationOptions","agentCompleteHandler","gateResultHandler","consensusResultHandler","poDecisionHandler","secret","process","env","WEBHOOK_SECRET","algorithm","WEBHOOK_ALGORITHM","verifySignature","algorithmType","headerName","setupRoutes","onAgentComplete","handler","onGateResult","onConsensusResult","onPODecision","getRouter","use","signatureVerificationMiddleware","bind","post","handleAgentComplete","handleGateResult","handleConsensusResult","handlePODecision","errorHandler","req","res","next","signature","headers","body","JSON","stringify","isValid","error","status","json","success","payload","agentId","taskId","data","context","isVerified","timestamp","Date","now","result","gateType","undefined","passed","validatorCount","consensusScore","decision","includes","hmac","update","expectedSignature","digest","Buffer","from","console","createWebhookRouter","handlers","webhooks"],"mappings":"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"}
|
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
import { createHash } from 'crypto';
|
|
7
7
|
import { readFileSync, existsSync, mkdirSync, statSync } from 'fs';
|
|
8
8
|
import { join, dirname } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
// ESM-compatible __dirname
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
9
13
|
// ============================================================================
|
|
10
14
|
// Error Classes
|
|
11
15
|
// ============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/artifact-registry.ts"],"sourcesContent":["/**\r\n * Artifact Registry TypeScript API\r\n * Provides centralized artifact management with TTL-based cleanup\r\n * Version: 1.0.0\r\n */\r\n\r\nimport Database from 'better-sqlite3';\r\nimport { createHash } from 'crypto';\r\nimport { readFileSync, existsSync, mkdirSync, statSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\n\r\n// ============================================================================\r\n// Types and Interfaces\r\n// ============================================================================\r\n\r\nexport type ArtifactType = 'code' | 'documentation' | 'test' | 'config' | 'binary' | 'data' | 'model' | 'report' | 'other';\r\nexport type ArtifactStatus = 'active' | 'archived' | 'deleted';\r\nexport type RetentionPolicy = 'ephemeral' | 'standard' | 'permanent' | 'custom';\r\n\r\nexport interface ArtifactMetadata {\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n storage_location: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version?: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string[];\r\n tags?: string[];\r\n metadata?: Record<string, any>;\r\n acl_level?: number;\r\n is_compressed?: boolean;\r\n compression_type?: string;\r\n retention_days?: number;\r\n retention_policy?: RetentionPolicy;\r\n}\r\n\r\nexport interface Artifact {\r\n id: string;\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n content_hash?: string;\r\n size_bytes?: number;\r\n storage_location: string;\r\n checksum?: string;\r\n is_compressed: boolean;\r\n compression_type?: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string;\r\n tags?: string;\r\n metadata?: string;\r\n acl_level: number;\r\n retention_days: number;\r\n retention_policy: RetentionPolicy;\r\n expires_at?: string;\r\n status: ArtifactStatus;\r\n cleanup_eligible: boolean;\r\n created_at: string;\r\n updated_at: string;\r\n archived_at?: string;\r\n deleted_at?: string;\r\n}\r\n\r\nexport interface ArtifactFilters {\r\n type?: ArtifactType;\r\n status?: ArtifactStatus;\r\n retention_policy?: RetentionPolicy;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n tags?: string[];\r\n cleanup_eligible?: boolean;\r\n created_after?: Date;\r\n created_before?: Date;\r\n expires_before?: Date;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface ArtifactStats {\r\n total: number;\r\n active: number;\r\n archived: number;\r\n deleted: number;\r\n cleanup_eligible: number;\r\n total_size_bytes: number;\r\n}\r\n\r\n// ============================================================================\r\n// Error Classes\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistryError extends Error {\r\n constructor(message: string, public code: string, public details?: any) {\r\n super(message);\r\n this.name = 'ArtifactRegistryError';\r\n }\r\n}\r\n\r\nexport class ArtifactNotFoundError extends ArtifactRegistryError {\r\n constructor(id: string) {\r\n super(`Artifact not found: ${id}`, 'ARTIFACT_NOT_FOUND', { id });\r\n this.name = 'ArtifactNotFoundError';\r\n }\r\n}\r\n\r\nexport class ArtifactValidationError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'VALIDATION_ERROR', details);\r\n this.name = 'ArtifactValidationError';\r\n }\r\n}\r\n\r\nexport class ArtifactDatabaseError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'DATABASE_ERROR', details);\r\n this.name = 'ArtifactDatabaseError';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Artifact Registry Class\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistry {\r\n private db: Database.Database;\r\n private static instance: ArtifactRegistry | null = null;\r\n\r\n constructor(dbPath: string) {\r\n try {\r\n // Ensure database directory exists\r\n const dbDir = dirname(dbPath);\r\n if (!existsSync(dbDir)) {\r\n mkdirSync(dbDir, { recursive: true });\r\n }\r\n\r\n this.db = new Database(dbPath);\r\n this.db.pragma('journal_mode = WAL'); // Write-Ahead Logging for concurrency\r\n this.db.pragma('foreign_keys = ON');\r\n this.db.pragma('synchronous = NORMAL');\r\n\r\n this.initializeSchema();\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize database: ${error instanceof Error ? error.message : String(error)}`,\r\n { dbPath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get singleton instance (optional pattern)\r\n */\r\n static getInstance(dbPath?: string): ArtifactRegistry {\r\n if (!ArtifactRegistry.instance) {\r\n if (!dbPath) {\r\n throw new ArtifactDatabaseError('Database path required for first initialization', {});\r\n }\r\n ArtifactRegistry.instance = new ArtifactRegistry(dbPath);\r\n }\r\n return ArtifactRegistry.instance;\r\n }\r\n\r\n /**\r\n * Initialize database schema\r\n */\r\n private initializeSchema(): void {\r\n try {\r\n const schemaPath = join(__dirname, '../database/artifact-registry-schema.sql');\r\n if (!existsSync(schemaPath)) {\r\n throw new Error(`Schema file not found: ${schemaPath}`);\r\n }\r\n\r\n const schema = readFileSync(schemaPath, 'utf-8');\r\n\r\n // Step 1: Remove multi-line comments FIRST (they can contain semicolons)\r\n const withoutMultiLineComments = schema.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n // Step 2: Remove single-line comments\r\n const cleanedSchema = withoutMultiLineComments\r\n .split('\\n')\r\n .filter(line => {\r\n const trimmed = line.trim();\r\n return trimmed.length > 0 && !trimmed.startsWith('--');\r\n })\r\n .join('\\n');\r\n\r\n // Step 3: Execute entire schema as one block\r\n // SQLite's exec() can handle multiple statements including triggers with internal semicolons\r\n this.db.exec(cleanedSchema);\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize schema: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate unique artifact ID\r\n */\r\n private generateId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 15);\r\n return `artifact-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Calculate checksum for file\r\n */\r\n private calculateChecksum(filePath: string): string {\r\n try {\r\n const content = readFileSync(filePath);\r\n return createHash('sha256').update(content).digest('hex');\r\n } catch (error) {\r\n throw new ArtifactValidationError(\r\n `Failed to calculate checksum: ${error instanceof Error ? error.message : String(error)}`,\r\n { filePath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate artifact metadata\r\n */\r\n private validateMetadata(metadata: ArtifactMetadata): void {\r\n if (!metadata.name || metadata.name.trim().length === 0) {\r\n throw new ArtifactValidationError('Artifact name is required');\r\n }\r\n\r\n if (!metadata.type) {\r\n throw new ArtifactValidationError('Artifact type is required');\r\n }\r\n\r\n const validTypes: ArtifactType[] = ['code', 'documentation', 'test', 'config', 'binary', 'data', 'model', 'report', 'other'];\r\n if (!validTypes.includes(metadata.type)) {\r\n throw new ArtifactValidationError(`Invalid artifact type: ${metadata.type}`, { validTypes });\r\n }\r\n\r\n if (!metadata.storage_location || metadata.storage_location.trim().length === 0) {\r\n throw new ArtifactValidationError('Storage location is required');\r\n }\r\n\r\n if (metadata.acl_level !== undefined && (metadata.acl_level < 1 || metadata.acl_level > 5)) {\r\n throw new ArtifactValidationError('ACL level must be between 1 and 5', { acl_level: metadata.acl_level });\r\n }\r\n\r\n if (metadata.retention_policy) {\r\n const validPolicies: RetentionPolicy[] = ['ephemeral', 'standard', 'permanent', 'custom'];\r\n if (!validPolicies.includes(metadata.retention_policy)) {\r\n throw new ArtifactValidationError(`Invalid retention policy: ${metadata.retention_policy}`, { validPolicies });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create new artifact\r\n */\r\n createArtifact(metadata: ArtifactMetadata): Artifact {\r\n try {\r\n // Validate metadata\r\n this.validateMetadata(metadata);\r\n\r\n // Generate ID\r\n const id = this.generateId();\r\n\r\n // Calculate file-based metadata if storage location exists\r\n let size_bytes: number | undefined;\r\n let checksum: string | undefined;\r\n let content_hash: string | undefined;\r\n\r\n if (existsSync(metadata.storage_location)) {\r\n const stats = statSync(metadata.storage_location);\r\n size_bytes = stats.size;\r\n checksum = this.calculateChecksum(metadata.storage_location);\r\n\r\n if (metadata.content) {\r\n content_hash = createHash('sha256').update(metadata.content).digest('hex');\r\n }\r\n }\r\n\r\n // Set defaults\r\n const retention_days = metadata.retention_days ?? (\r\n metadata.retention_policy === 'ephemeral' ? 7 :\r\n metadata.retention_policy === 'permanent' ? 0 :\r\n 30 // standard\r\n );\r\n\r\n const retention_policy = metadata.retention_policy ?? 'standard';\r\n\r\n // Prepare insert statement\r\n const stmt = this.db.prepare(`\r\n INSERT INTO artifacts (\r\n id, name, type, format, content, content_hash, size_bytes,\r\n storage_location, checksum, is_compressed, compression_type,\r\n swarm_id, agent_id, task_id, version, parent_artifact_id,\r\n artifact_chain, tags, metadata, acl_level,\r\n retention_days, retention_policy, status\r\n ) VALUES (\r\n ?, ?, ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?\r\n )\r\n `);\r\n\r\n // Execute insert\r\n stmt.run(\r\n id,\r\n metadata.name,\r\n metadata.type,\r\n metadata.format ?? null,\r\n metadata.content ?? null,\r\n content_hash ?? null,\r\n size_bytes ?? null,\r\n metadata.storage_location,\r\n checksum ?? null,\r\n metadata.is_compressed ? 1 : 0,\r\n metadata.compression_type ?? null,\r\n metadata.swarm_id ?? null,\r\n metadata.agent_id ?? null,\r\n metadata.task_id ?? null,\r\n metadata.version ?? 1,\r\n metadata.parent_artifact_id ?? null,\r\n metadata.artifact_chain ? JSON.stringify(metadata.artifact_chain) : null,\r\n metadata.tags ? JSON.stringify(metadata.tags) : null,\r\n metadata.metadata ? JSON.stringify(metadata.metadata) : null,\r\n metadata.acl_level ?? 2,\r\n retention_days,\r\n retention_policy,\r\n 'active'\r\n );\r\n\r\n // Retrieve and return created artifact\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactDatabaseError('Failed to retrieve created artifact', { id });\r\n }\r\n\r\n return artifact;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to create artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { metadata, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact by ID\r\n */\r\n getArtifact(id: string): Artifact | null {\r\n try {\r\n const stmt = this.db.prepare('SELECT * FROM artifacts WHERE id = ?');\r\n const row = stmt.get(id) as Artifact | undefined;\r\n return row ?? null;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * List artifacts with optional filters\r\n */\r\n listArtifacts(filters?: ArtifactFilters): Artifact[] {\r\n try {\r\n let query = 'SELECT * FROM artifacts WHERE 1=1';\r\n const params: any[] = [];\r\n\r\n if (filters) {\r\n if (filters.type) {\r\n query += ' AND type = ?';\r\n params.push(filters.type);\r\n }\r\n\r\n if (filters.status) {\r\n query += ' AND status = ?';\r\n params.push(filters.status);\r\n }\r\n\r\n if (filters.retention_policy) {\r\n query += ' AND retention_policy = ?';\r\n params.push(filters.retention_policy);\r\n }\r\n\r\n if (filters.swarm_id) {\r\n query += ' AND swarm_id = ?';\r\n params.push(filters.swarm_id);\r\n }\r\n\r\n if (filters.agent_id) {\r\n query += ' AND agent_id = ?';\r\n params.push(filters.agent_id);\r\n }\r\n\r\n if (filters.task_id) {\r\n query += ' AND task_id = ?';\r\n params.push(filters.task_id);\r\n }\r\n\r\n if (filters.cleanup_eligible !== undefined) {\r\n query += ' AND cleanup_eligible = ?';\r\n params.push(filters.cleanup_eligible ? 1 : 0);\r\n }\r\n\r\n if (filters.created_after) {\r\n query += ' AND created_at >= ?';\r\n params.push(filters.created_after.toISOString());\r\n }\r\n\r\n if (filters.created_before) {\r\n query += ' AND created_at <= ?';\r\n params.push(filters.created_before.toISOString());\r\n }\r\n\r\n if (filters.expires_before) {\r\n query += ' AND expires_at IS NOT NULL AND expires_at <= ?';\r\n params.push(filters.expires_before.toISOString());\r\n }\r\n\r\n if (filters.tags && filters.tags.length > 0) {\r\n // JSON search for tags (SQLite JSON support)\r\n for (const tag of filters.tags) {\r\n query += ` AND tags LIKE ?`;\r\n params.push(`%\"${tag}\"%`);\r\n }\r\n }\r\n }\r\n\r\n query += ' ORDER BY created_at DESC';\r\n\r\n if (filters?.limit) {\r\n query += ' LIMIT ?';\r\n params.push(filters.limit);\r\n }\r\n\r\n if (filters?.offset) {\r\n query += ' OFFSET ?';\r\n params.push(filters.offset);\r\n }\r\n\r\n const stmt = this.db.prepare(query);\r\n return stmt.all(...params) as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to list artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { filters, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Archive artifact (mark as archived)\r\n */\r\n archiveArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n if (artifact.status === 'deleted') {\r\n throw new ArtifactValidationError('Cannot archive deleted artifact', { id, status: artifact.status });\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'archived',\r\n archived_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve archived artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to archive artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Delete artifact (soft delete - mark as deleted)\r\n */\r\n deleteArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'deleted',\r\n deleted_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve deleted artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to delete artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact statistics by retention policy\r\n */\r\n getStatsByRetentionPolicy(): Record<RetentionPolicy, ArtifactStats> {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT\r\n retention_policy,\r\n COUNT(*) as total,\r\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\r\n SUM(CASE WHEN status = 'archived' THEN 1 ELSE 0 END) as archived,\r\n SUM(CASE WHEN status = 'deleted' THEN 1 ELSE 0 END) as deleted,\r\n SUM(CASE WHEN cleanup_eligible = 1 THEN 1 ELSE 0 END) as cleanup_eligible,\r\n COALESCE(SUM(size_bytes), 0) as total_size_bytes\r\n FROM artifacts\r\n GROUP BY retention_policy\r\n `);\r\n\r\n const rows = stmt.all() as Array<{ retention_policy: RetentionPolicy } & ArtifactStats>;\r\n const stats: Record<string, ArtifactStats> = {};\r\n\r\n for (const row of rows) {\r\n const { retention_policy, ...statsData } = row;\r\n stats[retention_policy] = statsData;\r\n }\r\n\r\n return stats as Record<RetentionPolicy, ArtifactStats>;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get statistics: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Find expired artifacts eligible for cleanup\r\n */\r\n findExpiredArtifacts(): Artifact[] {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM artifacts\r\n WHERE status = 'active'\r\n AND expires_at IS NOT NULL\r\n AND datetime('now') >= expires_at\r\n ORDER BY created_at ASC\r\n `);\r\n\r\n return stmt.all() as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to find expired artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n close(): void {\r\n this.db.close();\r\n }\r\n}\r\n"],"names":["Database","createHash","readFileSync","existsSync","mkdirSync","statSync","join","dirname","ArtifactRegistryError","Error","message","code","details","name","ArtifactNotFoundError","id","ArtifactValidationError","ArtifactDatabaseError","ArtifactRegistry","db","instance","dbPath","dbDir","recursive","pragma","initializeSchema","error","String","getInstance","schemaPath","__dirname","schema","withoutMultiLineComments","replace","cleanedSchema","split","filter","line","trimmed","trim","length","startsWith","exec","generateId","timestamp","Date","now","random","Math","toString","substring","calculateChecksum","filePath","content","update","digest","validateMetadata","metadata","type","validTypes","includes","storage_location","acl_level","undefined","retention_policy","validPolicies","createArtifact","size_bytes","checksum","content_hash","stats","size","retention_days","stmt","prepare","run","format","is_compressed","compression_type","swarm_id","agent_id","task_id","version","parent_artifact_id","artifact_chain","JSON","stringify","tags","artifact","getArtifact","row","get","listArtifacts","filters","query","params","push","status","cleanup_eligible","created_after","toISOString","created_before","expires_before","tag","limit","offset","all","archiveArtifact","updated","deleteArtifact","getStatsByRetentionPolicy","rows","statsData","findExpiredArtifacts","close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/artifact-registry.ts"],"sourcesContent":["/**\r\n * Artifact Registry TypeScript API\r\n * Provides centralized artifact management with TTL-based cleanup\r\n * Version: 1.0.0\r\n */\r\n\r\nimport Database from 'better-sqlite3';\r\nimport { createHash } from 'crypto';\r\nimport { readFileSync, existsSync, mkdirSync, statSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\nimport { fileURLToPath } from 'url';\r\n\r\n// ESM-compatible __dirname\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n// ============================================================================\r\n// Types and Interfaces\r\n// ============================================================================\r\n\r\nexport type ArtifactType = 'code' | 'documentation' | 'test' | 'config' | 'binary' | 'data' | 'model' | 'report' | 'other';\r\nexport type ArtifactStatus = 'active' | 'archived' | 'deleted';\r\nexport type RetentionPolicy = 'ephemeral' | 'standard' | 'permanent' | 'custom';\r\n\r\nexport interface ArtifactMetadata {\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n storage_location: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version?: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string[];\r\n tags?: string[];\r\n metadata?: Record<string, any>;\r\n acl_level?: number;\r\n is_compressed?: boolean;\r\n compression_type?: string;\r\n retention_days?: number;\r\n retention_policy?: RetentionPolicy;\r\n}\r\n\r\nexport interface Artifact {\r\n id: string;\r\n name: string;\r\n type: ArtifactType;\r\n format?: string;\r\n content?: string;\r\n content_hash?: string;\r\n size_bytes?: number;\r\n storage_location: string;\r\n checksum?: string;\r\n is_compressed: boolean;\r\n compression_type?: string;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n version: number;\r\n parent_artifact_id?: string;\r\n artifact_chain?: string;\r\n tags?: string;\r\n metadata?: string;\r\n acl_level: number;\r\n retention_days: number;\r\n retention_policy: RetentionPolicy;\r\n expires_at?: string;\r\n status: ArtifactStatus;\r\n cleanup_eligible: boolean;\r\n created_at: string;\r\n updated_at: string;\r\n archived_at?: string;\r\n deleted_at?: string;\r\n}\r\n\r\nexport interface ArtifactFilters {\r\n type?: ArtifactType;\r\n status?: ArtifactStatus;\r\n retention_policy?: RetentionPolicy;\r\n swarm_id?: string;\r\n agent_id?: string;\r\n task_id?: string;\r\n tags?: string[];\r\n cleanup_eligible?: boolean;\r\n created_after?: Date;\r\n created_before?: Date;\r\n expires_before?: Date;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface ArtifactStats {\r\n total: number;\r\n active: number;\r\n archived: number;\r\n deleted: number;\r\n cleanup_eligible: number;\r\n total_size_bytes: number;\r\n}\r\n\r\n// ============================================================================\r\n// Error Classes\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistryError extends Error {\r\n constructor(message: string, public code: string, public details?: any) {\r\n super(message);\r\n this.name = 'ArtifactRegistryError';\r\n }\r\n}\r\n\r\nexport class ArtifactNotFoundError extends ArtifactRegistryError {\r\n constructor(id: string) {\r\n super(`Artifact not found: ${id}`, 'ARTIFACT_NOT_FOUND', { id });\r\n this.name = 'ArtifactNotFoundError';\r\n }\r\n}\r\n\r\nexport class ArtifactValidationError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'VALIDATION_ERROR', details);\r\n this.name = 'ArtifactValidationError';\r\n }\r\n}\r\n\r\nexport class ArtifactDatabaseError extends ArtifactRegistryError {\r\n constructor(message: string, details?: any) {\r\n super(message, 'DATABASE_ERROR', details);\r\n this.name = 'ArtifactDatabaseError';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Artifact Registry Class\r\n// ============================================================================\r\n\r\nexport class ArtifactRegistry {\r\n private db: Database.Database;\r\n private static instance: ArtifactRegistry | null = null;\r\n\r\n constructor(dbPath: string) {\r\n try {\r\n // Ensure database directory exists\r\n const dbDir = dirname(dbPath);\r\n if (!existsSync(dbDir)) {\r\n mkdirSync(dbDir, { recursive: true });\r\n }\r\n\r\n this.db = new Database(dbPath);\r\n this.db.pragma('journal_mode = WAL'); // Write-Ahead Logging for concurrency\r\n this.db.pragma('foreign_keys = ON');\r\n this.db.pragma('synchronous = NORMAL');\r\n\r\n this.initializeSchema();\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize database: ${error instanceof Error ? error.message : String(error)}`,\r\n { dbPath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get singleton instance (optional pattern)\r\n */\r\n static getInstance(dbPath?: string): ArtifactRegistry {\r\n if (!ArtifactRegistry.instance) {\r\n if (!dbPath) {\r\n throw new ArtifactDatabaseError('Database path required for first initialization', {});\r\n }\r\n ArtifactRegistry.instance = new ArtifactRegistry(dbPath);\r\n }\r\n return ArtifactRegistry.instance;\r\n }\r\n\r\n /**\r\n * Initialize database schema\r\n */\r\n private initializeSchema(): void {\r\n try {\r\n const schemaPath = join(__dirname, '../database/artifact-registry-schema.sql');\r\n if (!existsSync(schemaPath)) {\r\n throw new Error(`Schema file not found: ${schemaPath}`);\r\n }\r\n\r\n const schema = readFileSync(schemaPath, 'utf-8');\r\n\r\n // Step 1: Remove multi-line comments FIRST (they can contain semicolons)\r\n const withoutMultiLineComments = schema.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n // Step 2: Remove single-line comments\r\n const cleanedSchema = withoutMultiLineComments\r\n .split('\\n')\r\n .filter(line => {\r\n const trimmed = line.trim();\r\n return trimmed.length > 0 && !trimmed.startsWith('--');\r\n })\r\n .join('\\n');\r\n\r\n // Step 3: Execute entire schema as one block\r\n // SQLite's exec() can handle multiple statements including triggers with internal semicolons\r\n this.db.exec(cleanedSchema);\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to initialize schema: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate unique artifact ID\r\n */\r\n private generateId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 15);\r\n return `artifact-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Calculate checksum for file\r\n */\r\n private calculateChecksum(filePath: string): string {\r\n try {\r\n const content = readFileSync(filePath);\r\n return createHash('sha256').update(content).digest('hex');\r\n } catch (error) {\r\n throw new ArtifactValidationError(\r\n `Failed to calculate checksum: ${error instanceof Error ? error.message : String(error)}`,\r\n { filePath, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate artifact metadata\r\n */\r\n private validateMetadata(metadata: ArtifactMetadata): void {\r\n if (!metadata.name || metadata.name.trim().length === 0) {\r\n throw new ArtifactValidationError('Artifact name is required');\r\n }\r\n\r\n if (!metadata.type) {\r\n throw new ArtifactValidationError('Artifact type is required');\r\n }\r\n\r\n const validTypes: ArtifactType[] = ['code', 'documentation', 'test', 'config', 'binary', 'data', 'model', 'report', 'other'];\r\n if (!validTypes.includes(metadata.type)) {\r\n throw new ArtifactValidationError(`Invalid artifact type: ${metadata.type}`, { validTypes });\r\n }\r\n\r\n if (!metadata.storage_location || metadata.storage_location.trim().length === 0) {\r\n throw new ArtifactValidationError('Storage location is required');\r\n }\r\n\r\n if (metadata.acl_level !== undefined && (metadata.acl_level < 1 || metadata.acl_level > 5)) {\r\n throw new ArtifactValidationError('ACL level must be between 1 and 5', { acl_level: metadata.acl_level });\r\n }\r\n\r\n if (metadata.retention_policy) {\r\n const validPolicies: RetentionPolicy[] = ['ephemeral', 'standard', 'permanent', 'custom'];\r\n if (!validPolicies.includes(metadata.retention_policy)) {\r\n throw new ArtifactValidationError(`Invalid retention policy: ${metadata.retention_policy}`, { validPolicies });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create new artifact\r\n */\r\n createArtifact(metadata: ArtifactMetadata): Artifact {\r\n try {\r\n // Validate metadata\r\n this.validateMetadata(metadata);\r\n\r\n // Generate ID\r\n const id = this.generateId();\r\n\r\n // Calculate file-based metadata if storage location exists\r\n let size_bytes: number | undefined;\r\n let checksum: string | undefined;\r\n let content_hash: string | undefined;\r\n\r\n if (existsSync(metadata.storage_location)) {\r\n const stats = statSync(metadata.storage_location);\r\n size_bytes = stats.size;\r\n checksum = this.calculateChecksum(metadata.storage_location);\r\n\r\n if (metadata.content) {\r\n content_hash = createHash('sha256').update(metadata.content).digest('hex');\r\n }\r\n }\r\n\r\n // Set defaults\r\n const retention_days = metadata.retention_days ?? (\r\n metadata.retention_policy === 'ephemeral' ? 7 :\r\n metadata.retention_policy === 'permanent' ? 0 :\r\n 30 // standard\r\n );\r\n\r\n const retention_policy = metadata.retention_policy ?? 'standard';\r\n\r\n // Prepare insert statement\r\n const stmt = this.db.prepare(`\r\n INSERT INTO artifacts (\r\n id, name, type, format, content, content_hash, size_bytes,\r\n storage_location, checksum, is_compressed, compression_type,\r\n swarm_id, agent_id, task_id, version, parent_artifact_id,\r\n artifact_chain, tags, metadata, acl_level,\r\n retention_days, retention_policy, status\r\n ) VALUES (\r\n ?, ?, ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?, ?, ?,\r\n ?, ?, ?, ?,\r\n ?, ?, ?\r\n )\r\n `);\r\n\r\n // Execute insert\r\n stmt.run(\r\n id,\r\n metadata.name,\r\n metadata.type,\r\n metadata.format ?? null,\r\n metadata.content ?? null,\r\n content_hash ?? null,\r\n size_bytes ?? null,\r\n metadata.storage_location,\r\n checksum ?? null,\r\n metadata.is_compressed ? 1 : 0,\r\n metadata.compression_type ?? null,\r\n metadata.swarm_id ?? null,\r\n metadata.agent_id ?? null,\r\n metadata.task_id ?? null,\r\n metadata.version ?? 1,\r\n metadata.parent_artifact_id ?? null,\r\n metadata.artifact_chain ? JSON.stringify(metadata.artifact_chain) : null,\r\n metadata.tags ? JSON.stringify(metadata.tags) : null,\r\n metadata.metadata ? JSON.stringify(metadata.metadata) : null,\r\n metadata.acl_level ?? 2,\r\n retention_days,\r\n retention_policy,\r\n 'active'\r\n );\r\n\r\n // Retrieve and return created artifact\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactDatabaseError('Failed to retrieve created artifact', { id });\r\n }\r\n\r\n return artifact;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to create artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { metadata, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact by ID\r\n */\r\n getArtifact(id: string): Artifact | null {\r\n try {\r\n const stmt = this.db.prepare('SELECT * FROM artifacts WHERE id = ?');\r\n const row = stmt.get(id) as Artifact | undefined;\r\n return row ?? null;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * List artifacts with optional filters\r\n */\r\n listArtifacts(filters?: ArtifactFilters): Artifact[] {\r\n try {\r\n let query = 'SELECT * FROM artifacts WHERE 1=1';\r\n const params: any[] = [];\r\n\r\n if (filters) {\r\n if (filters.type) {\r\n query += ' AND type = ?';\r\n params.push(filters.type);\r\n }\r\n\r\n if (filters.status) {\r\n query += ' AND status = ?';\r\n params.push(filters.status);\r\n }\r\n\r\n if (filters.retention_policy) {\r\n query += ' AND retention_policy = ?';\r\n params.push(filters.retention_policy);\r\n }\r\n\r\n if (filters.swarm_id) {\r\n query += ' AND swarm_id = ?';\r\n params.push(filters.swarm_id);\r\n }\r\n\r\n if (filters.agent_id) {\r\n query += ' AND agent_id = ?';\r\n params.push(filters.agent_id);\r\n }\r\n\r\n if (filters.task_id) {\r\n query += ' AND task_id = ?';\r\n params.push(filters.task_id);\r\n }\r\n\r\n if (filters.cleanup_eligible !== undefined) {\r\n query += ' AND cleanup_eligible = ?';\r\n params.push(filters.cleanup_eligible ? 1 : 0);\r\n }\r\n\r\n if (filters.created_after) {\r\n query += ' AND created_at >= ?';\r\n params.push(filters.created_after.toISOString());\r\n }\r\n\r\n if (filters.created_before) {\r\n query += ' AND created_at <= ?';\r\n params.push(filters.created_before.toISOString());\r\n }\r\n\r\n if (filters.expires_before) {\r\n query += ' AND expires_at IS NOT NULL AND expires_at <= ?';\r\n params.push(filters.expires_before.toISOString());\r\n }\r\n\r\n if (filters.tags && filters.tags.length > 0) {\r\n // JSON search for tags (SQLite JSON support)\r\n for (const tag of filters.tags) {\r\n query += ` AND tags LIKE ?`;\r\n params.push(`%\"${tag}\"%`);\r\n }\r\n }\r\n }\r\n\r\n query += ' ORDER BY created_at DESC';\r\n\r\n if (filters?.limit) {\r\n query += ' LIMIT ?';\r\n params.push(filters.limit);\r\n }\r\n\r\n if (filters?.offset) {\r\n query += ' OFFSET ?';\r\n params.push(filters.offset);\r\n }\r\n\r\n const stmt = this.db.prepare(query);\r\n return stmt.all(...params) as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to list artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { filters, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Archive artifact (mark as archived)\r\n */\r\n archiveArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n if (artifact.status === 'deleted') {\r\n throw new ArtifactValidationError('Cannot archive deleted artifact', { id, status: artifact.status });\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'archived',\r\n archived_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve archived artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to archive artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Delete artifact (soft delete - mark as deleted)\r\n */\r\n deleteArtifact(id: string): Artifact {\r\n try {\r\n const artifact = this.getArtifact(id);\r\n if (!artifact) {\r\n throw new ArtifactNotFoundError(id);\r\n }\r\n\r\n const stmt = this.db.prepare(`\r\n UPDATE artifacts\r\n SET status = 'deleted',\r\n deleted_at = CURRENT_TIMESTAMP,\r\n updated_at = CURRENT_TIMESTAMP\r\n WHERE id = ?\r\n `);\r\n\r\n stmt.run(id);\r\n\r\n const updated = this.getArtifact(id);\r\n if (!updated) {\r\n throw new ArtifactDatabaseError('Failed to retrieve deleted artifact', { id });\r\n }\r\n\r\n return updated;\r\n } catch (error) {\r\n if (error instanceof ArtifactRegistryError) {\r\n throw error;\r\n }\r\n throw new ArtifactDatabaseError(\r\n `Failed to delete artifact: ${error instanceof Error ? error.message : String(error)}`,\r\n { id, error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get artifact statistics by retention policy\r\n */\r\n getStatsByRetentionPolicy(): Record<RetentionPolicy, ArtifactStats> {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT\r\n retention_policy,\r\n COUNT(*) as total,\r\n SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,\r\n SUM(CASE WHEN status = 'archived' THEN 1 ELSE 0 END) as archived,\r\n SUM(CASE WHEN status = 'deleted' THEN 1 ELSE 0 END) as deleted,\r\n SUM(CASE WHEN cleanup_eligible = 1 THEN 1 ELSE 0 END) as cleanup_eligible,\r\n COALESCE(SUM(size_bytes), 0) as total_size_bytes\r\n FROM artifacts\r\n GROUP BY retention_policy\r\n `);\r\n\r\n const rows = stmt.all() as Array<{ retention_policy: RetentionPolicy } & ArtifactStats>;\r\n const stats: Record<string, ArtifactStats> = {};\r\n\r\n for (const row of rows) {\r\n const { retention_policy, ...statsData } = row;\r\n stats[retention_policy] = statsData;\r\n }\r\n\r\n return stats as Record<RetentionPolicy, ArtifactStats>;\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to get statistics: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Find expired artifacts eligible for cleanup\r\n */\r\n findExpiredArtifacts(): Artifact[] {\r\n try {\r\n const stmt = this.db.prepare(`\r\n SELECT * FROM artifacts\r\n WHERE status = 'active'\r\n AND expires_at IS NOT NULL\r\n AND datetime('now') >= expires_at\r\n ORDER BY created_at ASC\r\n `);\r\n\r\n return stmt.all() as Artifact[];\r\n } catch (error) {\r\n throw new ArtifactDatabaseError(\r\n `Failed to find expired artifacts: ${error instanceof Error ? error.message : String(error)}`,\r\n { error }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Close database connection\r\n */\r\n close(): void {\r\n this.db.close();\r\n }\r\n}\r\n"],"names":["Database","createHash","readFileSync","existsSync","mkdirSync","statSync","join","dirname","fileURLToPath","__filename","url","__dirname","ArtifactRegistryError","Error","message","code","details","name","ArtifactNotFoundError","id","ArtifactValidationError","ArtifactDatabaseError","ArtifactRegistry","db","instance","dbPath","dbDir","recursive","pragma","initializeSchema","error","String","getInstance","schemaPath","schema","withoutMultiLineComments","replace","cleanedSchema","split","filter","line","trimmed","trim","length","startsWith","exec","generateId","timestamp","Date","now","random","Math","toString","substring","calculateChecksum","filePath","content","update","digest","validateMetadata","metadata","type","validTypes","includes","storage_location","acl_level","undefined","retention_policy","validPolicies","createArtifact","size_bytes","checksum","content_hash","stats","size","retention_days","stmt","prepare","run","format","is_compressed","compression_type","swarm_id","agent_id","task_id","version","parent_artifact_id","artifact_chain","JSON","stringify","tags","artifact","getArtifact","row","get","listArtifacts","filters","query","params","push","status","cleanup_eligible","created_after","toISOString","created_before","expires_before","tag","limit","offset","all","archiveArtifact","updated","deleteArtifact","getStatsByRetentionPolicy","rows","statsData","findExpiredArtifacts","close"],"mappings":"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"}
|