claude-flow-novice 2.15.3 → 2.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -177
- package/readme/README.md +19 -4
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Database Query Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides type-safe SQL queries for skill metadata operations.
|
|
5
|
+
* Part of SkillLoader API implementation.
|
|
6
|
+
*
|
|
7
|
+
* @module skills-query
|
|
8
|
+
*/ /**
|
|
9
|
+
* Bootstrap skill IDs that should always be loaded
|
|
10
|
+
*/ export const BOOTSTRAP_SKILL_IDS = [
|
|
11
|
+
'cfn-coordination',
|
|
12
|
+
'hook-pipeline',
|
|
13
|
+
'pre-edit-backup',
|
|
14
|
+
'cfn-agent-spawning',
|
|
15
|
+
'cfn-loop-validation'
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* SQL queries for skills database operations
|
|
19
|
+
*/ export class SkillsQueryBuilder {
|
|
20
|
+
/**
|
|
21
|
+
* Get skills by agent type with optional context filtering
|
|
22
|
+
*/ static getSkillsByAgentType(agentType, contextKeywords, phase) {
|
|
23
|
+
const params = [
|
|
24
|
+
agentType
|
|
25
|
+
];
|
|
26
|
+
let sql = `
|
|
27
|
+
SELECT DISTINCT
|
|
28
|
+
s.id,
|
|
29
|
+
s.name,
|
|
30
|
+
s.version,
|
|
31
|
+
s.file_path,
|
|
32
|
+
s.content_hash,
|
|
33
|
+
s.namespace,
|
|
34
|
+
s.status,
|
|
35
|
+
s.priority,
|
|
36
|
+
s.tags,
|
|
37
|
+
asm.is_required,
|
|
38
|
+
asm.priority as mapping_priority
|
|
39
|
+
FROM skills s
|
|
40
|
+
INNER JOIN agent_skill_mappings asm ON s.id = asm.skill_id
|
|
41
|
+
WHERE asm.agent_type = ?
|
|
42
|
+
AND s.status = 'active'
|
|
43
|
+
`;
|
|
44
|
+
// Add phase filter if provided
|
|
45
|
+
if (phase) {
|
|
46
|
+
sql += ` AND (asm.phase IS NULL OR asm.phase = ?)`;
|
|
47
|
+
params.push(phase);
|
|
48
|
+
}
|
|
49
|
+
// Add context keyword filter if provided
|
|
50
|
+
if (contextKeywords && contextKeywords.length > 0) {
|
|
51
|
+
const keywordConditions = contextKeywords.map(()=>`(asm.context_keywords LIKE ? OR s.tags LIKE ?)`).join(' OR ');
|
|
52
|
+
sql += ` AND (${keywordConditions})`;
|
|
53
|
+
contextKeywords.forEach((keyword)=>{
|
|
54
|
+
params.push(`%${keyword}%`, `%${keyword}%`);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
sql += `
|
|
58
|
+
ORDER BY
|
|
59
|
+
asm.is_required DESC,
|
|
60
|
+
COALESCE(asm.priority, s.priority) DESC,
|
|
61
|
+
s.name ASC
|
|
62
|
+
`;
|
|
63
|
+
return {
|
|
64
|
+
sql,
|
|
65
|
+
params
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get bootstrap skills that should always be loaded
|
|
70
|
+
*/ static getBootstrapSkills() {
|
|
71
|
+
const placeholders = BOOTSTRAP_SKILL_IDS.map(()=>'?').join(',');
|
|
72
|
+
return {
|
|
73
|
+
sql: `
|
|
74
|
+
SELECT
|
|
75
|
+
id,
|
|
76
|
+
name,
|
|
77
|
+
version,
|
|
78
|
+
file_path,
|
|
79
|
+
content_hash,
|
|
80
|
+
namespace,
|
|
81
|
+
status,
|
|
82
|
+
priority,
|
|
83
|
+
tags
|
|
84
|
+
FROM skills
|
|
85
|
+
WHERE id IN (${placeholders})
|
|
86
|
+
AND status = 'active'
|
|
87
|
+
ORDER BY priority DESC
|
|
88
|
+
`,
|
|
89
|
+
params: [
|
|
90
|
+
...BOOTSTRAP_SKILL_IDS
|
|
91
|
+
]
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get skill by ID
|
|
96
|
+
*/ static getSkillById(skillId) {
|
|
97
|
+
return {
|
|
98
|
+
sql: `
|
|
99
|
+
SELECT
|
|
100
|
+
id,
|
|
101
|
+
name,
|
|
102
|
+
version,
|
|
103
|
+
file_path,
|
|
104
|
+
content_hash,
|
|
105
|
+
namespace,
|
|
106
|
+
status,
|
|
107
|
+
priority,
|
|
108
|
+
tags,
|
|
109
|
+
created_at,
|
|
110
|
+
updated_at
|
|
111
|
+
FROM skills
|
|
112
|
+
WHERE id = ?
|
|
113
|
+
`,
|
|
114
|
+
params: [
|
|
115
|
+
skillId
|
|
116
|
+
]
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate skill content hash
|
|
121
|
+
*/ static validateContentHash(skillId, expectedHash) {
|
|
122
|
+
return {
|
|
123
|
+
sql: `
|
|
124
|
+
SELECT
|
|
125
|
+
id,
|
|
126
|
+
content_hash,
|
|
127
|
+
updated_at
|
|
128
|
+
FROM skills
|
|
129
|
+
WHERE id = ?
|
|
130
|
+
AND content_hash = ?
|
|
131
|
+
`,
|
|
132
|
+
params: [
|
|
133
|
+
skillId,
|
|
134
|
+
expectedHash
|
|
135
|
+
]
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Log skill usage for analytics
|
|
140
|
+
*/ static insertSkillUsage(usage) {
|
|
141
|
+
return {
|
|
142
|
+
sql: `
|
|
143
|
+
INSERT INTO skill_usage_log (
|
|
144
|
+
id,
|
|
145
|
+
skill_id,
|
|
146
|
+
agent_id,
|
|
147
|
+
agent_type,
|
|
148
|
+
loaded_at,
|
|
149
|
+
execution_time_ms,
|
|
150
|
+
confidence_impact
|
|
151
|
+
) VALUES (?, ?, ?, ?, datetime('now'), ?, ?)
|
|
152
|
+
`,
|
|
153
|
+
params: [
|
|
154
|
+
`usage-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
155
|
+
usage.skill_id,
|
|
156
|
+
usage.agent_id,
|
|
157
|
+
usage.agent_type,
|
|
158
|
+
usage.execution_time_ms,
|
|
159
|
+
usage.confidence_impact ?? null
|
|
160
|
+
]
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get skill effectiveness analytics
|
|
165
|
+
*/ static getSkillEffectiveness(skillId) {
|
|
166
|
+
const params = [];
|
|
167
|
+
let sql = `
|
|
168
|
+
SELECT
|
|
169
|
+
s.id,
|
|
170
|
+
s.name,
|
|
171
|
+
COUNT(sul.id) as usage_count,
|
|
172
|
+
AVG(sul.execution_time_ms) as avg_load_time_ms,
|
|
173
|
+
AVG(sul.confidence_impact) as avg_confidence_impact,
|
|
174
|
+
MAX(sul.loaded_at) as last_used_at
|
|
175
|
+
FROM skills s
|
|
176
|
+
LEFT JOIN skill_usage_log sul ON s.id = sul.skill_id
|
|
177
|
+
`;
|
|
178
|
+
if (skillId) {
|
|
179
|
+
sql += ` WHERE s.id = ?`;
|
|
180
|
+
params.push(skillId);
|
|
181
|
+
}
|
|
182
|
+
sql += `
|
|
183
|
+
GROUP BY s.id, s.name
|
|
184
|
+
ORDER BY usage_count DESC, avg_confidence_impact DESC
|
|
185
|
+
`;
|
|
186
|
+
return {
|
|
187
|
+
sql,
|
|
188
|
+
params
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Update skill content hash (for cache invalidation)
|
|
193
|
+
*/ static updateContentHash(skillId, newHash) {
|
|
194
|
+
return {
|
|
195
|
+
sql: `
|
|
196
|
+
UPDATE skills
|
|
197
|
+
SET content_hash = ?,
|
|
198
|
+
updated_at = datetime('now')
|
|
199
|
+
WHERE id = ?
|
|
200
|
+
`,
|
|
201
|
+
params: [
|
|
202
|
+
newHash,
|
|
203
|
+
skillId
|
|
204
|
+
]
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get all active skills for caching
|
|
209
|
+
*/ static getAllActiveSkills() {
|
|
210
|
+
return {
|
|
211
|
+
sql: `
|
|
212
|
+
SELECT
|
|
213
|
+
id,
|
|
214
|
+
name,
|
|
215
|
+
version,
|
|
216
|
+
file_path,
|
|
217
|
+
content_hash,
|
|
218
|
+
namespace,
|
|
219
|
+
status,
|
|
220
|
+
priority,
|
|
221
|
+
tags
|
|
222
|
+
FROM skills
|
|
223
|
+
WHERE status = 'active'
|
|
224
|
+
ORDER BY priority DESC, name ASC
|
|
225
|
+
`,
|
|
226
|
+
params: []
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get skills by tags
|
|
231
|
+
*/ static getSkillsByTags(tags) {
|
|
232
|
+
const conditions = tags.map(()=>'s.tags LIKE ?').join(' OR ');
|
|
233
|
+
const params = tags.map((tag)=>`%${tag}%`);
|
|
234
|
+
return {
|
|
235
|
+
sql: `
|
|
236
|
+
SELECT
|
|
237
|
+
id,
|
|
238
|
+
name,
|
|
239
|
+
version,
|
|
240
|
+
file_path,
|
|
241
|
+
content_hash,
|
|
242
|
+
namespace,
|
|
243
|
+
status,
|
|
244
|
+
priority,
|
|
245
|
+
tags
|
|
246
|
+
FROM skills s
|
|
247
|
+
WHERE status = 'active'
|
|
248
|
+
AND (${conditions})
|
|
249
|
+
ORDER BY priority DESC, name ASC
|
|
250
|
+
`,
|
|
251
|
+
params
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Create skills table schema
|
|
256
|
+
*/ static createSkillsTableSchema() {
|
|
257
|
+
return `
|
|
258
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
259
|
+
id TEXT PRIMARY KEY,
|
|
260
|
+
name TEXT NOT NULL,
|
|
261
|
+
version TEXT NOT NULL,
|
|
262
|
+
file_path TEXT NOT NULL,
|
|
263
|
+
content_hash TEXT NOT NULL,
|
|
264
|
+
namespace TEXT NOT NULL DEFAULT 'cfn',
|
|
265
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'deprecated', 'experimental')),
|
|
266
|
+
priority INTEGER NOT NULL DEFAULT 5 CHECK(priority BETWEEN 1 AND 10),
|
|
267
|
+
tags TEXT,
|
|
268
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
269
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
CREATE INDEX IF NOT EXISTS idx_skills_status ON skills(status);
|
|
273
|
+
CREATE INDEX IF NOT EXISTS idx_skills_namespace ON skills(namespace);
|
|
274
|
+
CREATE INDEX IF NOT EXISTS idx_skills_priority ON skills(priority);
|
|
275
|
+
CREATE INDEX IF NOT EXISTS idx_skills_tags ON skills(tags);
|
|
276
|
+
`;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create agent_skill_mappings table schema
|
|
280
|
+
*/ static createMappingsTableSchema() {
|
|
281
|
+
return `
|
|
282
|
+
CREATE TABLE IF NOT EXISTS agent_skill_mappings (
|
|
283
|
+
agent_type TEXT NOT NULL,
|
|
284
|
+
skill_id TEXT NOT NULL,
|
|
285
|
+
is_required BOOLEAN NOT NULL DEFAULT 0,
|
|
286
|
+
priority INTEGER NOT NULL DEFAULT 5 CHECK(priority BETWEEN 1 AND 10),
|
|
287
|
+
phase TEXT,
|
|
288
|
+
context_keywords TEXT,
|
|
289
|
+
PRIMARY KEY (agent_type, skill_id),
|
|
290
|
+
FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
CREATE INDEX IF NOT EXISTS idx_asm_agent_type ON agent_skill_mappings(agent_type);
|
|
294
|
+
CREATE INDEX IF NOT EXISTS idx_asm_skill_id ON agent_skill_mappings(skill_id);
|
|
295
|
+
CREATE INDEX IF NOT EXISTS idx_asm_phase ON agent_skill_mappings(phase);
|
|
296
|
+
`;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Create skill_usage_log table schema
|
|
300
|
+
*/ static createUsageLogTableSchema() {
|
|
301
|
+
return `
|
|
302
|
+
CREATE TABLE IF NOT EXISTS skill_usage_log (
|
|
303
|
+
id TEXT PRIMARY KEY,
|
|
304
|
+
skill_id TEXT NOT NULL,
|
|
305
|
+
agent_id TEXT NOT NULL,
|
|
306
|
+
agent_type TEXT NOT NULL,
|
|
307
|
+
loaded_at TEXT NOT NULL,
|
|
308
|
+
execution_time_ms INTEGER NOT NULL,
|
|
309
|
+
confidence_impact REAL,
|
|
310
|
+
FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
CREATE INDEX IF NOT EXISTS idx_sul_skill_id ON skill_usage_log(skill_id);
|
|
314
|
+
CREATE INDEX IF NOT EXISTS idx_sul_agent_type ON skill_usage_log(agent_type);
|
|
315
|
+
CREATE INDEX IF NOT EXISTS idx_sul_loaded_at ON skill_usage_log(loaded_at);
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Create cache_invalidations table schema
|
|
320
|
+
*
|
|
321
|
+
* Tracks cache invalidation events for monitoring and analytics.
|
|
322
|
+
*/ static createCacheInvalidationsTableSchema() {
|
|
323
|
+
return `
|
|
324
|
+
CREATE TABLE IF NOT EXISTS cache_invalidations (
|
|
325
|
+
id TEXT PRIMARY KEY,
|
|
326
|
+
skill_id TEXT NOT NULL,
|
|
327
|
+
invalidated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
328
|
+
reason TEXT NOT NULL,
|
|
329
|
+
old_hash TEXT,
|
|
330
|
+
new_hash TEXT,
|
|
331
|
+
FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
CREATE INDEX IF NOT EXISTS idx_ci_skill_id ON cache_invalidations(skill_id);
|
|
335
|
+
CREATE INDEX IF NOT EXISTS idx_ci_timestamp ON cache_invalidations(invalidated_at);
|
|
336
|
+
`;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Create skill_loader_metrics table schema
|
|
340
|
+
*
|
|
341
|
+
* Tracks skill loader performance metrics for monitoring.
|
|
342
|
+
*/ static createSkillLoaderMetricsTableSchema() {
|
|
343
|
+
return `
|
|
344
|
+
CREATE TABLE IF NOT EXISTS skill_loader_metrics (
|
|
345
|
+
id TEXT PRIMARY KEY,
|
|
346
|
+
agent_type TEXT NOT NULL,
|
|
347
|
+
load_time_ms INTEGER NOT NULL,
|
|
348
|
+
cache_hit INTEGER NOT NULL DEFAULT 0,
|
|
349
|
+
cache_miss INTEGER NOT NULL DEFAULT 0,
|
|
350
|
+
cache_invalidation INTEGER NOT NULL DEFAULT 0,
|
|
351
|
+
skills_loaded INTEGER NOT NULL,
|
|
352
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now'))
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
CREATE INDEX IF NOT EXISTS idx_slm_agent_type ON skill_loader_metrics(agent_type);
|
|
356
|
+
CREATE INDEX IF NOT EXISTS idx_slm_timestamp ON skill_loader_metrics(timestamp);
|
|
357
|
+
`;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get cache invalidation events (last N hours)
|
|
361
|
+
*
|
|
362
|
+
* @param hours - Number of hours to look back (default: 24)
|
|
363
|
+
* @returns SQL query for cache invalidations
|
|
364
|
+
*/ static getCacheInvalidations(hours = 24) {
|
|
365
|
+
return {
|
|
366
|
+
sql: `
|
|
367
|
+
SELECT
|
|
368
|
+
ci.skill_id,
|
|
369
|
+
s.name as skill_name,
|
|
370
|
+
ci.invalidated_at,
|
|
371
|
+
ci.reason,
|
|
372
|
+
ci.old_hash,
|
|
373
|
+
ci.new_hash
|
|
374
|
+
FROM cache_invalidations ci
|
|
375
|
+
LEFT JOIN skills s ON ci.skill_id = s.id
|
|
376
|
+
WHERE ci.invalidated_at > datetime('now', '-' || ? || ' hours')
|
|
377
|
+
ORDER BY ci.invalidated_at DESC
|
|
378
|
+
`,
|
|
379
|
+
params: [
|
|
380
|
+
hours
|
|
381
|
+
]
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Get cache invalidation count (last N hours)
|
|
386
|
+
*
|
|
387
|
+
* @param hours - Number of hours to look back (default: 24)
|
|
388
|
+
* @returns SQL query for invalidation count
|
|
389
|
+
*/ static getCacheInvalidationCount(hours = 24) {
|
|
390
|
+
return {
|
|
391
|
+
sql: `
|
|
392
|
+
SELECT COUNT(*) as invalidations
|
|
393
|
+
FROM cache_invalidations
|
|
394
|
+
WHERE invalidated_at > datetime('now', '-' || ? || ' hours')
|
|
395
|
+
`,
|
|
396
|
+
params: [
|
|
397
|
+
hours
|
|
398
|
+
]
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get skills with frequent updates (top N)
|
|
403
|
+
*
|
|
404
|
+
* Identifies skills that are frequently modified based on invalidation events.
|
|
405
|
+
*
|
|
406
|
+
* @param limit - Number of top skills to return (default: 10)
|
|
407
|
+
* @param hours - Number of hours to look back (default: 168 = 7 days)
|
|
408
|
+
* @returns SQL query for frequently updated skills
|
|
409
|
+
*/ static getFrequentlyUpdatedSkills(limit = 10, hours = 168) {
|
|
410
|
+
return {
|
|
411
|
+
sql: `
|
|
412
|
+
SELECT
|
|
413
|
+
ci.skill_id,
|
|
414
|
+
s.name as skill_name,
|
|
415
|
+
COUNT(*) as update_count,
|
|
416
|
+
MAX(ci.invalidated_at) as last_update
|
|
417
|
+
FROM cache_invalidations ci
|
|
418
|
+
LEFT JOIN skills s ON ci.skill_id = s.id
|
|
419
|
+
WHERE ci.invalidated_at > datetime('now', '-' || ? || ' hours')
|
|
420
|
+
GROUP BY ci.skill_id, s.name
|
|
421
|
+
ORDER BY update_count DESC
|
|
422
|
+
LIMIT ?
|
|
423
|
+
`,
|
|
424
|
+
params: [
|
|
425
|
+
hours,
|
|
426
|
+
limit
|
|
427
|
+
]
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Get cache hit/miss/invalidation ratio
|
|
432
|
+
*
|
|
433
|
+
* Calculates cache performance metrics over the last N hours.
|
|
434
|
+
*
|
|
435
|
+
* @param hours - Number of hours to look back (default: 24)
|
|
436
|
+
* @returns SQL query for cache performance metrics
|
|
437
|
+
*/ static getCachePerformanceMetrics(hours = 24) {
|
|
438
|
+
return {
|
|
439
|
+
sql: `
|
|
440
|
+
SELECT
|
|
441
|
+
SUM(cache_hit) as total_hits,
|
|
442
|
+
SUM(cache_miss) as total_misses,
|
|
443
|
+
SUM(cache_invalidation) as total_invalidations,
|
|
444
|
+
ROUND(100.0 * SUM(cache_hit) / NULLIF(SUM(cache_hit) + SUM(cache_miss), 0), 2) as hit_rate,
|
|
445
|
+
ROUND(AVG(load_time_ms), 2) as avg_load_time_ms,
|
|
446
|
+
COUNT(*) as total_loads
|
|
447
|
+
FROM skill_loader_metrics
|
|
448
|
+
WHERE timestamp > datetime('now', '-' || ? || ' hours')
|
|
449
|
+
`,
|
|
450
|
+
params: [
|
|
451
|
+
hours
|
|
452
|
+
]
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Get cache performance by agent type
|
|
457
|
+
*
|
|
458
|
+
* Breaks down cache performance metrics per agent type.
|
|
459
|
+
*
|
|
460
|
+
* @param hours - Number of hours to look back (default: 24)
|
|
461
|
+
* @returns SQL query for agent-specific cache metrics
|
|
462
|
+
*/ static getCachePerformanceByAgentType(hours = 24) {
|
|
463
|
+
return {
|
|
464
|
+
sql: `
|
|
465
|
+
SELECT
|
|
466
|
+
agent_type,
|
|
467
|
+
SUM(cache_hit) as hits,
|
|
468
|
+
SUM(cache_miss) as misses,
|
|
469
|
+
SUM(cache_invalidation) as invalidations,
|
|
470
|
+
ROUND(100.0 * SUM(cache_hit) / NULLIF(SUM(cache_hit) + SUM(cache_miss), 0), 2) as hit_rate,
|
|
471
|
+
ROUND(AVG(load_time_ms), 2) as avg_load_time_ms,
|
|
472
|
+
COUNT(*) as load_count
|
|
473
|
+
FROM skill_loader_metrics
|
|
474
|
+
WHERE timestamp > datetime('now', '-' || ? || ' hours')
|
|
475
|
+
GROUP BY agent_type
|
|
476
|
+
ORDER BY load_count DESC
|
|
477
|
+
`,
|
|
478
|
+
params: [
|
|
479
|
+
hours
|
|
480
|
+
]
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Record cache invalidation event
|
|
485
|
+
*
|
|
486
|
+
* @param skillId - Skill ID that was invalidated
|
|
487
|
+
* @param reason - Reason for invalidation
|
|
488
|
+
* @param oldHash - Old content hash
|
|
489
|
+
* @param newHash - New content hash
|
|
490
|
+
* @returns SQL query for inserting invalidation record
|
|
491
|
+
*/ static recordCacheInvalidation(skillId, reason, oldHash, newHash) {
|
|
492
|
+
return {
|
|
493
|
+
sql: `
|
|
494
|
+
INSERT INTO cache_invalidations (id, skill_id, reason, old_hash, new_hash)
|
|
495
|
+
VALUES (?, ?, ?, ?, ?)
|
|
496
|
+
`,
|
|
497
|
+
params: [
|
|
498
|
+
`ci-${skillId}-${Date.now()}`,
|
|
499
|
+
skillId,
|
|
500
|
+
reason,
|
|
501
|
+
oldHash || null,
|
|
502
|
+
newHash || null
|
|
503
|
+
]
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Record skill loader metrics
|
|
508
|
+
*
|
|
509
|
+
* @param agentType - Agent type that loaded skills
|
|
510
|
+
* @param loadTimeMs - Load time in milliseconds
|
|
511
|
+
* @param cacheHit - Cache hit count (0 or 1)
|
|
512
|
+
* @param cacheMiss - Cache miss count (0 or 1)
|
|
513
|
+
* @param cacheInvalidation - Cache invalidation count
|
|
514
|
+
* @param skillsLoaded - Number of skills loaded
|
|
515
|
+
* @returns SQL query for inserting metrics record
|
|
516
|
+
*/ static recordSkillLoaderMetrics(agentType, loadTimeMs, cacheHit, cacheMiss, cacheInvalidation, skillsLoaded) {
|
|
517
|
+
return {
|
|
518
|
+
sql: `
|
|
519
|
+
INSERT INTO skill_loader_metrics (id, agent_type, load_time_ms, cache_hit, cache_miss, cache_invalidation, skills_loaded)
|
|
520
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
521
|
+
`,
|
|
522
|
+
params: [
|
|
523
|
+
`slm-${agentType}-${Date.now()}`,
|
|
524
|
+
agentType,
|
|
525
|
+
loadTimeMs,
|
|
526
|
+
cacheHit,
|
|
527
|
+
cacheMiss,
|
|
528
|
+
cacheInvalidation,
|
|
529
|
+
skillsLoaded
|
|
530
|
+
]
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
//# sourceMappingURL=skills-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/skills-query.ts"],"sourcesContent":["/**\r\n * Skills Database Query Layer\r\n *\r\n * Provides type-safe SQL queries for skill metadata operations.\r\n * Part of SkillLoader API implementation.\r\n *\r\n * @module skills-query\r\n */\r\n\r\nimport { QueryFilter, QueryOptions } from '../lib/database-service/types.js';\r\n\r\n/**\r\n * Skill metadata record\r\n */\r\nexport interface SkillRecord {\r\n id: string;\r\n name: string;\r\n version: string;\r\n file_path: string;\r\n content_hash: string;\r\n namespace: string;\r\n status: 'active' | 'deprecated' | 'experimental';\r\n priority: number;\r\n tags: string;\r\n created_at: string;\r\n updated_at: string;\r\n}\r\n\r\n/**\r\n * Agent-skill mapping record\r\n */\r\nexport interface AgentSkillMapping {\r\n agent_type: string;\r\n skill_id: string;\r\n is_required: boolean;\r\n priority: number;\r\n phase?: string;\r\n context_keywords?: string;\r\n}\r\n\r\n/**\r\n * Skill usage analytics record\r\n */\r\nexport interface SkillUsageRecord {\r\n id: string;\r\n skill_id: string;\r\n agent_id: string;\r\n agent_type: string;\r\n loaded_at: string;\r\n execution_time_ms: number;\r\n confidence_impact?: number;\r\n}\r\n\r\n/**\r\n * Bootstrap skill IDs that should always be loaded\r\n */\r\nexport const BOOTSTRAP_SKILL_IDS = [\r\n 'cfn-coordination',\r\n 'hook-pipeline',\r\n 'pre-edit-backup',\r\n 'cfn-agent-spawning',\r\n 'cfn-loop-validation',\r\n] as const;\r\n\r\n/**\r\n * SQL queries for skills database operations\r\n */\r\nexport class SkillsQueryBuilder {\r\n /**\r\n * Get skills by agent type with optional context filtering\r\n */\r\n static getSkillsByAgentType(\r\n agentType: string,\r\n contextKeywords?: string[],\r\n phase?: string\r\n ): { sql: string; params: any[] } {\r\n const params: any[] = [agentType];\r\n let sql = `\r\n SELECT DISTINCT\r\n s.id,\r\n s.name,\r\n s.version,\r\n s.file_path,\r\n s.content_hash,\r\n s.namespace,\r\n s.status,\r\n s.priority,\r\n s.tags,\r\n asm.is_required,\r\n asm.priority as mapping_priority\r\n FROM skills s\r\n INNER JOIN agent_skill_mappings asm ON s.id = asm.skill_id\r\n WHERE asm.agent_type = ?\r\n AND s.status = 'active'\r\n `;\r\n\r\n // Add phase filter if provided\r\n if (phase) {\r\n sql += ` AND (asm.phase IS NULL OR asm.phase = ?)`;\r\n params.push(phase);\r\n }\r\n\r\n // Add context keyword filter if provided\r\n if (contextKeywords && contextKeywords.length > 0) {\r\n const keywordConditions = contextKeywords.map(() =>\r\n `(asm.context_keywords LIKE ? OR s.tags LIKE ?)`\r\n ).join(' OR ');\r\n\r\n sql += ` AND (${keywordConditions})`;\r\n\r\n contextKeywords.forEach(keyword => {\r\n params.push(`%${keyword}%`, `%${keyword}%`);\r\n });\r\n }\r\n\r\n sql += `\r\n ORDER BY\r\n asm.is_required DESC,\r\n COALESCE(asm.priority, s.priority) DESC,\r\n s.name ASC\r\n `;\r\n\r\n return { sql, params };\r\n }\r\n\r\n /**\r\n * Get bootstrap skills that should always be loaded\r\n */\r\n static getBootstrapSkills(): { sql: string; params: any[] } {\r\n const placeholders = BOOTSTRAP_SKILL_IDS.map(() => '?').join(',');\r\n\r\n return {\r\n sql: `\r\n SELECT\r\n id,\r\n name,\r\n version,\r\n file_path,\r\n content_hash,\r\n namespace,\r\n status,\r\n priority,\r\n tags\r\n FROM skills\r\n WHERE id IN (${placeholders})\r\n AND status = 'active'\r\n ORDER BY priority DESC\r\n `,\r\n params: [...BOOTSTRAP_SKILL_IDS],\r\n };\r\n }\r\n\r\n /**\r\n * Get skill by ID\r\n */\r\n static getSkillById(skillId: string): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n id,\r\n name,\r\n version,\r\n file_path,\r\n content_hash,\r\n namespace,\r\n status,\r\n priority,\r\n tags,\r\n created_at,\r\n updated_at\r\n FROM skills\r\n WHERE id = ?\r\n `,\r\n params: [skillId],\r\n };\r\n }\r\n\r\n /**\r\n * Validate skill content hash\r\n */\r\n static validateContentHash(skillId: string, expectedHash: string): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n id,\r\n content_hash,\r\n updated_at\r\n FROM skills\r\n WHERE id = ?\r\n AND content_hash = ?\r\n `,\r\n params: [skillId, expectedHash],\r\n };\r\n }\r\n\r\n /**\r\n * Log skill usage for analytics\r\n */\r\n static insertSkillUsage(usage: Omit<SkillUsageRecord, 'id' | 'loaded_at'>): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n INSERT INTO skill_usage_log (\r\n id,\r\n skill_id,\r\n agent_id,\r\n agent_type,\r\n loaded_at,\r\n execution_time_ms,\r\n confidence_impact\r\n ) VALUES (?, ?, ?, ?, datetime('now'), ?, ?)\r\n `,\r\n params: [\r\n `usage-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n usage.skill_id,\r\n usage.agent_id,\r\n usage.agent_type,\r\n usage.execution_time_ms,\r\n usage.confidence_impact ?? null,\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Get skill effectiveness analytics\r\n */\r\n static getSkillEffectiveness(skillId?: string): { sql: string; params: any[] } {\r\n const params: any[] = [];\r\n let sql = `\r\n SELECT\r\n s.id,\r\n s.name,\r\n COUNT(sul.id) as usage_count,\r\n AVG(sul.execution_time_ms) as avg_load_time_ms,\r\n AVG(sul.confidence_impact) as avg_confidence_impact,\r\n MAX(sul.loaded_at) as last_used_at\r\n FROM skills s\r\n LEFT JOIN skill_usage_log sul ON s.id = sul.skill_id\r\n `;\r\n\r\n if (skillId) {\r\n sql += ` WHERE s.id = ?`;\r\n params.push(skillId);\r\n }\r\n\r\n sql += `\r\n GROUP BY s.id, s.name\r\n ORDER BY usage_count DESC, avg_confidence_impact DESC\r\n `;\r\n\r\n return { sql, params };\r\n }\r\n\r\n /**\r\n * Update skill content hash (for cache invalidation)\r\n */\r\n static updateContentHash(skillId: string, newHash: string): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n UPDATE skills\r\n SET content_hash = ?,\r\n updated_at = datetime('now')\r\n WHERE id = ?\r\n `,\r\n params: [newHash, skillId],\r\n };\r\n }\r\n\r\n /**\r\n * Get all active skills for caching\r\n */\r\n static getAllActiveSkills(): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n id,\r\n name,\r\n version,\r\n file_path,\r\n content_hash,\r\n namespace,\r\n status,\r\n priority,\r\n tags\r\n FROM skills\r\n WHERE status = 'active'\r\n ORDER BY priority DESC, name ASC\r\n `,\r\n params: [],\r\n };\r\n }\r\n\r\n /**\r\n * Get skills by tags\r\n */\r\n static getSkillsByTags(tags: string[]): { sql: string; params: any[] } {\r\n const conditions = tags.map(() => 's.tags LIKE ?').join(' OR ');\r\n const params = tags.map(tag => `%${tag}%`);\r\n\r\n return {\r\n sql: `\r\n SELECT\r\n id,\r\n name,\r\n version,\r\n file_path,\r\n content_hash,\r\n namespace,\r\n status,\r\n priority,\r\n tags\r\n FROM skills s\r\n WHERE status = 'active'\r\n AND (${conditions})\r\n ORDER BY priority DESC, name ASC\r\n `,\r\n params,\r\n };\r\n }\r\n\r\n /**\r\n * Create skills table schema\r\n */\r\n static createSkillsTableSchema(): string {\r\n return `\r\n CREATE TABLE IF NOT EXISTS skills (\r\n id TEXT PRIMARY KEY,\r\n name TEXT NOT NULL,\r\n version TEXT NOT NULL,\r\n file_path TEXT NOT NULL,\r\n content_hash TEXT NOT NULL,\r\n namespace TEXT NOT NULL DEFAULT 'cfn',\r\n status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'deprecated', 'experimental')),\r\n priority INTEGER NOT NULL DEFAULT 5 CHECK(priority BETWEEN 1 AND 10),\r\n tags TEXT,\r\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\r\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_skills_status ON skills(status);\r\n CREATE INDEX IF NOT EXISTS idx_skills_namespace ON skills(namespace);\r\n CREATE INDEX IF NOT EXISTS idx_skills_priority ON skills(priority);\r\n CREATE INDEX IF NOT EXISTS idx_skills_tags ON skills(tags);\r\n `;\r\n }\r\n\r\n /**\r\n * Create agent_skill_mappings table schema\r\n */\r\n static createMappingsTableSchema(): string {\r\n return `\r\n CREATE TABLE IF NOT EXISTS agent_skill_mappings (\r\n agent_type TEXT NOT NULL,\r\n skill_id TEXT NOT NULL,\r\n is_required BOOLEAN NOT NULL DEFAULT 0,\r\n priority INTEGER NOT NULL DEFAULT 5 CHECK(priority BETWEEN 1 AND 10),\r\n phase TEXT,\r\n context_keywords TEXT,\r\n PRIMARY KEY (agent_type, skill_id),\r\n FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_asm_agent_type ON agent_skill_mappings(agent_type);\r\n CREATE INDEX IF NOT EXISTS idx_asm_skill_id ON agent_skill_mappings(skill_id);\r\n CREATE INDEX IF NOT EXISTS idx_asm_phase ON agent_skill_mappings(phase);\r\n `;\r\n }\r\n\r\n /**\r\n * Create skill_usage_log table schema\r\n */\r\n static createUsageLogTableSchema(): string {\r\n return `\r\n CREATE TABLE IF NOT EXISTS skill_usage_log (\r\n id TEXT PRIMARY KEY,\r\n skill_id TEXT NOT NULL,\r\n agent_id TEXT NOT NULL,\r\n agent_type TEXT NOT NULL,\r\n loaded_at TEXT NOT NULL,\r\n execution_time_ms INTEGER NOT NULL,\r\n confidence_impact REAL,\r\n FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_sul_skill_id ON skill_usage_log(skill_id);\r\n CREATE INDEX IF NOT EXISTS idx_sul_agent_type ON skill_usage_log(agent_type);\r\n CREATE INDEX IF NOT EXISTS idx_sul_loaded_at ON skill_usage_log(loaded_at);\r\n `;\r\n }\r\n\r\n /**\r\n * Create cache_invalidations table schema\r\n *\r\n * Tracks cache invalidation events for monitoring and analytics.\r\n */\r\n static createCacheInvalidationsTableSchema(): string {\r\n return `\r\n CREATE TABLE IF NOT EXISTS cache_invalidations (\r\n id TEXT PRIMARY KEY,\r\n skill_id TEXT NOT NULL,\r\n invalidated_at TEXT NOT NULL DEFAULT (datetime('now')),\r\n reason TEXT NOT NULL,\r\n old_hash TEXT,\r\n new_hash TEXT,\r\n FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_ci_skill_id ON cache_invalidations(skill_id);\r\n CREATE INDEX IF NOT EXISTS idx_ci_timestamp ON cache_invalidations(invalidated_at);\r\n `;\r\n }\r\n\r\n /**\r\n * Create skill_loader_metrics table schema\r\n *\r\n * Tracks skill loader performance metrics for monitoring.\r\n */\r\n static createSkillLoaderMetricsTableSchema(): string {\r\n return `\r\n CREATE TABLE IF NOT EXISTS skill_loader_metrics (\r\n id TEXT PRIMARY KEY,\r\n agent_type TEXT NOT NULL,\r\n load_time_ms INTEGER NOT NULL,\r\n cache_hit INTEGER NOT NULL DEFAULT 0,\r\n cache_miss INTEGER NOT NULL DEFAULT 0,\r\n cache_invalidation INTEGER NOT NULL DEFAULT 0,\r\n skills_loaded INTEGER NOT NULL,\r\n timestamp TEXT NOT NULL DEFAULT (datetime('now'))\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_slm_agent_type ON skill_loader_metrics(agent_type);\r\n CREATE INDEX IF NOT EXISTS idx_slm_timestamp ON skill_loader_metrics(timestamp);\r\n `;\r\n }\r\n\r\n /**\r\n * Get cache invalidation events (last N hours)\r\n *\r\n * @param hours - Number of hours to look back (default: 24)\r\n * @returns SQL query for cache invalidations\r\n */\r\n static getCacheInvalidations(hours: number = 24): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n ci.skill_id,\r\n s.name as skill_name,\r\n ci.invalidated_at,\r\n ci.reason,\r\n ci.old_hash,\r\n ci.new_hash\r\n FROM cache_invalidations ci\r\n LEFT JOIN skills s ON ci.skill_id = s.id\r\n WHERE ci.invalidated_at > datetime('now', '-' || ? || ' hours')\r\n ORDER BY ci.invalidated_at DESC\r\n `,\r\n params: [hours],\r\n };\r\n }\r\n\r\n /**\r\n * Get cache invalidation count (last N hours)\r\n *\r\n * @param hours - Number of hours to look back (default: 24)\r\n * @returns SQL query for invalidation count\r\n */\r\n static getCacheInvalidationCount(hours: number = 24): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT COUNT(*) as invalidations\r\n FROM cache_invalidations\r\n WHERE invalidated_at > datetime('now', '-' || ? || ' hours')\r\n `,\r\n params: [hours],\r\n };\r\n }\r\n\r\n /**\r\n * Get skills with frequent updates (top N)\r\n *\r\n * Identifies skills that are frequently modified based on invalidation events.\r\n *\r\n * @param limit - Number of top skills to return (default: 10)\r\n * @param hours - Number of hours to look back (default: 168 = 7 days)\r\n * @returns SQL query for frequently updated skills\r\n */\r\n static getFrequentlyUpdatedSkills(\r\n limit: number = 10,\r\n hours: number = 168\r\n ): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n ci.skill_id,\r\n s.name as skill_name,\r\n COUNT(*) as update_count,\r\n MAX(ci.invalidated_at) as last_update\r\n FROM cache_invalidations ci\r\n LEFT JOIN skills s ON ci.skill_id = s.id\r\n WHERE ci.invalidated_at > datetime('now', '-' || ? || ' hours')\r\n GROUP BY ci.skill_id, s.name\r\n ORDER BY update_count DESC\r\n LIMIT ?\r\n `,\r\n params: [hours, limit],\r\n };\r\n }\r\n\r\n /**\r\n * Get cache hit/miss/invalidation ratio\r\n *\r\n * Calculates cache performance metrics over the last N hours.\r\n *\r\n * @param hours - Number of hours to look back (default: 24)\r\n * @returns SQL query for cache performance metrics\r\n */\r\n static getCachePerformanceMetrics(hours: number = 24): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n SUM(cache_hit) as total_hits,\r\n SUM(cache_miss) as total_misses,\r\n SUM(cache_invalidation) as total_invalidations,\r\n ROUND(100.0 * SUM(cache_hit) / NULLIF(SUM(cache_hit) + SUM(cache_miss), 0), 2) as hit_rate,\r\n ROUND(AVG(load_time_ms), 2) as avg_load_time_ms,\r\n COUNT(*) as total_loads\r\n FROM skill_loader_metrics\r\n WHERE timestamp > datetime('now', '-' || ? || ' hours')\r\n `,\r\n params: [hours],\r\n };\r\n }\r\n\r\n /**\r\n * Get cache performance by agent type\r\n *\r\n * Breaks down cache performance metrics per agent type.\r\n *\r\n * @param hours - Number of hours to look back (default: 24)\r\n * @returns SQL query for agent-specific cache metrics\r\n */\r\n static getCachePerformanceByAgentType(hours: number = 24): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n SELECT\r\n agent_type,\r\n SUM(cache_hit) as hits,\r\n SUM(cache_miss) as misses,\r\n SUM(cache_invalidation) as invalidations,\r\n ROUND(100.0 * SUM(cache_hit) / NULLIF(SUM(cache_hit) + SUM(cache_miss), 0), 2) as hit_rate,\r\n ROUND(AVG(load_time_ms), 2) as avg_load_time_ms,\r\n COUNT(*) as load_count\r\n FROM skill_loader_metrics\r\n WHERE timestamp > datetime('now', '-' || ? || ' hours')\r\n GROUP BY agent_type\r\n ORDER BY load_count DESC\r\n `,\r\n params: [hours],\r\n };\r\n }\r\n\r\n /**\r\n * Record cache invalidation event\r\n *\r\n * @param skillId - Skill ID that was invalidated\r\n * @param reason - Reason for invalidation\r\n * @param oldHash - Old content hash\r\n * @param newHash - New content hash\r\n * @returns SQL query for inserting invalidation record\r\n */\r\n static recordCacheInvalidation(\r\n skillId: string,\r\n reason: string,\r\n oldHash?: string,\r\n newHash?: string\r\n ): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n INSERT INTO cache_invalidations (id, skill_id, reason, old_hash, new_hash)\r\n VALUES (?, ?, ?, ?, ?)\r\n `,\r\n params: [\r\n `ci-${skillId}-${Date.now()}`,\r\n skillId,\r\n reason,\r\n oldHash || null,\r\n newHash || null,\r\n ],\r\n };\r\n }\r\n\r\n /**\r\n * Record skill loader metrics\r\n *\r\n * @param agentType - Agent type that loaded skills\r\n * @param loadTimeMs - Load time in milliseconds\r\n * @param cacheHit - Cache hit count (0 or 1)\r\n * @param cacheMiss - Cache miss count (0 or 1)\r\n * @param cacheInvalidation - Cache invalidation count\r\n * @param skillsLoaded - Number of skills loaded\r\n * @returns SQL query for inserting metrics record\r\n */\r\n static recordSkillLoaderMetrics(\r\n agentType: string,\r\n loadTimeMs: number,\r\n cacheHit: number,\r\n cacheMiss: number,\r\n cacheInvalidation: number,\r\n skillsLoaded: number\r\n ): { sql: string; params: any[] } {\r\n return {\r\n sql: `\r\n INSERT INTO skill_loader_metrics (id, agent_type, load_time_ms, cache_hit, cache_miss, cache_invalidation, skills_loaded)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)\r\n `,\r\n params: [\r\n `slm-${agentType}-${Date.now()}`,\r\n agentType,\r\n loadTimeMs,\r\n cacheHit,\r\n cacheMiss,\r\n cacheInvalidation,\r\n skillsLoaded,\r\n ],\r\n };\r\n }\r\n}\r\n"],"names":["BOOTSTRAP_SKILL_IDS","SkillsQueryBuilder","getSkillsByAgentType","agentType","contextKeywords","phase","params","sql","push","length","keywordConditions","map","join","forEach","keyword","getBootstrapSkills","placeholders","getSkillById","skillId","validateContentHash","expectedHash","insertSkillUsage","usage","Date","now","Math","random","toString","substr","skill_id","agent_id","agent_type","execution_time_ms","confidence_impact","getSkillEffectiveness","updateContentHash","newHash","getAllActiveSkills","getSkillsByTags","tags","conditions","tag","createSkillsTableSchema","createMappingsTableSchema","createUsageLogTableSchema","createCacheInvalidationsTableSchema","createSkillLoaderMetricsTableSchema","getCacheInvalidations","hours","getCacheInvalidationCount","getFrequentlyUpdatedSkills","limit","getCachePerformanceMetrics","getCachePerformanceByAgentType","recordCacheInvalidation","reason","oldHash","recordSkillLoaderMetrics","loadTimeMs","cacheHit","cacheMiss","cacheInvalidation","skillsLoaded"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - Automatic retry on transient failures
|
|
10
10
|
*/ import { Pool as PgPool } from 'pg';
|
|
11
11
|
import sqlite3 from 'sqlite3';
|
|
12
|
-
import { StandardAdapter, JSONLogger } from './StandardAdapter';
|
|
12
|
+
import { StandardAdapter, JSONLogger } from './StandardAdapter.js';
|
|
13
13
|
/**
|
|
14
14
|
* DatabaseHandoff - Reference implementation for cross-database correlation
|
|
15
15
|
*
|