@zigrivers/scaffold 3.28.0 → 3.29.0

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 (669) hide show
  1. package/README.md +5 -1
  2. package/content/guides/.gitkeep +0 -0
  3. package/content/guides/index.html +1188 -0
  4. package/content/guides/mmr/.diagrams/diagram-0.svg +1 -0
  5. package/content/guides/mmr/.diagrams/manifest.json +3 -0
  6. package/content/guides/mmr/index.html +1728 -0
  7. package/content/guides/mmr/index.md +403 -0
  8. package/content/knowledge/VERSION +1 -0
  9. package/content/knowledge/backend/backend-api-design.md +8 -0
  10. package/content/knowledge/backend/backend-architecture.md +8 -0
  11. package/content/knowledge/backend/backend-async-patterns.md +7 -0
  12. package/content/knowledge/backend/backend-auth-patterns.md +9 -0
  13. package/content/knowledge/backend/backend-conventions.md +6 -0
  14. package/content/knowledge/backend/backend-data-modeling.md +7 -0
  15. package/content/knowledge/backend/backend-deployment.md +8 -0
  16. package/content/knowledge/backend/backend-dev-environment.md +5 -0
  17. package/content/knowledge/backend/backend-fintech-broker-integration.md +6 -0
  18. package/content/knowledge/backend/backend-fintech-compliance.md +10 -2
  19. package/content/knowledge/backend/backend-fintech-data-modeling.md +6 -0
  20. package/content/knowledge/backend/backend-fintech-ledger.md +6 -0
  21. package/content/knowledge/backend/backend-fintech-observability.md +6 -0
  22. package/content/knowledge/backend/backend-fintech-order-lifecycle.md +6 -0
  23. package/content/knowledge/backend/backend-fintech-risk-management.md +6 -0
  24. package/content/knowledge/backend/backend-fintech-testing.md +6 -0
  25. package/content/knowledge/backend/backend-observability.md +7 -0
  26. package/content/knowledge/backend/backend-project-structure.md +6 -0
  27. package/content/knowledge/backend/backend-requirements.md +6 -0
  28. package/content/knowledge/backend/backend-security.md +7 -0
  29. package/content/knowledge/backend/backend-testing.md +7 -0
  30. package/content/knowledge/backend/backend-worker-patterns.md +6 -0
  31. package/content/knowledge/browser-extension/browser-extension-architecture.md +6 -0
  32. package/content/knowledge/browser-extension/browser-extension-content-scripts.md +6 -0
  33. package/content/knowledge/browser-extension/browser-extension-conventions.md +6 -0
  34. package/content/knowledge/browser-extension/browser-extension-cross-browser.md +6 -0
  35. package/content/knowledge/browser-extension/browser-extension-dev-environment.md +6 -0
  36. package/content/knowledge/browser-extension/browser-extension-manifest.md +6 -0
  37. package/content/knowledge/browser-extension/browser-extension-project-structure.md +6 -0
  38. package/content/knowledge/browser-extension/browser-extension-requirements.md +6 -0
  39. package/content/knowledge/browser-extension/browser-extension-security.md +7 -0
  40. package/content/knowledge/browser-extension/browser-extension-service-workers.md +6 -0
  41. package/content/knowledge/browser-extension/browser-extension-store-submission.md +6 -0
  42. package/content/knowledge/browser-extension/browser-extension-testing.md +6 -0
  43. package/content/knowledge/cli/cli-architecture.md +4 -0
  44. package/content/knowledge/cli/cli-conventions.md +4 -0
  45. package/content/knowledge/cli/cli-dev-environment.md +5 -0
  46. package/content/knowledge/cli/cli-distribution-patterns.md +5 -0
  47. package/content/knowledge/cli/cli-interactivity-patterns.md +4 -0
  48. package/content/knowledge/cli/cli-output-patterns.md +4 -0
  49. package/content/knowledge/cli/cli-project-structure.md +4 -0
  50. package/content/knowledge/cli/cli-requirements.md +4 -0
  51. package/content/knowledge/cli/cli-shell-integration.md +4 -0
  52. package/content/knowledge/cli/cli-testing.md +4 -0
  53. package/content/knowledge/core/adr-craft.md +8 -0
  54. package/content/knowledge/core/ai-memory-management.md +6 -0
  55. package/content/knowledge/core/api-design.md +6 -0
  56. package/content/knowledge/core/automated-review-tooling.md +8 -0
  57. package/content/knowledge/core/claude-md-patterns.md +8 -0
  58. package/content/knowledge/core/coding-conventions.md +8 -0
  59. package/content/knowledge/core/database-design.md +8 -0
  60. package/content/knowledge/core/design-system-tokens.md +8 -0
  61. package/content/knowledge/core/dev-environment.md +4 -0
  62. package/content/knowledge/core/domain-modeling.md +6 -0
  63. package/content/knowledge/core/eval-craft.md +6 -0
  64. package/content/knowledge/core/git-workflow-patterns.md +8 -0
  65. package/content/knowledge/core/multi-model-research-dispatch.md +6 -0
  66. package/content/knowledge/core/multi-model-review-dispatch.md +6 -0
  67. package/content/knowledge/core/multi-service-api-contracts.md +5 -0
  68. package/content/knowledge/core/multi-service-architecture.md +5 -0
  69. package/content/knowledge/core/multi-service-auth.md +6 -0
  70. package/content/knowledge/core/multi-service-data-ownership.md +8 -0
  71. package/content/knowledge/core/multi-service-observability.md +8 -0
  72. package/content/knowledge/core/multi-service-resilience.md +5 -0
  73. package/content/knowledge/core/multi-service-task-decomposition.md +8 -0
  74. package/content/knowledge/core/multi-service-testing.md +5 -0
  75. package/content/knowledge/core/operations-runbook.md +8 -0
  76. package/content/knowledge/core/project-structure-patterns.md +4 -0
  77. package/content/knowledge/core/review-step-template.md +4 -0
  78. package/content/knowledge/core/security-best-practices.md +6 -0
  79. package/content/knowledge/core/system-architecture.md +6 -0
  80. package/content/knowledge/core/task-decomposition.md +5 -0
  81. package/content/knowledge/core/task-tracking.md +8 -0
  82. package/content/knowledge/core/tech-stack-selection.md +8 -0
  83. package/content/knowledge/core/test-skeleton-generation.md +4 -0
  84. package/content/knowledge/core/testing-strategy.md +8 -0
  85. package/content/knowledge/core/user-stories.md +8 -0
  86. package/content/knowledge/core/user-story-innovation.md +4 -0
  87. package/content/knowledge/core/ux-specification.md +5 -0
  88. package/content/knowledge/data-pipeline/data-pipeline-architecture.md +5 -0
  89. package/content/knowledge/data-pipeline/data-pipeline-batch-patterns.md +4 -0
  90. package/content/knowledge/data-pipeline/data-pipeline-conventions.md +4 -0
  91. package/content/knowledge/data-pipeline/data-pipeline-dev-environment.md +4 -0
  92. package/content/knowledge/data-pipeline/data-pipeline-orchestration.md +4 -0
  93. package/content/knowledge/data-pipeline/data-pipeline-project-structure.md +4 -0
  94. package/content/knowledge/data-pipeline/data-pipeline-quality.md +4 -0
  95. package/content/knowledge/data-pipeline/data-pipeline-requirements.md +4 -0
  96. package/content/knowledge/data-pipeline/data-pipeline-schema-management.md +4 -0
  97. package/content/knowledge/data-pipeline/data-pipeline-security.md +4 -0
  98. package/content/knowledge/data-pipeline/data-pipeline-streaming-patterns.md +4 -0
  99. package/content/knowledge/data-pipeline/data-pipeline-testing.md +4 -0
  100. package/content/knowledge/data-science/data-science-architecture.md +5 -0
  101. package/content/knowledge/data-science/data-science-conventions.md +6 -0
  102. package/content/knowledge/data-science/data-science-data-versioning.md +6 -0
  103. package/content/knowledge/data-science/data-science-dev-environment.md +6 -0
  104. package/content/knowledge/data-science/data-science-experiment-tracking.md +8 -0
  105. package/content/knowledge/data-science/data-science-model-evaluation.md +5 -0
  106. package/content/knowledge/data-science/data-science-notebook-discipline.md +5 -0
  107. package/content/knowledge/data-science/data-science-observability.md +6 -0
  108. package/content/knowledge/data-science/data-science-project-structure.md +5 -0
  109. package/content/knowledge/data-science/data-science-reproducibility.md +8 -0
  110. package/content/knowledge/data-science/data-science-requirements.md +5 -0
  111. package/content/knowledge/data-science/data-science-security.md +8 -0
  112. package/content/knowledge/data-science/data-science-testing.md +5 -0
  113. package/content/knowledge/execution/enhancement-workflow.md +4 -0
  114. package/content/knowledge/execution/multi-agent-coordination.md +12 -1
  115. package/content/knowledge/execution/task-claiming-strategy.md +4 -0
  116. package/content/knowledge/execution/tdd-execution-loop.md +5 -0
  117. package/content/knowledge/execution/worktree-management.md +5 -0
  118. package/content/knowledge/finalization/apply-fixes-and-freeze.md +4 -0
  119. package/content/knowledge/finalization/developer-onboarding.md +4 -0
  120. package/content/knowledge/finalization/implementation-playbook.md +4 -0
  121. package/content/knowledge/game/game-accessibility.md +4 -0
  122. package/content/knowledge/game/game-ai-patterns.md +4 -0
  123. package/content/knowledge/game/game-asset-pipeline.md +4 -0
  124. package/content/knowledge/game/game-audio-design.md +4 -0
  125. package/content/knowledge/game/game-binary-vcs-strategy.md +5 -0
  126. package/content/knowledge/game/game-design-document.md +4 -0
  127. package/content/knowledge/game/game-domain-patterns.md +4 -0
  128. package/content/knowledge/game/game-economy-design.md +4 -0
  129. package/content/knowledge/game/game-engine-selection.md +4 -0
  130. package/content/knowledge/game/game-ideation.md +4 -0
  131. package/content/knowledge/game/game-input-systems.md +4 -0
  132. package/content/knowledge/game/game-level-content-design.md +4 -0
  133. package/content/knowledge/game/game-liveops-analytics.md +4 -0
  134. package/content/knowledge/game/game-localization.md +4 -0
  135. package/content/knowledge/game/game-milestone-definitions.md +4 -0
  136. package/content/knowledge/game/game-modding-ugc.md +4 -0
  137. package/content/knowledge/game/game-narrative-design.md +4 -0
  138. package/content/knowledge/game/game-networking.md +4 -0
  139. package/content/knowledge/game/game-performance-budgeting.md +4 -0
  140. package/content/knowledge/game/game-platform-certification.md +6 -0
  141. package/content/knowledge/game/game-project-structure.md +4 -0
  142. package/content/knowledge/game/game-save-systems.md +4 -0
  143. package/content/knowledge/game/game-testing-strategy.md +4 -0
  144. package/content/knowledge/game/game-ui-patterns.md +4 -0
  145. package/content/knowledge/game/game-vr-ar-design.md +6 -0
  146. package/content/knowledge/library/library-api-design.md +4 -0
  147. package/content/knowledge/library/library-architecture.md +4 -0
  148. package/content/knowledge/library/library-bundling.md +4 -0
  149. package/content/knowledge/library/library-conventions.md +5 -0
  150. package/content/knowledge/library/library-dev-environment.md +4 -0
  151. package/content/knowledge/library/library-documentation.md +4 -0
  152. package/content/knowledge/library/library-project-structure.md +4 -0
  153. package/content/knowledge/library/library-requirements.md +4 -0
  154. package/content/knowledge/library/library-security.md +4 -0
  155. package/content/knowledge/library/library-testing.md +4 -0
  156. package/content/knowledge/library/library-type-definitions.md +4 -0
  157. package/content/knowledge/library/library-versioning.md +5 -0
  158. package/content/knowledge/ml/ml-architecture.md +4 -0
  159. package/content/knowledge/ml/ml-conventions.md +4 -0
  160. package/content/knowledge/ml/ml-dev-environment.md +4 -0
  161. package/content/knowledge/ml/ml-experiment-tracking.md +6 -0
  162. package/content/knowledge/ml/ml-model-evaluation.md +4 -0
  163. package/content/knowledge/ml/ml-observability.md +5 -0
  164. package/content/knowledge/ml/ml-project-structure.md +4 -0
  165. package/content/knowledge/ml/ml-requirements.md +4 -0
  166. package/content/knowledge/ml/ml-security.md +5 -0
  167. package/content/knowledge/ml/ml-serving-patterns.md +4 -0
  168. package/content/knowledge/ml/ml-testing.md +4 -0
  169. package/content/knowledge/ml/ml-training-patterns.md +4 -0
  170. package/content/knowledge/mobile-app/mobile-app-architecture.md +6 -0
  171. package/content/knowledge/mobile-app/mobile-app-conventions.md +6 -0
  172. package/content/knowledge/mobile-app/mobile-app-deployment.md +6 -0
  173. package/content/knowledge/mobile-app/mobile-app-dev-environment.md +6 -0
  174. package/content/knowledge/mobile-app/mobile-app-distribution.md +6 -0
  175. package/content/knowledge/mobile-app/mobile-app-observability.md +7 -0
  176. package/content/knowledge/mobile-app/mobile-app-offline-patterns.md +7 -0
  177. package/content/knowledge/mobile-app/mobile-app-project-structure.md +6 -0
  178. package/content/knowledge/mobile-app/mobile-app-push-notifications.md +6 -0
  179. package/content/knowledge/mobile-app/mobile-app-requirements.md +7 -0
  180. package/content/knowledge/mobile-app/mobile-app-security.md +8 -0
  181. package/content/knowledge/mobile-app/mobile-app-testing.md +6 -0
  182. package/content/knowledge/product/gap-analysis.md +4 -0
  183. package/content/knowledge/product/ideation-craft.md +4 -0
  184. package/content/knowledge/product/prd-craft.md +4 -0
  185. package/content/knowledge/product/prd-innovation.md +4 -0
  186. package/content/knowledge/product/vision-craft.md +4 -0
  187. package/content/knowledge/product/vision-innovation.md +4 -0
  188. package/content/knowledge/research/research-architecture.md +4 -0
  189. package/content/knowledge/research/research-conventions.md +6 -0
  190. package/content/knowledge/research/research-dev-environment.md +6 -0
  191. package/content/knowledge/research/research-experiment-loop.md +4 -0
  192. package/content/knowledge/research/research-experiment-tracking.md +6 -0
  193. package/content/knowledge/research/research-ml-architecture-search.md +4 -0
  194. package/content/knowledge/research/research-ml-evaluation.md +4 -0
  195. package/content/knowledge/research/research-ml-experiment-tracking.md +6 -0
  196. package/content/knowledge/research/research-ml-training-patterns.md +4 -0
  197. package/content/knowledge/research/research-observability.md +5 -0
  198. package/content/knowledge/research/research-overfitting-prevention.md +5 -0
  199. package/content/knowledge/research/research-project-structure.md +5 -0
  200. package/content/knowledge/research/research-quant-backtesting.md +4 -0
  201. package/content/knowledge/research/research-quant-market-data.md +4 -0
  202. package/content/knowledge/research/research-quant-metrics.md +4 -0
  203. package/content/knowledge/research/research-quant-requirements.md +4 -0
  204. package/content/knowledge/research/research-quant-risk.md +4 -0
  205. package/content/knowledge/research/research-quant-strategy-patterns.md +4 -0
  206. package/content/knowledge/research/research-requirements.md +5 -0
  207. package/content/knowledge/research/research-security.md +5 -0
  208. package/content/knowledge/research/research-sim-compute-management.md +4 -0
  209. package/content/knowledge/research/research-sim-engine-patterns.md +4 -0
  210. package/content/knowledge/research/research-sim-parameter-spaces.md +4 -0
  211. package/content/knowledge/research/research-sim-validation.md +4 -0
  212. package/content/knowledge/research/research-testing.md +5 -0
  213. package/content/knowledge/review/review-adr.md +6 -0
  214. package/content/knowledge/review/review-api-design.md +6 -0
  215. package/content/knowledge/review/review-art-bible.md +4 -0
  216. package/content/knowledge/review/review-database-design.md +5 -0
  217. package/content/knowledge/review/review-domain-modeling.md +5 -0
  218. package/content/knowledge/review/review-game-design.md +4 -0
  219. package/content/knowledge/review/review-game-economy.md +4 -0
  220. package/content/knowledge/review/review-game-ui.md +5 -0
  221. package/content/knowledge/review/review-implementation-tasks.md +5 -0
  222. package/content/knowledge/review/review-methodology.md +4 -0
  223. package/content/knowledge/review/review-netcode.md +4 -0
  224. package/content/knowledge/review/review-operations.md +6 -0
  225. package/content/knowledge/review/review-platform-cert.md +4 -0
  226. package/content/knowledge/review/review-prd.md +4 -0
  227. package/content/knowledge/review/review-security.md +7 -0
  228. package/content/knowledge/review/review-system-architecture.md +6 -0
  229. package/content/knowledge/review/review-testing-strategy.md +6 -0
  230. package/content/knowledge/review/review-user-stories.md +5 -0
  231. package/content/knowledge/review/review-ux-specification.md +6 -0
  232. package/content/knowledge/review/review-vision.md +4 -0
  233. package/content/knowledge/tools/post-implementation-review-methodology.md +4 -0
  234. package/content/knowledge/tools/release-management.md +5 -0
  235. package/content/knowledge/tools/session-analysis.md +4 -0
  236. package/content/knowledge/tools/version-strategy.md +4 -0
  237. package/content/knowledge/validation/critical-path-analysis.md +4 -0
  238. package/content/knowledge/validation/cross-phase-consistency.md +4 -0
  239. package/content/knowledge/validation/decision-completeness.md +5 -0
  240. package/content/knowledge/validation/dependency-validation.md +4 -0
  241. package/content/knowledge/validation/implementability-review.md +4 -0
  242. package/content/knowledge/validation/scope-management.md +4 -0
  243. package/content/knowledge/validation/traceability.md +4 -0
  244. package/content/knowledge/web-app/web-app-api-patterns.md +6 -0
  245. package/content/knowledge/web-app/web-app-architecture.md +6 -0
  246. package/content/knowledge/web-app/web-app-auth-patterns.md +9 -0
  247. package/content/knowledge/web-app/web-app-conventions.md +5 -0
  248. package/content/knowledge/web-app/web-app-data-patterns.md +6 -0
  249. package/content/knowledge/web-app/web-app-deployment-workflow.md +6 -0
  250. package/content/knowledge/web-app/web-app-deployment.md +6 -0
  251. package/content/knowledge/web-app/web-app-design-system.md +6 -0
  252. package/content/knowledge/web-app/web-app-dev-environment.md +6 -0
  253. package/content/knowledge/web-app/web-app-observability.md +6 -0
  254. package/content/knowledge/web-app/web-app-project-structure.md +5 -0
  255. package/content/knowledge/web-app/web-app-rendering-strategies.md +6 -0
  256. package/content/knowledge/web-app/web-app-requirements.md +6 -0
  257. package/content/knowledge/web-app/web-app-security.md +8 -0
  258. package/content/knowledge/web-app/web-app-session-patterns.md +7 -0
  259. package/content/knowledge/web-app/web-app-testing.md +6 -0
  260. package/content/knowledge/web-app/web-app-ux-patterns.md +6 -0
  261. package/content/knowledge/web3/web3-access-control.md +8 -0
  262. package/content/knowledge/web3/web3-architecture.md +7 -0
  263. package/content/knowledge/web3/web3-audit-workflow.md +7 -0
  264. package/content/knowledge/web3/web3-common-vulnerabilities.md +8 -0
  265. package/content/knowledge/web3/web3-conventions.md +6 -0
  266. package/content/knowledge/web3/web3-deployment-and-verification.md +7 -0
  267. package/content/knowledge/web3/web3-dev-environment.md +6 -0
  268. package/content/knowledge/web3/web3-gas-optimization.md +7 -0
  269. package/content/knowledge/web3/web3-oracles-and-external-data.md +7 -0
  270. package/content/knowledge/web3/web3-project-structure.md +6 -0
  271. package/content/knowledge/web3/web3-requirements.md +6 -0
  272. package/content/knowledge/web3/web3-security.md +8 -0
  273. package/content/knowledge/web3/web3-testing.md +6 -0
  274. package/content/knowledge/web3/web3-upgradeability.md +7 -0
  275. package/content/tools/knowledge-audit-entry.md +79 -0
  276. package/content/tools/review-code.md +41 -14
  277. package/content/tools/review-pr.md +32 -14
  278. package/dist/cli/commands/dashboard.d.ts +1 -1
  279. package/dist/cli/commands/dashboard.d.ts.map +1 -1
  280. package/dist/cli/commands/dashboard.js +10 -10
  281. package/dist/cli/commands/dashboard.js.map +1 -1
  282. package/dist/cli/commands/dashboard.test.js +1 -1
  283. package/dist/cli/commands/dashboard.test.js.map +1 -1
  284. package/dist/cli/commands/guides.d.ts +24 -0
  285. package/dist/cli/commands/guides.d.ts.map +1 -0
  286. package/dist/cli/commands/guides.js +103 -0
  287. package/dist/cli/commands/guides.js.map +1 -0
  288. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts +9 -0
  289. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts.map +1 -0
  290. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js +112 -0
  291. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js.map +1 -0
  292. package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts +8 -0
  293. package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts.map +1 -0
  294. package/dist/cli/commands/knowledge-freshness-audit-apply.js +96 -0
  295. package/dist/cli/commands/knowledge-freshness-audit-apply.js.map +1 -0
  296. package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts +7 -0
  297. package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts.map +1 -0
  298. package/dist/cli/commands/knowledge-freshness-audit-prefilter.js +42 -0
  299. package/dist/cli/commands/knowledge-freshness-audit-prefilter.js.map +1 -0
  300. package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts +9 -0
  301. package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts.map +1 -0
  302. package/dist/cli/commands/knowledge-freshness-audit-run-entry.js +63 -0
  303. package/dist/cli/commands/knowledge-freshness-audit-run-entry.js.map +1 -0
  304. package/dist/cli/commands/knowledge-freshness-bump-version.d.ts +8 -0
  305. package/dist/cli/commands/knowledge-freshness-bump-version.d.ts.map +1 -0
  306. package/dist/cli/commands/knowledge-freshness-bump-version.js +34 -0
  307. package/dist/cli/commands/knowledge-freshness-bump-version.js.map +1 -0
  308. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts +7 -0
  309. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts.map +1 -0
  310. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js +51 -0
  311. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js.map +1 -0
  312. package/dist/cli/commands/knowledge-freshness-link-check.d.ts +7 -0
  313. package/dist/cli/commands/knowledge-freshness-link-check.d.ts.map +1 -0
  314. package/dist/cli/commands/knowledge-freshness-link-check.js +57 -0
  315. package/dist/cli/commands/knowledge-freshness-link-check.js.map +1 -0
  316. package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts +8 -0
  317. package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts.map +1 -0
  318. package/dist/cli/commands/knowledge-freshness-lint-unsourced.js +58 -0
  319. package/dist/cli/commands/knowledge-freshness-lint-unsourced.js.map +1 -0
  320. package/dist/cli/commands/knowledge-freshness.d.ts +4 -0
  321. package/dist/cli/commands/knowledge-freshness.d.ts.map +1 -0
  322. package/dist/cli/commands/knowledge-freshness.js +25 -0
  323. package/dist/cli/commands/knowledge-freshness.js.map +1 -0
  324. package/dist/cli/commands/observe.d.ts +4 -0
  325. package/dist/cli/commands/observe.d.ts.map +1 -1
  326. package/dist/cli/commands/observe.js +13 -0
  327. package/dist/cli/commands/observe.js.map +1 -1
  328. package/dist/cli/commands/observe.test.js +46 -0
  329. package/dist/cli/commands/observe.test.js.map +1 -1
  330. package/dist/cli/commands/validate-knowledge.d.ts +4 -0
  331. package/dist/cli/commands/validate-knowledge.d.ts.map +1 -0
  332. package/dist/cli/commands/validate-knowledge.js +32 -0
  333. package/dist/cli/commands/validate-knowledge.js.map +1 -0
  334. package/dist/cli/index.d.ts.map +1 -1
  335. package/dist/cli/index.js +6 -0
  336. package/dist/cli/index.js.map +1 -1
  337. package/dist/core/adapters/claude-code.d.ts.map +1 -1
  338. package/dist/core/adapters/claude-code.js +6 -3
  339. package/dist/core/adapters/claude-code.js.map +1 -1
  340. package/dist/core/adapters/claude-code.test.js +45 -1
  341. package/dist/core/adapters/claude-code.test.js.map +1 -1
  342. package/dist/core/assembly/engine.d.ts.map +1 -1
  343. package/dist/core/assembly/engine.js +7 -3
  344. package/dist/core/assembly/engine.js.map +1 -1
  345. package/dist/core/assembly/engine.test.js +45 -1
  346. package/dist/core/assembly/engine.test.js.map +1 -1
  347. package/dist/core/assembly/gap-signal-tail.d.ts +18 -0
  348. package/dist/core/assembly/gap-signal-tail.d.ts.map +1 -0
  349. package/dist/core/assembly/gap-signal-tail.js +43 -0
  350. package/dist/core/assembly/gap-signal-tail.js.map +1 -0
  351. package/dist/core/assembly/gap-signal-tail.test.d.ts +2 -0
  352. package/dist/core/assembly/gap-signal-tail.test.d.ts.map +1 -0
  353. package/dist/core/assembly/gap-signal-tail.test.js +49 -0
  354. package/dist/core/assembly/gap-signal-tail.test.js.map +1 -0
  355. package/dist/core/assembly/knowledge-loader.d.ts +11 -0
  356. package/dist/core/assembly/knowledge-loader.d.ts.map +1 -1
  357. package/dist/core/assembly/knowledge-loader.js +54 -1
  358. package/dist/core/assembly/knowledge-loader.js.map +1 -1
  359. package/dist/core/assembly/knowledge-loader.test.js +73 -0
  360. package/dist/core/assembly/knowledge-loader.test.js.map +1 -1
  361. package/dist/guides/build.d.ts +12 -0
  362. package/dist/guides/build.d.ts.map +1 -0
  363. package/dist/guides/build.js +50 -0
  364. package/dist/guides/build.js.map +1 -0
  365. package/dist/guides/build.test.d.ts +2 -0
  366. package/dist/guides/build.test.d.ts.map +1 -0
  367. package/dist/guides/build.test.js +74 -0
  368. package/dist/guides/build.test.js.map +1 -0
  369. package/dist/guides/chrome.d.ts +24 -0
  370. package/dist/guides/chrome.d.ts.map +1 -0
  371. package/dist/guides/chrome.js +118 -0
  372. package/dist/guides/chrome.js.map +1 -0
  373. package/dist/guides/cli-guides.test.d.ts +2 -0
  374. package/dist/guides/cli-guides.test.d.ts.map +1 -0
  375. package/dist/guides/cli-guides.test.js +41 -0
  376. package/dist/guides/cli-guides.test.js.map +1 -0
  377. package/dist/guides/dashboard-theme.css +1073 -0
  378. package/dist/guides/directives-callout.test.d.ts +2 -0
  379. package/dist/guides/directives-callout.test.d.ts.map +1 -0
  380. package/dist/guides/directives-callout.test.js +22 -0
  381. package/dist/guides/directives-callout.test.js.map +1 -0
  382. package/dist/guides/directives-chart.test.d.ts +2 -0
  383. package/dist/guides/directives-chart.test.d.ts.map +1 -0
  384. package/dist/guides/directives-chart.test.js +25 -0
  385. package/dist/guides/directives-chart.test.js.map +1 -0
  386. package/dist/guides/directives-filter-table.test.d.ts +2 -0
  387. package/dist/guides/directives-filter-table.test.d.ts.map +1 -0
  388. package/dist/guides/directives-filter-table.test.js +22 -0
  389. package/dist/guides/directives-filter-table.test.js.map +1 -0
  390. package/dist/guides/directives-sev.test.d.ts +2 -0
  391. package/dist/guides/directives-sev.test.d.ts.map +1 -0
  392. package/dist/guides/directives-sev.test.js +15 -0
  393. package/dist/guides/directives-sev.test.js.map +1 -0
  394. package/dist/guides/directives-tabs.test.d.ts +2 -0
  395. package/dist/guides/directives-tabs.test.d.ts.map +1 -0
  396. package/dist/guides/directives-tabs.test.js +52 -0
  397. package/dist/guides/directives-tabs.test.js.map +1 -0
  398. package/dist/guides/directives.d.ts +7 -0
  399. package/dist/guides/directives.d.ts.map +1 -0
  400. package/dist/guides/directives.js +158 -0
  401. package/dist/guides/directives.js.map +1 -0
  402. package/dist/guides/fs-guides.test.d.ts +2 -0
  403. package/dist/guides/fs-guides.test.d.ts.map +1 -0
  404. package/dist/guides/fs-guides.test.js +14 -0
  405. package/dist/guides/fs-guides.test.js.map +1 -0
  406. package/dist/guides/index-page.d.ts +3 -0
  407. package/dist/guides/index-page.d.ts.map +1 -0
  408. package/dist/guides/index-page.js +14 -0
  409. package/dist/guides/index-page.js.map +1 -0
  410. package/dist/guides/lint.d.ts +6 -0
  411. package/dist/guides/lint.d.ts.map +1 -0
  412. package/dist/guides/lint.js +27 -0
  413. package/dist/guides/lint.js.map +1 -0
  414. package/dist/guides/lint.test.d.ts +2 -0
  415. package/dist/guides/lint.test.d.ts.map +1 -0
  416. package/dist/guides/lint.test.js +24 -0
  417. package/dist/guides/lint.test.js.map +1 -0
  418. package/dist/guides/loader.d.ts +4 -0
  419. package/dist/guides/loader.d.ts.map +1 -0
  420. package/dist/guides/loader.js +63 -0
  421. package/dist/guides/loader.js.map +1 -0
  422. package/dist/guides/loader.test.d.ts +2 -0
  423. package/dist/guides/loader.test.d.ts.map +1 -0
  424. package/dist/guides/loader.test.js +85 -0
  425. package/dist/guides/loader.test.js.map +1 -0
  426. package/dist/guides/mermaid-sanitize.test.d.ts +2 -0
  427. package/dist/guides/mermaid-sanitize.test.d.ts.map +1 -0
  428. package/dist/guides/mermaid-sanitize.test.js +57 -0
  429. package/dist/guides/mermaid-sanitize.test.js.map +1 -0
  430. package/dist/guides/mermaid.d.ts +18 -0
  431. package/dist/guides/mermaid.d.ts.map +1 -0
  432. package/dist/guides/mermaid.js +137 -0
  433. package/dist/guides/mermaid.js.map +1 -0
  434. package/dist/guides/mermaid.test.d.ts +2 -0
  435. package/dist/guides/mermaid.test.d.ts.map +1 -0
  436. package/dist/guides/mermaid.test.js +105 -0
  437. package/dist/guides/mermaid.test.js.map +1 -0
  438. package/dist/guides/render.d.ts +12 -0
  439. package/dist/guides/render.d.ts.map +1 -0
  440. package/dist/guides/render.js +58 -0
  441. package/dist/guides/render.js.map +1 -0
  442. package/dist/guides/render.test.d.ts +2 -0
  443. package/dist/guides/render.test.d.ts.map +1 -0
  444. package/dist/guides/render.test.js +46 -0
  445. package/dist/guides/render.test.js.map +1 -0
  446. package/dist/guides/sanitize.d.ts +3 -0
  447. package/dist/guides/sanitize.d.ts.map +1 -0
  448. package/dist/guides/sanitize.js +76 -0
  449. package/dist/guides/sanitize.js.map +1 -0
  450. package/dist/guides/sanitize.test.d.ts +2 -0
  451. package/dist/guides/sanitize.test.d.ts.map +1 -0
  452. package/dist/guides/sanitize.test.js +45 -0
  453. package/dist/guides/sanitize.test.js.map +1 -0
  454. package/dist/guides/template.d.ts +11 -0
  455. package/dist/guides/template.d.ts.map +1 -0
  456. package/dist/guides/template.js +38 -0
  457. package/dist/guides/template.js.map +1 -0
  458. package/dist/guides/template.test.d.ts +2 -0
  459. package/dist/guides/template.test.d.ts.map +1 -0
  460. package/dist/guides/template.test.js +41 -0
  461. package/dist/guides/template.test.js.map +1 -0
  462. package/dist/guides/types.d.ts +20 -0
  463. package/dist/guides/types.d.ts.map +1 -0
  464. package/dist/guides/types.js +2 -0
  465. package/dist/guides/types.js.map +1 -0
  466. package/dist/knowledge-freshness/audit-apply-pr.d.ts +64 -0
  467. package/dist/knowledge-freshness/audit-apply-pr.d.ts.map +1 -0
  468. package/dist/knowledge-freshness/audit-apply-pr.js +309 -0
  469. package/dist/knowledge-freshness/audit-apply-pr.js.map +1 -0
  470. package/dist/knowledge-freshness/audit-apply-pr.test.d.ts +2 -0
  471. package/dist/knowledge-freshness/audit-apply-pr.test.d.ts.map +1 -0
  472. package/dist/knowledge-freshness/audit-apply-pr.test.js +211 -0
  473. package/dist/knowledge-freshness/audit-apply-pr.test.js.map +1 -0
  474. package/dist/knowledge-freshness/audit-apply.d.ts +16 -0
  475. package/dist/knowledge-freshness/audit-apply.d.ts.map +1 -0
  476. package/dist/knowledge-freshness/audit-apply.js +193 -0
  477. package/dist/knowledge-freshness/audit-apply.js.map +1 -0
  478. package/dist/knowledge-freshness/audit-apply.test.d.ts +2 -0
  479. package/dist/knowledge-freshness/audit-apply.test.d.ts.map +1 -0
  480. package/dist/knowledge-freshness/audit-apply.test.js +482 -0
  481. package/dist/knowledge-freshness/audit-apply.test.js.map +1 -0
  482. package/dist/knowledge-freshness/audit-prefilter.d.ts +12 -0
  483. package/dist/knowledge-freshness/audit-prefilter.d.ts.map +1 -0
  484. package/dist/knowledge-freshness/audit-prefilter.js +74 -0
  485. package/dist/knowledge-freshness/audit-prefilter.js.map +1 -0
  486. package/dist/knowledge-freshness/audit-prefilter.test.d.ts +2 -0
  487. package/dist/knowledge-freshness/audit-prefilter.test.d.ts.map +1 -0
  488. package/dist/knowledge-freshness/audit-prefilter.test.js +78 -0
  489. package/dist/knowledge-freshness/audit-prefilter.test.js.map +1 -0
  490. package/dist/knowledge-freshness/audit-runner.d.ts +135 -0
  491. package/dist/knowledge-freshness/audit-runner.d.ts.map +1 -0
  492. package/dist/knowledge-freshness/audit-runner.js +168 -0
  493. package/dist/knowledge-freshness/audit-runner.js.map +1 -0
  494. package/dist/knowledge-freshness/audit-runner.test.d.ts +2 -0
  495. package/dist/knowledge-freshness/audit-runner.test.d.ts.map +1 -0
  496. package/dist/knowledge-freshness/audit-runner.test.js +130 -0
  497. package/dist/knowledge-freshness/audit-runner.test.js.map +1 -0
  498. package/dist/knowledge-freshness/bump-version.d.ts +24 -0
  499. package/dist/knowledge-freshness/bump-version.d.ts.map +1 -0
  500. package/dist/knowledge-freshness/bump-version.js +69 -0
  501. package/dist/knowledge-freshness/bump-version.js.map +1 -0
  502. package/dist/knowledge-freshness/bump-version.test.d.ts +2 -0
  503. package/dist/knowledge-freshness/bump-version.test.d.ts.map +1 -0
  504. package/dist/knowledge-freshness/bump-version.test.js +82 -0
  505. package/dist/knowledge-freshness/bump-version.test.js.map +1 -0
  506. package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts +86 -0
  507. package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts.map +1 -0
  508. package/dist/knowledge-freshness/gates/anti-over-rewrite.js +210 -0
  509. package/dist/knowledge-freshness/gates/anti-over-rewrite.js.map +1 -0
  510. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts +2 -0
  511. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts.map +1 -0
  512. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js +115 -0
  513. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js.map +1 -0
  514. package/dist/knowledge-freshness/gates/changed-files.d.ts +53 -0
  515. package/dist/knowledge-freshness/gates/changed-files.d.ts.map +1 -0
  516. package/dist/knowledge-freshness/gates/changed-files.js +128 -0
  517. package/dist/knowledge-freshness/gates/changed-files.js.map +1 -0
  518. package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts +23 -0
  519. package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts.map +1 -0
  520. package/dist/knowledge-freshness/gates/deep-guidance-check.js +27 -0
  521. package/dist/knowledge-freshness/gates/deep-guidance-check.js.map +1 -0
  522. package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts +2 -0
  523. package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts.map +1 -0
  524. package/dist/knowledge-freshness/gates/deep-guidance-check.test.js +23 -0
  525. package/dist/knowledge-freshness/gates/deep-guidance-check.test.js.map +1 -0
  526. package/dist/knowledge-freshness/gates/link-check.d.ts +55 -0
  527. package/dist/knowledge-freshness/gates/link-check.d.ts.map +1 -0
  528. package/dist/knowledge-freshness/gates/link-check.js +161 -0
  529. package/dist/knowledge-freshness/gates/link-check.js.map +1 -0
  530. package/dist/knowledge-freshness/gates/link-check.test.d.ts +2 -0
  531. package/dist/knowledge-freshness/gates/link-check.test.d.ts.map +1 -0
  532. package/dist/knowledge-freshness/gates/link-check.test.js +76 -0
  533. package/dist/knowledge-freshness/gates/link-check.test.js.map +1 -0
  534. package/dist/knowledge-freshness/gates/lint-unsourced.d.ts +40 -0
  535. package/dist/knowledge-freshness/gates/lint-unsourced.d.ts.map +1 -0
  536. package/dist/knowledge-freshness/gates/lint-unsourced.js +143 -0
  537. package/dist/knowledge-freshness/gates/lint-unsourced.js.map +1 -0
  538. package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts +2 -0
  539. package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts.map +1 -0
  540. package/dist/knowledge-freshness/gates/lint-unsourced.test.js +68 -0
  541. package/dist/knowledge-freshness/gates/lint-unsourced.test.js.map +1 -0
  542. package/dist/knowledge-freshness/gates/parse-entry.d.ts +25 -0
  543. package/dist/knowledge-freshness/gates/parse-entry.d.ts.map +1 -0
  544. package/dist/knowledge-freshness/gates/parse-entry.js +41 -0
  545. package/dist/knowledge-freshness/gates/parse-entry.js.map +1 -0
  546. package/dist/knowledge-freshness/gates/parse-entry.test.d.ts +2 -0
  547. package/dist/knowledge-freshness/gates/parse-entry.test.d.ts.map +1 -0
  548. package/dist/knowledge-freshness/gates/parse-entry.test.js +34 -0
  549. package/dist/knowledge-freshness/gates/parse-entry.test.js.map +1 -0
  550. package/dist/knowledge-freshness/providers/anthropic.d.ts +33 -0
  551. package/dist/knowledge-freshness/providers/anthropic.d.ts.map +1 -0
  552. package/dist/knowledge-freshness/providers/anthropic.js +36 -0
  553. package/dist/knowledge-freshness/providers/anthropic.js.map +1 -0
  554. package/dist/knowledge-freshness/providers/anthropic.test.d.ts +2 -0
  555. package/dist/knowledge-freshness/providers/anthropic.test.d.ts.map +1 -0
  556. package/dist/knowledge-freshness/providers/anthropic.test.js +32 -0
  557. package/dist/knowledge-freshness/providers/anthropic.test.js.map +1 -0
  558. package/dist/knowledge-freshness/providers/deepseek.d.ts +33 -0
  559. package/dist/knowledge-freshness/providers/deepseek.d.ts.map +1 -0
  560. package/dist/knowledge-freshness/providers/deepseek.js +157 -0
  561. package/dist/knowledge-freshness/providers/deepseek.js.map +1 -0
  562. package/dist/knowledge-freshness/providers/deepseek.test.d.ts +2 -0
  563. package/dist/knowledge-freshness/providers/deepseek.test.d.ts.map +1 -0
  564. package/dist/knowledge-freshness/providers/deepseek.test.js +142 -0
  565. package/dist/knowledge-freshness/providers/deepseek.test.js.map +1 -0
  566. package/dist/knowledge-freshness/providers/index.d.ts +41 -0
  567. package/dist/knowledge-freshness/providers/index.d.ts.map +1 -0
  568. package/dist/knowledge-freshness/providers/index.js +108 -0
  569. package/dist/knowledge-freshness/providers/index.js.map +1 -0
  570. package/dist/knowledge-freshness/providers/index.test.d.ts +2 -0
  571. package/dist/knowledge-freshness/providers/index.test.d.ts.map +1 -0
  572. package/dist/knowledge-freshness/providers/index.test.js +97 -0
  573. package/dist/knowledge-freshness/providers/index.test.js.map +1 -0
  574. package/dist/knowledge-freshness/source-hash.d.ts +39 -0
  575. package/dist/knowledge-freshness/source-hash.d.ts.map +1 -0
  576. package/dist/knowledge-freshness/source-hash.js +180 -0
  577. package/dist/knowledge-freshness/source-hash.js.map +1 -0
  578. package/dist/knowledge-freshness/source-hash.test.d.ts +2 -0
  579. package/dist/knowledge-freshness/source-hash.test.d.ts.map +1 -0
  580. package/dist/knowledge-freshness/source-hash.test.js +63 -0
  581. package/dist/knowledge-freshness/source-hash.test.js.map +1 -0
  582. package/dist/knowledge-freshness/source-url-validator.d.ts +57 -0
  583. package/dist/knowledge-freshness/source-url-validator.d.ts.map +1 -0
  584. package/dist/knowledge-freshness/source-url-validator.js +304 -0
  585. package/dist/knowledge-freshness/source-url-validator.js.map +1 -0
  586. package/dist/knowledge-freshness/source-url-validator.test.d.ts +2 -0
  587. package/dist/knowledge-freshness/source-url-validator.test.d.ts.map +1 -0
  588. package/dist/knowledge-freshness/source-url-validator.test.js +167 -0
  589. package/dist/knowledge-freshness/source-url-validator.test.js.map +1 -0
  590. package/dist/observability/checks/lens-i-knowledge-gaps.d.ts +3 -0
  591. package/dist/observability/checks/lens-i-knowledge-gaps.d.ts.map +1 -0
  592. package/dist/observability/checks/lens-i-knowledge-gaps.js +165 -0
  593. package/dist/observability/checks/lens-i-knowledge-gaps.js.map +1 -0
  594. package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts +2 -0
  595. package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts.map +1 -0
  596. package/dist/observability/checks/lens-i-knowledge-gaps.test.js +421 -0
  597. package/dist/observability/checks/lens-i-knowledge-gaps.test.js.map +1 -0
  598. package/dist/observability/checks/lens-i-lessons-scanner.d.ts +16 -0
  599. package/dist/observability/checks/lens-i-lessons-scanner.d.ts.map +1 -0
  600. package/dist/observability/checks/lens-i-lessons-scanner.js +106 -0
  601. package/dist/observability/checks/lens-i-lessons-scanner.js.map +1 -0
  602. package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts +2 -0
  603. package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts.map +1 -0
  604. package/dist/observability/checks/lens-i-lessons-scanner.test.js +174 -0
  605. package/dist/observability/checks/lens-i-lessons-scanner.test.js.map +1 -0
  606. package/dist/observability/engine/api.d.ts +4 -0
  607. package/dist/observability/engine/api.d.ts.map +1 -1
  608. package/dist/observability/engine/api.js +17 -1
  609. package/dist/observability/engine/api.js.map +1 -1
  610. package/dist/observability/engine/checks/observability-config.d.ts +4 -0
  611. package/dist/observability/engine/checks/observability-config.d.ts.map +1 -1
  612. package/dist/observability/engine/checks/observability-config.js +1 -0
  613. package/dist/observability/engine/checks/observability-config.js.map +1 -1
  614. package/dist/observability/engine/checks/registry.d.ts.map +1 -1
  615. package/dist/observability/engine/checks/registry.js +7 -0
  616. package/dist/observability/engine/checks/registry.js.map +1 -1
  617. package/dist/observability/engine/checks/registry.test.js +3 -2
  618. package/dist/observability/engine/checks/registry.test.js.map +1 -1
  619. package/dist/observability/engine/checks/runner.d.ts +30 -0
  620. package/dist/observability/engine/checks/runner.d.ts.map +1 -1
  621. package/dist/observability/engine/checks/runner.js +8 -1
  622. package/dist/observability/engine/checks/runner.js.map +1 -1
  623. package/dist/observability/engine/checks/runner.test.js +74 -0
  624. package/dist/observability/engine/checks/runner.test.js.map +1 -1
  625. package/dist/observability/engine/event-schemas.d.ts.map +1 -1
  626. package/dist/observability/engine/event-schemas.js +41 -3
  627. package/dist/observability/engine/event-schemas.js.map +1 -1
  628. package/dist/observability/engine/event-schemas.test.js +105 -0
  629. package/dist/observability/engine/event-schemas.test.js.map +1 -1
  630. package/dist/observability/engine/fix-flow.d.ts +7 -0
  631. package/dist/observability/engine/fix-flow.d.ts.map +1 -1
  632. package/dist/observability/engine/fix-flow.js +5 -3
  633. package/dist/observability/engine/fix-flow.js.map +1 -1
  634. package/dist/observability/engine/knowledge-root-integration.test.d.ts +2 -0
  635. package/dist/observability/engine/knowledge-root-integration.test.d.ts.map +1 -0
  636. package/dist/observability/engine/knowledge-root-integration.test.js +103 -0
  637. package/dist/observability/engine/knowledge-root-integration.test.js.map +1 -0
  638. package/dist/observability/engine/types.d.ts +20 -1
  639. package/dist/observability/engine/types.d.ts.map +1 -1
  640. package/dist/observability/engine/types.test.js +1 -1
  641. package/dist/observability/engine/types.test.js.map +1 -1
  642. package/dist/observability/knowledge-index.d.ts +145 -0
  643. package/dist/observability/knowledge-index.d.ts.map +1 -0
  644. package/dist/observability/knowledge-index.js +353 -0
  645. package/dist/observability/knowledge-index.js.map +1 -0
  646. package/dist/observability/knowledge-index.test.d.ts +2 -0
  647. package/dist/observability/knowledge-index.test.d.ts.map +1 -0
  648. package/dist/observability/knowledge-index.test.js +364 -0
  649. package/dist/observability/knowledge-index.test.js.map +1 -0
  650. package/dist/observability/renderers/markdown.d.ts.map +1 -1
  651. package/dist/observability/renderers/markdown.js +14 -0
  652. package/dist/observability/renderers/markdown.js.map +1 -1
  653. package/dist/observability/renderers/markdown.test.js +30 -0
  654. package/dist/observability/renderers/markdown.test.js.map +1 -1
  655. package/dist/types/assembly.d.ts +10 -0
  656. package/dist/types/assembly.d.ts.map +1 -1
  657. package/dist/utils/fs.d.ts +6 -0
  658. package/dist/utils/fs.d.ts.map +1 -1
  659. package/dist/utils/fs.js +13 -0
  660. package/dist/utils/fs.js.map +1 -1
  661. package/dist/validation/knowledge-frontmatter-validator.d.ts +15 -0
  662. package/dist/validation/knowledge-frontmatter-validator.d.ts.map +1 -0
  663. package/dist/validation/knowledge-frontmatter-validator.js +131 -0
  664. package/dist/validation/knowledge-frontmatter-validator.js.map +1 -0
  665. package/dist/validation/knowledge-frontmatter-validator.test.d.ts +2 -0
  666. package/dist/validation/knowledge-frontmatter-validator.test.d.ts.map +1 -0
  667. package/dist/validation/knowledge-frontmatter-validator.test.js +66 -0
  668. package/dist/validation/knowledge-frontmatter-validator.test.js.map +1 -0
  669. package/package.json +13 -4
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Resolve the list of changed knowledge-entry .md files for a gate run.
3
+ *
4
+ * Argument semantics:
5
+ * - If `args` has entries, treat them as file paths (relative or absolute)
6
+ * and use them directly. Operators pass explicit files when iterating
7
+ * locally; the workflow passes them when GitHub's "changed files" API
8
+ * surface is more convenient than re-running `git diff`.
9
+ * - Otherwise fall back to `git diff --name-only origin/main...HEAD`,
10
+ * filtering to `content/knowledge/**\/*.md` so callers can run the CLI
11
+ * on a feature branch without flag plumbing.
12
+ *
13
+ * Returns absolute paths so callers can `fs.readFileSync` directly.
14
+ */
15
+ export interface ResolveOptions {
16
+ /**
17
+ * Read the file list from a JSON file (must be an array of strings). Used
18
+ * by the CI workflow to avoid shell-interpolating PR-controlled filenames
19
+ * (round-2 F-001) — a PR could add a content/knowledge path containing
20
+ * shell metacharacters that would `$()`-execute inside the workflow's
21
+ * bash. Reading from a JSON file lets us validate each entry on the Node
22
+ * side without ever touching bash.
23
+ */
24
+ filesFrom?: string;
25
+ }
26
+ export declare function resolveTargetFiles(args: string[], cwd: string, opts?: ResolveOptions): string[];
27
+ /**
28
+ * Read the operator opt-out list for link-checking from
29
+ * `.scaffold/observability.yaml` under `knowledge_freshness.link_check.skip`.
30
+ * Empty list when the file or key is missing — the default is "no opt-outs"
31
+ * per the task spec ("no opt-outs" if no list exists).
32
+ */
33
+ export declare function loadLinkCheckSkip(projectRoot: string): string[];
34
+ /**
35
+ * Produce a unified diff for a SPECIFIC set of files.
36
+ *
37
+ * Round-2 F-003: this used to diff `origin/main...HEAD`, which produced an
38
+ * empty diff in both deployment shapes:
39
+ * - PR gate workflow: HEAD of the base checkout IS origin/main (since the
40
+ * PR head's content/knowledge/ is OVERLAID, not merged). So
41
+ * `origin/main...HEAD` returns nothing even when the overlay added
42
+ * thousands of lines.
43
+ * - Cron inline gates: audit-apply edits on disk WITHOUT committing,
44
+ * so HEAD is still main and the diff is empty.
45
+ *
46
+ * Diffing the working tree (no commit ranges, just `git diff -- <files>`)
47
+ * captures both uncommitted edits AND overlaid files. That's the right
48
+ * shape for every gate-execution context we use.
49
+ *
50
+ * Returns an empty string when there are no changes.
51
+ */
52
+ export declare function gitDiffForFiles(cwd: string, files: string[]): string;
53
+ //# sourceMappingURL=changed-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changed-files.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/changed-files.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAoBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,EAAE,CAyCnG;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB/D;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAcpE"}
@@ -0,0 +1,128 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import yaml from 'js-yaml';
5
+ /** Reject any path that escapes content/knowledge/, contains shell metas, or isn't a .md file. */
6
+ function validateGatePath(rel) {
7
+ if (!rel.startsWith('content/knowledge/')) {
8
+ throw new Error(`refusing gate path outside content/knowledge/: ${JSON.stringify(rel)}`);
9
+ }
10
+ if (!rel.endsWith('.md')) {
11
+ throw new Error(`refusing non-markdown gate path: ${JSON.stringify(rel)}`);
12
+ }
13
+ if (rel.includes('..')) {
14
+ throw new Error(`refusing gate path containing "..": ${JSON.stringify(rel)}`);
15
+ }
16
+ // Belt-and-braces: even though we never interpolate these paths into a
17
+ // shell, reject the metacharacters a future regression might.
18
+ if (/[\s;|&`$<>"'\\(){}*?]/.test(rel)) {
19
+ throw new Error(`refusing gate path with shell metacharacters: ${JSON.stringify(rel)}`);
20
+ }
21
+ }
22
+ export function resolveTargetFiles(args, cwd, opts = {}) {
23
+ if (opts.filesFrom) {
24
+ const raw = fs.readFileSync(path.resolve(cwd, opts.filesFrom), 'utf8');
25
+ let parsed;
26
+ try {
27
+ parsed = JSON.parse(raw);
28
+ }
29
+ catch (e) {
30
+ throw new Error(`--files-from JSON parse error: ${e.message}`);
31
+ }
32
+ if (!Array.isArray(parsed))
33
+ throw new Error('--files-from must be a JSON array of strings');
34
+ const out = [];
35
+ for (const p of parsed) {
36
+ if (typeof p !== 'string')
37
+ throw new Error('--files-from entries must be strings');
38
+ validateGatePath(p);
39
+ out.push(path.resolve(cwd, p));
40
+ }
41
+ return out;
42
+ }
43
+ if (args.length > 0) {
44
+ // Even explicit args go through the validator — the CLI is called from
45
+ // workflows too, and we want one validation chokepoint.
46
+ for (const a of args) {
47
+ const rel = path.isAbsolute(a) ? path.relative(cwd, a) : a;
48
+ validateGatePath(rel);
49
+ }
50
+ return args.map((p) => path.resolve(cwd, p));
51
+ }
52
+ // Round-8 F-001: mirror the CI workflow's --diff-filter=d so a locally-
53
+ // deleted knowledge entry doesn't appear in the file list and crash
54
+ // downstream gates with ENOENT.
55
+ const out = spawnSync('git', ['diff', '--name-only', '--diff-filter=d', 'origin/main...HEAD'], {
56
+ cwd, encoding: 'utf8',
57
+ });
58
+ if (out.status !== 0) {
59
+ throw new Error(`git diff failed (exit ${out.status}): ${out.stderr || '<no stderr>'}\n` +
60
+ 'If you are running this gate locally without an origin/main, pass file paths explicitly.');
61
+ }
62
+ return out.stdout
63
+ .split('\n')
64
+ .map((s) => s.trim())
65
+ .filter((s) => s.startsWith('content/knowledge/') && s.endsWith('.md'))
66
+ .map((p) => path.resolve(cwd, p));
67
+ }
68
+ /**
69
+ * Read the operator opt-out list for link-checking from
70
+ * `.scaffold/observability.yaml` under `knowledge_freshness.link_check.skip`.
71
+ * Empty list when the file or key is missing — the default is "no opt-outs"
72
+ * per the task spec ("no opt-outs" if no list exists).
73
+ */
74
+ export function loadLinkCheckSkip(projectRoot) {
75
+ const yamlPath = path.join(projectRoot, '.scaffold', 'observability.yaml');
76
+ if (!fs.existsSync(yamlPath))
77
+ return [];
78
+ try {
79
+ const parsed = yaml.load(fs.readFileSync(yamlPath, 'utf8'), { schema: yaml.JSON_SCHEMA });
80
+ if (!parsed || typeof parsed !== 'object')
81
+ return [];
82
+ const kf = parsed['knowledge_freshness'];
83
+ if (!kf || typeof kf !== 'object')
84
+ return [];
85
+ const lc = kf['link_check'];
86
+ if (!lc || typeof lc !== 'object')
87
+ return [];
88
+ const skip = lc['skip'];
89
+ if (!Array.isArray(skip))
90
+ return [];
91
+ return skip.filter((s) => typeof s === 'string' && s.length > 0);
92
+ }
93
+ catch {
94
+ return [];
95
+ }
96
+ }
97
+ // F-007: the former `readPrBody` helper was removed. Anti-over-rewrite no
98
+ // longer reads the PR body — the override is now a maintainer-applied label
99
+ // passed explicitly via `--pr-labels` from the workflow (see F-005).
100
+ /**
101
+ * Produce a unified diff for a SPECIFIC set of files.
102
+ *
103
+ * Round-2 F-003: this used to diff `origin/main...HEAD`, which produced an
104
+ * empty diff in both deployment shapes:
105
+ * - PR gate workflow: HEAD of the base checkout IS origin/main (since the
106
+ * PR head's content/knowledge/ is OVERLAID, not merged). So
107
+ * `origin/main...HEAD` returns nothing even when the overlay added
108
+ * thousands of lines.
109
+ * - Cron inline gates: audit-apply edits on disk WITHOUT committing,
110
+ * so HEAD is still main and the diff is empty.
111
+ *
112
+ * Diffing the working tree (no commit ranges, just `git diff -- <files>`)
113
+ * captures both uncommitted edits AND overlaid files. That's the right
114
+ * shape for every gate-execution context we use.
115
+ *
116
+ * Returns an empty string when there are no changes.
117
+ */
118
+ export function gitDiffForFiles(cwd, files) {
119
+ if (files.length === 0)
120
+ return '';
121
+ const relFiles = files.map((f) => path.relative(cwd, f));
122
+ const out = spawnSync('git', ['diff', '--no-color', '--', ...relFiles], { cwd, encoding: 'utf8' });
123
+ if (out.status !== 0) {
124
+ throw new Error(`git diff failed (exit ${out.status}): ${out.stderr || '<no stderr>'}`);
125
+ }
126
+ return out.stdout;
127
+ }
128
+ //# sourceMappingURL=changed-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changed-files.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/changed-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Deep-Guidance-preserved gate (spec §A.5).
3
+ *
4
+ * The assembly engine matches `^## Deep Guidance\s*$` to extract per-entry
5
+ * deep guidance for injection into pipeline prompts. If a refresh PR replaces
6
+ * the heading with `## Guidance` or `### Deep Guidance` the engine silently
7
+ * skips the section. This gate refuses to merge any PR that drops the exact
8
+ * heading from a changed entry.
9
+ *
10
+ * The check is positive (must contain the literal heading), not regex-fuzzy
11
+ * — we explicitly want to fail variants like `# Deep Guidance`,
12
+ * `## deep guidance`, or trailing punctuation.
13
+ */
14
+ export interface DeepGuidanceFinding {
15
+ file: string;
16
+ ok: boolean;
17
+ reason?: string;
18
+ }
19
+ export declare function checkDeepGuidance(inputs: Array<{
20
+ file: string;
21
+ content: string;
22
+ }>): DeepGuidanceFinding[];
23
+ //# sourceMappingURL=deep-guidance-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-guidance-check.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/deep-guidance-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,mBAAmB,EAAE,CAWzG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Deep-Guidance-preserved gate (spec §A.5).
3
+ *
4
+ * The assembly engine matches `^## Deep Guidance\s*$` to extract per-entry
5
+ * deep guidance for injection into pipeline prompts. If a refresh PR replaces
6
+ * the heading with `## Guidance` or `### Deep Guidance` the engine silently
7
+ * skips the section. This gate refuses to merge any PR that drops the exact
8
+ * heading from a changed entry.
9
+ *
10
+ * The check is positive (must contain the literal heading), not regex-fuzzy
11
+ * — we explicitly want to fail variants like `# Deep Guidance`,
12
+ * `## deep guidance`, or trailing punctuation.
13
+ */
14
+ const DEEP_GUIDANCE_RE = /^## Deep Guidance\s*$/m;
15
+ export function checkDeepGuidance(inputs) {
16
+ return inputs.map(({ file, content }) => {
17
+ if (DEEP_GUIDANCE_RE.test(content)) {
18
+ return { file, ok: true };
19
+ }
20
+ return {
21
+ file,
22
+ ok: false,
23
+ reason: 'missing literal `## Deep Guidance` heading (assembly engine depends on this exact form)',
24
+ };
25
+ });
26
+ }
27
+ //# sourceMappingURL=deep-guidance-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-guidance-check.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/deep-guidance-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,gBAAgB,GAAG,wBAAwB,CAAA;AAQjD,MAAM,UAAU,iBAAiB,CAAC,MAAgD;IAChF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACtC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO;YACL,IAAI;YACJ,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,yFAAyF;SAClG,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deep-guidance-check.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-guidance-check.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/deep-guidance-check.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { checkDeepGuidance } from './deep-guidance-check.js';
3
+ describe('checkDeepGuidance', () => {
4
+ it('passes entries that contain the literal heading', () => {
5
+ const content = '---\nname: x\n---\n## Deep Guidance\nstuff';
6
+ expect(checkDeepGuidance([{ file: 'a.md', content }])[0].ok).toBe(true);
7
+ });
8
+ it('fails when the heading is missing entirely', () => {
9
+ const content = '---\nname: x\n---\n## Guidance\nstuff';
10
+ const r = checkDeepGuidance([{ file: 'a.md', content }])[0];
11
+ expect(r.ok).toBe(false);
12
+ expect(r.reason).toMatch(/Deep Guidance/);
13
+ });
14
+ it('fails on case-different variants', () => {
15
+ const content = '---\nname: x\n---\n## deep guidance\n';
16
+ expect(checkDeepGuidance([{ file: 'a.md', content }])[0].ok).toBe(false);
17
+ });
18
+ it('fails when the heading is demoted to ###', () => {
19
+ const content = '---\nname: x\n---\n### Deep Guidance\n';
20
+ expect(checkDeepGuidance([{ file: 'a.md', content }])[0].ok).toBe(false);
21
+ });
22
+ });
23
+ //# sourceMappingURL=deep-guidance-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-guidance-check.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/deep-guidance-check.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,OAAO,GAAG,4CAA4C,CAAA;QAC5D,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,uCAAuC,CAAA;QACvD,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG,uCAAuC,CAAA;QACvD,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,wCAAwC,CAAA;QACxD,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,55 @@
1
+ import { type Resolver } from '../source-url-validator.js';
2
+ /**
3
+ * Link-check gate: verifies every `sources[*].url` declared in changed
4
+ * knowledge entries resolves to a 2xx (after following 3xx). HEAD is tried
5
+ * first; if the server returns 405/501 or any non-2xx that's still <500, we
6
+ * fall back to a GET with `Range: bytes=0-0` so the body cap from
7
+ * `fetchAndHash` doesn't apply here either.
8
+ *
9
+ * SSRF: every hop is re-validated using the same `assertSafeSourceUrlWithDns`
10
+ * + pinning-agent pattern as `source-hash.ts::fetchAndHash`. This is the only
11
+ * other code path that issues outbound HTTP from this package — keeping the
12
+ * guards identical means a fix to one applies to both.
13
+ */
14
+ export type FetchImpl = (input: string, init?: Record<string, unknown>) => Promise<Response>;
15
+ export interface LinkCheckOptions {
16
+ resolver?: Resolver;
17
+ timeoutMs?: number;
18
+ fetchImpl?: FetchImpl;
19
+ /**
20
+ * Hosts (or exact URLs) to skip entirely. Drawn from
21
+ * `.scaffold/observability.yaml` `knowledge_freshness.link_check.skip:` when
22
+ * present. Matching is by exact-URL or by hostname suffix.
23
+ */
24
+ skip?: string[];
25
+ }
26
+ export interface LinkCheckResult {
27
+ url: string;
28
+ ok: boolean;
29
+ status: number | null;
30
+ reason?: string;
31
+ /** True when the URL matched the operator opt-out list and was not fetched. */
32
+ skipped?: boolean;
33
+ }
34
+ /**
35
+ * HEAD-check one URL (with GET-Range fallback). Returns a structured result
36
+ * rather than throwing so the caller can aggregate per-URL outcomes for the
37
+ * CI annotation output. SSRF / DNS-rebinding errors surface as `ok: false`
38
+ * with `status: null` and the validator's message in `reason`.
39
+ */
40
+ export declare function checkOneUrl(url: string, opts?: LinkCheckOptions): Promise<LinkCheckResult>;
41
+ /**
42
+ * Check every URL across a set of entries. Returns one result per (url, file)
43
+ * pair so the CLI can attribute failures to specific files in the PR.
44
+ */
45
+ export interface AggregateLinkCheckResult {
46
+ ok: boolean;
47
+ results: Array<LinkCheckResult & {
48
+ file: string;
49
+ }>;
50
+ }
51
+ export declare function checkUrlsForEntries(entries: Array<{
52
+ file: string;
53
+ sourceUrls: string[];
54
+ }>, opts?: LinkCheckOptions): Promise<AggregateLinkCheckResult>;
55
+ //# sourceMappingURL=link-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-check.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/link-check.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAA;AAEnC;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAK5F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAyBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAwF1B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,KAAK,CAAC,eAAe,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EACtD,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,wBAAwB,CAAC,CAWnC"}
@@ -0,0 +1,161 @@
1
+ import net from 'node:net';
2
+ import { fetch as undiciFetch, Agent } from 'undici';
3
+ import { assertSafeSourceUrlWithDns, defaultResolver, } from '../source-url-validator.js';
4
+ const MAX_REDIRECT_HOPS = 5;
5
+ const DEFAULT_TIMEOUT_MS = 15_000;
6
+ function pinningAgent(pinnedIp) {
7
+ const family = net.isIP(pinnedIp) === 6 ? 6 : 4;
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ const lookup = (_hostname, opts, callback) => {
10
+ if (opts && opts.all === true)
11
+ callback(null, [{ address: pinnedIp, family }]);
12
+ else
13
+ callback(null, pinnedIp, family);
14
+ };
15
+ return new Agent({ connect: { lookup } });
16
+ }
17
+ function urlMatchesSkip(url, skip) {
18
+ if (!skip.length)
19
+ return false;
20
+ let parsed;
21
+ try {
22
+ parsed = new URL(url);
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ for (const entry of skip) {
28
+ if (!entry)
29
+ continue;
30
+ if (entry === url)
31
+ return true;
32
+ // Hostname or hostname-suffix match — same pattern as the allowlist loader.
33
+ if (parsed.hostname === entry || parsed.hostname.endsWith('.' + entry))
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ /**
39
+ * HEAD-check one URL (with GET-Range fallback). Returns a structured result
40
+ * rather than throwing so the caller can aggregate per-URL outcomes for the
41
+ * CI annotation output. SSRF / DNS-rebinding errors surface as `ok: false`
42
+ * with `status: null` and the validator's message in `reason`.
43
+ */
44
+ export async function checkOneUrl(url, opts = {}) {
45
+ const skip = opts.skip ?? [];
46
+ if (urlMatchesSkip(url, skip)) {
47
+ return { url, ok: true, status: null, skipped: true };
48
+ }
49
+ const resolver = opts.resolver ?? defaultResolver;
50
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
51
+ const doFetch = opts.fetchImpl ?? undiciFetch;
52
+ let current = url;
53
+ let lastStatus = null;
54
+ for (let hop = 0; hop <= MAX_REDIRECT_HOPS; hop++) {
55
+ let validated;
56
+ try {
57
+ validated = await assertSafeSourceUrlWithDns(current, resolver);
58
+ }
59
+ catch (e) {
60
+ return { url, ok: false, status: null, reason: e instanceof Error ? e.message : String(e) };
61
+ }
62
+ let host = validated.url.hostname;
63
+ if (host.startsWith('[') && host.endsWith(']'))
64
+ host = host.slice(1, -1);
65
+ const pinnedIp = validated.ips[0];
66
+ const dispatcher = net.isIP(host) === 0 && pinnedIp ? pinningAgent(pinnedIp) : undefined;
67
+ // Try HEAD first; if the server returns a status that suggests HEAD isn't
68
+ // supported (405 / 501) OR any non-2xx that's not a redirect, fall back
69
+ // to a tiny GET (Range: bytes=0-0) before declaring failure.
70
+ let headRes;
71
+ try {
72
+ try {
73
+ headRes = await doFetch(current, {
74
+ method: 'HEAD',
75
+ redirect: 'manual',
76
+ signal: AbortSignal.timeout(timeoutMs),
77
+ ...(dispatcher ? { dispatcher } : {}),
78
+ });
79
+ }
80
+ catch (e) {
81
+ // Some servers reset the connection on HEAD. Try GET-Range below.
82
+ const msg = e instanceof Error ? e.message : String(e);
83
+ if (/abort|timeout/i.test(msg)) {
84
+ return { url, ok: false, status: null, reason: msg };
85
+ }
86
+ // Fall through to GET-Range fallback.
87
+ headRes = undefined;
88
+ }
89
+ const headStatus = headRes?.status ?? 0;
90
+ const shouldFallback = !headRes || headStatus === 405 || headStatus === 501 ||
91
+ (headStatus >= 400 && headStatus < 500);
92
+ let res;
93
+ if (shouldFallback) {
94
+ try {
95
+ await headRes?.body?.cancel();
96
+ }
97
+ catch { /* noop */ }
98
+ res = await doFetch(current, {
99
+ method: 'GET',
100
+ headers: { Range: 'bytes=0-0' },
101
+ redirect: 'manual',
102
+ signal: AbortSignal.timeout(timeoutMs),
103
+ ...(dispatcher ? { dispatcher } : {}),
104
+ });
105
+ }
106
+ else {
107
+ res = headRes;
108
+ }
109
+ lastStatus = res.status;
110
+ // 2xx including 206 Partial Content from the Range request → success.
111
+ if (res.status >= 200 && res.status < 300) {
112
+ try {
113
+ await res.body?.cancel();
114
+ }
115
+ catch { /* noop */ }
116
+ return { url, ok: true, status: res.status };
117
+ }
118
+ // 3xx → re-validate the redirect target and try again.
119
+ if (res.status >= 300 && res.status < 400) {
120
+ const location = res.headers.get('location');
121
+ try {
122
+ await res.body?.cancel();
123
+ }
124
+ catch { /* noop */ }
125
+ if (!location) {
126
+ return { url, ok: false, status: res.status, reason: `${res.status} with no Location header` };
127
+ }
128
+ current = new URL(location, current).toString();
129
+ continue;
130
+ }
131
+ // 4xx / 5xx → fail.
132
+ try {
133
+ await res.body?.cancel();
134
+ }
135
+ catch { /* noop */ }
136
+ return { url, ok: false, status: res.status, reason: `HTTP ${res.status}` };
137
+ }
138
+ catch (e) {
139
+ return { url, ok: false, status: lastStatus, reason: e instanceof Error ? e.message : String(e) };
140
+ }
141
+ finally {
142
+ if (dispatcher)
143
+ await dispatcher.close();
144
+ }
145
+ }
146
+ return { url, ok: false, status: lastStatus, reason: `exceeded ${MAX_REDIRECT_HOPS} redirects` };
147
+ }
148
+ export async function checkUrlsForEntries(entries, opts = {}) {
149
+ const out = [];
150
+ let ok = true;
151
+ for (const e of entries) {
152
+ for (const url of e.sourceUrls) {
153
+ const r = await checkOneUrl(url, opts);
154
+ out.push({ ...r, file: e.file });
155
+ if (!r.ok)
156
+ ok = false;
157
+ }
158
+ }
159
+ return { ok, results: out };
160
+ }
161
+ //# sourceMappingURL=link-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-check.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/link-check.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,EACL,0BAA0B,EAC1B,eAAe,GAEhB,MAAM,4BAA4B,CAAA;AAiBnC,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAC3B,MAAM,kBAAkB,GAAG,MAAM,CAAA;AAuBjC,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,8DAA8D;IAC9D,MAAM,MAAM,GAAG,CAAC,SAAiB,EAAE,IAAS,EAAE,QAAa,EAAE,EAAE;QAC7D,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;;YACzE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC,CAAA;IACD,OAAO,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,IAAc;IACjD,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC9B,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;IACpD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC9B,4EAA4E;QAC5E,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;IACrF,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,OAAyB,EAAE;IAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;IAC5B,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACvD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAA;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACtD,MAAM,OAAO,GAAc,IAAI,CAAC,SAAS,IAAK,WAAoC,CAAA;IAElF,IAAI,OAAO,GAAG,GAAG,CAAA;IACjB,IAAI,UAAU,GAAkB,IAAI,CAAA;IACpC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE,EAAE,CAAC;QAClD,IAAI,SAAsC,CAAA;QAC1C,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACjE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7F,CAAC;QACD,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAA;QACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACxE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAExF,0EAA0E;QAC1E,wEAAwE;QACxE,6DAA6D;QAC7D,IAAI,OAA6B,CAAA;QACjC,IAAI,CAAC;YACH,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;oBAC/B,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;oBACtC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACtC,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,kEAAkE;gBAClE,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gBACtD,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;gBACtD,CAAC;gBACD,sCAAsC;gBACtC,OAAO,GAAG,SAAS,CAAA;YACrB,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAA;YACvC,MAAM,cAAc,GAAG,CAAC,OAAO,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG;gBACzE,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,CAAC,CAAA;YACzC,IAAI,GAAa,CAAA;YACjB,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC1D,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;oBAC3B,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;oBAC/B,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;oBACtC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACtC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,OAAmB,CAAA;YAC3B,CAAC;YAED,UAAU,GAAG,GAAG,CAAC,MAAM,CAAA;YACvB,sEAAsE;YACtE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAA;YAC9C,CAAC;YACD,uDAAuD;YACvD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAC5C,IAAI,CAAC;oBAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,0BAA0B,EAAE,CAAA;gBAChG,CAAC;gBACD,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAC/C,SAAQ;YACV,CAAC;YACD,oBAAoB;YACpB,IAAI,CAAC;gBAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACrD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;QAC7E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QACnG,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU;gBAAE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,iBAAiB,YAAY,EAAE,CAAA;AAClG,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAsD,EACtD,OAAyB,EAAE;IAE3B,MAAM,GAAG,GAA8C,EAAE,CAAA;IACzD,IAAI,EAAE,GAAG,IAAI,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAChC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,EAAE,GAAG,KAAK,CAAA;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=link-check.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-check.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/link-check.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { checkOneUrl, checkUrlsForEntries } from './link-check.js';
3
+ const allowResolver = async () => ['93.184.216.34'];
4
+ describe('checkOneUrl', () => {
5
+ it('returns ok for a 200 HEAD', async () => {
6
+ const fetchImpl = vi.fn(async () => new Response(null, { status: 200 }));
7
+ const r = await checkOneUrl('https://example.com/a', { resolver: allowResolver, fetchImpl });
8
+ expect(r.ok).toBe(true);
9
+ expect(r.status).toBe(200);
10
+ });
11
+ it('falls back to GET-Range when HEAD returns 405', async () => {
12
+ const calls = [];
13
+ const fetchImpl = vi.fn(async (_url, init) => {
14
+ calls.push({ method: String(init.method) });
15
+ if (init.method === 'HEAD')
16
+ return new Response(null, { status: 405 });
17
+ return new Response('partial', { status: 206 });
18
+ });
19
+ const r = await checkOneUrl('https://example.com/a', { resolver: allowResolver, fetchImpl });
20
+ expect(r.ok).toBe(true);
21
+ expect(r.status).toBe(206);
22
+ expect(calls.map((c) => c.method)).toEqual(['HEAD', 'GET']);
23
+ });
24
+ it('fails on 404', async () => {
25
+ const fetchImpl = vi.fn(async () => {
26
+ // HEAD returns 404 → falls back to GET, which also returns 404.
27
+ return new Response(null, { status: 404 });
28
+ });
29
+ const r = await checkOneUrl('https://example.com/missing', { resolver: allowResolver, fetchImpl });
30
+ expect(r.ok).toBe(false);
31
+ expect(r.status).toBe(404);
32
+ });
33
+ it('follows a 301 redirect', async () => {
34
+ let hop = 0;
35
+ const fetchImpl = vi.fn(async () => {
36
+ hop++;
37
+ if (hop === 1)
38
+ return new Response(null, { status: 301, headers: { Location: 'https://example.com/b' } });
39
+ return new Response(null, { status: 200 });
40
+ });
41
+ const r = await checkOneUrl('https://example.com/a', { resolver: allowResolver, fetchImpl });
42
+ expect(r.ok).toBe(true);
43
+ expect(r.status).toBe(200);
44
+ });
45
+ it('honors the operator skip list', async () => {
46
+ const fetchImpl = vi.fn();
47
+ const r = await checkOneUrl('https://flaky.example.com/x', {
48
+ resolver: allowResolver, fetchImpl, skip: ['flaky.example.com'],
49
+ });
50
+ expect(r.skipped).toBe(true);
51
+ expect(r.ok).toBe(true);
52
+ expect(fetchImpl).not.toHaveBeenCalled();
53
+ });
54
+ it('rejects SSRF targets via the validator', async () => {
55
+ const fetchImpl = vi.fn();
56
+ const r = await checkOneUrl('http://localhost/x', { resolver: allowResolver, fetchImpl });
57
+ expect(r.ok).toBe(false);
58
+ expect(r.reason).toMatch(/localhost|SSRF|blocked/i);
59
+ expect(fetchImpl).not.toHaveBeenCalled();
60
+ });
61
+ });
62
+ describe('checkUrlsForEntries', () => {
63
+ it('aggregates ok=false when any URL fails', async () => {
64
+ const fetchImpl = vi.fn(async (url) => {
65
+ if (url.endsWith('/bad'))
66
+ return new Response(null, { status: 404 });
67
+ return new Response(null, { status: 200 });
68
+ });
69
+ const out = await checkUrlsForEntries([
70
+ { file: 'a.md', sourceUrls: ['https://example.com/good', 'https://example.com/bad'] },
71
+ ], { resolver: allowResolver, fetchImpl });
72
+ expect(out.ok).toBe(false);
73
+ expect(out.results.find((r) => r.url.endsWith('/bad'))?.ok).toBe(false);
74
+ });
75
+ });
76
+ //# sourceMappingURL=link-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-check.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/link-check.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGlE,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,eAAe,CAAC,CAAA;AAEnD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAyB,CAAA;QAChG,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAK,GAA8B,EAAE,CAAA;QAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,IAA6B,EAAE,EAAE;YAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACtE,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACjD,CAAC,CAAyB,CAAA;QAC1B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACjC,gEAAgE;YAChE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAyB,CAAA;QAC1B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;QAClG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACjC,GAAG,EAAE,CAAA;YACL,IAAI,GAAG,KAAK,CAAC;gBAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAA;YACzG,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAyB,CAAA;QAC1B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAA;QACjD,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,6BAA6B,EAAE;YACzD,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC;SAChE,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAA0B,CAAA;QACjD,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;QACzF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;QACnD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACpE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAyB,CAAA;QAC1B,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC;YACpC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,0BAA0B,EAAE,yBAAyB,CAAC,EAAE;SACtF,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}