claude-flow-novice 2.15.3 → 2.15.5

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