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,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Migrator
|
|
3
|
+
* Migrate legacy configuration formats to YAML
|
|
4
|
+
*
|
|
5
|
+
* @version 1.0.0
|
|
6
|
+
* @description Handles migration from JSON, ENV, and bash variable formats
|
|
7
|
+
*/ import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as yaml from 'js-yaml';
|
|
10
|
+
import Ajv from 'ajv';
|
|
11
|
+
/**
|
|
12
|
+
* ConfigMigrator - Convert legacy formats to YAML
|
|
13
|
+
*/ export class ConfigMigrator {
|
|
14
|
+
schemaPath;
|
|
15
|
+
ajv;
|
|
16
|
+
constructor(schemaPath){
|
|
17
|
+
this.schemaPath = schemaPath;
|
|
18
|
+
this.ajv = new Ajv({
|
|
19
|
+
allErrors: true,
|
|
20
|
+
strict: false
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Migrate JSON configuration to YAML
|
|
25
|
+
*/ async migrateJsonToYaml(jsonPath, yamlPath, options = {}) {
|
|
26
|
+
const opts = {
|
|
27
|
+
dryRun: false,
|
|
28
|
+
createBackup: true,
|
|
29
|
+
validate: true,
|
|
30
|
+
...options
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
// Read JSON file
|
|
34
|
+
const jsonContent = await fs.readFile(jsonPath, 'utf-8');
|
|
35
|
+
const config = JSON.parse(jsonContent);
|
|
36
|
+
// Validate if schema provided
|
|
37
|
+
if (opts.validate && this.schemaPath) {
|
|
38
|
+
await this.validateConfig(config);
|
|
39
|
+
}
|
|
40
|
+
// Convert to YAML
|
|
41
|
+
const yamlContent = yaml.dump(config, {
|
|
42
|
+
indent: 2,
|
|
43
|
+
lineWidth: 80,
|
|
44
|
+
noRefs: true,
|
|
45
|
+
quotingType: "'"
|
|
46
|
+
});
|
|
47
|
+
// Dry run - return preview without writing
|
|
48
|
+
if (opts.dryRun) {
|
|
49
|
+
return yamlContent;
|
|
50
|
+
}
|
|
51
|
+
// Create backup of source file
|
|
52
|
+
if (opts.createBackup) {
|
|
53
|
+
await this.createBackup(jsonPath);
|
|
54
|
+
}
|
|
55
|
+
// Write YAML file
|
|
56
|
+
await fs.writeFile(yamlPath, yamlContent, 'utf-8');
|
|
57
|
+
return yamlContent;
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (error instanceof Error) {
|
|
60
|
+
throw new Error(`JSON to YAML migration failed: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Migrate .env file to YAML
|
|
67
|
+
*/ async migrateEnvToYaml(envPath, yamlPath, options = {}) {
|
|
68
|
+
const opts = {
|
|
69
|
+
dryRun: false,
|
|
70
|
+
createBackup: true,
|
|
71
|
+
validate: false,
|
|
72
|
+
...options
|
|
73
|
+
};
|
|
74
|
+
try {
|
|
75
|
+
// Read ENV file
|
|
76
|
+
const envContent = await fs.readFile(envPath, 'utf-8');
|
|
77
|
+
// Parse ENV variables
|
|
78
|
+
const config = this.parseEnvFile(envContent);
|
|
79
|
+
// Convert flat structure to nested
|
|
80
|
+
const nestedConfig = this.unflattenObject(config);
|
|
81
|
+
// Validate if schema provided
|
|
82
|
+
if (opts.validate && this.schemaPath) {
|
|
83
|
+
await this.validateConfig(nestedConfig);
|
|
84
|
+
}
|
|
85
|
+
// Convert to YAML
|
|
86
|
+
const yamlContent = yaml.dump(nestedConfig, {
|
|
87
|
+
indent: 2,
|
|
88
|
+
lineWidth: 80,
|
|
89
|
+
noRefs: true
|
|
90
|
+
});
|
|
91
|
+
// Dry run - return preview
|
|
92
|
+
if (opts.dryRun) {
|
|
93
|
+
return yamlContent;
|
|
94
|
+
}
|
|
95
|
+
// Create backup
|
|
96
|
+
if (opts.createBackup) {
|
|
97
|
+
await this.createBackup(envPath);
|
|
98
|
+
}
|
|
99
|
+
// Write YAML file
|
|
100
|
+
await fs.writeFile(yamlPath, yamlContent, 'utf-8');
|
|
101
|
+
return yamlContent;
|
|
102
|
+
} catch (error) {
|
|
103
|
+
if (error instanceof Error) {
|
|
104
|
+
throw new Error(`ENV to YAML migration failed: ${error.message}`);
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Migrate bash variable file to YAML
|
|
111
|
+
*/ async migrateBashToYaml(bashPath, yamlPath, options = {}) {
|
|
112
|
+
const opts = {
|
|
113
|
+
dryRun: false,
|
|
114
|
+
createBackup: true,
|
|
115
|
+
validate: false,
|
|
116
|
+
...options
|
|
117
|
+
};
|
|
118
|
+
try {
|
|
119
|
+
// Read bash file
|
|
120
|
+
const bashContent = await fs.readFile(bashPath, 'utf-8');
|
|
121
|
+
// Parse bash variables
|
|
122
|
+
const config = this.parseBashFile(bashContent);
|
|
123
|
+
// Convert flat structure to nested
|
|
124
|
+
const nestedConfig = this.unflattenObject(config);
|
|
125
|
+
// Validate if schema provided
|
|
126
|
+
if (opts.validate && this.schemaPath) {
|
|
127
|
+
await this.validateConfig(nestedConfig);
|
|
128
|
+
}
|
|
129
|
+
// Convert to YAML
|
|
130
|
+
const yamlContent = yaml.dump(nestedConfig, {
|
|
131
|
+
indent: 2,
|
|
132
|
+
lineWidth: 80,
|
|
133
|
+
noRefs: true
|
|
134
|
+
});
|
|
135
|
+
// Dry run - return preview
|
|
136
|
+
if (opts.dryRun) {
|
|
137
|
+
return yamlContent;
|
|
138
|
+
}
|
|
139
|
+
// Create backup
|
|
140
|
+
if (opts.createBackup) {
|
|
141
|
+
await this.createBackup(bashPath);
|
|
142
|
+
}
|
|
143
|
+
// Write YAML file
|
|
144
|
+
await fs.writeFile(yamlPath, yamlContent, 'utf-8');
|
|
145
|
+
return yamlContent;
|
|
146
|
+
} catch (error) {
|
|
147
|
+
if (error instanceof Error) {
|
|
148
|
+
throw new Error(`Bash to YAML migration failed: ${error.message}`);
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Parse .env file into key-value pairs
|
|
155
|
+
*/ parseEnvFile(content) {
|
|
156
|
+
const config = {};
|
|
157
|
+
const lines = content.split('\n');
|
|
158
|
+
for (const line of lines){
|
|
159
|
+
const trimmed = line.trim();
|
|
160
|
+
// Skip comments and empty lines
|
|
161
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Parse KEY=value format
|
|
165
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);
|
|
166
|
+
if (match) {
|
|
167
|
+
const [, key, value] = match;
|
|
168
|
+
config[this.toCamelCase(key)] = this.inferType(value.trim());
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return config;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Parse bash variable file
|
|
175
|
+
*/ parseBashFile(content) {
|
|
176
|
+
const config = {};
|
|
177
|
+
const lines = content.split('\n');
|
|
178
|
+
for (const line of lines){
|
|
179
|
+
const trimmed = line.trim();
|
|
180
|
+
// Skip comments, empty lines, and shebang
|
|
181
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('export ')) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Parse variable assignments
|
|
185
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=["']?([^"']*)["']?$/);
|
|
186
|
+
if (match) {
|
|
187
|
+
const [, key, value] = match;
|
|
188
|
+
config[this.toCamelCase(key)] = this.inferType(value.trim());
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return config;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Infer type from string value
|
|
195
|
+
*/ inferType(value) {
|
|
196
|
+
// Remove quotes if present
|
|
197
|
+
const unquoted = value.replace(/^["']|["']$/g, '');
|
|
198
|
+
// Boolean
|
|
199
|
+
if (unquoted.toLowerCase() === 'true') return true;
|
|
200
|
+
if (unquoted.toLowerCase() === 'false') return false;
|
|
201
|
+
// Null
|
|
202
|
+
if (unquoted.toLowerCase() === 'null') return null;
|
|
203
|
+
// Number (integer)
|
|
204
|
+
if (/^-?\d+$/.test(unquoted)) {
|
|
205
|
+
return parseInt(unquoted, 10);
|
|
206
|
+
}
|
|
207
|
+
// Number (float)
|
|
208
|
+
if (/^-?\d+\.\d+$/.test(unquoted)) {
|
|
209
|
+
return parseFloat(unquoted);
|
|
210
|
+
}
|
|
211
|
+
// String
|
|
212
|
+
return unquoted;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Convert SCREAMING_SNAKE_CASE to camelCase
|
|
216
|
+
*/ toCamelCase(str) {
|
|
217
|
+
return str.toLowerCase().replace(/_([a-z0-9])/g, (_, letter)=>letter.toUpperCase());
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Convert flat object to nested structure
|
|
221
|
+
* Example: { databaseType: 'sqlite', databasePath: './data' }
|
|
222
|
+
* Becomes: { database: { type: 'sqlite', path: './data' } }
|
|
223
|
+
*/ unflattenObject(flat) {
|
|
224
|
+
const nested = {};
|
|
225
|
+
// Group by common prefixes
|
|
226
|
+
for (const [key, value] of Object.entries(flat)){
|
|
227
|
+
// Try to detect nested structure by camelCase boundaries
|
|
228
|
+
const parts = this.splitCamelCase(key);
|
|
229
|
+
if (parts.length === 1) {
|
|
230
|
+
// No nesting detected
|
|
231
|
+
nested[key] = value;
|
|
232
|
+
} else if (parts.length === 2) {
|
|
233
|
+
// Two-level nesting: databaseType → database.type
|
|
234
|
+
const [prefix, suffix] = parts;
|
|
235
|
+
if (!(prefix in nested)) {
|
|
236
|
+
nested[prefix] = {};
|
|
237
|
+
}
|
|
238
|
+
if (typeof nested[prefix] === 'object') {
|
|
239
|
+
nested[prefix][suffix] = value;
|
|
240
|
+
}
|
|
241
|
+
} else if (parts.length >= 3) {
|
|
242
|
+
// Multi-level nesting: databasePoolMin → database.pool.min
|
|
243
|
+
let current = nested;
|
|
244
|
+
for(let i = 0; i < parts.length - 1; i++){
|
|
245
|
+
const part = parts[i];
|
|
246
|
+
if (!(part in current)) {
|
|
247
|
+
current[part] = {};
|
|
248
|
+
}
|
|
249
|
+
if (typeof current[part] !== 'object' || Array.isArray(current[part])) {
|
|
250
|
+
// Can't nest further, use flat key instead
|
|
251
|
+
nested[key] = value;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
current = current[part];
|
|
255
|
+
}
|
|
256
|
+
if (typeof current === 'object' && !Array.isArray(current)) {
|
|
257
|
+
current[parts[parts.length - 1]] = value;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return nested;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Split camelCase string into parts
|
|
265
|
+
*/ splitCamelCase(str) {
|
|
266
|
+
// Handle common patterns: databaseType, redisHost, etc.
|
|
267
|
+
// Split on uppercase boundaries, keeping the uppercase letter
|
|
268
|
+
const parts = [];
|
|
269
|
+
let current = '';
|
|
270
|
+
for(let i = 0; i < str.length; i++){
|
|
271
|
+
const char = str[i];
|
|
272
|
+
if (char === char.toUpperCase() && char !== char.toLowerCase()) {
|
|
273
|
+
// Uppercase letter - start new part
|
|
274
|
+
if (current) {
|
|
275
|
+
parts.push(current.toLowerCase());
|
|
276
|
+
}
|
|
277
|
+
current = char;
|
|
278
|
+
} else {
|
|
279
|
+
current += char;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (current) {
|
|
283
|
+
parts.push(current.toLowerCase());
|
|
284
|
+
}
|
|
285
|
+
return parts.length > 0 ? parts : [
|
|
286
|
+
str.toLowerCase()
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Validate configuration against schema
|
|
291
|
+
*/ async validateConfig(config) {
|
|
292
|
+
if (!this.schemaPath) {
|
|
293
|
+
throw new Error('Schema path not provided for validation');
|
|
294
|
+
}
|
|
295
|
+
const schemaContent = await fs.readFile(this.schemaPath, 'utf-8');
|
|
296
|
+
const schema = JSON.parse(schemaContent);
|
|
297
|
+
const validate = this.ajv.compile(schema);
|
|
298
|
+
const valid = validate(config);
|
|
299
|
+
if (!valid) {
|
|
300
|
+
const errors = validate.errors?.map((err)=>`${err.instancePath} ${err.message}`).join(', ');
|
|
301
|
+
throw new Error(`Configuration validation failed: ${errors}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Create backup of file
|
|
306
|
+
*/ async createBackup(filePath) {
|
|
307
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
308
|
+
const ext = path.extname(filePath);
|
|
309
|
+
const base = path.basename(filePath, ext);
|
|
310
|
+
const dir = path.dirname(filePath);
|
|
311
|
+
const backupPath = path.join(dir, `${base}.${timestamp}.backup${ext}`);
|
|
312
|
+
await fs.copyFile(filePath, backupPath);
|
|
313
|
+
return backupPath;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Scan directory for legacy configuration files
|
|
317
|
+
*/ async scanForLegacyConfigs(directory) {
|
|
318
|
+
const legacyFiles = [];
|
|
319
|
+
try {
|
|
320
|
+
const files = await fs.readdir(directory, {
|
|
321
|
+
withFileTypes: true
|
|
322
|
+
});
|
|
323
|
+
for (const file of files){
|
|
324
|
+
if (file.isFile()) {
|
|
325
|
+
const fullPath = path.join(directory, file.name);
|
|
326
|
+
// Check for legacy formats
|
|
327
|
+
if (file.name.endsWith('.json') || file.name === '.env' || file.name.endsWith('.env') || file.name.endsWith('.sh') && file.name.includes('config')) {
|
|
328
|
+
legacyFiles.push(fullPath);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
} catch (error) {
|
|
333
|
+
// Directory doesn't exist or not accessible
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
return legacyFiles;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Batch migrate multiple files
|
|
340
|
+
*/ async batchMigrate(files, outputDir, options = {}) {
|
|
341
|
+
const results = [];
|
|
342
|
+
for (const filePath of files){
|
|
343
|
+
const ext = path.extname(filePath);
|
|
344
|
+
const base = path.basename(filePath, ext);
|
|
345
|
+
const yamlPath = path.join(outputDir, `${base}.yml`);
|
|
346
|
+
try {
|
|
347
|
+
let preview;
|
|
348
|
+
if (ext === '.json') {
|
|
349
|
+
preview = await this.migrateJsonToYaml(filePath, yamlPath, options);
|
|
350
|
+
} else if (filePath.includes('.env')) {
|
|
351
|
+
preview = await this.migrateEnvToYaml(filePath, yamlPath, options);
|
|
352
|
+
} else if (ext === '.sh') {
|
|
353
|
+
preview = await this.migrateBashToYaml(filePath, yamlPath, options);
|
|
354
|
+
} else {
|
|
355
|
+
results.push({
|
|
356
|
+
success: false,
|
|
357
|
+
sourcePath: filePath,
|
|
358
|
+
targetPath: yamlPath,
|
|
359
|
+
errors: [
|
|
360
|
+
`Unsupported file format: ${ext}`
|
|
361
|
+
]
|
|
362
|
+
});
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
results.push({
|
|
366
|
+
success: true,
|
|
367
|
+
sourcePath: filePath,
|
|
368
|
+
targetPath: yamlPath,
|
|
369
|
+
preview: options.dryRun ? preview : undefined
|
|
370
|
+
});
|
|
371
|
+
} catch (error) {
|
|
372
|
+
results.push({
|
|
373
|
+
success: false,
|
|
374
|
+
sourcePath: filePath,
|
|
375
|
+
targetPath: yamlPath,
|
|
376
|
+
errors: [
|
|
377
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
378
|
+
]
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return results;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
//# sourceMappingURL=config-migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/config-migrator.ts"],"sourcesContent":["/**\r\n * Configuration Migrator\r\n * Migrate legacy configuration formats to YAML\r\n *\r\n * @version 1.0.0\r\n * @description Handles migration from JSON, ENV, and bash variable formats\r\n */\r\n\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport * as yaml from 'js-yaml';\r\nimport Ajv from 'ajv';\r\nimport { ConfigSchema } from './config-manager.js';\r\n\r\nexport interface MigrationOptions {\r\n dryRun?: boolean;\r\n createBackup?: boolean;\r\n validate?: boolean;\r\n}\r\n\r\nexport interface MigrationResult {\r\n success: boolean;\r\n sourcePath: string;\r\n targetPath: string;\r\n backupPath?: string;\r\n preview?: string;\r\n errors?: string[];\r\n}\r\n\r\n/**\r\n * ConfigMigrator - Convert legacy formats to YAML\r\n */\r\nexport class ConfigMigrator {\r\n private schemaPath?: string;\r\n private ajv: Ajv;\r\n\r\n constructor(schemaPath?: string) {\r\n this.schemaPath = schemaPath;\r\n this.ajv = new Ajv({ allErrors: true, strict: false });\r\n }\r\n\r\n /**\r\n * Migrate JSON configuration to YAML\r\n */\r\n async migrateJsonToYaml(\r\n jsonPath: string,\r\n yamlPath: string,\r\n options: MigrationOptions = {}\r\n ): Promise<string> {\r\n const opts = {\r\n dryRun: false,\r\n createBackup: true,\r\n validate: true,\r\n ...options\r\n };\r\n\r\n try {\r\n // Read JSON file\r\n const jsonContent = await fs.readFile(jsonPath, 'utf-8');\r\n const config = JSON.parse(jsonContent) as ConfigSchema;\r\n\r\n // Validate if schema provided\r\n if (opts.validate && this.schemaPath) {\r\n await this.validateConfig(config);\r\n }\r\n\r\n // Convert to YAML\r\n const yamlContent = yaml.dump(config, {\r\n indent: 2,\r\n lineWidth: 80,\r\n noRefs: true,\r\n quotingType: \"'\"\r\n });\r\n\r\n // Dry run - return preview without writing\r\n if (opts.dryRun) {\r\n return yamlContent;\r\n }\r\n\r\n // Create backup of source file\r\n if (opts.createBackup) {\r\n await this.createBackup(jsonPath);\r\n }\r\n\r\n // Write YAML file\r\n await fs.writeFile(yamlPath, yamlContent, 'utf-8');\r\n\r\n return yamlContent;\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`JSON to YAML migration failed: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Migrate .env file to YAML\r\n */\r\n async migrateEnvToYaml(\r\n envPath: string,\r\n yamlPath: string,\r\n options: MigrationOptions = {}\r\n ): Promise<string> {\r\n const opts = {\r\n dryRun: false,\r\n createBackup: true,\r\n validate: false, // ENV files typically don't match schema directly\r\n ...options\r\n };\r\n\r\n try {\r\n // Read ENV file\r\n const envContent = await fs.readFile(envPath, 'utf-8');\r\n\r\n // Parse ENV variables\r\n const config = this.parseEnvFile(envContent);\r\n\r\n // Convert flat structure to nested\r\n const nestedConfig = this.unflattenObject(config);\r\n\r\n // Validate if schema provided\r\n if (opts.validate && this.schemaPath) {\r\n await this.validateConfig(nestedConfig);\r\n }\r\n\r\n // Convert to YAML\r\n const yamlContent = yaml.dump(nestedConfig, {\r\n indent: 2,\r\n lineWidth: 80,\r\n noRefs: true\r\n });\r\n\r\n // Dry run - return preview\r\n if (opts.dryRun) {\r\n return yamlContent;\r\n }\r\n\r\n // Create backup\r\n if (opts.createBackup) {\r\n await this.createBackup(envPath);\r\n }\r\n\r\n // Write YAML file\r\n await fs.writeFile(yamlPath, yamlContent, 'utf-8');\r\n\r\n return yamlContent;\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`ENV to YAML migration failed: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Migrate bash variable file to YAML\r\n */\r\n async migrateBashToYaml(\r\n bashPath: string,\r\n yamlPath: string,\r\n options: MigrationOptions = {}\r\n ): Promise<string> {\r\n const opts = {\r\n dryRun: false,\r\n createBackup: true,\r\n validate: false,\r\n ...options\r\n };\r\n\r\n try {\r\n // Read bash file\r\n const bashContent = await fs.readFile(bashPath, 'utf-8');\r\n\r\n // Parse bash variables\r\n const config = this.parseBashFile(bashContent);\r\n\r\n // Convert flat structure to nested\r\n const nestedConfig = this.unflattenObject(config);\r\n\r\n // Validate if schema provided\r\n if (opts.validate && this.schemaPath) {\r\n await this.validateConfig(nestedConfig);\r\n }\r\n\r\n // Convert to YAML\r\n const yamlContent = yaml.dump(nestedConfig, {\r\n indent: 2,\r\n lineWidth: 80,\r\n noRefs: true\r\n });\r\n\r\n // Dry run - return preview\r\n if (opts.dryRun) {\r\n return yamlContent;\r\n }\r\n\r\n // Create backup\r\n if (opts.createBackup) {\r\n await this.createBackup(bashPath);\r\n }\r\n\r\n // Write YAML file\r\n await fs.writeFile(yamlPath, yamlContent, 'utf-8');\r\n\r\n return yamlContent;\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Bash to YAML migration failed: ${error.message}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Parse .env file into key-value pairs\r\n */\r\n private parseEnvFile(content: string): Record<string, any> {\r\n const config: Record<string, any> = {};\r\n const lines = content.split('\\n');\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Skip comments and empty lines\r\n if (!trimmed || trimmed.startsWith('#')) {\r\n continue;\r\n }\r\n\r\n // Parse KEY=value format\r\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);\r\n if (match) {\r\n const [, key, value] = match;\r\n config[this.toCamelCase(key)] = this.inferType(value.trim());\r\n }\r\n }\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Parse bash variable file\r\n */\r\n private parseBashFile(content: string): Record<string, any> {\r\n const config: Record<string, any> = {};\r\n const lines = content.split('\\n');\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Skip comments, empty lines, and shebang\r\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('export ')) {\r\n continue;\r\n }\r\n\r\n // Parse variable assignments\r\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=[\"']?([^\"']*)[\"']?$/);\r\n if (match) {\r\n const [, key, value] = match;\r\n config[this.toCamelCase(key)] = this.inferType(value.trim());\r\n }\r\n }\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Infer type from string value\r\n */\r\n private inferType(value: string): any {\r\n // Remove quotes if present\r\n const unquoted = value.replace(/^[\"']|[\"']$/g, '');\r\n\r\n // Boolean\r\n if (unquoted.toLowerCase() === 'true') return true;\r\n if (unquoted.toLowerCase() === 'false') return false;\r\n\r\n // Null\r\n if (unquoted.toLowerCase() === 'null') return null;\r\n\r\n // Number (integer)\r\n if (/^-?\\d+$/.test(unquoted)) {\r\n return parseInt(unquoted, 10);\r\n }\r\n\r\n // Number (float)\r\n if (/^-?\\d+\\.\\d+$/.test(unquoted)) {\r\n return parseFloat(unquoted);\r\n }\r\n\r\n // String\r\n return unquoted;\r\n }\r\n\r\n /**\r\n * Convert SCREAMING_SNAKE_CASE to camelCase\r\n */\r\n private toCamelCase(str: string): string {\r\n return str\r\n .toLowerCase()\r\n .replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());\r\n }\r\n\r\n /**\r\n * Convert flat object to nested structure\r\n * Example: { databaseType: 'sqlite', databasePath: './data' }\r\n * Becomes: { database: { type: 'sqlite', path: './data' } }\r\n */\r\n private unflattenObject(flat: Record<string, any>): any {\r\n const nested: any = {};\r\n\r\n // Group by common prefixes\r\n for (const [key, value] of Object.entries(flat)) {\r\n // Try to detect nested structure by camelCase boundaries\r\n const parts = this.splitCamelCase(key);\r\n\r\n if (parts.length === 1) {\r\n // No nesting detected\r\n nested[key] = value;\r\n } else if (parts.length === 2) {\r\n // Two-level nesting: databaseType → database.type\r\n const [prefix, suffix] = parts;\r\n if (!(prefix in nested)) {\r\n nested[prefix] = {};\r\n }\r\n if (typeof nested[prefix] === 'object') {\r\n nested[prefix][suffix] = value;\r\n }\r\n } else if (parts.length >= 3) {\r\n // Multi-level nesting: databasePoolMin → database.pool.min\r\n let current = nested;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n if (!(part in current)) {\r\n current[part] = {};\r\n }\r\n if (typeof current[part] !== 'object' || Array.isArray(current[part])) {\r\n // Can't nest further, use flat key instead\r\n nested[key] = value;\r\n break;\r\n }\r\n current = current[part];\r\n }\r\n if (typeof current === 'object' && !Array.isArray(current)) {\r\n current[parts[parts.length - 1]] = value;\r\n }\r\n }\r\n }\r\n\r\n return nested;\r\n }\r\n\r\n /**\r\n * Split camelCase string into parts\r\n */\r\n private splitCamelCase(str: string): string[] {\r\n // Handle common patterns: databaseType, redisHost, etc.\r\n // Split on uppercase boundaries, keeping the uppercase letter\r\n const parts: string[] = [];\r\n let current = '';\r\n\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str[i];\r\n\r\n if (char === char.toUpperCase() && char !== char.toLowerCase()) {\r\n // Uppercase letter - start new part\r\n if (current) {\r\n parts.push(current.toLowerCase());\r\n }\r\n current = char;\r\n } else {\r\n current += char;\r\n }\r\n }\r\n\r\n if (current) {\r\n parts.push(current.toLowerCase());\r\n }\r\n\r\n return parts.length > 0 ? parts : [str.toLowerCase()];\r\n }\r\n\r\n /**\r\n * Validate configuration against schema\r\n */\r\n private async validateConfig(config: ConfigSchema): Promise<void> {\r\n if (!this.schemaPath) {\r\n throw new Error('Schema path not provided for validation');\r\n }\r\n\r\n const schemaContent = await fs.readFile(this.schemaPath, 'utf-8');\r\n const schema = JSON.parse(schemaContent);\r\n\r\n const validate = this.ajv.compile(schema);\r\n const valid = validate(config);\r\n\r\n if (!valid) {\r\n const errors = validate.errors?.map(err =>\r\n `${err.instancePath} ${err.message}`\r\n ).join(', ');\r\n throw new Error(`Configuration validation failed: ${errors}`);\r\n }\r\n }\r\n\r\n /**\r\n * Create backup of file\r\n */\r\n private async createBackup(filePath: string): Promise<string> {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const ext = path.extname(filePath);\r\n const base = path.basename(filePath, ext);\r\n const dir = path.dirname(filePath);\r\n\r\n const backupPath = path.join(dir, `${base}.${timestamp}.backup${ext}`);\r\n\r\n await fs.copyFile(filePath, backupPath);\r\n\r\n return backupPath;\r\n }\r\n\r\n /**\r\n * Scan directory for legacy configuration files\r\n */\r\n async scanForLegacyConfigs(directory: string): Promise<string[]> {\r\n const legacyFiles: string[] = [];\r\n\r\n try {\r\n const files = await fs.readdir(directory, { withFileTypes: true });\r\n\r\n for (const file of files) {\r\n if (file.isFile()) {\r\n const fullPath = path.join(directory, file.name);\r\n\r\n // Check for legacy formats\r\n if (\r\n file.name.endsWith('.json') ||\r\n file.name === '.env' ||\r\n file.name.endsWith('.env') ||\r\n (file.name.endsWith('.sh') && file.name.includes('config'))\r\n ) {\r\n legacyFiles.push(fullPath);\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n // Directory doesn't exist or not accessible\r\n return [];\r\n }\r\n\r\n return legacyFiles;\r\n }\r\n\r\n /**\r\n * Batch migrate multiple files\r\n */\r\n async batchMigrate(\r\n files: string[],\r\n outputDir: string,\r\n options: MigrationOptions = {}\r\n ): Promise<MigrationResult[]> {\r\n const results: MigrationResult[] = [];\r\n\r\n for (const filePath of files) {\r\n const ext = path.extname(filePath);\r\n const base = path.basename(filePath, ext);\r\n const yamlPath = path.join(outputDir, `${base}.yml`);\r\n\r\n try {\r\n let preview: string | undefined;\r\n\r\n if (ext === '.json') {\r\n preview = await this.migrateJsonToYaml(filePath, yamlPath, options);\r\n } else if (filePath.includes('.env')) {\r\n preview = await this.migrateEnvToYaml(filePath, yamlPath, options);\r\n } else if (ext === '.sh') {\r\n preview = await this.migrateBashToYaml(filePath, yamlPath, options);\r\n } else {\r\n results.push({\r\n success: false,\r\n sourcePath: filePath,\r\n targetPath: yamlPath,\r\n errors: [`Unsupported file format: ${ext}`]\r\n });\r\n continue;\r\n }\r\n\r\n results.push({\r\n success: true,\r\n sourcePath: filePath,\r\n targetPath: yamlPath,\r\n preview: options.dryRun ? preview : undefined\r\n });\r\n } catch (error) {\r\n results.push({\r\n success: false,\r\n sourcePath: filePath,\r\n targetPath: yamlPath,\r\n errors: [error instanceof Error ? error.message : 'Unknown error']\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n}\r\n"],"names":["fs","path","yaml","Ajv","ConfigMigrator","schemaPath","ajv","allErrors","strict","migrateJsonToYaml","jsonPath","yamlPath","options","opts","dryRun","createBackup","validate","jsonContent","readFile","config","JSON","parse","validateConfig","yamlContent","dump","indent","lineWidth","noRefs","quotingType","writeFile","error","Error","message","migrateEnvToYaml","envPath","envContent","parseEnvFile","nestedConfig","unflattenObject","migrateBashToYaml","bashPath","bashContent","parseBashFile","content","lines","split","line","trimmed","trim","startsWith","match","key","value","toCamelCase","inferType","unquoted","replace","toLowerCase","test","parseInt","parseFloat","str","_","letter","toUpperCase","flat","nested","Object","entries","parts","splitCamelCase","length","prefix","suffix","current","i","part","Array","isArray","char","push","schemaContent","schema","compile","valid","errors","map","err","instancePath","join","filePath","timestamp","Date","toISOString","ext","extname","base","basename","dir","dirname","backupPath","copyFile","scanForLegacyConfigs","directory","legacyFiles","files","readdir","withFileTypes","file","isFile","fullPath","name","endsWith","includes","batchMigrate","outputDir","results","preview","success","sourcePath","targetPath","undefined"],"mappings":"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"}
|