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,290 @@
|
|
|
1
|
+
# File Operations Skill
|
|
2
|
+
|
|
3
|
+
Centralized file locking and atomic write operations for bash scripts.
|
|
4
|
+
|
|
5
|
+
**Part of Task 4.2: Centralized File Locking & Atomic Operations**
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
This skill provides:
|
|
10
|
+
- **File Locking**: Acquire, release, and renew locks with queuing
|
|
11
|
+
- **Atomic Writes**: Write-then-move pattern with SHA256 verification
|
|
12
|
+
- **Safety**: Backup creation, rollback, permission preservation
|
|
13
|
+
- **Performance**: <100ms lock acquisition target, efficient retry logic
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
### File Locking
|
|
18
|
+
- Lock acquisition with configurable timeout (default: 300s)
|
|
19
|
+
- Waiting queue for blocked processes
|
|
20
|
+
- Lock renewal for long-running operations
|
|
21
|
+
- Force release for stuck locks
|
|
22
|
+
- Owner tracking (process ID, agent ID, hostname)
|
|
23
|
+
- Stale lock detection and automatic cleanup
|
|
24
|
+
|
|
25
|
+
### Atomic Writes
|
|
26
|
+
- Write-then-move pattern (atomic operation)
|
|
27
|
+
- SHA256 checksum verification
|
|
28
|
+
- Automatic backup creation
|
|
29
|
+
- Rollback on failure
|
|
30
|
+
- Permission and ownership preservation
|
|
31
|
+
- Integration with file locking
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
### Acquire Lock
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Basic usage
|
|
39
|
+
./.claude/skills/cfn-file-operations/execute.sh acquire-lock /path/to/file.txt
|
|
40
|
+
|
|
41
|
+
# With agent ID tracking
|
|
42
|
+
./.claude/skills/cfn-file-operations/execute.sh acquire-lock /path/to/file.txt --agent-id agent-001
|
|
43
|
+
|
|
44
|
+
# With custom timeout (30 seconds)
|
|
45
|
+
./.claude/skills/cfn-file-operations/execute.sh acquire-lock /path/to/file.txt --timeout 30000
|
|
46
|
+
|
|
47
|
+
# Output: LOCK_ID:LOCK_PATH (e.g., "lock-1234567890-999:/tmp/cfn-locks/abc123.lock")
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Release Lock
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Release lock using lock info from acquire
|
|
54
|
+
LOCK_INFO=$(./execute.sh acquire-lock /path/to/file.txt)
|
|
55
|
+
# ... perform operations ...
|
|
56
|
+
./execute.sh release-lock "$LOCK_INFO"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Renew Lock
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Renew lock with 5-minute extension (default)
|
|
63
|
+
./execute.sh renew-lock "$LOCK_INFO"
|
|
64
|
+
|
|
65
|
+
# Custom extension (10 minutes)
|
|
66
|
+
./execute.sh renew-lock "$LOCK_INFO" --extension 600000
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Force Release
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Force release a stuck lock
|
|
73
|
+
./execute.sh force-release /tmp/cfn-locks/abc123.lock
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Atomic Write
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Basic write
|
|
80
|
+
./execute.sh atomic-write /path/to/file.txt "Content here"
|
|
81
|
+
|
|
82
|
+
# With checksum verification
|
|
83
|
+
./execute.sh atomic-write /path/to/file.txt "Content" --checksum
|
|
84
|
+
|
|
85
|
+
# With backup creation
|
|
86
|
+
./execute.sh atomic-write /path/to/file.txt "Content" --backup
|
|
87
|
+
|
|
88
|
+
# With lock (auto-acquire and release)
|
|
89
|
+
./execute.sh atomic-write /path/to/file.txt "Content" --lock
|
|
90
|
+
|
|
91
|
+
# All features combined
|
|
92
|
+
./execute.sh atomic-write /path/to/file.txt "Content" --checksum --backup --lock
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Atomic Read
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Read with checksum
|
|
99
|
+
./execute.sh atomic-read /path/to/file.txt
|
|
100
|
+
|
|
101
|
+
# Verify expected checksum
|
|
102
|
+
./execute.sh atomic-read /path/to/file.txt --expected-checksum abc123...
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Verify Checksum
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
./execute.sh verify-checksum /path/to/file.txt expected_sha256_hash
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Get Metrics
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
./execute.sh get-metrics
|
|
115
|
+
|
|
116
|
+
# Output (JSON):
|
|
117
|
+
# {
|
|
118
|
+
# "activeLocks": 3,
|
|
119
|
+
# "staleLocks": 0,
|
|
120
|
+
# "lockDirectory": "/tmp/cfn-locks"
|
|
121
|
+
# }
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Complete Workflow Example
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
#!/bin/bash
|
|
128
|
+
set -euo pipefail
|
|
129
|
+
|
|
130
|
+
SKILL_PATH="./.claude/skills/cfn-file-operations/execute.sh"
|
|
131
|
+
FILE_PATH="/path/to/important-file.txt"
|
|
132
|
+
AGENT_ID="backend-dev-001"
|
|
133
|
+
|
|
134
|
+
# Acquire lock
|
|
135
|
+
echo "Acquiring lock..."
|
|
136
|
+
LOCK_INFO=$($SKILL_PATH acquire-lock "$FILE_PATH" --agent-id "$AGENT_ID" --timeout 60000)
|
|
137
|
+
|
|
138
|
+
if [ $? -ne 0 ]; then
|
|
139
|
+
echo "Failed to acquire lock"
|
|
140
|
+
exit 1
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
echo "Lock acquired: $LOCK_INFO"
|
|
144
|
+
|
|
145
|
+
# Perform operations with atomic write
|
|
146
|
+
echo "Writing file..."
|
|
147
|
+
RESULT=$($SKILL_PATH atomic-write "$FILE_PATH" "New content here" --checksum --backup)
|
|
148
|
+
|
|
149
|
+
if [ $? -ne 0 ]; then
|
|
150
|
+
echo "Write failed, releasing lock"
|
|
151
|
+
$SKILL_PATH release-lock "$LOCK_INFO"
|
|
152
|
+
exit 1
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
echo "Write successful: $RESULT"
|
|
156
|
+
|
|
157
|
+
# Renew lock for extended operation
|
|
158
|
+
echo "Renewing lock for extended operation..."
|
|
159
|
+
$SKILL_PATH renew-lock "$LOCK_INFO" --extension 300000
|
|
160
|
+
|
|
161
|
+
# Release lock
|
|
162
|
+
echo "Releasing lock..."
|
|
163
|
+
$SKILL_PATH release-lock "$LOCK_INFO"
|
|
164
|
+
|
|
165
|
+
echo "Complete!"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Lock File Format
|
|
169
|
+
|
|
170
|
+
Locks are stored in `/tmp/cfn-locks/` (configurable via `CFN_LOCK_DIR`).
|
|
171
|
+
|
|
172
|
+
Lock file naming: `${SHA256_HASH_OF_TARGET_PATH}.lock`
|
|
173
|
+
|
|
174
|
+
Lock metadata (JSON):
|
|
175
|
+
```json
|
|
176
|
+
{
|
|
177
|
+
"lockId": "lock-1234567890-999",
|
|
178
|
+
"filePath": "/absolute/path/to/file.txt",
|
|
179
|
+
"owner": {
|
|
180
|
+
"pid": 12345,
|
|
181
|
+
"agentId": "backend-dev-001",
|
|
182
|
+
"hostname": "server01"
|
|
183
|
+
},
|
|
184
|
+
"acquiredAt": "2025-11-16T04:00:00.123Z",
|
|
185
|
+
"expiresAt": "2025-11-16T04:05:00.123Z",
|
|
186
|
+
"timeoutMs": 300000,
|
|
187
|
+
"renewalCount": 0,
|
|
188
|
+
"lastRenewedAt": null
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Write Result Format
|
|
193
|
+
|
|
194
|
+
Atomic write operations return JSON:
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"success": true,
|
|
198
|
+
"filePath": "/absolute/path/to/file.txt",
|
|
199
|
+
"checksum": "abc123def456...",
|
|
200
|
+
"bytesWritten": 1024,
|
|
201
|
+
"durationMs": 45,
|
|
202
|
+
"backupPath": "/absolute/path/to/file.txt.2025-11-16T04-00-00.backup"
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Integration with TypeScript
|
|
207
|
+
|
|
208
|
+
This skill integrates with the TypeScript file operations:
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
import { FileLockManager } from './lib/file-lock-manager';
|
|
212
|
+
import { AtomicFileWriter } from './lib/atomic-file-writer';
|
|
213
|
+
|
|
214
|
+
// Use TypeScript API
|
|
215
|
+
const manager = new FileLockManager();
|
|
216
|
+
const lock = await manager.acquireLock('/path/to/file.txt', {
|
|
217
|
+
agentId: 'agent-001',
|
|
218
|
+
timeout: 30000
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
try {
|
|
222
|
+
const writer = new AtomicFileWriter();
|
|
223
|
+
await writer.writeFile('/path/to/file.txt', content, {
|
|
224
|
+
verifyChecksum: true,
|
|
225
|
+
createBackup: true
|
|
226
|
+
});
|
|
227
|
+
} finally {
|
|
228
|
+
await manager.releaseLock(lock.id);
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Configuration
|
|
233
|
+
|
|
234
|
+
Environment variables:
|
|
235
|
+
- `CFN_LOCK_DIR`: Lock directory (default: `/tmp/cfn-locks`)
|
|
236
|
+
|
|
237
|
+
Default timeouts:
|
|
238
|
+
- Lock acquisition: 300000ms (5 minutes)
|
|
239
|
+
- Retry interval: 100ms
|
|
240
|
+
- Stale lock detection: 300000ms (5 minutes)
|
|
241
|
+
|
|
242
|
+
## Error Handling
|
|
243
|
+
|
|
244
|
+
The skill uses exit codes for error signaling:
|
|
245
|
+
- `0`: Success
|
|
246
|
+
- `1`: General error (invalid arguments, operation failed)
|
|
247
|
+
|
|
248
|
+
Error messages are written to stderr.
|
|
249
|
+
|
|
250
|
+
## Performance
|
|
251
|
+
|
|
252
|
+
Target metrics:
|
|
253
|
+
- Lock acquisition: <100ms (when lock available)
|
|
254
|
+
- Atomic write: <50ms (small files)
|
|
255
|
+
- Checksum calculation: O(file size)
|
|
256
|
+
|
|
257
|
+
## Stale Lock Cleanup
|
|
258
|
+
|
|
259
|
+
Stale locks are automatically cleaned up:
|
|
260
|
+
- Locks past expiration time are considered stale
|
|
261
|
+
- Cleanup occurs during lock acquisition attempts
|
|
262
|
+
- Manual cleanup via `force-release` command
|
|
263
|
+
|
|
264
|
+
## Security Considerations
|
|
265
|
+
|
|
266
|
+
- Locks are process-scoped (not system-wide semaphores)
|
|
267
|
+
- Lock files are world-readable by default (chmod 644)
|
|
268
|
+
- Force release should be used with caution
|
|
269
|
+
- Ownership verification prevents unauthorized release
|
|
270
|
+
|
|
271
|
+
## Testing
|
|
272
|
+
|
|
273
|
+
See `test.sh` for comprehensive test suite covering:
|
|
274
|
+
- Lock acquisition and release
|
|
275
|
+
- Timeout scenarios
|
|
276
|
+
- Concurrent access
|
|
277
|
+
- Atomic writes with verification
|
|
278
|
+
- Stale lock detection
|
|
279
|
+
- Error handling
|
|
280
|
+
|
|
281
|
+
## See Also
|
|
282
|
+
|
|
283
|
+
- TypeScript API: `src/lib/file-lock-manager.ts`
|
|
284
|
+
- Atomic Writer: `src/lib/atomic-file-writer.ts`
|
|
285
|
+
- Usage Guide: `docs/FILE_OPERATIONS_GUIDE.md`
|
|
286
|
+
- Tests: `.claude/skills/cfn-file-operations/test.sh`
|
|
287
|
+
|
|
288
|
+
## Version
|
|
289
|
+
|
|
290
|
+
1.0.0 (Task 4.2 - November 2025)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# File Operations Skill - Main Entry Point
|
|
4
|
+
#
|
|
5
|
+
# Provides file locking and atomic write operations for bash scripts.
|
|
6
|
+
# Part of Task 4.2: Centralized File Locking & Atomic Operations
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# # Acquire lock
|
|
10
|
+
# ./.claude/skills/cfn-file-operations/execute.sh acquire-lock /path/to/file.txt --agent-id agent-001
|
|
11
|
+
#
|
|
12
|
+
# # Write atomically
|
|
13
|
+
# ./.claude/skills/cfn-file-operations/execute.sh atomic-write /path/to/file.txt "content" --checksum
|
|
14
|
+
#
|
|
15
|
+
# # Release lock
|
|
16
|
+
# ./.claude/skills/cfn-file-operations/execute.sh release-lock LOCK_ID
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
22
|
+
source "${SCRIPT_DIR}/lib/lock.sh"
|
|
23
|
+
source "${SCRIPT_DIR}/lib/atomic-write.sh"
|
|
24
|
+
|
|
25
|
+
# Command dispatcher
|
|
26
|
+
COMMAND="${1:-help}"
|
|
27
|
+
shift || true
|
|
28
|
+
|
|
29
|
+
case "$COMMAND" in
|
|
30
|
+
acquire-lock)
|
|
31
|
+
file_path="${1:-}"
|
|
32
|
+
shift || true
|
|
33
|
+
acquire_file_lock "$file_path" "$@"
|
|
34
|
+
;;
|
|
35
|
+
|
|
36
|
+
release-lock)
|
|
37
|
+
lock_id="${1:-}"
|
|
38
|
+
shift || true
|
|
39
|
+
release_file_lock "$lock_id" "$@"
|
|
40
|
+
;;
|
|
41
|
+
|
|
42
|
+
renew-lock)
|
|
43
|
+
lock_id="${1:-}"
|
|
44
|
+
shift || true
|
|
45
|
+
renew_file_lock "$lock_id" "$@"
|
|
46
|
+
;;
|
|
47
|
+
|
|
48
|
+
force-release)
|
|
49
|
+
lock_path="${1:-}"
|
|
50
|
+
shift || true
|
|
51
|
+
force_release_lock "$lock_path" "$@"
|
|
52
|
+
;;
|
|
53
|
+
|
|
54
|
+
atomic-write)
|
|
55
|
+
file_path="${1:-}"
|
|
56
|
+
content="${2:-}"
|
|
57
|
+
shift 2 || true
|
|
58
|
+
atomic_write_file "$file_path" "$content" "$@"
|
|
59
|
+
;;
|
|
60
|
+
|
|
61
|
+
atomic-read)
|
|
62
|
+
file_path="${1:-}"
|
|
63
|
+
shift || true
|
|
64
|
+
atomic_read_file "$file_path" "$@"
|
|
65
|
+
;;
|
|
66
|
+
|
|
67
|
+
verify-checksum)
|
|
68
|
+
file_path="${1:-}"
|
|
69
|
+
expected_checksum="${2:-}"
|
|
70
|
+
shift 2 || true
|
|
71
|
+
verify_file_checksum "$file_path" "$expected_checksum" "$@"
|
|
72
|
+
;;
|
|
73
|
+
|
|
74
|
+
get-metrics)
|
|
75
|
+
get_lock_metrics
|
|
76
|
+
;;
|
|
77
|
+
|
|
78
|
+
help|--help|-h)
|
|
79
|
+
cat <<EOF
|
|
80
|
+
File Operations Skill - Usage
|
|
81
|
+
|
|
82
|
+
Commands:
|
|
83
|
+
acquire-lock <file-path> [--agent-id ID] [--timeout MS]
|
|
84
|
+
Acquire a file lock
|
|
85
|
+
|
|
86
|
+
release-lock <lock-id>
|
|
87
|
+
Release a file lock
|
|
88
|
+
|
|
89
|
+
renew-lock <lock-id> [--extension MS]
|
|
90
|
+
Renew a file lock (extend expiration)
|
|
91
|
+
|
|
92
|
+
force-release <lock-path>
|
|
93
|
+
Force release a stuck lock
|
|
94
|
+
|
|
95
|
+
atomic-write <file-path> <content> [--checksum] [--backup]
|
|
96
|
+
Write file atomically with optional checksum verification
|
|
97
|
+
|
|
98
|
+
atomic-read <file-path> [--expected-checksum HASH]
|
|
99
|
+
Read file with optional checksum verification
|
|
100
|
+
|
|
101
|
+
verify-checksum <file-path> <expected-checksum>
|
|
102
|
+
Verify file SHA256 checksum
|
|
103
|
+
|
|
104
|
+
get-metrics
|
|
105
|
+
Get lock manager metrics
|
|
106
|
+
|
|
107
|
+
help
|
|
108
|
+
Show this help message
|
|
109
|
+
|
|
110
|
+
Examples:
|
|
111
|
+
# Acquire lock
|
|
112
|
+
./execute.sh acquire-lock /tmp/test.txt --agent-id agent-001
|
|
113
|
+
|
|
114
|
+
# Write atomically
|
|
115
|
+
./execute.sh atomic-write /tmp/test.txt "Hello World" --checksum --backup
|
|
116
|
+
|
|
117
|
+
# Release lock
|
|
118
|
+
./execute.sh release-lock abc123-lock-id
|
|
119
|
+
|
|
120
|
+
For more information, see SKILL.md
|
|
121
|
+
EOF
|
|
122
|
+
;;
|
|
123
|
+
|
|
124
|
+
*)
|
|
125
|
+
echo "Error: Unknown command: $COMMAND" >&2
|
|
126
|
+
echo "Run '$0 help' for usage information" >&2
|
|
127
|
+
exit 1
|
|
128
|
+
;;
|
|
129
|
+
esac
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Atomic Write Operations Library
|
|
4
|
+
#
|
|
5
|
+
# Provides atomic file write functions with SHA256 verification.
|
|
6
|
+
# Part of Task 4.2: Centralized File Locking & Atomic Operations
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Calculate SHA256 checksum of content
|
|
11
|
+
#
|
|
12
|
+
# Usage: calculate_checksum <content>
|
|
13
|
+
#
|
|
14
|
+
calculate_checksum() {
|
|
15
|
+
local content="$1"
|
|
16
|
+
echo -n "$content" | sha256sum | awk '{print $1}'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Calculate SHA256 checksum of file
|
|
21
|
+
#
|
|
22
|
+
# Usage: calculate_file_checksum <file-path>
|
|
23
|
+
#
|
|
24
|
+
calculate_file_checksum() {
|
|
25
|
+
local file_path="$1"
|
|
26
|
+
|
|
27
|
+
if [ ! -f "$file_path" ]; then
|
|
28
|
+
echo "Error: File not found: $file_path" >&2
|
|
29
|
+
return 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
sha256sum "$file_path" | awk '{print $1}'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Write file atomically
|
|
37
|
+
#
|
|
38
|
+
# Usage: atomic_write_file <file-path> <content> [--checksum] [--backup] [--lock]
|
|
39
|
+
#
|
|
40
|
+
atomic_write_file() {
|
|
41
|
+
local file_path="$1"
|
|
42
|
+
local content="$2"
|
|
43
|
+
shift 2
|
|
44
|
+
|
|
45
|
+
if [ -z "$file_path" ]; then
|
|
46
|
+
echo "Error: file-path required" >&2
|
|
47
|
+
return 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
local verify_checksum=0
|
|
51
|
+
local create_backup=0
|
|
52
|
+
local use_lock=0
|
|
53
|
+
local lock_info=""
|
|
54
|
+
|
|
55
|
+
# Parse options
|
|
56
|
+
while [[ $# -gt 0 ]]; do
|
|
57
|
+
case "$1" in
|
|
58
|
+
--checksum)
|
|
59
|
+
verify_checksum=1
|
|
60
|
+
shift
|
|
61
|
+
;;
|
|
62
|
+
--backup)
|
|
63
|
+
create_backup=1
|
|
64
|
+
shift
|
|
65
|
+
;;
|
|
66
|
+
--lock)
|
|
67
|
+
use_lock=1
|
|
68
|
+
shift
|
|
69
|
+
;;
|
|
70
|
+
*)
|
|
71
|
+
shift
|
|
72
|
+
;;
|
|
73
|
+
esac
|
|
74
|
+
done
|
|
75
|
+
|
|
76
|
+
local start_time
|
|
77
|
+
start_time=$(date +%s%3N)
|
|
78
|
+
|
|
79
|
+
# Acquire lock if requested
|
|
80
|
+
if [ "$use_lock" -eq 1 ]; then
|
|
81
|
+
lock_info=$(acquire_file_lock "$file_path" --timeout 30000)
|
|
82
|
+
if [ $? -ne 0 ]; then
|
|
83
|
+
echo "Error: Failed to acquire lock for $file_path" >&2
|
|
84
|
+
return 1
|
|
85
|
+
fi
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
local dir
|
|
89
|
+
dir=$(dirname "$file_path")
|
|
90
|
+
|
|
91
|
+
local temp_path
|
|
92
|
+
temp_path="${dir}/.$(basename "$file_path").$(date +%s%N).tmp"
|
|
93
|
+
|
|
94
|
+
local backup_path=""
|
|
95
|
+
local success=0
|
|
96
|
+
|
|
97
|
+
# Calculate expected checksum
|
|
98
|
+
local expected_checksum
|
|
99
|
+
expected_checksum=$(calculate_checksum "$content")
|
|
100
|
+
|
|
101
|
+
# Create backup if requested and file exists
|
|
102
|
+
if [ "$create_backup" -eq 1 ] && [ -f "$file_path" ]; then
|
|
103
|
+
local timestamp
|
|
104
|
+
timestamp=$(date -u +"%Y-%m-%dT%H-%M-%S")
|
|
105
|
+
backup_path="${file_path}.${timestamp}.backup"
|
|
106
|
+
|
|
107
|
+
cp "$file_path" "$backup_path" 2>/dev/null || {
|
|
108
|
+
echo "Error: Failed to create backup" >&2
|
|
109
|
+
[ -n "$lock_info" ] && release_file_lock "$lock_info"
|
|
110
|
+
return 1
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
echo "Backup created: $backup_path" >&2
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# Write to temporary file
|
|
117
|
+
echo -n "$content" > "$temp_path" || {
|
|
118
|
+
echo "Error: Failed to write temporary file" >&2
|
|
119
|
+
[ -n "$lock_info" ] && release_file_lock "$lock_info"
|
|
120
|
+
return 1
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
# Verify checksum if requested
|
|
124
|
+
if [ "$verify_checksum" -eq 1 ]; then
|
|
125
|
+
local actual_checksum
|
|
126
|
+
actual_checksum=$(calculate_file_checksum "$temp_path")
|
|
127
|
+
|
|
128
|
+
if [ "$actual_checksum" != "$expected_checksum" ]; then
|
|
129
|
+
echo "Error: Checksum verification failed" >&2
|
|
130
|
+
echo " Expected: $expected_checksum" >&2
|
|
131
|
+
echo " Actual: $actual_checksum" >&2
|
|
132
|
+
rm -f "$temp_path"
|
|
133
|
+
[ -n "$lock_info" ] && release_file_lock "$lock_info"
|
|
134
|
+
return 1
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
echo "Checksum verified: $actual_checksum" >&2
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
# Preserve permissions if file exists
|
|
141
|
+
if [ -f "$file_path" ]; then
|
|
142
|
+
chmod --reference="$file_path" "$temp_path" 2>/dev/null || true
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# Atomic move
|
|
146
|
+
if mv "$temp_path" "$file_path" 2>/dev/null; then
|
|
147
|
+
success=1
|
|
148
|
+
else
|
|
149
|
+
echo "Error: Failed to move temporary file to target" >&2
|
|
150
|
+
|
|
151
|
+
# Rollback from backup if available
|
|
152
|
+
if [ -n "$backup_path" ] && [ -f "$backup_path" ]; then
|
|
153
|
+
cp "$backup_path" "$file_path" 2>/dev/null && {
|
|
154
|
+
echo "Restored from backup after failed write" >&2
|
|
155
|
+
}
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
rm -f "$temp_path"
|
|
159
|
+
[ -n "$lock_info" ] && release_file_lock "$lock_info"
|
|
160
|
+
return 1
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# Get file size
|
|
164
|
+
local bytes_written
|
|
165
|
+
bytes_written=$(stat -f%z "$file_path" 2>/dev/null || stat -c%s "$file_path" 2>/dev/null || echo "0")
|
|
166
|
+
|
|
167
|
+
local end_time
|
|
168
|
+
end_time=$(date +%s%3N)
|
|
169
|
+
local duration=$((end_time - start_time))
|
|
170
|
+
|
|
171
|
+
# Release lock if acquired
|
|
172
|
+
if [ -n "$lock_info" ]; then
|
|
173
|
+
release_file_lock "$lock_info"
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
# Output result as JSON
|
|
177
|
+
jq -n \
|
|
178
|
+
--argjson success "$success" \
|
|
179
|
+
--arg filePath "$file_path" \
|
|
180
|
+
--arg checksum "$expected_checksum" \
|
|
181
|
+
--argjson bytesWritten "$bytes_written" \
|
|
182
|
+
--argjson durationMs "$duration" \
|
|
183
|
+
--arg backupPath "$backup_path" \
|
|
184
|
+
'{
|
|
185
|
+
success: $success,
|
|
186
|
+
filePath: $filePath,
|
|
187
|
+
checksum: $checksum,
|
|
188
|
+
bytesWritten: $bytesWritten,
|
|
189
|
+
durationMs: $durationMs,
|
|
190
|
+
backupPath: $backupPath
|
|
191
|
+
}'
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
#
|
|
195
|
+
# Read file atomically
|
|
196
|
+
#
|
|
197
|
+
# Usage: atomic_read_file <file-path> [--expected-checksum HASH]
|
|
198
|
+
#
|
|
199
|
+
atomic_read_file() {
|
|
200
|
+
local file_path="$1"
|
|
201
|
+
shift
|
|
202
|
+
|
|
203
|
+
if [ -z "$file_path" ]; then
|
|
204
|
+
echo "Error: file-path required" >&2
|
|
205
|
+
return 1
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
if [ ! -f "$file_path" ]; then
|
|
209
|
+
echo "Error: File not found: $file_path" >&2
|
|
210
|
+
return 1
|
|
211
|
+
fi
|
|
212
|
+
|
|
213
|
+
local expected_checksum=""
|
|
214
|
+
|
|
215
|
+
# Parse options
|
|
216
|
+
while [[ $# -gt 0 ]]; do
|
|
217
|
+
case "$1" in
|
|
218
|
+
--expected-checksum)
|
|
219
|
+
expected_checksum="$2"
|
|
220
|
+
shift 2
|
|
221
|
+
;;
|
|
222
|
+
*)
|
|
223
|
+
shift
|
|
224
|
+
;;
|
|
225
|
+
esac
|
|
226
|
+
done
|
|
227
|
+
|
|
228
|
+
# Read content
|
|
229
|
+
local content
|
|
230
|
+
content=$(cat "$file_path")
|
|
231
|
+
|
|
232
|
+
# Calculate checksum
|
|
233
|
+
local actual_checksum
|
|
234
|
+
actual_checksum=$(calculate_checksum "$content")
|
|
235
|
+
|
|
236
|
+
# Verify if expected checksum provided
|
|
237
|
+
if [ -n "$expected_checksum" ]; then
|
|
238
|
+
if [ "$actual_checksum" != "$expected_checksum" ]; then
|
|
239
|
+
echo "Error: Checksum verification failed" >&2
|
|
240
|
+
echo " Expected: $expected_checksum" >&2
|
|
241
|
+
echo " Actual: $actual_checksum" >&2
|
|
242
|
+
return 1
|
|
243
|
+
fi
|
|
244
|
+
fi
|
|
245
|
+
|
|
246
|
+
# Output result as JSON
|
|
247
|
+
jq -n \
|
|
248
|
+
--arg content "$content" \
|
|
249
|
+
--arg checksum "$actual_checksum" \
|
|
250
|
+
'{
|
|
251
|
+
content: $content,
|
|
252
|
+
checksum: $checksum
|
|
253
|
+
}'
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
#
|
|
257
|
+
# Verify file checksum
|
|
258
|
+
#
|
|
259
|
+
# Usage: verify_file_checksum <file-path> <expected-checksum>
|
|
260
|
+
#
|
|
261
|
+
verify_file_checksum() {
|
|
262
|
+
local file_path="$1"
|
|
263
|
+
local expected_checksum="$2"
|
|
264
|
+
|
|
265
|
+
if [ -z "$file_path" ] || [ -z "$expected_checksum" ]; then
|
|
266
|
+
echo "Error: file-path and expected-checksum required" >&2
|
|
267
|
+
return 1
|
|
268
|
+
fi
|
|
269
|
+
|
|
270
|
+
if [ ! -f "$file_path" ]; then
|
|
271
|
+
echo "Error: File not found: $file_path" >&2
|
|
272
|
+
return 1
|
|
273
|
+
fi
|
|
274
|
+
|
|
275
|
+
local actual_checksum
|
|
276
|
+
actual_checksum=$(calculate_file_checksum "$file_path")
|
|
277
|
+
|
|
278
|
+
local matches=0
|
|
279
|
+
if [ "$actual_checksum" = "$expected_checksum" ]; then
|
|
280
|
+
matches=1
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
jq -n \
|
|
284
|
+
--arg filePath "$file_path" \
|
|
285
|
+
--arg expected "$expected_checksum" \
|
|
286
|
+
--arg actual "$actual_checksum" \
|
|
287
|
+
--argjson matches "$matches" \
|
|
288
|
+
'{
|
|
289
|
+
filePath: $filePath,
|
|
290
|
+
expectedChecksum: $expected,
|
|
291
|
+
actualChecksum: $actual,
|
|
292
|
+
matches: $matches
|
|
293
|
+
}'
|
|
294
|
+
}
|