claude-flow-novice 2.15.3 → 2.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +29 -6
- 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 +238 -29
- 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 +6 -2
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -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 +29 -6
- 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 +238 -29
- 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 +6 -2
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -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/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/config-manager.js +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +201 -0
- package/dist/cli/conversation-fork-cleanup.js.map +1 -0
- package/dist/cli/conversation-fork.js +16 -3
- package/dist/cli/conversation-fork.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/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
- package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
- package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
- package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
- package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
- package/package.json +35 -4
- package/readme/README.md +53 -5
- 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/scripts/verify-redis-cleanup.sh +173 -0
- package/tests/README.md +84 -0
- package/tests/test-memory-leak-task-mode.sh +435 -0
- 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,350 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# test-metadata-update.sh - Test Metadata Update Functionality
|
|
4
|
+
#
|
|
5
|
+
# Purpose: Verify that propagate-skill-update.sh correctly updates
|
|
6
|
+
# frontmatter metadata (tags, category, owner, approval_level)
|
|
7
|
+
# when propagating skill updates.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
# Input validation (SQL injection prevention)
|
|
12
|
+
validate_identifier() {
|
|
13
|
+
local input="$1"
|
|
14
|
+
local max_length="${2:-255}"
|
|
15
|
+
if ! [[ "$input" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
16
|
+
echo "ERROR: Invalid identifier (alphanumeric + underscore/hyphen only): $input" >&2
|
|
17
|
+
return 1
|
|
18
|
+
fi
|
|
19
|
+
if [ ${#input} -gt $max_length ]; then
|
|
20
|
+
echo "ERROR: Identifier exceeds max length ($max_length chars)" >&2
|
|
21
|
+
return 1
|
|
22
|
+
fi
|
|
23
|
+
return 0
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
27
|
+
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
|
28
|
+
|
|
29
|
+
# Colors
|
|
30
|
+
RED='\033[0;31m'
|
|
31
|
+
GREEN='\033[0;32m'
|
|
32
|
+
YELLOW='\033[1;33m'
|
|
33
|
+
BLUE='\033[0;34m'
|
|
34
|
+
NC='\033[0m'
|
|
35
|
+
|
|
36
|
+
# Test database path
|
|
37
|
+
TEST_DB="/tmp/test-skills-metadata-$(date +%s).db"
|
|
38
|
+
|
|
39
|
+
# Cleanup function
|
|
40
|
+
cleanup() {
|
|
41
|
+
if [[ -f "$TEST_DB" ]]; then
|
|
42
|
+
rm -f "$TEST_DB"
|
|
43
|
+
fi
|
|
44
|
+
rm -f /tmp/test-skill-*.md
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# Helper functions
|
|
48
|
+
log_test() {
|
|
49
|
+
echo -e "${YELLOW}$*${NC}"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
log_pass() {
|
|
53
|
+
echo -e "${GREEN}✓ PASS${NC}"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
log_fail() {
|
|
57
|
+
echo -e "${RED}✗ FAIL${NC} $*"
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# Create test database schema
|
|
61
|
+
setup_test_db() {
|
|
62
|
+
log_test "Setting up test database..."
|
|
63
|
+
|
|
64
|
+
sqlite3 "$TEST_DB" <<EOF
|
|
65
|
+
CREATE TABLE skills (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
name TEXT NOT NULL UNIQUE,
|
|
68
|
+
category TEXT NOT NULL,
|
|
69
|
+
tags TEXT,
|
|
70
|
+
version TEXT NOT NULL DEFAULT '1.0.0',
|
|
71
|
+
content_path TEXT NOT NULL,
|
|
72
|
+
content_hash TEXT NOT NULL,
|
|
73
|
+
owner TEXT,
|
|
74
|
+
approval_level TEXT DEFAULT 'manual',
|
|
75
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
76
|
+
updated_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
CREATE TABLE approval_history (
|
|
80
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
81
|
+
skill_id INTEGER NOT NULL,
|
|
82
|
+
version TEXT NOT NULL,
|
|
83
|
+
approval_level TEXT NOT NULL,
|
|
84
|
+
approver TEXT NOT NULL,
|
|
85
|
+
decision TEXT NOT NULL,
|
|
86
|
+
reasoning TEXT,
|
|
87
|
+
approval_criteria_check TEXT,
|
|
88
|
+
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
89
|
+
FOREIGN KEY (skill_id) REFERENCES skills(id)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE TABLE agent_skill_mappings (
|
|
93
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
94
|
+
agent_type TEXT NOT NULL,
|
|
95
|
+
skill_id INTEGER NOT NULL,
|
|
96
|
+
FOREIGN KEY (skill_id) REFERENCES skills(id)
|
|
97
|
+
);
|
|
98
|
+
EOF
|
|
99
|
+
|
|
100
|
+
log_pass
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Create test skill v1.0.0
|
|
104
|
+
create_test_skill_v1() {
|
|
105
|
+
local skill_file="/tmp/test-skill-v1.0.0.md"
|
|
106
|
+
|
|
107
|
+
cat > "$skill_file" <<'EOF'
|
|
108
|
+
---
|
|
109
|
+
name: test-skill
|
|
110
|
+
category: testing
|
|
111
|
+
tags: [original, test]
|
|
112
|
+
version: 1.0.0
|
|
113
|
+
owner: test-owner
|
|
114
|
+
approval_level: manual
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
# Test Skill v1.0.0
|
|
118
|
+
|
|
119
|
+
Original content for testing.
|
|
120
|
+
EOF
|
|
121
|
+
|
|
122
|
+
# Calculate hash
|
|
123
|
+
local hash=$(sha256sum "$skill_file" | awk '{print $1}')
|
|
124
|
+
|
|
125
|
+
# Insert into database
|
|
126
|
+
sqlite3 "$TEST_DB" <<EOSQL
|
|
127
|
+
INSERT INTO skills (name, category, tags, version, content_path, content_hash, owner, approval_level)
|
|
128
|
+
VALUES (
|
|
129
|
+
'test-skill',
|
|
130
|
+
'testing',
|
|
131
|
+
'["original","test"]',
|
|
132
|
+
'1.0.0',
|
|
133
|
+
'$skill_file',
|
|
134
|
+
'$hash',
|
|
135
|
+
'test-owner',
|
|
136
|
+
'manual'
|
|
137
|
+
);
|
|
138
|
+
EOSQL
|
|
139
|
+
|
|
140
|
+
echo "$skill_file"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# Create test skill v1.0.1 with updated metadata
|
|
144
|
+
create_test_skill_v1_0_1() {
|
|
145
|
+
local skill_file="/tmp/test-skill-v1.0.1.md"
|
|
146
|
+
|
|
147
|
+
cat > "$skill_file" <<'EOF'
|
|
148
|
+
---
|
|
149
|
+
name: test-skill
|
|
150
|
+
category: updated-category
|
|
151
|
+
tags: [updated, new-tag, test]
|
|
152
|
+
version: 1.0.1
|
|
153
|
+
owner: new-owner
|
|
154
|
+
approval_level: auto
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
# Test Skill v1.0.1
|
|
158
|
+
|
|
159
|
+
Updated content with new metadata.
|
|
160
|
+
EOF
|
|
161
|
+
|
|
162
|
+
echo "$skill_file"
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# Test 1: Verify metadata is updated
|
|
166
|
+
test_metadata_update() {
|
|
167
|
+
log_test "Test 1: Verify metadata is updated from frontmatter"
|
|
168
|
+
|
|
169
|
+
# Create initial skill
|
|
170
|
+
local v1_path=$(create_test_skill_v1)
|
|
171
|
+
|
|
172
|
+
# Create updated skill
|
|
173
|
+
local v1_0_1_path=$(create_test_skill_v1_0_1)
|
|
174
|
+
|
|
175
|
+
# Run propagate-skill-update.sh
|
|
176
|
+
export CFN_SKILLS_DB_PATH="$TEST_DB"
|
|
177
|
+
|
|
178
|
+
if bash "${SCRIPT_DIR}/propagate-skill-update.sh" \
|
|
179
|
+
"test-skill" \
|
|
180
|
+
"1.0.1" \
|
|
181
|
+
"$v1_0_1_path" \
|
|
182
|
+
"patch" \
|
|
183
|
+
"false" > /dev/null 2>&1; then
|
|
184
|
+
|
|
185
|
+
# Verify version updated
|
|
186
|
+
local version=$(sqlite3 "$TEST_DB" "SELECT version FROM skills WHERE name='test-skill'")
|
|
187
|
+
if [[ "$version" != "1.0.1" ]]; then
|
|
188
|
+
log_fail "Version not updated (expected: 1.0.1, got: $version)"
|
|
189
|
+
return 1
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
# Verify tags updated
|
|
193
|
+
local tags=$(sqlite3 "$TEST_DB" "SELECT tags FROM skills WHERE name='test-skill'")
|
|
194
|
+
if [[ "$tags" != '["updated","new-tag","test"]' ]]; then
|
|
195
|
+
log_fail "Tags not updated (expected: [\"updated\",\"new-tag\",\"test\"], got: $tags)"
|
|
196
|
+
return 1
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
# Verify category updated
|
|
200
|
+
local category=$(sqlite3 "$TEST_DB" "SELECT category FROM skills WHERE name='test-skill'")
|
|
201
|
+
if [[ "$category" != "updated-category" ]]; then
|
|
202
|
+
log_fail "Category not updated (expected: updated-category, got: $category)"
|
|
203
|
+
return 1
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
# Verify owner updated
|
|
207
|
+
local owner=$(sqlite3 "$TEST_DB" "SELECT owner FROM skills WHERE name='test-skill'")
|
|
208
|
+
if [[ "$owner" != "new-owner" ]]; then
|
|
209
|
+
log_fail "Owner not updated (expected: new-owner, got: $owner)"
|
|
210
|
+
return 1
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
# Verify approval_level updated
|
|
214
|
+
local approval_level=$(sqlite3 "$TEST_DB" "SELECT approval_level FROM skills WHERE name='test-skill'")
|
|
215
|
+
if [[ "$approval_level" != "auto" ]]; then
|
|
216
|
+
log_fail "Approval level not updated (expected: auto, got: $approval_level)"
|
|
217
|
+
return 1
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
log_pass
|
|
221
|
+
return 0
|
|
222
|
+
else
|
|
223
|
+
log_fail "propagate-skill-update.sh failed"
|
|
224
|
+
return 1
|
|
225
|
+
fi
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
# Test 2: Verify fallback to existing values when metadata missing
|
|
229
|
+
test_metadata_fallback() {
|
|
230
|
+
log_test "Test 2: Verify fallback to existing values when frontmatter missing"
|
|
231
|
+
|
|
232
|
+
echo "DEBUG: Test 2 started" >&2
|
|
233
|
+
|
|
234
|
+
# Clean database
|
|
235
|
+
if [[ -f "$TEST_DB" ]]; then
|
|
236
|
+
sqlite3 "$TEST_DB" "DELETE FROM skills" || {
|
|
237
|
+
log_fail "Failed to clean database"
|
|
238
|
+
return 1
|
|
239
|
+
}
|
|
240
|
+
else
|
|
241
|
+
log_fail "Database not found: $TEST_DB"
|
|
242
|
+
return 1
|
|
243
|
+
fi
|
|
244
|
+
|
|
245
|
+
# Create initial skill
|
|
246
|
+
local v1_path=$(create_test_skill_v1)
|
|
247
|
+
|
|
248
|
+
# Create updated skill without some metadata
|
|
249
|
+
local skill_file="/tmp/test-skill-v1.0.2.md"
|
|
250
|
+
cat > "$skill_file" <<'EOF'
|
|
251
|
+
---
|
|
252
|
+
name: test-skill
|
|
253
|
+
version: 1.0.2
|
|
254
|
+
tags: [partial-update]
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
# Test Skill v1.0.2
|
|
258
|
+
|
|
259
|
+
Updated content with partial metadata.
|
|
260
|
+
EOF
|
|
261
|
+
|
|
262
|
+
# Run propagate-skill-update.sh
|
|
263
|
+
export CFN_SKILLS_DB_PATH="$TEST_DB"
|
|
264
|
+
|
|
265
|
+
if bash "${SCRIPT_DIR}/propagate-skill-update.sh" \
|
|
266
|
+
"test-skill" \
|
|
267
|
+
"1.0.2" \
|
|
268
|
+
"$skill_file" \
|
|
269
|
+
"patch" \
|
|
270
|
+
"false" > /dev/null 2>&1; then
|
|
271
|
+
|
|
272
|
+
# Verify tags updated
|
|
273
|
+
local tags=$(sqlite3 "$TEST_DB" "SELECT tags FROM skills WHERE name='test-skill'")
|
|
274
|
+
if [[ "$tags" != '["partial-update"]' ]]; then
|
|
275
|
+
log_fail "Tags not updated (expected: [\"partial-update\"], got: $tags)"
|
|
276
|
+
return 1
|
|
277
|
+
fi
|
|
278
|
+
|
|
279
|
+
# Verify category fallback to existing value
|
|
280
|
+
local category=$(sqlite3 "$TEST_DB" "SELECT category FROM skills WHERE name='test-skill'")
|
|
281
|
+
if [[ "$category" != "testing" ]]; then
|
|
282
|
+
log_fail "Category fallback failed (expected: testing, got: $category)"
|
|
283
|
+
return 1
|
|
284
|
+
fi
|
|
285
|
+
|
|
286
|
+
# Verify owner fallback to existing value
|
|
287
|
+
local owner=$(sqlite3 "$TEST_DB" "SELECT owner FROM skills WHERE name='test-skill'")
|
|
288
|
+
if [[ "$owner" != "test-owner" ]]; then
|
|
289
|
+
log_fail "Owner fallback failed (expected: test-owner, got: $owner)"
|
|
290
|
+
return 1
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
log_pass
|
|
294
|
+
return 0
|
|
295
|
+
else
|
|
296
|
+
log_fail "propagate-skill-update.sh failed"
|
|
297
|
+
return 1
|
|
298
|
+
fi
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
# Main execution
|
|
302
|
+
main() {
|
|
303
|
+
echo "=========================================="
|
|
304
|
+
echo "Metadata Update Functionality Tests"
|
|
305
|
+
echo "=========================================="
|
|
306
|
+
echo ""
|
|
307
|
+
|
|
308
|
+
setup_test_db
|
|
309
|
+
echo ""
|
|
310
|
+
|
|
311
|
+
local tests_passed=0
|
|
312
|
+
local tests_failed=0
|
|
313
|
+
|
|
314
|
+
if test_metadata_update; then
|
|
315
|
+
((tests_passed++))
|
|
316
|
+
else
|
|
317
|
+
((tests_failed++))
|
|
318
|
+
fi
|
|
319
|
+
echo ""
|
|
320
|
+
|
|
321
|
+
echo "DEBUG: About to run Test 2" >&2
|
|
322
|
+
|
|
323
|
+
if test_metadata_fallback; then
|
|
324
|
+
((tests_passed++))
|
|
325
|
+
else
|
|
326
|
+
((tests_failed++))
|
|
327
|
+
fi
|
|
328
|
+
echo ""
|
|
329
|
+
|
|
330
|
+
# Summary
|
|
331
|
+
echo "=========================================="
|
|
332
|
+
echo "Test Summary"
|
|
333
|
+
echo "=========================================="
|
|
334
|
+
echo "Tests run: $((tests_passed + tests_failed))"
|
|
335
|
+
echo -e "${GREEN}Tests passed: $tests_passed${NC}"
|
|
336
|
+
|
|
337
|
+
if [[ $tests_failed -gt 0 ]]; then
|
|
338
|
+
echo -e "${RED}Tests failed: $tests_failed${NC}"
|
|
339
|
+
echo "=========================================="
|
|
340
|
+
cleanup
|
|
341
|
+
return 1
|
|
342
|
+
else
|
|
343
|
+
echo "Tests failed: 0"
|
|
344
|
+
echo "=========================================="
|
|
345
|
+
cleanup
|
|
346
|
+
return 0
|
|
347
|
+
fi
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
main "$@"
|
|
@@ -1,10 +1,38 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
+
# Input validation functions (SQL injection prevention)
|
|
5
|
+
validate_date() {
|
|
6
|
+
local input="$1"
|
|
7
|
+
if ! [[ "$input" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
|
|
8
|
+
echo "ERROR: Invalid date format: $input (expected YYYY-MM-DD)" >&2
|
|
9
|
+
return 1
|
|
10
|
+
fi
|
|
11
|
+
return 0
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
validate_period() {
|
|
15
|
+
local input="$1"
|
|
16
|
+
if ! [[ "$input" =~ ^[0-9]+$ ]]; then
|
|
17
|
+
echo "ERROR: Invalid period (must be numeric): $input" >&2
|
|
18
|
+
return 1
|
|
19
|
+
fi
|
|
20
|
+
if [ "$input" -lt 1 ] || [ "$input" -gt 365 ]; then
|
|
21
|
+
echo "ERROR: Period out of range (1-365): $input" >&2
|
|
22
|
+
return 1
|
|
23
|
+
fi
|
|
24
|
+
return 0
|
|
25
|
+
}
|
|
26
|
+
|
|
4
27
|
# track-cost-savings.sh - Log skill executions and calculate ROI metrics
|
|
5
28
|
# Tracks cost savings from script execution vs AI agent usage
|
|
6
29
|
|
|
7
30
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
31
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
|
32
|
+
|
|
33
|
+
# Load parameterized query library (SQL injection prevention)
|
|
34
|
+
source "${SCRIPT_DIR}/../bootstrap/sqlite-params.sh"
|
|
35
|
+
|
|
8
36
|
DB_PATH="${DB_PATH:-${SCRIPT_DIR}/workflow-codification.db}"
|
|
9
37
|
|
|
10
38
|
# Cost constants
|
|
@@ -120,10 +148,11 @@ EOF
|
|
|
120
148
|
# Generate ROI snapshot
|
|
121
149
|
generate_roi_snapshot() {
|
|
122
150
|
local snapshot_date="${1:-$(date +%Y-%m-%d)}"
|
|
151
|
+
validate_date "$snapshot_date" || exit 1
|
|
123
152
|
|
|
124
153
|
# Calculate aggregate metrics
|
|
125
154
|
local total_executions
|
|
126
|
-
total_executions=$(
|
|
155
|
+
total_executions=$(sqlite_select "$DB_PATH" "SELECT COUNT(*) FROM skill_executions WHERE date(timestamp) = ?1" "$snapshot_date")
|
|
127
156
|
|
|
128
157
|
if [[ "$total_executions" -eq 0 ]]; then
|
|
129
158
|
echo "No executions found for date: $snapshot_date"
|
|
@@ -131,17 +160,17 @@ generate_roi_snapshot() {
|
|
|
131
160
|
fi
|
|
132
161
|
|
|
133
162
|
local total_cost_avoided
|
|
134
|
-
total_cost_avoided=$(
|
|
163
|
+
total_cost_avoided=$(sqlite_select "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions WHERE date(timestamp) = ?1" "$snapshot_date")
|
|
135
164
|
|
|
136
165
|
local total_tokens_avoided
|
|
137
|
-
total_tokens_avoided=$(
|
|
166
|
+
total_tokens_avoided=$(sqlite_select "$DB_PATH" "SELECT COALESCE(SUM(tokens_avoided), 0) FROM skill_executions WHERE date(timestamp) = ?1" "$snapshot_date")
|
|
138
167
|
|
|
139
168
|
local avg_execution_time
|
|
140
|
-
avg_execution_time=$(
|
|
169
|
+
avg_execution_time=$(sqlite_select "$DB_PATH" "SELECT COALESCE(AVG(execution_time_ms), 0) FROM skill_executions WHERE date(timestamp) = ?1" "$snapshot_date")
|
|
141
170
|
|
|
142
171
|
# Get top performing skill
|
|
143
172
|
local top_skill_data
|
|
144
|
-
top_skill_data=$(
|
|
173
|
+
top_skill_data=$(sqlite_select "$DB_PATH" "SELECT skill_name, SUM(cost_avoided_usd) FROM skill_executions WHERE date(timestamp) = ?1 GROUP BY skill_name ORDER BY SUM(cost_avoided_usd) DESC LIMIT 1" "$snapshot_date")
|
|
145
174
|
|
|
146
175
|
local top_skill_name
|
|
147
176
|
local top_skill_savings
|
|
@@ -185,6 +214,7 @@ EOF
|
|
|
185
214
|
# Query per-skill ROI ranking
|
|
186
215
|
query_skill_roi_ranking() {
|
|
187
216
|
local period="${1:-30}" # Default: last 30 days
|
|
217
|
+
validate_period "$period" || exit 1
|
|
188
218
|
|
|
189
219
|
sqlite3 -header -column "$DB_PATH" <<EOF
|
|
190
220
|
SELECT
|
|
@@ -207,10 +237,10 @@ calculate_projections() {
|
|
|
207
237
|
|
|
208
238
|
# Get average daily metrics
|
|
209
239
|
local daily_executions
|
|
210
|
-
daily_executions=$(
|
|
240
|
+
daily_executions=$(sqlite_select "$DB_PATH" "SELECT COALESCE(COUNT(*) / ?1, 0) FROM skill_executions WHERE timestamp >= datetime('now', '-' || ?1 || ' days')" "$period_days")
|
|
211
241
|
|
|
212
242
|
local daily_savings
|
|
213
|
-
daily_savings=$(
|
|
243
|
+
daily_savings=$(sqlite_select "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd) / ?1, 0) FROM skill_executions WHERE timestamp >= datetime('now', '-' || ?1 || ' days')" "$period_days")
|
|
214
244
|
|
|
215
245
|
# Calculate projections
|
|
216
246
|
local monthly_executions=$(echo "$daily_executions * 30" | bc)
|
|
@@ -239,16 +269,25 @@ export_dashboard_metrics() {
|
|
|
239
269
|
|
|
240
270
|
case "$output_format" in
|
|
241
271
|
json)
|
|
272
|
+
# Calculate metrics using parameterized queries
|
|
273
|
+
local total_executions=$(sqlite_select "$DB_PATH" "SELECT COUNT(*) FROM skill_executions")
|
|
274
|
+
local total_cost_avoided=$(sqlite_select "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions")
|
|
275
|
+
local total_tokens_avoided=$(sqlite_select "$DB_PATH" "SELECT COALESCE(SUM(tokens_avoided), 0) FROM skill_executions")
|
|
276
|
+
local avg_execution_time=$(sqlite_select "$DB_PATH" "SELECT COALESCE(AVG(execution_time_ms), 0) FROM skill_executions")
|
|
277
|
+
local success_rate=$(sqlite_select "$DB_PATH" "SELECT COALESCE(CAST(SUM(CASE WHEN exit_code = 0 THEN 1 ELSE 0 END) AS REAL) / COUNT(*), 0) FROM skill_executions")
|
|
278
|
+
local executions_30d=$(sqlite_select "$DB_PATH" "SELECT COUNT(*) FROM skill_executions WHERE timestamp >= datetime('now', '-30 days')")
|
|
279
|
+
local cost_avoided_30d=$(sqlite_select "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions WHERE timestamp >= datetime('now', '-30 days')")
|
|
280
|
+
|
|
242
281
|
cat <<JSON
|
|
243
282
|
{
|
|
244
|
-
"total_executions": $
|
|
245
|
-
"total_cost_avoided_usd": $
|
|
246
|
-
"total_tokens_avoided": $
|
|
247
|
-
"avg_execution_time_ms": $
|
|
248
|
-
"success_rate": $
|
|
283
|
+
"total_executions": $total_executions,
|
|
284
|
+
"total_cost_avoided_usd": $total_cost_avoided,
|
|
285
|
+
"total_tokens_avoided": $total_tokens_avoided,
|
|
286
|
+
"avg_execution_time_ms": $avg_execution_time,
|
|
287
|
+
"success_rate": $success_rate,
|
|
249
288
|
"last_30_days": {
|
|
250
|
-
"executions": $
|
|
251
|
-
"cost_avoided_usd": $
|
|
289
|
+
"executions": $executions_30d,
|
|
290
|
+
"cost_avoided_usd": $cost_avoided_30d
|
|
252
291
|
}
|
|
253
292
|
}
|
|
254
293
|
JSON
|
|
@@ -302,6 +341,7 @@ main() {
|
|
|
302
341
|
local task_description=""
|
|
303
342
|
local metadata="{}"
|
|
304
343
|
local period="30"
|
|
344
|
+
validate_period "$period" || exit 1
|
|
305
345
|
local output_format="json"
|
|
306
346
|
|
|
307
347
|
while [[ $# -gt 0 ]]; do
|
|
@@ -344,6 +384,7 @@ main() {
|
|
|
344
384
|
;;
|
|
345
385
|
--period)
|
|
346
386
|
period="$2"
|
|
387
|
+
validate_period "$period" || exit 1
|
|
347
388
|
shift 2
|
|
348
389
|
;;
|
|
349
390
|
--format)
|