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
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Store test benchmarks in SQLite
|
|
3
|
+
# SECURITY: Uses Pattern B parameterized queries to prevent SQL injection
|
|
3
4
|
set -euo pipefail
|
|
4
5
|
|
|
5
6
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
7
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
|
7
|
-
DB_FILE
|
|
8
|
+
# Allow DB_FILE override for testing (security: prevents modification of production DB during tests)
|
|
9
|
+
DB_FILE="${DB_FILE:-$PROJECT_ROOT/.artifacts/test-benchmarks.db}"
|
|
10
|
+
|
|
11
|
+
# Source sqlite parameter binding library
|
|
12
|
+
source "$PROJECT_ROOT/.claude/skills/bootstrap/sqlite-params.sh"
|
|
8
13
|
|
|
9
14
|
# Parse arguments
|
|
10
15
|
SUITE=""
|
|
@@ -32,24 +37,17 @@ done
|
|
|
32
37
|
|
|
33
38
|
SUCCESS_RATE=$(awk "BEGIN {printf \"%.4f\", ($PASSED / $TOTAL)}")
|
|
34
39
|
|
|
35
|
-
# Get or create suite ID
|
|
36
|
-
SUITE_ID=$(
|
|
40
|
+
# Get or create suite ID using parameterized query (Pattern B)
|
|
41
|
+
SUITE_ID=$(sqlite_select "$DB_FILE" "SELECT id FROM test_suites WHERE name = ?1" "$SUITE")
|
|
37
42
|
if [ -z "$SUITE_ID" ]; then
|
|
38
|
-
|
|
39
|
-
SUITE_ID=$(
|
|
43
|
+
sqlite_insert "$DB_FILE" "INSERT INTO test_suites (name) VALUES (?1)" "$SUITE"
|
|
44
|
+
SUITE_ID=$(sqlite_select "$DB_FILE" "SELECT last_insert_rowid()")
|
|
40
45
|
fi
|
|
41
46
|
|
|
42
|
-
# Insert test run
|
|
43
|
-
|
|
44
|
-
INSERT INTO test_runs (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
$SUITE_ID, '$COMMIT', '$BRANCH',
|
|
50
|
-
$TOTAL, $PASSED, $FAILED, $SKIPPED,
|
|
51
|
-
$DURATION, $SUCCESS_RATE
|
|
52
|
-
);
|
|
53
|
-
EOFSQL
|
|
54
|
-
|
|
55
|
-
echo "✅ Benchmark stored (run_id: $(sqlite3 "$DB_FILE" "SELECT last_insert_rowid()"))"
|
|
47
|
+
# Insert test run using parameterized query (Pattern B)
|
|
48
|
+
sqlite_insert "$DB_FILE" \
|
|
49
|
+
"INSERT INTO test_runs (suite_id, git_commit, git_branch, total_tests, passed, failed, skipped, duration_seconds, success_rate) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)" \
|
|
50
|
+
"$SUITE_ID" "$COMMIT" "$BRANCH" "$TOTAL" "$PASSED" "$FAILED" "$SKIPPED" "$DURATION" "$SUCCESS_RATE"
|
|
51
|
+
|
|
52
|
+
RUN_ID=$(sqlite_select "$DB_FILE" "SELECT last_insert_rowid()")
|
|
53
|
+
echo "✅ Benchmark stored (run_id: $RUN_ID)"
|
|
@@ -4,6 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
|
+
# Input validation (SQL injection prevention)
|
|
8
|
+
validate_identifier() {
|
|
9
|
+
local input="$1"
|
|
10
|
+
local max_length="${2:-255}"
|
|
11
|
+
if ! [[ "$input" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
12
|
+
echo "ERROR: Invalid identifier (alphanumeric + underscore/hyphen only): $input" >&2
|
|
13
|
+
return 1
|
|
14
|
+
fi
|
|
15
|
+
if [ ${#input} -gt $max_length ]; then
|
|
16
|
+
echo "ERROR: Identifier exceeds max length ($max_length chars)" >&2
|
|
17
|
+
return 1
|
|
18
|
+
fi
|
|
19
|
+
return 0
|
|
20
|
+
}
|
|
21
|
+
|
|
7
22
|
# Test configuration
|
|
8
23
|
TEST_TASK_ID="e2e-test-$(date +%s)"
|
|
9
24
|
TEST_AGENT_ID="backend-dev-e2e"
|
|
@@ -4,6 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
|
+
# Input validation (SQL injection prevention)
|
|
8
|
+
validate_identifier() {
|
|
9
|
+
local input="$1"
|
|
10
|
+
local max_length="${2:-255}"
|
|
11
|
+
if ! [[ "$input" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
12
|
+
echo "ERROR: Invalid identifier (alphanumeric + underscore/hyphen only): $input" >&2
|
|
13
|
+
return 1
|
|
14
|
+
fi
|
|
15
|
+
if [ ${#input} -gt $max_length ]; then
|
|
16
|
+
echo "ERROR: Identifier exceeds max length ($max_length chars)" >&2
|
|
17
|
+
return 1
|
|
18
|
+
fi
|
|
19
|
+
return 0
|
|
20
|
+
}
|
|
21
|
+
|
|
7
22
|
# Source the main script to access validation functions
|
|
8
23
|
source "$(dirname "$0")/.claude/skills/cfn-cfn-test-integration.sh"
|
|
9
24
|
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# CFN Utilities Skill
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
name: cfn-utilities
|
|
5
|
+
category: utilities
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
tags: [bash, logging, error-handling, retry, file-operations, utilities]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Description
|
|
11
|
+
|
|
12
|
+
Reusable bash utility functions for the CFN Loop system. Provides standardized logging, error handling, retry logic, and atomic file operations with zero external dependencies.
|
|
13
|
+
|
|
14
|
+
## Purpose
|
|
15
|
+
|
|
16
|
+
- **Structured Logging**: JSON-formatted logs compatible with TypeScript logging system
|
|
17
|
+
- **Error Handling**: Consistent error management across bash scripts
|
|
18
|
+
- **Retry Logic**: Exponential backoff for transient failures
|
|
19
|
+
- **File Operations**: Atomic writes and file locking primitives
|
|
20
|
+
|
|
21
|
+
## Dependencies
|
|
22
|
+
|
|
23
|
+
- POSIX-compliant bash (4.0+)
|
|
24
|
+
- Coreutils (standard Linux/macOS utilities)
|
|
25
|
+
- No external dependencies required
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
### Direct Function Invocation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Source all utilities
|
|
33
|
+
source ./.claude/skills/cfn-utilities/execute.sh
|
|
34
|
+
|
|
35
|
+
# Use individual functions
|
|
36
|
+
log_info "Task started" '{"task_id":"abc123"}'
|
|
37
|
+
retry_with_backoff 3 2 curl https://api.example.com
|
|
38
|
+
atomic_write "/path/to/file.txt" "content here"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Via Execute Script
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Execute specific function
|
|
45
|
+
./.claude/skills/cfn-utilities/execute.sh log_json "info" "Message" '{"key":"value"}'
|
|
46
|
+
|
|
47
|
+
# Source and call
|
|
48
|
+
source ./.claude/skills/cfn-utilities/execute.sh
|
|
49
|
+
log_error "Operation failed" '{"error_code":"E001"}'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Available Functions
|
|
53
|
+
|
|
54
|
+
### Logging (lib/logging.sh)
|
|
55
|
+
|
|
56
|
+
**log_json(level, message, context)**
|
|
57
|
+
```bash
|
|
58
|
+
log_json "info" "Task started" '{"task_id":"abc123","agent":"backend-dev"}'
|
|
59
|
+
# Output: {"timestamp":"2025-11-15T20:00:00Z","level":"info","message":"Task started","context":{"task_id":"abc123","agent":"backend-dev"}}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**log_info(message, context)**
|
|
63
|
+
```bash
|
|
64
|
+
log_info "Processing file" '{"file":"data.txt"}'
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**log_warn(message, context)**
|
|
68
|
+
```bash
|
|
69
|
+
log_warn "Deprecated function used" '{"function":"old_func"}'
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**log_error(message, context)**
|
|
73
|
+
```bash
|
|
74
|
+
log_error "Failed to connect" '{"host":"api.example.com","code":500}'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**log_debug(message, context)**
|
|
78
|
+
```bash
|
|
79
|
+
export LOG_LEVEL=debug
|
|
80
|
+
log_debug "Variable state" '{"var":"value"}'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Error Handling (lib/errors.sh)
|
|
84
|
+
|
|
85
|
+
**error_exit(message, exit_code, context)**
|
|
86
|
+
```bash
|
|
87
|
+
error_exit "Database connection failed" 1 '{"db":"postgres"}'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**error_handle(message, context)**
|
|
91
|
+
```bash
|
|
92
|
+
if ! validate_input "$data"; then
|
|
93
|
+
error_handle "Invalid input" '{"input":"'$data'"}'
|
|
94
|
+
return 1
|
|
95
|
+
fi
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**is_error_code(expected_code)**
|
|
99
|
+
```bash
|
|
100
|
+
curl https://api.example.com
|
|
101
|
+
if is_error_code 7; then
|
|
102
|
+
echo "Connection failed"
|
|
103
|
+
fi
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Retry Logic (lib/retry.sh)
|
|
107
|
+
|
|
108
|
+
**retry_with_backoff(max_attempts, base_delay_sec, command, args...)**
|
|
109
|
+
```bash
|
|
110
|
+
# Retry curl with exponential backoff (2s, 4s, 8s)
|
|
111
|
+
retry_with_backoff 3 2 curl -f https://api.example.com/data
|
|
112
|
+
|
|
113
|
+
# Retry custom command
|
|
114
|
+
retry_with_backoff 5 1 cfn-spawn agent "backend-developer" --task "task"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### File Operations (lib/file-ops.sh)
|
|
118
|
+
|
|
119
|
+
**atomic_write(filepath, content)**
|
|
120
|
+
```bash
|
|
121
|
+
atomic_write "/tmp/data.json" '{"status":"complete"}'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**acquire_lock(lockfile, timeout_sec)**
|
|
125
|
+
```bash
|
|
126
|
+
if acquire_lock "/tmp/resource.lock" 30; then
|
|
127
|
+
# Critical section
|
|
128
|
+
release_lock "/tmp/resource.lock"
|
|
129
|
+
fi
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**release_lock(lockfile)**
|
|
133
|
+
```bash
|
|
134
|
+
release_lock "/tmp/resource.lock"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**with_lock(lockfile, timeout_sec, command, args...)**
|
|
138
|
+
```bash
|
|
139
|
+
with_lock "/tmp/database.lock" 60 ./scripts/migrate-db.sh
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Integration Points
|
|
143
|
+
|
|
144
|
+
### TypeScript Compatibility
|
|
145
|
+
|
|
146
|
+
**Logging Format**:
|
|
147
|
+
- JSON output compatible with `src/utils/logging.ts`
|
|
148
|
+
- Correlation ID format matches TypeScript UUID generation
|
|
149
|
+
- Timestamp format: ISO 8601 (UTC)
|
|
150
|
+
|
|
151
|
+
**Error Codes**:
|
|
152
|
+
- Error codes align with `src/utils/errors.ts`
|
|
153
|
+
- Exit codes: 0=success, 1=general error, 2=usage error, 130=timeout
|
|
154
|
+
|
|
155
|
+
**File Locking**:
|
|
156
|
+
- Lock files use `.lock` extension (same as `src/utils/file-operations.ts`)
|
|
157
|
+
- Timeout behavior matches TypeScript implementation
|
|
158
|
+
|
|
159
|
+
### CFN System Integration
|
|
160
|
+
|
|
161
|
+
**Used By**:
|
|
162
|
+
- `.claude/hooks/cfn-invoke-pre-edit.sh` - atomic backup creation
|
|
163
|
+
- `.claude/skills/cfn-coordination/` - structured logging
|
|
164
|
+
- `.claude/skills/cfn-loop-orchestration/orchestrate.sh` - retry logic
|
|
165
|
+
- All CFN agents - standardized error handling
|
|
166
|
+
|
|
167
|
+
**Correlation IDs**:
|
|
168
|
+
```bash
|
|
169
|
+
# Generate correlation ID (compatible with TypeScript)
|
|
170
|
+
CORRELATION_ID=$(uuidgen 2>/dev/null || echo "$(date +%s)-$$-$RANDOM")
|
|
171
|
+
log_info "Request started" '{"correlation_id":"'$CORRELATION_ID'"}'
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Testing
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Run all tests
|
|
178
|
+
./.claude/skills/cfn-utilities/test.sh
|
|
179
|
+
|
|
180
|
+
# Expected output:
|
|
181
|
+
# PASS: log_json outputs valid JSON
|
|
182
|
+
# PASS: retry_with_backoff succeeds after failures
|
|
183
|
+
# PASS: atomic_write creates file atomically
|
|
184
|
+
# PASS: with_lock prevents concurrent execution
|
|
185
|
+
# All tests passed (15/15)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Implementation Patterns
|
|
189
|
+
|
|
190
|
+
### Safe Script Template
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
#!/usr/bin/env bash
|
|
194
|
+
set -euo pipefail
|
|
195
|
+
|
|
196
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
197
|
+
source "$SCRIPT_DIR/.claude/skills/cfn-utilities/execute.sh"
|
|
198
|
+
|
|
199
|
+
main() {
|
|
200
|
+
log_info "Script started" '{"script":"'$(basename "$0")'"}'
|
|
201
|
+
|
|
202
|
+
retry_with_backoff 3 2 risky_operation || {
|
|
203
|
+
error_exit "Operation failed after retries" 1
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
atomic_write "/tmp/result.txt" "Success"
|
|
207
|
+
log_info "Script completed" '{"status":"success"}'
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
main "$@"
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Critical Section Pattern
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
#!/usr/bin/env bash
|
|
217
|
+
source ./.claude/skills/cfn-utilities/execute.sh
|
|
218
|
+
|
|
219
|
+
# Ensure only one instance modifies shared resource
|
|
220
|
+
with_lock "/tmp/shared-resource.lock" 30 bash -c '
|
|
221
|
+
log_info "Updating shared resource"
|
|
222
|
+
echo "new data" >> /tmp/shared-resource.txt
|
|
223
|
+
log_info "Update complete"
|
|
224
|
+
'
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Best Practices
|
|
228
|
+
|
|
229
|
+
1. **Always use structured logging** - Include context objects for debugging
|
|
230
|
+
2. **Set strict mode** - Use `set -euo pipefail` in all scripts
|
|
231
|
+
3. **Use atomic operations** - Prevent partial writes with atomic_write()
|
|
232
|
+
4. **Implement retries** - Handle transient failures gracefully
|
|
233
|
+
5. **Lock shared resources** - Prevent race conditions with file locks
|
|
234
|
+
|
|
235
|
+
## Version History
|
|
236
|
+
|
|
237
|
+
- **1.0.0** (2025-11-15): Initial release with logging, errors, retry, and file ops
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# CFN Utilities - Main entry point
|
|
3
|
+
# Sources all utility libraries and provides function execution
|
|
4
|
+
# Usage: ./.claude/skills/cfn-utilities/execute.sh <function> <args>
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
# Get script directory (absolute path)
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
|
|
11
|
+
# Source all utility libraries
|
|
12
|
+
source "$SCRIPT_DIR/lib/logging.sh"
|
|
13
|
+
source "$SCRIPT_DIR/lib/errors.sh"
|
|
14
|
+
source "$SCRIPT_DIR/lib/retry.sh"
|
|
15
|
+
source "$SCRIPT_DIR/lib/file-ops.sh"
|
|
16
|
+
|
|
17
|
+
# If script is executed directly (not sourced), run the requested function
|
|
18
|
+
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
|
19
|
+
if [ $# -eq 0 ]; then
|
|
20
|
+
echo "Usage: $0 <function> [args...]" >&2
|
|
21
|
+
echo "" >&2
|
|
22
|
+
echo "Available functions:" >&2
|
|
23
|
+
echo " Logging: log_json, log_info, log_warn, log_error, log_debug" >&2
|
|
24
|
+
echo " Errors: error_exit, error_handle, is_error_code" >&2
|
|
25
|
+
echo " Retry: retry_with_backoff, retry_fixed, retry_until_timeout" >&2
|
|
26
|
+
echo " File Ops: atomic_write, acquire_lock, release_lock, with_lock, is_locked" >&2
|
|
27
|
+
exit 2
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Execute the requested function with its arguments
|
|
31
|
+
"$@"
|
|
32
|
+
fi
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Error handling utilities for CFN system
|
|
3
|
+
# Compatible with TypeScript errors.ts conventions
|
|
4
|
+
|
|
5
|
+
# Source logging if not already loaded
|
|
6
|
+
if ! declare -f log_error >/dev/null 2>&1; then
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
source "$SCRIPT_DIR/logging.sh"
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
# Log error and exit with specified code
|
|
12
|
+
# Usage: error_exit "message" exit_code '{"context":"json"}'
|
|
13
|
+
error_exit() {
|
|
14
|
+
local message="${1:-Unknown error}"
|
|
15
|
+
local exit_code="${2:-1}"
|
|
16
|
+
local context="${3:-{}}"
|
|
17
|
+
|
|
18
|
+
log_error "$message" "$context"
|
|
19
|
+
exit "$exit_code"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
# Handle error without exiting (just log and return error code)
|
|
23
|
+
# Usage: error_handle "message" '{"context":"json"}' || return 1
|
|
24
|
+
error_handle() {
|
|
25
|
+
local message="${1:-Unknown error}"
|
|
26
|
+
local context="${2:-{}}"
|
|
27
|
+
|
|
28
|
+
log_error "$message" "$context"
|
|
29
|
+
return 1
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Check if exit code matches expected value
|
|
33
|
+
# Usage: some_command; EXITCODE=$?; if is_error_code $EXITCODE 7; then echo "Connection failed"; fi
|
|
34
|
+
is_error_code() {
|
|
35
|
+
local actual_code="${1:?Exit code required}"
|
|
36
|
+
local expected_code="${2:-1}"
|
|
37
|
+
|
|
38
|
+
[ "$actual_code" -eq "$expected_code" ]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# Capture error context from last failed command
|
|
42
|
+
# Usage: get_error_context
|
|
43
|
+
get_error_context() {
|
|
44
|
+
local exit_code=$?
|
|
45
|
+
local line_number="${BASH_LINENO[0]}"
|
|
46
|
+
local function_name="${FUNCNAME[1]}"
|
|
47
|
+
|
|
48
|
+
echo "{\"exit_code\":$exit_code,\"line\":$line_number,\"function\":\"$function_name\"}"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# Standard exit codes (compatible with TypeScript errors.ts)
|
|
52
|
+
readonly EXIT_SUCCESS=0
|
|
53
|
+
readonly EXIT_GENERAL_ERROR=1
|
|
54
|
+
readonly EXIT_USAGE_ERROR=2
|
|
55
|
+
readonly EXIT_TIMEOUT=130
|
|
56
|
+
readonly EXIT_INTERRUPT=143
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Atomic file operations and locking for CFN system
|
|
3
|
+
|
|
4
|
+
# Source logging if not already loaded
|
|
5
|
+
if ! declare -f log_info >/dev/null 2>&1; then
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
source "$SCRIPT_DIR/logging.sh"
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
# Atomic file write (write-then-move pattern)
|
|
11
|
+
# Usage: atomic_write "/path/to/file.txt" "content here"
|
|
12
|
+
atomic_write() {
|
|
13
|
+
local filepath="${1:?Filepath required}"
|
|
14
|
+
local content="${2:?Content required}"
|
|
15
|
+
|
|
16
|
+
# Create parent directory if needed
|
|
17
|
+
local dirpath
|
|
18
|
+
dirpath=$(dirname "$filepath")
|
|
19
|
+
mkdir -p "$dirpath"
|
|
20
|
+
|
|
21
|
+
# Write to temporary file first
|
|
22
|
+
local tmpfile
|
|
23
|
+
tmpfile="${filepath}.tmp.$$"
|
|
24
|
+
|
|
25
|
+
if ! echo "$content" > "$tmpfile"; then
|
|
26
|
+
log_error "Failed to write temporary file" "{\"file\":\"$tmpfile\"}"
|
|
27
|
+
rm -f "$tmpfile"
|
|
28
|
+
return 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Atomic move
|
|
32
|
+
if ! mv "$tmpfile" "$filepath"; then
|
|
33
|
+
log_error "Failed to move temporary file" "{\"tmpfile\":\"$tmpfile\",\"target\":\"$filepath\"}"
|
|
34
|
+
rm -f "$tmpfile"
|
|
35
|
+
return 1
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
log_debug "Atomic write succeeded" "{\"file\":\"$filepath\",\"bytes\":${#content}}"
|
|
39
|
+
return 0
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Acquire file lock with timeout
|
|
43
|
+
# Usage: if acquire_lock "/path/to/resource.lock" 30; then ... fi
|
|
44
|
+
acquire_lock() {
|
|
45
|
+
local lockfile="${1:?Lockfile required}"
|
|
46
|
+
local timeout_sec="${2:-30}"
|
|
47
|
+
|
|
48
|
+
local start_time
|
|
49
|
+
start_time=$(date +%s)
|
|
50
|
+
local end_time=$((start_time + timeout_sec))
|
|
51
|
+
|
|
52
|
+
# Create lock directory if needed
|
|
53
|
+
local lockdir
|
|
54
|
+
lockdir=$(dirname "$lockfile")
|
|
55
|
+
mkdir -p "$lockdir"
|
|
56
|
+
|
|
57
|
+
while [ "$(date +%s)" -lt "$end_time" ]; do
|
|
58
|
+
# Try to create lock file atomically
|
|
59
|
+
if (set -o noclobber; echo $$ > "$lockfile") 2>/dev/null; then
|
|
60
|
+
log_debug "Lock acquired" "{\"lockfile\":\"$lockfile\",\"pid\":$$}"
|
|
61
|
+
return 0
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# Check if lock holder is still alive
|
|
65
|
+
if [ -f "$lockfile" ]; then
|
|
66
|
+
local lock_pid
|
|
67
|
+
lock_pid=$(cat "$lockfile" 2>/dev/null || echo "")
|
|
68
|
+
|
|
69
|
+
if [ -n "$lock_pid" ] && ! kill -0 "$lock_pid" 2>/dev/null; then
|
|
70
|
+
log_warn "Stale lock detected, removing" "{\"lockfile\":\"$lockfile\",\"stale_pid\":$lock_pid}"
|
|
71
|
+
rm -f "$lockfile"
|
|
72
|
+
continue
|
|
73
|
+
fi
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Wait before retry
|
|
77
|
+
sleep 0.5
|
|
78
|
+
done
|
|
79
|
+
|
|
80
|
+
log_error "Failed to acquire lock (timeout)" "{\"lockfile\":\"$lockfile\",\"timeout\":$timeout_sec}"
|
|
81
|
+
return 1
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Release file lock
|
|
85
|
+
# Usage: release_lock "/path/to/resource.lock"
|
|
86
|
+
release_lock() {
|
|
87
|
+
local lockfile="${1:?Lockfile required}"
|
|
88
|
+
|
|
89
|
+
if [ ! -f "$lockfile" ]; then
|
|
90
|
+
log_warn "Lock file does not exist" "{\"lockfile\":\"$lockfile\"}"
|
|
91
|
+
return 1
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Verify we own the lock
|
|
95
|
+
local lock_pid
|
|
96
|
+
lock_pid=$(cat "$lockfile" 2>/dev/null || echo "")
|
|
97
|
+
|
|
98
|
+
if [ "$lock_pid" != "$$" ]; then
|
|
99
|
+
log_warn "Cannot release lock owned by another process" "{\"lockfile\":\"$lockfile\",\"owner\":$lock_pid,\"current\":$$}"
|
|
100
|
+
return 1
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
if ! rm -f "$lockfile"; then
|
|
104
|
+
log_error "Failed to remove lock file" "{\"lockfile\":\"$lockfile\"}"
|
|
105
|
+
return 1
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
log_debug "Lock released" "{\"lockfile\":\"$lockfile\",\"pid\":$$}"
|
|
109
|
+
return 0
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# Execute command with file lock held
|
|
113
|
+
# Usage: with_lock "/path/to/resource.lock" timeout_sec command [args...]
|
|
114
|
+
with_lock() {
|
|
115
|
+
local lockfile="${1:?Lockfile required}"
|
|
116
|
+
local timeout_sec="${2:?Timeout required}"
|
|
117
|
+
shift 2
|
|
118
|
+
local command=("$@")
|
|
119
|
+
|
|
120
|
+
# Acquire lock
|
|
121
|
+
if ! acquire_lock "$lockfile" "$timeout_sec"; then
|
|
122
|
+
log_error "Failed to acquire lock for command execution" "{\"lockfile\":\"$lockfile\",\"command\":\"${command[0]}\"}"
|
|
123
|
+
return 1
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
# Setup trap to release lock on exit
|
|
127
|
+
trap "release_lock '$lockfile'" EXIT INT TERM
|
|
128
|
+
|
|
129
|
+
# Execute command
|
|
130
|
+
local exit_code=0
|
|
131
|
+
"${command[@]}" || exit_code=$?
|
|
132
|
+
|
|
133
|
+
# Release lock
|
|
134
|
+
release_lock "$lockfile" || true
|
|
135
|
+
|
|
136
|
+
# Remove trap
|
|
137
|
+
trap - EXIT INT TERM
|
|
138
|
+
|
|
139
|
+
return $exit_code
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# Check if file lock exists and is held by a living process
|
|
143
|
+
# Usage: if is_locked "/path/to/resource.lock"; then ... fi
|
|
144
|
+
is_locked() {
|
|
145
|
+
local lockfile="${1:?Lockfile required}"
|
|
146
|
+
|
|
147
|
+
if [ ! -f "$lockfile" ]; then
|
|
148
|
+
return 1
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
local lock_pid
|
|
152
|
+
lock_pid=$(cat "$lockfile" 2>/dev/null || echo "")
|
|
153
|
+
|
|
154
|
+
if [ -z "$lock_pid" ]; then
|
|
155
|
+
return 1
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# Check if process is alive
|
|
159
|
+
if kill -0 "$lock_pid" 2>/dev/null; then
|
|
160
|
+
return 0 # Locked by living process
|
|
161
|
+
else
|
|
162
|
+
return 1 # Stale lock
|
|
163
|
+
fi
|
|
164
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Structured logging utilities for CFN system
|
|
3
|
+
# Compatible with TypeScript logging.ts format
|
|
4
|
+
|
|
5
|
+
# Get current timestamp in ISO 8601 format (UTC)
|
|
6
|
+
get_timestamp() {
|
|
7
|
+
date -u +"%Y-%m-%dT%H:%M:%SZ"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
# Output structured JSON log
|
|
11
|
+
# Usage: log_json "level" "message" '{"context":"json"}'
|
|
12
|
+
log_json() {
|
|
13
|
+
local level="${1:-info}"
|
|
14
|
+
local message="${2:-}"
|
|
15
|
+
local context="${3:-{}}"
|
|
16
|
+
local timestamp
|
|
17
|
+
timestamp=$(get_timestamp)
|
|
18
|
+
|
|
19
|
+
# Escape message for JSON (basic escaping)
|
|
20
|
+
message=$(echo "$message" | sed 's/"/\\"/g' | sed 's/\\/\\\\/g')
|
|
21
|
+
|
|
22
|
+
# Output JSON (ensure context is valid JSON)
|
|
23
|
+
if [ "$context" = "{}" ]; then
|
|
24
|
+
echo "{\"timestamp\":\"$timestamp\",\"level\":\"$level\",\"message\":\"$message\"}"
|
|
25
|
+
else
|
|
26
|
+
# Remove outer braces from context and merge
|
|
27
|
+
context_inner=$(echo "$context" | sed 's/^{//' | sed 's/}$//')
|
|
28
|
+
echo "{\"timestamp\":\"$timestamp\",\"level\":\"$level\",\"message\":\"$message\",\"context\":{$context_inner}}"
|
|
29
|
+
fi
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Info level log
|
|
33
|
+
# Usage: log_info "message" '{"key":"value"}'
|
|
34
|
+
log_info() {
|
|
35
|
+
local message="${1:-}"
|
|
36
|
+
local context="${2:-{}}"
|
|
37
|
+
log_json "info" "$message" "$context" >&2
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# Warning level log
|
|
41
|
+
# Usage: log_warn "message" '{"key":"value"}'
|
|
42
|
+
log_warn() {
|
|
43
|
+
local message="${1:-}"
|
|
44
|
+
local context="${2:-{}}"
|
|
45
|
+
log_json "warn" "$message" "$context" >&2
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Error level log
|
|
49
|
+
# Usage: log_error "message" '{"key":"value"}'
|
|
50
|
+
log_error() {
|
|
51
|
+
local message="${1:-}"
|
|
52
|
+
local context="${2:-{}}"
|
|
53
|
+
log_json "error" "$message" "$context" >&2
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Debug level log (respects LOG_LEVEL env var)
|
|
57
|
+
# Usage: LOG_LEVEL=debug log_debug "message" '{"key":"value"}'
|
|
58
|
+
log_debug() {
|
|
59
|
+
local message="${1:-}"
|
|
60
|
+
local context="${2:-{}}"
|
|
61
|
+
|
|
62
|
+
# Only output if LOG_LEVEL is debug or trace
|
|
63
|
+
if [[ "${LOG_LEVEL:-info}" =~ ^(debug|trace)$ ]]; then
|
|
64
|
+
log_json "debug" "$message" "$context" >&2
|
|
65
|
+
fi
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# Generate correlation ID (compatible with TypeScript UUID format)
|
|
69
|
+
# Usage: CORRELATION_ID=$(generate_correlation_id)
|
|
70
|
+
generate_correlation_id() {
|
|
71
|
+
# Try uuidgen first, fallback to timestamp+pid+random
|
|
72
|
+
if command -v uuidgen >/dev/null 2>&1; then
|
|
73
|
+
uuidgen | tr '[:upper:]' '[:lower:]'
|
|
74
|
+
else
|
|
75
|
+
echo "$(date +%s)-$$-$RANDOM"
|
|
76
|
+
fi
|
|
77
|
+
}
|