claude-flow-novice 2.15.2 → 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-BACKUP_USAGE.md +243 -243
- package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
- package/.claude/hooks/cfn-post-edit.config.json +44 -44
- 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-hybrid-routing/check-dependencies.sh +51 -51
- 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-loop-validation/orchestrate-cfn-loop.sh +252 -252
- 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 +74 -74
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
- 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/middleware-config.sh +28 -28
- package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
- package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- 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-BACKUP_USAGE.md +243 -243
- package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
- package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
- package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
- 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 +543 -572
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
- 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/persist-agent-output.sh +48 -48
- package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
- 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-expert-update/update-expert.sh +345 -345
- 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-hybrid-routing/check-dependencies.sh +51 -51
- package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
- package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
- 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-loop-validation/orchestrate-cfn-loop.sh +252 -252
- package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
- package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
- package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
- package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
- 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-playbook-auto-update/auto-update-playbook.sh +85 -85
- 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 +74 -74
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
- 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-scope-simplifier/simplify-scope.sh +67 -67
- 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-specialist-injection/recommend-specialist.sh +56 -56
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
- package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
- 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-task-config-init/initialize-config.sh +264 -264
- package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
- 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/middleware-config.sh +28 -28
- package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
- package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- 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/docker-build/SKILL.md +96 -203
- package/claude-assets/skills/docker-build/build.sh +73 -73
- package/claude-assets/skills/integration/agent-handoff.sh +492 -0
- package/claude-assets/skills/integration/file-operations.sh +414 -0
- 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/APPROVAL_WORKFLOW.md +806 -0
- package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
- package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
- package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
- package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -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/generate-skill-update.sh +525 -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/review-skill.sh +643 -0
- package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
- package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
- 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/config-manager.js +91 -109
- package/dist/cli/config-manager.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 +507 -0
- package/dist/integration/DatabaseHandoff.js.map +1 -0
- package/dist/integration/StandardAdapter.js +291 -0
- package/dist/integration/StandardAdapter.js.map +1 -0
- 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 +518 -0
- package/dist/lib/agent-output-parser.js.map +1 -0
- package/dist/lib/agent-output-validator.js +950 -0
- package/dist/lib/agent-output-validator.js.map +1 -0
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/artifact-registry.js +443 -0
- package/dist/lib/artifact-registry.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 +687 -0
- package/dist/lib/config-validator.js.map +1 -0
- 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/agent-output.js +44 -0
- package/dist/types/agent-output.js.map +1 -0
- package/dist/types/config.js +28 -0
- package/dist/types/config.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 -176
- package/readme/README.md +19 -4
- package/scripts/artifact-cleanup.sh +392 -0
- 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/deploy-production.sh +355 -355
- package/scripts/docker-playwright-fix.sh +311 -311
- package/scripts/docker-rebuild-all-agents.sh +127 -127
- 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/memory-leak-prevention.sh +305 -305
- package/scripts/migrate-artifacts.sh +563 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/migrate-yaml-to-json.sh +465 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/run-marketing-tests.sh +42 -42
- package/scripts/update_paths.sh +46 -46
- 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/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,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Markdown Validator
|
|
3
|
+
*
|
|
4
|
+
* Enforces consistent structure for all Markdown skill files with validated
|
|
5
|
+
* frontmatter and content sections.
|
|
6
|
+
*
|
|
7
|
+
* @module skill-markdown-validator
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/ import { parseFrontmatter, validateFrontmatter } from './skill-frontmatter-parser.js';
|
|
10
|
+
import { StandardError } from './errors.js';
|
|
11
|
+
import { getSafePath, PathValidationError } from './path-validator.js';
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
/**
|
|
15
|
+
* Skill markdown validation error
|
|
16
|
+
*/ export class SkillMarkdownError extends StandardError {
|
|
17
|
+
constructor(message, context){
|
|
18
|
+
super('SKILL_MARKDOWN_VALIDATION_ERROR', message, context);
|
|
19
|
+
this.name = 'SkillMarkdownError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Required sections in skill files (in order)
|
|
24
|
+
*/ export const REQUIRED_SECTIONS = [
|
|
25
|
+
'Overview',
|
|
26
|
+
'Usage',
|
|
27
|
+
'Examples',
|
|
28
|
+
'Implementation',
|
|
29
|
+
'Tests'
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Optional sections (can appear after required sections)
|
|
33
|
+
*/ export const OPTIONAL_SECTIONS = [
|
|
34
|
+
'API Reference',
|
|
35
|
+
'Configuration',
|
|
36
|
+
'Related Skills',
|
|
37
|
+
'References',
|
|
38
|
+
'Troubleshooting',
|
|
39
|
+
'Performance',
|
|
40
|
+
'Security',
|
|
41
|
+
'Quick Start'
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Supported code block languages
|
|
45
|
+
*/ export const SUPPORTED_LANGUAGES = [
|
|
46
|
+
'bash',
|
|
47
|
+
'sh',
|
|
48
|
+
'typescript',
|
|
49
|
+
'javascript',
|
|
50
|
+
'json',
|
|
51
|
+
'yaml',
|
|
52
|
+
'yml',
|
|
53
|
+
'markdown',
|
|
54
|
+
'md',
|
|
55
|
+
'python',
|
|
56
|
+
'sql',
|
|
57
|
+
'html',
|
|
58
|
+
'css',
|
|
59
|
+
'dockerfile',
|
|
60
|
+
'plaintext',
|
|
61
|
+
'text'
|
|
62
|
+
];
|
|
63
|
+
/**
|
|
64
|
+
* Minimum content length per section (characters)
|
|
65
|
+
*/ export const MIN_SECTION_LENGTH = 50;
|
|
66
|
+
/**
|
|
67
|
+
* Validate complete skill markdown file
|
|
68
|
+
*
|
|
69
|
+
* @param content - Raw SKILL.md content
|
|
70
|
+
* @param basePath - Base path for link validation (optional)
|
|
71
|
+
* @returns Validation result
|
|
72
|
+
* @throws SkillMarkdownError if parsing fails
|
|
73
|
+
*/ export function validateSkillMarkdown(content, basePath) {
|
|
74
|
+
const errors = [];
|
|
75
|
+
const warnings = [];
|
|
76
|
+
let frontmatterValid = false;
|
|
77
|
+
let contentValid = false;
|
|
78
|
+
let codeBlocksValid = false;
|
|
79
|
+
let linksValid = false;
|
|
80
|
+
try {
|
|
81
|
+
// Step 1: Parse and validate frontmatter
|
|
82
|
+
const parsed = parseFrontmatter(content);
|
|
83
|
+
const frontmatterValidation = validateFrontmatter(parsed.frontmatter);
|
|
84
|
+
frontmatterValid = frontmatterValidation.valid;
|
|
85
|
+
errors.push(...frontmatterValidation.errors);
|
|
86
|
+
warnings.push(...frontmatterValidation.warnings);
|
|
87
|
+
// Step 2: Validate content structure
|
|
88
|
+
const contentValidation = validateContentStructure(parsed.content);
|
|
89
|
+
contentValid = contentValidation.valid;
|
|
90
|
+
errors.push(...contentValidation.errors);
|
|
91
|
+
warnings.push(...contentValidation.warnings);
|
|
92
|
+
// Step 3: Validate code blocks
|
|
93
|
+
const codeBlockValidation = validateCodeBlocks(parsed.content);
|
|
94
|
+
codeBlocksValid = codeBlockValidation.valid;
|
|
95
|
+
errors.push(...codeBlockValidation.errors);
|
|
96
|
+
warnings.push(...codeBlockValidation.warnings);
|
|
97
|
+
// Step 4: Validate links (if basePath provided)
|
|
98
|
+
if (basePath) {
|
|
99
|
+
const linkValidation = validateInternalLinks(parsed.content, basePath);
|
|
100
|
+
linksValid = linkValidation.valid;
|
|
101
|
+
errors.push(...linkValidation.errors);
|
|
102
|
+
warnings.push(...linkValidation.warnings);
|
|
103
|
+
} else {
|
|
104
|
+
linksValid = true; // Skip link validation if no basePath
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
valid: frontmatterValid && contentValid && codeBlocksValid && linksValid,
|
|
108
|
+
errors,
|
|
109
|
+
warnings,
|
|
110
|
+
frontmatterValid,
|
|
111
|
+
contentValid,
|
|
112
|
+
codeBlocksValid,
|
|
113
|
+
linksValid
|
|
114
|
+
};
|
|
115
|
+
} catch (error) {
|
|
116
|
+
if (error instanceof Error) {
|
|
117
|
+
throw new SkillMarkdownError('Failed to validate skill markdown', {
|
|
118
|
+
originalError: error.message
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Validate content structure and section ordering
|
|
126
|
+
*
|
|
127
|
+
* @param content - Markdown content (without frontmatter)
|
|
128
|
+
* @returns Content validation result
|
|
129
|
+
*/ export function validateContentStructure(content) {
|
|
130
|
+
const errors = [];
|
|
131
|
+
const warnings = [];
|
|
132
|
+
const sections = {};
|
|
133
|
+
const missingRequiredSections = [];
|
|
134
|
+
const sectionOrderErrors = [];
|
|
135
|
+
const optionalSections = [];
|
|
136
|
+
// Extract sections using regex
|
|
137
|
+
const sectionRegex = /^##\s+(.+)$/gm;
|
|
138
|
+
const foundSections = [];
|
|
139
|
+
let match;
|
|
140
|
+
while((match = sectionRegex.exec(content)) !== null){
|
|
141
|
+
const sectionName = match[1].trim();
|
|
142
|
+
const sectionIndex = match.index;
|
|
143
|
+
// Find content up to next section or end
|
|
144
|
+
const nextMatch = sectionRegex.exec(content);
|
|
145
|
+
const endIndex = nextMatch ? nextMatch.index : content.length;
|
|
146
|
+
sectionRegex.lastIndex = nextMatch ? nextMatch.index : content.length;
|
|
147
|
+
const sectionContent = content.substring(sectionIndex, endIndex);
|
|
148
|
+
foundSections.push({
|
|
149
|
+
name: sectionName,
|
|
150
|
+
index: sectionIndex,
|
|
151
|
+
content: sectionContent
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Check required sections
|
|
155
|
+
REQUIRED_SECTIONS.forEach((requiredSection)=>{
|
|
156
|
+
const found = foundSections.some((s)=>s.name === requiredSection);
|
|
157
|
+
sections[requiredSection] = found;
|
|
158
|
+
if (!found) {
|
|
159
|
+
missingRequiredSections.push(requiredSection);
|
|
160
|
+
errors.push(`Required section "${requiredSection}" is missing`);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// Check section order
|
|
164
|
+
let lastRequiredIndex = -1;
|
|
165
|
+
REQUIRED_SECTIONS.forEach((requiredSection)=>{
|
|
166
|
+
const sectionIndex = foundSections.findIndex((s)=>s.name === requiredSection);
|
|
167
|
+
if (sectionIndex !== -1) {
|
|
168
|
+
if (sectionIndex < lastRequiredIndex) {
|
|
169
|
+
sectionOrderErrors.push(`Section "${requiredSection}" appears out of order (should be after previous required sections)`);
|
|
170
|
+
errors.push(`Section "${requiredSection}" is out of order. Expected order: ${REQUIRED_SECTIONS.join(', ')}`);
|
|
171
|
+
}
|
|
172
|
+
lastRequiredIndex = sectionIndex;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
// Identify optional sections
|
|
176
|
+
foundSections.forEach((section)=>{
|
|
177
|
+
if (!REQUIRED_SECTIONS.includes(section.name) && OPTIONAL_SECTIONS.includes(section.name)) {
|
|
178
|
+
optionalSections.push(section.name);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Check minimum content length per section
|
|
182
|
+
foundSections.forEach((section)=>{
|
|
183
|
+
const contentLength = section.content.replace(/^##.+$/m, '').trim().length;
|
|
184
|
+
if (contentLength < MIN_SECTION_LENGTH) {
|
|
185
|
+
warnings.push(`Section "${section.name}" has less than minimum content length (${contentLength} < ${MIN_SECTION_LENGTH} characters)`);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return {
|
|
189
|
+
valid: errors.length === 0,
|
|
190
|
+
errors,
|
|
191
|
+
warnings,
|
|
192
|
+
sections,
|
|
193
|
+
missingRequiredSections,
|
|
194
|
+
sectionOrderErrors,
|
|
195
|
+
optionalSections
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Validate code blocks and syntax highlighting
|
|
200
|
+
*
|
|
201
|
+
* @param content - Markdown content
|
|
202
|
+
* @returns Code block validation result
|
|
203
|
+
*/ export function validateCodeBlocks(content) {
|
|
204
|
+
const errors = [];
|
|
205
|
+
const warnings = [];
|
|
206
|
+
const codeBlocks = [];
|
|
207
|
+
// Extract code blocks using regex
|
|
208
|
+
const codeBlockRegex = /```(\w*)\n([\s\S]*?)```/g;
|
|
209
|
+
let match;
|
|
210
|
+
let lineNumber = 1;
|
|
211
|
+
// Track line numbers
|
|
212
|
+
const lines = content.split('\n');
|
|
213
|
+
while((match = codeBlockRegex.exec(content)) !== null){
|
|
214
|
+
const language = match[1] || '';
|
|
215
|
+
const blockContent = match[2];
|
|
216
|
+
// Calculate line number
|
|
217
|
+
const matchIndex = match.index;
|
|
218
|
+
const precedingContent = content.substring(0, matchIndex);
|
|
219
|
+
lineNumber = precedingContent.split('\n').length;
|
|
220
|
+
// Check language specification
|
|
221
|
+
if (!language) {
|
|
222
|
+
errors.push(`Code block at line ${lineNumber} missing language specification`);
|
|
223
|
+
} else {
|
|
224
|
+
codeBlocks.push({
|
|
225
|
+
language,
|
|
226
|
+
content: blockContent,
|
|
227
|
+
lineNumber
|
|
228
|
+
});
|
|
229
|
+
// Check if language is supported
|
|
230
|
+
if (!SUPPORTED_LANGUAGES.includes(language)) {
|
|
231
|
+
warnings.push(`Code block at line ${lineNumber} uses unsupported language "${language}"`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Check for empty code blocks
|
|
235
|
+
if (blockContent.trim().length === 0) {
|
|
236
|
+
warnings.push(`Code block at line ${lineNumber} is empty`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
valid: errors.length === 0,
|
|
241
|
+
errors,
|
|
242
|
+
warnings,
|
|
243
|
+
codeBlocks
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Validate internal links and anchors
|
|
248
|
+
*
|
|
249
|
+
* Security: All internal links are validated to prevent path traversal attacks.
|
|
250
|
+
* Paths are normalized, verified to stay within basePath, and checked for
|
|
251
|
+
* symlinks before file access.
|
|
252
|
+
*
|
|
253
|
+
* @param content - Markdown content
|
|
254
|
+
* @param basePath - Base path for resolving relative links (must be within allowed directories)
|
|
255
|
+
* @returns Link validation result
|
|
256
|
+
* @throws SkillMarkdownError if basePath is invalid
|
|
257
|
+
*/ export function validateInternalLinks(content, basePath) {
|
|
258
|
+
const errors = [];
|
|
259
|
+
const warnings = [];
|
|
260
|
+
const links = [];
|
|
261
|
+
const brokenLinks = [];
|
|
262
|
+
const externalLinks = [];
|
|
263
|
+
// Validate basePath for security
|
|
264
|
+
try {
|
|
265
|
+
// Ensure basePath is safe by resolving it
|
|
266
|
+
const normalizedBase = path.normalize(path.resolve(basePath));
|
|
267
|
+
basePath = normalizedBase;
|
|
268
|
+
} catch (error) {
|
|
269
|
+
throw new SkillMarkdownError('Invalid base path for link validation', {
|
|
270
|
+
basePath,
|
|
271
|
+
error: error instanceof Error ? error.message : String(error)
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
// Extract all markdown links
|
|
275
|
+
const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
|
|
276
|
+
let match;
|
|
277
|
+
while((match = linkRegex.exec(content)) !== null){
|
|
278
|
+
const text = match[1];
|
|
279
|
+
const href = match[2];
|
|
280
|
+
// Calculate line number
|
|
281
|
+
const precedingContent = content.substring(0, match.index);
|
|
282
|
+
const lineNumber = precedingContent.split('\n').length;
|
|
283
|
+
// Determine link type
|
|
284
|
+
let linkType;
|
|
285
|
+
if (href.startsWith('http://') || href.startsWith('https://')) {
|
|
286
|
+
linkType = 'external';
|
|
287
|
+
externalLinks.push(href);
|
|
288
|
+
} else if (href.startsWith('#')) {
|
|
289
|
+
linkType = 'anchor';
|
|
290
|
+
} else {
|
|
291
|
+
linkType = 'internal';
|
|
292
|
+
}
|
|
293
|
+
links.push({
|
|
294
|
+
text,
|
|
295
|
+
href,
|
|
296
|
+
type: linkType,
|
|
297
|
+
lineNumber
|
|
298
|
+
});
|
|
299
|
+
// Validate internal links with path traversal protection
|
|
300
|
+
if (linkType === 'internal') {
|
|
301
|
+
try {
|
|
302
|
+
// Validate path to prevent directory traversal (SECURITY: CVSS 7.5)
|
|
303
|
+
const validatedPath = getSafePath(href, basePath);
|
|
304
|
+
if (!fs.existsSync(validatedPath)) {
|
|
305
|
+
brokenLinks.push(href);
|
|
306
|
+
errors.push(`Broken internal link at line ${lineNumber}: "${href}" (file does not exist)`);
|
|
307
|
+
}
|
|
308
|
+
} catch (error) {
|
|
309
|
+
if (error instanceof PathValidationError) {
|
|
310
|
+
// Path traversal or security violation detected
|
|
311
|
+
brokenLinks.push(href);
|
|
312
|
+
errors.push(`Invalid internal link at line ${lineNumber}: "${href}" (${error.context?.reason || 'path validation failed'})`);
|
|
313
|
+
} else {
|
|
314
|
+
// Other file system errors
|
|
315
|
+
brokenLinks.push(href);
|
|
316
|
+
errors.push(`Error validating internal link at line ${lineNumber}: "${href}" (${error instanceof Error ? error.message : String(error)})`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Validate anchor links
|
|
321
|
+
if (linkType === 'anchor') {
|
|
322
|
+
const anchorName = href.substring(1); // Remove '#'
|
|
323
|
+
const sectionRegex = new RegExp(`^##\\s+${anchorName}$`, 'im');
|
|
324
|
+
// Also check slug format (lowercase, hyphens)
|
|
325
|
+
const slugRegex = new RegExp(`^##\\s+${anchorName.split('-').map((w)=>w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}$`, 'im');
|
|
326
|
+
if (!sectionRegex.test(content) && !slugRegex.test(content)) {
|
|
327
|
+
brokenLinks.push(href);
|
|
328
|
+
errors.push(`Broken anchor link at line ${lineNumber}: "${href}" (section not found)`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
valid: errors.length === 0,
|
|
334
|
+
errors,
|
|
335
|
+
warnings,
|
|
336
|
+
links,
|
|
337
|
+
brokenLinks,
|
|
338
|
+
externalLinks
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Extract sections from markdown content
|
|
343
|
+
*
|
|
344
|
+
* @param content - Markdown content
|
|
345
|
+
* @returns Map of section names to content
|
|
346
|
+
*/ export function extractSections(content) {
|
|
347
|
+
const sections = new Map();
|
|
348
|
+
const sectionRegex = /^##\s+(.+)$/gm;
|
|
349
|
+
const matches = [];
|
|
350
|
+
let match;
|
|
351
|
+
while((match = sectionRegex.exec(content)) !== null){
|
|
352
|
+
matches.push({
|
|
353
|
+
name: match[1].trim(),
|
|
354
|
+
index: match.index
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
// Extract content for each section
|
|
358
|
+
matches.forEach((current, index)=>{
|
|
359
|
+
const nextSection = matches[index + 1];
|
|
360
|
+
const endIndex = nextSection ? nextSection.index : content.length;
|
|
361
|
+
const sectionContent = content.substring(current.index, endIndex).trim();
|
|
362
|
+
sections.set(current.name, sectionContent);
|
|
363
|
+
});
|
|
364
|
+
return sections;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get validation summary for display
|
|
368
|
+
*
|
|
369
|
+
* @param result - Validation result
|
|
370
|
+
* @returns Human-readable summary
|
|
371
|
+
*/ export function getValidationSummary(result) {
|
|
372
|
+
const parts = [];
|
|
373
|
+
if (result.valid) {
|
|
374
|
+
parts.push('✓ All validations passed');
|
|
375
|
+
} else {
|
|
376
|
+
parts.push(`✗ Validation failed (${result.errors.length} errors)`);
|
|
377
|
+
}
|
|
378
|
+
if (!result.frontmatterValid) {
|
|
379
|
+
parts.push(' - Frontmatter validation failed');
|
|
380
|
+
}
|
|
381
|
+
if (!result.contentValid) {
|
|
382
|
+
parts.push(' - Content structure validation failed');
|
|
383
|
+
}
|
|
384
|
+
if (!result.codeBlocksValid) {
|
|
385
|
+
parts.push(' - Code block validation failed');
|
|
386
|
+
}
|
|
387
|
+
if (!result.linksValid) {
|
|
388
|
+
parts.push(' - Link validation failed');
|
|
389
|
+
}
|
|
390
|
+
if (result.warnings.length > 0) {
|
|
391
|
+
parts.push(` - ${result.warnings.length} warnings`);
|
|
392
|
+
}
|
|
393
|
+
return parts.join('\n');
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
//# sourceMappingURL=skill-markdown-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/skill-markdown-validator.ts"],"sourcesContent":["/**\r\n * Skill Markdown Validator\r\n *\r\n * Enforces consistent structure for all Markdown skill files with validated\r\n * frontmatter and content sections.\r\n *\r\n * @module skill-markdown-validator\r\n * @version 1.0.0\r\n */\r\n\r\nimport { parseFrontmatter, validateFrontmatter, ParsedSkillDocument } from './skill-frontmatter-parser.js';\r\nimport { StandardError } from './errors.js';\r\nimport { validatePath, getSafePath, PathValidationError } from './path-validator.js';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * Skill markdown validation error\r\n */\r\nexport class SkillMarkdownError extends StandardError {\r\n constructor(message: string, context?: Record<string, unknown>) {\r\n super('SKILL_MARKDOWN_VALIDATION_ERROR', message, context);\r\n this.name = 'SkillMarkdownError';\r\n }\r\n}\r\n\r\n/**\r\n * Required sections in skill files (in order)\r\n */\r\nexport const REQUIRED_SECTIONS = [\r\n 'Overview',\r\n 'Usage',\r\n 'Examples',\r\n 'Implementation',\r\n 'Tests',\r\n] as const;\r\n\r\n/**\r\n * Optional sections (can appear after required sections)\r\n */\r\nexport const OPTIONAL_SECTIONS = [\r\n 'API Reference',\r\n 'Configuration',\r\n 'Related Skills',\r\n 'References',\r\n 'Troubleshooting',\r\n 'Performance',\r\n 'Security',\r\n 'Quick Start',\r\n] as const;\r\n\r\n/**\r\n * Supported code block languages\r\n */\r\nexport const SUPPORTED_LANGUAGES = [\r\n 'bash',\r\n 'sh',\r\n 'typescript',\r\n 'javascript',\r\n 'json',\r\n 'yaml',\r\n 'yml',\r\n 'markdown',\r\n 'md',\r\n 'python',\r\n 'sql',\r\n 'html',\r\n 'css',\r\n 'dockerfile',\r\n 'plaintext',\r\n 'text',\r\n] as const;\r\n\r\n/**\r\n * Minimum content length per section (characters)\r\n */\r\nexport const MIN_SECTION_LENGTH = 50;\r\n\r\n/**\r\n * Content validation result\r\n */\r\nexport interface ContentValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n sections: Record<string, boolean>;\r\n missingRequiredSections: string[];\r\n sectionOrderErrors: string[];\r\n optionalSections: string[];\r\n}\r\n\r\n/**\r\n * Code block metadata\r\n */\r\nexport interface CodeBlock {\r\n language: string;\r\n content: string;\r\n lineNumber: number;\r\n}\r\n\r\n/**\r\n * Code block validation result\r\n */\r\nexport interface CodeBlockValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n codeBlocks: CodeBlock[];\r\n}\r\n\r\n/**\r\n * Link metadata\r\n */\r\nexport interface Link {\r\n text: string;\r\n href: string;\r\n type: 'internal' | 'external' | 'anchor';\r\n lineNumber: number;\r\n}\r\n\r\n/**\r\n * Link validation result\r\n */\r\nexport interface LinkValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n links: Link[];\r\n brokenLinks: string[];\r\n externalLinks: string[];\r\n}\r\n\r\n/**\r\n * Complete skill markdown validation result\r\n */\r\nexport interface SkillMarkdownValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n frontmatterValid: boolean;\r\n contentValid: boolean;\r\n codeBlocksValid: boolean;\r\n linksValid: boolean;\r\n}\r\n\r\n/**\r\n * Validate complete skill markdown file\r\n *\r\n * @param content - Raw SKILL.md content\r\n * @param basePath - Base path for link validation (optional)\r\n * @returns Validation result\r\n * @throws SkillMarkdownError if parsing fails\r\n */\r\nexport function validateSkillMarkdown(\r\n content: string,\r\n basePath?: string\r\n): SkillMarkdownValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n let frontmatterValid = false;\r\n let contentValid = false;\r\n let codeBlocksValid = false;\r\n let linksValid = false;\r\n\r\n try {\r\n // Step 1: Parse and validate frontmatter\r\n const parsed = parseFrontmatter(content);\r\n const frontmatterValidation = validateFrontmatter(parsed.frontmatter);\r\n\r\n frontmatterValid = frontmatterValidation.valid;\r\n errors.push(...frontmatterValidation.errors);\r\n warnings.push(...frontmatterValidation.warnings);\r\n\r\n // Step 2: Validate content structure\r\n const contentValidation = validateContentStructure(parsed.content);\r\n contentValid = contentValidation.valid;\r\n errors.push(...contentValidation.errors);\r\n warnings.push(...contentValidation.warnings);\r\n\r\n // Step 3: Validate code blocks\r\n const codeBlockValidation = validateCodeBlocks(parsed.content);\r\n codeBlocksValid = codeBlockValidation.valid;\r\n errors.push(...codeBlockValidation.errors);\r\n warnings.push(...codeBlockValidation.warnings);\r\n\r\n // Step 4: Validate links (if basePath provided)\r\n if (basePath) {\r\n const linkValidation = validateInternalLinks(parsed.content, basePath);\r\n linksValid = linkValidation.valid;\r\n errors.push(...linkValidation.errors);\r\n warnings.push(...linkValidation.warnings);\r\n } else {\r\n linksValid = true; // Skip link validation if no basePath\r\n }\r\n\r\n return {\r\n valid: frontmatterValid && contentValid && codeBlocksValid && linksValid,\r\n errors,\r\n warnings,\r\n frontmatterValid,\r\n contentValid,\r\n codeBlocksValid,\r\n linksValid,\r\n };\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new SkillMarkdownError(\r\n 'Failed to validate skill markdown',\r\n { originalError: error.message }\r\n );\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Validate content structure and section ordering\r\n *\r\n * @param content - Markdown content (without frontmatter)\r\n * @returns Content validation result\r\n */\r\nexport function validateContentStructure(content: string): ContentValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const sections: Record<string, boolean> = {};\r\n const missingRequiredSections: string[] = [];\r\n const sectionOrderErrors: string[] = [];\r\n const optionalSections: string[] = [];\r\n\r\n // Extract sections using regex\r\n const sectionRegex = /^##\\s+(.+)$/gm;\r\n const foundSections: Array<{ name: string; index: number; content: string }> = [];\r\n let match;\r\n\r\n while ((match = sectionRegex.exec(content)) !== null) {\r\n const sectionName = match[1].trim();\r\n const sectionIndex = match.index;\r\n\r\n // Find content up to next section or end\r\n const nextMatch = sectionRegex.exec(content);\r\n const endIndex = nextMatch ? nextMatch.index : content.length;\r\n sectionRegex.lastIndex = nextMatch ? nextMatch.index : content.length;\r\n\r\n const sectionContent = content.substring(sectionIndex, endIndex);\r\n\r\n foundSections.push({\r\n name: sectionName,\r\n index: sectionIndex,\r\n content: sectionContent,\r\n });\r\n }\r\n\r\n // Check required sections\r\n REQUIRED_SECTIONS.forEach((requiredSection) => {\r\n const found = foundSections.some((s) => s.name === requiredSection);\r\n sections[requiredSection] = found;\r\n\r\n if (!found) {\r\n missingRequiredSections.push(requiredSection);\r\n errors.push(`Required section \"${requiredSection}\" is missing`);\r\n }\r\n });\r\n\r\n // Check section order\r\n let lastRequiredIndex = -1;\r\n REQUIRED_SECTIONS.forEach((requiredSection) => {\r\n const sectionIndex = foundSections.findIndex((s) => s.name === requiredSection);\r\n\r\n if (sectionIndex !== -1) {\r\n if (sectionIndex < lastRequiredIndex) {\r\n sectionOrderErrors.push(\r\n `Section \"${requiredSection}\" appears out of order (should be after previous required sections)`\r\n );\r\n errors.push(\r\n `Section \"${requiredSection}\" is out of order. Expected order: ${REQUIRED_SECTIONS.join(', ')}`\r\n );\r\n }\r\n lastRequiredIndex = sectionIndex;\r\n }\r\n });\r\n\r\n // Identify optional sections\r\n foundSections.forEach((section) => {\r\n if (\r\n !REQUIRED_SECTIONS.includes(section.name as any) &&\r\n OPTIONAL_SECTIONS.includes(section.name as any)\r\n ) {\r\n optionalSections.push(section.name);\r\n }\r\n });\r\n\r\n // Check minimum content length per section\r\n foundSections.forEach((section) => {\r\n const contentLength = section.content.replace(/^##.+$/m, '').trim().length;\r\n\r\n if (contentLength < MIN_SECTION_LENGTH) {\r\n warnings.push(\r\n `Section \"${section.name}\" has less than minimum content length (${contentLength} < ${MIN_SECTION_LENGTH} characters)`\r\n );\r\n }\r\n });\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n sections,\r\n missingRequiredSections,\r\n sectionOrderErrors,\r\n optionalSections,\r\n };\r\n}\r\n\r\n/**\r\n * Validate code blocks and syntax highlighting\r\n *\r\n * @param content - Markdown content\r\n * @returns Code block validation result\r\n */\r\nexport function validateCodeBlocks(content: string): CodeBlockValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const codeBlocks: CodeBlock[] = [];\r\n\r\n // Extract code blocks using regex\r\n const codeBlockRegex = /```(\\w*)\\n([\\s\\S]*?)```/g;\r\n let match;\r\n let lineNumber = 1;\r\n\r\n // Track line numbers\r\n const lines = content.split('\\n');\r\n\r\n while ((match = codeBlockRegex.exec(content)) !== null) {\r\n const language = match[1] || '';\r\n const blockContent = match[2];\r\n\r\n // Calculate line number\r\n const matchIndex = match.index;\r\n const precedingContent = content.substring(0, matchIndex);\r\n lineNumber = precedingContent.split('\\n').length;\r\n\r\n // Check language specification\r\n if (!language) {\r\n errors.push(\r\n `Code block at line ${lineNumber} missing language specification`\r\n );\r\n } else {\r\n codeBlocks.push({\r\n language,\r\n content: blockContent,\r\n lineNumber,\r\n });\r\n\r\n // Check if language is supported\r\n if (!SUPPORTED_LANGUAGES.includes(language as any)) {\r\n warnings.push(\r\n `Code block at line ${lineNumber} uses unsupported language \"${language}\"`\r\n );\r\n }\r\n }\r\n\r\n // Check for empty code blocks\r\n if (blockContent.trim().length === 0) {\r\n warnings.push(`Code block at line ${lineNumber} is empty`);\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n codeBlocks,\r\n };\r\n}\r\n\r\n/**\r\n * Validate internal links and anchors\r\n *\r\n * Security: All internal links are validated to prevent path traversal attacks.\r\n * Paths are normalized, verified to stay within basePath, and checked for\r\n * symlinks before file access.\r\n *\r\n * @param content - Markdown content\r\n * @param basePath - Base path for resolving relative links (must be within allowed directories)\r\n * @returns Link validation result\r\n * @throws SkillMarkdownError if basePath is invalid\r\n */\r\nexport function validateInternalLinks(\r\n content: string,\r\n basePath: string\r\n): LinkValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const links: Link[] = [];\r\n const brokenLinks: string[] = [];\r\n const externalLinks: string[] = [];\r\n\r\n // Validate basePath for security\r\n try {\r\n // Ensure basePath is safe by resolving it\r\n const normalizedBase = path.normalize(path.resolve(basePath));\r\n basePath = normalizedBase;\r\n } catch (error) {\r\n throw new SkillMarkdownError(\r\n 'Invalid base path for link validation',\r\n { basePath, error: error instanceof Error ? error.message : String(error) }\r\n );\r\n }\r\n\r\n // Extract all markdown links\r\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\r\n let match;\r\n\r\n while ((match = linkRegex.exec(content)) !== null) {\r\n const text = match[1];\r\n const href = match[2];\r\n\r\n // Calculate line number\r\n const precedingContent = content.substring(0, match.index);\r\n const lineNumber = precedingContent.split('\\n').length;\r\n\r\n // Determine link type\r\n let linkType: 'internal' | 'external' | 'anchor';\r\n\r\n if (href.startsWith('http://') || href.startsWith('https://')) {\r\n linkType = 'external';\r\n externalLinks.push(href);\r\n } else if (href.startsWith('#')) {\r\n linkType = 'anchor';\r\n } else {\r\n linkType = 'internal';\r\n }\r\n\r\n links.push({\r\n text,\r\n href,\r\n type: linkType,\r\n lineNumber,\r\n });\r\n\r\n // Validate internal links with path traversal protection\r\n if (linkType === 'internal') {\r\n try {\r\n // Validate path to prevent directory traversal (SECURITY: CVSS 7.5)\r\n const validatedPath = getSafePath(href, basePath);\r\n\r\n if (!fs.existsSync(validatedPath)) {\r\n brokenLinks.push(href);\r\n errors.push(\r\n `Broken internal link at line ${lineNumber}: \"${href}\" (file does not exist)`\r\n );\r\n }\r\n } catch (error) {\r\n if (error instanceof PathValidationError) {\r\n // Path traversal or security violation detected\r\n brokenLinks.push(href);\r\n errors.push(\r\n `Invalid internal link at line ${lineNumber}: \"${href}\" (${error.context?.reason || 'path validation failed'})`\r\n );\r\n } else {\r\n // Other file system errors\r\n brokenLinks.push(href);\r\n errors.push(\r\n `Error validating internal link at line ${lineNumber}: \"${href}\" (${error instanceof Error ? error.message : String(error)})`\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Validate anchor links\r\n if (linkType === 'anchor') {\r\n const anchorName = href.substring(1); // Remove '#'\r\n const sectionRegex = new RegExp(`^##\\\\s+${anchorName}$`, 'im');\r\n\r\n // Also check slug format (lowercase, hyphens)\r\n const slugRegex = new RegExp(\r\n `^##\\\\s+${anchorName.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}$`,\r\n 'im'\r\n );\r\n\r\n if (!sectionRegex.test(content) && !slugRegex.test(content)) {\r\n brokenLinks.push(href);\r\n errors.push(\r\n `Broken anchor link at line ${lineNumber}: \"${href}\" (section not found)`\r\n );\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n links,\r\n brokenLinks,\r\n externalLinks,\r\n };\r\n}\r\n\r\n/**\r\n * Extract sections from markdown content\r\n *\r\n * @param content - Markdown content\r\n * @returns Map of section names to content\r\n */\r\nexport function extractSections(content: string): Map<string, string> {\r\n const sections = new Map<string, string>();\r\n const sectionRegex = /^##\\s+(.+)$/gm;\r\n const matches: Array<{ name: string; index: number }> = [];\r\n\r\n let match;\r\n while ((match = sectionRegex.exec(content)) !== null) {\r\n matches.push({\r\n name: match[1].trim(),\r\n index: match.index,\r\n });\r\n }\r\n\r\n // Extract content for each section\r\n matches.forEach((current, index) => {\r\n const nextSection = matches[index + 1];\r\n const endIndex = nextSection ? nextSection.index : content.length;\r\n const sectionContent = content.substring(current.index, endIndex).trim();\r\n\r\n sections.set(current.name, sectionContent);\r\n });\r\n\r\n return sections;\r\n}\r\n\r\n/**\r\n * Get validation summary for display\r\n *\r\n * @param result - Validation result\r\n * @returns Human-readable summary\r\n */\r\nexport function getValidationSummary(result: SkillMarkdownValidationResult): string {\r\n const parts: string[] = [];\r\n\r\n if (result.valid) {\r\n parts.push('✓ All validations passed');\r\n } else {\r\n parts.push(`✗ Validation failed (${result.errors.length} errors)`);\r\n }\r\n\r\n if (!result.frontmatterValid) {\r\n parts.push(' - Frontmatter validation failed');\r\n }\r\n\r\n if (!result.contentValid) {\r\n parts.push(' - Content structure validation failed');\r\n }\r\n\r\n if (!result.codeBlocksValid) {\r\n parts.push(' - Code block validation failed');\r\n }\r\n\r\n if (!result.linksValid) {\r\n parts.push(' - Link validation failed');\r\n }\r\n\r\n if (result.warnings.length > 0) {\r\n parts.push(` - ${result.warnings.length} warnings`);\r\n }\r\n\r\n return parts.join('\\n');\r\n}\r\n"],"names":["parseFrontmatter","validateFrontmatter","StandardError","getSafePath","PathValidationError","fs","path","SkillMarkdownError","message","context","name","REQUIRED_SECTIONS","OPTIONAL_SECTIONS","SUPPORTED_LANGUAGES","MIN_SECTION_LENGTH","validateSkillMarkdown","content","basePath","errors","warnings","frontmatterValid","contentValid","codeBlocksValid","linksValid","parsed","frontmatterValidation","frontmatter","valid","push","contentValidation","validateContentStructure","codeBlockValidation","validateCodeBlocks","linkValidation","validateInternalLinks","error","Error","originalError","sections","missingRequiredSections","sectionOrderErrors","optionalSections","sectionRegex","foundSections","match","exec","sectionName","trim","sectionIndex","index","nextMatch","endIndex","length","lastIndex","sectionContent","substring","forEach","requiredSection","found","some","s","lastRequiredIndex","findIndex","join","section","includes","contentLength","replace","codeBlocks","codeBlockRegex","lineNumber","lines","split","language","blockContent","matchIndex","precedingContent","links","brokenLinks","externalLinks","normalizedBase","normalize","resolve","String","linkRegex","text","href","linkType","startsWith","type","validatedPath","existsSync","reason","anchorName","RegExp","slugRegex","map","w","charAt","toUpperCase","slice","test","extractSections","Map","matches","current","nextSection","set","getValidationSummary","result","parts"],"mappings":"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"}
|