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.
Files changed (533) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
  36. package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
  37. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  38. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  39. package/.claude/hooks/cfn-post-edit.config.json +44 -44
  40. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  42. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  43. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  44. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  45. package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  46. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  47. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  48. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  49. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  50. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  51. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  52. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  53. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  54. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  55. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  56. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  57. package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
  58. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  59. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  60. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  61. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  62. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  63. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  64. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  65. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  66. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  67. package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  68. package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  69. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  70. package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  71. package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  72. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  73. package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  74. package/README.md +116 -475
  75. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  76. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  77. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  78. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  79. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  80. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  81. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  82. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  83. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  84. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  85. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  86. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  87. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  88. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  89. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  90. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  91. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  92. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  93. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  94. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  95. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  96. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  97. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  98. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  99. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  100. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  101. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  102. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  103. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  104. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  105. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  106. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  107. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  108. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  109. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  110. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  111. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  112. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  113. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  114. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  115. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  116. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  117. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  118. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  119. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  120. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  121. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  122. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  123. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  124. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  125. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  126. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  127. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  128. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  129. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  130. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  131. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  147. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  148. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  149. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  150. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  151. package/claude-assets/commands/switch-api.md +31 -10
  152. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
  153. package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
  154. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  155. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  156. package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
  157. package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
  158. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  159. package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
  160. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  161. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  162. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
  163. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
  164. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  165. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  166. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  167. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  168. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  169. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  170. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  171. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  172. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  173. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  174. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  175. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
  176. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
  177. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  178. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
  179. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  180. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  181. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  182. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  183. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  184. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  185. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  186. package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
  187. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  188. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  189. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  190. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  191. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  192. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  193. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
  194. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
  195. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  196. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  197. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  198. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  199. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  200. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  201. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  202. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  203. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  204. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  205. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  206. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
  207. package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
  208. package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
  209. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
  210. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  211. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  212. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  213. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
  214. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  215. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  216. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  217. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  218. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  219. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  220. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  221. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
  222. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  223. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  224. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  225. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  226. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  227. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  228. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  229. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  230. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
  231. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  232. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  233. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
  234. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  235. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
  236. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
  237. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  238. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  239. package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
  240. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
  241. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  242. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  243. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  244. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  245. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  246. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  247. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  248. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  249. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  250. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  251. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  252. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  253. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  254. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  255. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  256. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  257. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  258. package/claude-assets/skills/docker-build/SKILL.md +96 -203
  259. package/claude-assets/skills/docker-build/build.sh +73 -73
  260. package/claude-assets/skills/integration/agent-handoff.sh +492 -0
  261. package/claude-assets/skills/integration/file-operations.sh +414 -0
  262. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  263. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  264. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  265. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  266. package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
  267. package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
  268. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  269. package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
  270. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  271. package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
  272. package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
  273. package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
  274. package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
  275. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  276. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  277. package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
  278. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  279. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  280. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  281. package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
  282. package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
  283. package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
  284. package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
  285. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  286. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
  287. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  288. package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
  289. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  290. package/dist/ace/ace-curator.js +10 -2
  291. package/dist/ace/ace-curator.js.map +1 -1
  292. package/dist/ace/ace-generator.js +4 -0
  293. package/dist/ace/ace-generator.js.map +1 -1
  294. package/dist/ace/ace-reflector.js +1 -1
  295. package/dist/ace/ace-reflector.js.map +1 -1
  296. package/dist/ace/context-injection.js +24 -2
  297. package/dist/ace/context-injection.js.map +1 -1
  298. package/dist/agents/agent-loader.js +146 -165
  299. package/dist/agents/agent-loader.js.map +1 -1
  300. package/dist/agents/task-agent-integration.js +1 -1
  301. package/dist/agents/task-agent-integration.js.map +1 -1
  302. package/dist/api/health-endpoints.js +390 -0
  303. package/dist/api/health-endpoints.js.map +1 -0
  304. package/dist/cli/agent-executor.js +4 -1
  305. package/dist/cli/agent-executor.js.map +1 -1
  306. package/dist/cli/agent-prompt-builder.js +89 -1
  307. package/dist/cli/agent-prompt-builder.js.map +1 -1
  308. package/dist/cli/agent-spawn.js +130 -37
  309. package/dist/cli/agent-spawn.js.map +1 -1
  310. package/dist/cli/config-manager.js +91 -109
  311. package/dist/cli/config-manager.js.map +1 -1
  312. package/dist/cli/skill-cache-validator.js +412 -0
  313. package/dist/cli/skill-cache-validator.js.map +1 -0
  314. package/dist/cli/skill-cli.js +991 -0
  315. package/dist/cli/skill-cli.js.map +1 -0
  316. package/dist/cli/skill-execution-logger.js +284 -0
  317. package/dist/cli/skill-execution-logger.js.map +1 -0
  318. package/dist/cli/skill-loader.js +457 -0
  319. package/dist/cli/skill-loader.js.map +1 -0
  320. package/dist/coordination/event-bus.js +2 -2
  321. package/dist/coordination/event-bus.js.map +1 -1
  322. package/dist/coordination/fleet-manager.js +1 -1
  323. package/dist/coordination/fleet-manager.js.map +1 -1
  324. package/dist/coordination/index.js +23 -9
  325. package/dist/coordination/index.js.map +1 -1
  326. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  327. package/dist/db/migration-manager.js +483 -0
  328. package/dist/db/migration-manager.js.map +1 -0
  329. package/dist/db/skills-query.js +535 -0
  330. package/dist/db/skills-query.js.map +1 -0
  331. package/dist/integration/DatabaseHandoff.js +507 -0
  332. package/dist/integration/DatabaseHandoff.js.map +1 -0
  333. package/dist/integration/StandardAdapter.js +291 -0
  334. package/dist/integration/StandardAdapter.js.map +1 -0
  335. package/dist/jobs/edge-case-analyzer.js +367 -0
  336. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  337. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  338. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  339. package/dist/lib/agent-output-parser.js +518 -0
  340. package/dist/lib/agent-output-parser.js.map +1 -0
  341. package/dist/lib/agent-output-validator.js +950 -0
  342. package/dist/lib/agent-output-validator.js.map +1 -0
  343. package/dist/lib/agent-workspace.js +281 -0
  344. package/dist/lib/agent-workspace.js.map +1 -0
  345. package/dist/lib/artifact-registry.js +443 -0
  346. package/dist/lib/artifact-registry.js.map +1 -0
  347. package/dist/lib/atomic-file-writer.js +377 -0
  348. package/dist/lib/atomic-file-writer.js.map +1 -0
  349. package/dist/lib/backup-manager.js +779 -0
  350. package/dist/lib/backup-manager.js.map +1 -0
  351. package/dist/lib/checkpoint-manager.js +837 -0
  352. package/dist/lib/checkpoint-manager.js.map +1 -0
  353. package/dist/lib/circuit-breaker.js +340 -0
  354. package/dist/lib/circuit-breaker.js.map +1 -0
  355. package/dist/lib/completion-signal-handler.js +243 -0
  356. package/dist/lib/completion-signal-handler.js.map +1 -0
  357. package/dist/lib/config-manager.js +312 -0
  358. package/dist/lib/config-manager.js.map +1 -0
  359. package/dist/lib/config-migrator.js +386 -0
  360. package/dist/lib/config-migrator.js.map +1 -0
  361. package/dist/lib/config-validator.js +687 -0
  362. package/dist/lib/config-validator.js.map +1 -0
  363. package/dist/lib/correlation-cache.js +311 -0
  364. package/dist/lib/correlation-cache.js.map +1 -0
  365. package/dist/lib/correlation.js +263 -0
  366. package/dist/lib/correlation.js.map +1 -0
  367. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  368. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  369. package/dist/lib/database-service/correlation.js +329 -0
  370. package/dist/lib/database-service/correlation.js.map +1 -0
  371. package/dist/lib/database-service/errors.js +120 -0
  372. package/dist/lib/database-service/errors.js.map +1 -0
  373. package/dist/lib/database-service/index.js +168 -0
  374. package/dist/lib/database-service/index.js.map +1 -0
  375. package/dist/lib/database-service/postgres-adapter.js +526 -0
  376. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  377. package/dist/lib/database-service/redis-adapter.js +360 -0
  378. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  379. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  380. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  381. package/dist/lib/database-service/transaction-manager.js +773 -0
  382. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  383. package/dist/lib/database-service/types.js +23 -0
  384. package/dist/lib/database-service/types.js.map +1 -0
  385. package/dist/lib/deadlock-resolver.js +292 -0
  386. package/dist/lib/deadlock-resolver.js.map +1 -0
  387. package/dist/lib/distributed-lock.js +451 -0
  388. package/dist/lib/distributed-lock.js.map +1 -0
  389. package/dist/lib/edge-case-deduplicator.js +227 -0
  390. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  391. package/dist/lib/encryption-manager.js +322 -0
  392. package/dist/lib/encryption-manager.js.map +1 -0
  393. package/dist/lib/error-aggregator.js +234 -0
  394. package/dist/lib/error-aggregator.js.map +1 -0
  395. package/dist/lib/errors.js +287 -0
  396. package/dist/lib/errors.js.map +1 -0
  397. package/dist/lib/file-lock-manager.js +578 -0
  398. package/dist/lib/file-lock-manager.js.map +1 -0
  399. package/dist/lib/file-operations.js +367 -0
  400. package/dist/lib/file-operations.js.map +1 -0
  401. package/dist/lib/idempotent-write.js +237 -0
  402. package/dist/lib/idempotent-write.js.map +1 -0
  403. package/dist/lib/integration-schema-validator.js +522 -0
  404. package/dist/lib/integration-schema-validator.js.map +1 -0
  405. package/dist/lib/lock-health-monitor.js +298 -0
  406. package/dist/lib/lock-health-monitor.js.map +1 -0
  407. package/dist/lib/log-shipper.js +422 -0
  408. package/dist/lib/log-shipper.js.map +1 -0
  409. package/dist/lib/logging.js +146 -0
  410. package/dist/lib/logging.js.map +1 -0
  411. package/dist/lib/message-deduplicator.js +439 -0
  412. package/dist/lib/message-deduplicator.js.map +1 -0
  413. package/dist/lib/multi-system-query.js +604 -0
  414. package/dist/lib/multi-system-query.js.map +1 -0
  415. package/dist/lib/orphan-detector.js +332 -0
  416. package/dist/lib/orphan-detector.js.map +1 -0
  417. package/dist/lib/password-generator.js +166 -0
  418. package/dist/lib/password-generator.js.map +1 -0
  419. package/dist/lib/path-validator.js +429 -0
  420. package/dist/lib/path-validator.js.map +1 -0
  421. package/dist/lib/query-translator.js +905 -0
  422. package/dist/lib/query-translator.js.map +1 -0
  423. package/dist/lib/queue-recovery.js +469 -0
  424. package/dist/lib/queue-recovery.js.map +1 -0
  425. package/dist/lib/redis-queue-manager.js +512 -0
  426. package/dist/lib/redis-queue-manager.js.map +1 -0
  427. package/dist/lib/reflection-archiver.js +272 -0
  428. package/dist/lib/reflection-archiver.js.map +1 -0
  429. package/dist/lib/retry-manager.js +453 -0
  430. package/dist/lib/retry-manager.js.map +1 -0
  431. package/dist/lib/retry.js +262 -0
  432. package/dist/lib/retry.js.map +1 -0
  433. package/dist/lib/schema-transform.js +695 -0
  434. package/dist/lib/schema-transform.js.map +1 -0
  435. package/dist/lib/schema-validator.js +491 -0
  436. package/dist/lib/schema-validator.js.map +1 -0
  437. package/dist/lib/skill-cache.js +297 -0
  438. package/dist/lib/skill-cache.js.map +1 -0
  439. package/dist/lib/skill-content-manager.js +337 -0
  440. package/dist/lib/skill-content-manager.js.map +1 -0
  441. package/dist/lib/skill-frontmatter-parser.js +237 -0
  442. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  443. package/dist/lib/skill-git-integration.js +275 -0
  444. package/dist/lib/skill-git-integration.js.map +1 -0
  445. package/dist/lib/skill-markdown-validator.js +396 -0
  446. package/dist/lib/skill-markdown-validator.js.map +1 -0
  447. package/dist/lib/skill-output-parser.js +312 -0
  448. package/dist/lib/skill-output-parser.js.map +1 -0
  449. package/dist/lib/unified-query-api.js +467 -0
  450. package/dist/lib/unified-query-api.js.map +1 -0
  451. package/dist/middleware/auth-middleware.js +350 -0
  452. package/dist/middleware/auth-middleware.js.map +1 -0
  453. package/dist/middleware/schema-validation.js +347 -0
  454. package/dist/middleware/schema-validation.js.map +1 -0
  455. package/dist/providers/anthropic-provider.js +1 -1
  456. package/dist/providers/anthropic-provider.js.map +1 -1
  457. package/dist/providers/provider-factory.js +2 -2
  458. package/dist/providers/provider-factory.js.map +1 -1
  459. package/dist/services/edge-case-analyzer.js +321 -0
  460. package/dist/services/edge-case-analyzer.js.map +1 -0
  461. package/dist/services/edge-case-deduplicator.js +266 -0
  462. package/dist/services/edge-case-deduplicator.js.map +1 -0
  463. package/dist/services/edge-case-detector.js +337 -0
  464. package/dist/services/edge-case-detector.js.map +1 -0
  465. package/dist/services/edge-case-tracker.js +547 -0
  466. package/dist/services/edge-case-tracker.js.map +1 -0
  467. package/dist/services/health-check-system.js +586 -0
  468. package/dist/services/health-check-system.js.map +1 -0
  469. package/dist/services/metrics-logger.js +412 -0
  470. package/dist/services/metrics-logger.js.map +1 -0
  471. package/dist/services/patch-generator.js +378 -0
  472. package/dist/services/patch-generator.js.map +1 -0
  473. package/dist/services/patch-validator.js +337 -0
  474. package/dist/services/patch-validator.js.map +1 -0
  475. package/dist/services/performance-monitor.js +811 -0
  476. package/dist/services/performance-monitor.js.map +1 -0
  477. package/dist/services/promotion-pipeline.js +918 -0
  478. package/dist/services/promotion-pipeline.js.map +1 -0
  479. package/dist/services/promotion-validator.js +394 -0
  480. package/dist/services/promotion-validator.js.map +1 -0
  481. package/dist/services/reflection-logger.js +388 -0
  482. package/dist/services/reflection-logger.js.map +1 -0
  483. package/dist/services/skill-deployment.js +472 -0
  484. package/dist/services/skill-deployment.js.map +1 -0
  485. package/dist/services/skill-loader.js +427 -0
  486. package/dist/services/skill-loader.js.map +1 -0
  487. package/dist/services/skill-promotion.js +372 -0
  488. package/dist/services/skill-promotion.js.map +1 -0
  489. package/dist/services/skill-validator.js +454 -0
  490. package/dist/services/skill-validator.js.map +1 -0
  491. package/dist/services/skill-versioning.js +244 -0
  492. package/dist/services/skill-versioning.js.map +1 -0
  493. package/dist/services/workspace-supervisor.js +597 -0
  494. package/dist/services/workspace-supervisor.js.map +1 -0
  495. package/dist/types/agent-output.js +44 -0
  496. package/dist/types/agent-output.js.map +1 -0
  497. package/dist/types/config.js +28 -0
  498. package/dist/types/config.js.map +1 -0
  499. package/dist/types/edge-case.js +45 -0
  500. package/dist/types/edge-case.js.map +1 -0
  501. package/package.json +201 -176
  502. package/readme/README.md +19 -4
  503. package/scripts/artifact-cleanup.sh +392 -0
  504. package/scripts/backup-cleanup.sh +627 -0
  505. package/scripts/cleanup-workspaces.sh +412 -0
  506. package/scripts/cleanup-yaml-configs.sh +141 -0
  507. package/scripts/deploy-approved-skills.sh +263 -0
  508. package/scripts/deploy-production.sh +355 -355
  509. package/scripts/docker-playwright-fix.sh +311 -311
  510. package/scripts/docker-rebuild-all-agents.sh +127 -127
  511. package/scripts/health-check.sh +447 -0
  512. package/scripts/log-aggregator.sh +554 -0
  513. package/scripts/log-monitor.sh +629 -0
  514. package/scripts/manage-agent-workspaces.sh +434 -0
  515. package/scripts/memory-leak-prevention.sh +305 -305
  516. package/scripts/migrate-artifacts.sh +563 -0
  517. package/scripts/migrate-schema.sh +533 -0
  518. package/scripts/migrate-yaml-to-json.sh +465 -0
  519. package/scripts/promote-staged-skills.sh +423 -0
  520. package/scripts/run-marketing-tests.sh +42 -42
  521. package/scripts/update_paths.sh +46 -46
  522. package/scripts/verify-no-secrets.sh +88 -35
  523. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  524. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  525. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  526. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  527. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  528. package/README.md.backup_before_replace +0 -781
  529. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  530. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  531. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  532. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  533. 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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"}