@zxyycom/vibe-check 0.0.2 → 0.0.3

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 (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -1,4 +1,5 @@
1
1
  import { defineCheck } from "../../check/check.mjs";
2
+ import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
2
3
  import { MAINTENANCE_REMINDER_UNAVAILABLE_REASON, parseMaintenanceRemindersData } from "./final-data.mjs";
3
4
  import { runGit } from "./maintenance-support.mjs";
4
5
  import { exactRecord, validEntries, validGit } from "./options-validation.mjs";
@@ -11,51 +12,26 @@ const WHOLE_CHECK_UNAVAILABLE_CODE = Object.freeze({
11
12
  executionCancelled: "execution-cancelled",
12
13
  internalFailure: "maintenance-reminders-internal-failure"
13
14
  });
14
- /**
15
- * 创建一个固定 ID 的普通 Check,并在其局部最终数据中评估多条维护提醒。
16
- *
17
- * @remarks 构造函数只接收项目无法可靠推断的提醒政策;它补齐 Git 可执行文件、身份、可见性和直接执行逻辑。返回值仍是普通 Check,可按现有原生对象组合规则替换完整 `options` 分支。
18
- * @example 创建一个单一 Check 的维护提醒
19
- * ```ts
20
- * import { defineConfig, maintenanceReminders, run } from "@zxyycom/vibe-check";
21
- *
22
- * // 下列 baseCommit 都是示例占位值;实际使用时,每条都必须替换为该提醒最近一次真实复核对应的完整 commit ID。
23
- * const maintenance = maintenanceReminders([
24
- * {
25
- * id: "documentation-review",
26
- * baseCommit: "0123456789abcdef0123456789abcdef01234567",
27
- * limits: { commits: 40, changedLines: 2_000 },
28
- * message: "Review the documentation structure after this body of change."
29
- * },
30
- * {
31
- * id: "optimization-audit",
32
- * baseCommit: "89abcdef0123456789abcdef0123456789abcdef",
33
- * limits: { commits: 80 },
34
- * message: "Audit optimization quality before this becomes older.",
35
- * mode: "enforcing"
36
- * }
37
- * ]);
38
- *
39
- * const definition = defineConfig({
40
- * checks: [maintenance],
41
- * outputs: {
42
- * diagnosticLogging: { enabled: false },
43
- * machinePublication: { enabled: false },
44
- * progressRendering: { enabled: false }
45
- * }
46
- * });
47
- *
48
- * const result = await run(definition);
49
- * if (result.kind !== "completed") throw new Error(`Run did not complete: ${result.kind}`);
50
- * ```
51
- */
52
- export function maintenanceReminders(entries) {
15
+ export function maintenanceReminders(input) {
16
+ if (isMaintenanceReminderEntries(input)) {
17
+ return createMaintenanceRemindersCheck({
18
+ checkId: MAINTENANCE_REMINDERS_CHECK_ID,
19
+ displayName: "Maintenance reminders",
20
+ omitQuietPassedRow: true
21
+ }, input);
22
+ }
23
+ const resolvedInput = resolveMaintenanceRemindersInput(input);
24
+ if (resolvedInput === undefined) {
25
+ throw new TypeError("maintenanceReminders input must be entries or a closed { entries, checkId?, displayName?, enabledByFlags?, checks?, dependsOn?, observes?, maxParallel?, admissionPriority?, mutex?, resourceClaims?, omitQuietPassedRow? } object");
26
+ }
27
+ return createMaintenanceRemindersCheck(resolvedInput.definition, resolvedInput.entries);
28
+ }
29
+ function createMaintenanceRemindersCheck(definition, entries) {
53
30
  return defineCheck({
54
- checkId: MAINTENANCE_REMINDERS_CHECK_ID,
55
- displayName: "Maintenance reminders",
56
- execution: executeMaintenanceReminders,
31
+ ...definition,
32
+ execute: executeMaintenanceReminders,
57
33
  parseData: parseMaintenanceRemindersData,
58
- preflight: (options) => validMaintenanceReminderOptions(options)
34
+ prepare: (options) => validMaintenanceReminderOptions(options)
59
35
  ? { status: "success", preparedOptions: options }
60
36
  : {
61
37
  status: "failure",
@@ -72,9 +48,25 @@ export function maintenanceReminders(entries) {
72
48
  options: {
73
49
  entries,
74
50
  git: { executable: "git" }
75
- },
76
- visibility: "attention"
51
+ }
52
+ });
53
+ }
54
+ function isMaintenanceReminderEntries(input) {
55
+ return Array.isArray(input);
56
+ }
57
+ function resolveMaintenanceRemindersInput(input) {
58
+ const resolved = resolvePackageCheckAuthoringInput(input, ["entries"], {
59
+ checkId: MAINTENANCE_REMINDERS_CHECK_ID,
60
+ displayName: "Maintenance reminders",
61
+ omitQuietPassedRow: true
77
62
  });
63
+ if (resolved === undefined)
64
+ return undefined;
65
+ const entries = resolved.domainOptions.entries;
66
+ if (!Array.isArray(entries))
67
+ return undefined;
68
+ const reminderEntries = entries;
69
+ return Object.freeze({ definition: resolved.definition, entries: reminderEntries });
78
70
  }
79
71
  /** 在普通对象组合后验证完整的选项形状。 */
80
72
  export function validMaintenanceReminderOptions(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance-reminders.mjs","sourceRoot":"","sources":["../../../../src/package-checks/maintenance-reminders/maintenance-reminders.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineCheck,\n type CheckExecutionContext,\n type CheckResult,\n type TypedCheckWithOptions\n} from \"../../check/check.ts\";\nimport {\n MAINTENANCE_REMINDER_UNAVAILABLE_REASON,\n parseMaintenanceRemindersData,\n type MaintenanceReminderAssessment,\n type MaintenanceRemindersFinalData\n} from \"./final-data.ts\";\nimport { runGit } from \"./maintenance-support.ts\";\nimport { exactRecord, validEntries, validGit } from \"./options-validation.ts\";\nimport {\n completedResult,\n reminderEvaluation,\n unavailableAssessment,\n unavailableHistory,\n unavailableResult\n} from \"./assessment-results.ts\";\nimport { measureReminder, parseCommitId, parseFirstParentHistory } from \"./measurement.ts\";\n\nexport const MAINTENANCE_REMINDERS_CHECK_ID = \"maintenance-reminders\";\n\nconst MAINTENANCE_REMINDER_OPTION_KEYS: readonly string[] = [\"entries\", \"git\"];\nconst WHOLE_CHECK_UNAVAILABLE_CODE = Object.freeze({\n invalidOptions: \"invalid-options\",\n executionCancelled: \"execution-cancelled\",\n internalFailure: \"maintenance-reminders-internal-failure\"\n});\n\n/** 一项维护提醒的项目政策输入。 */\nexport interface MaintenanceReminder {\n /** 在同一次构造函数调用中唯一的小写短横线命名局部标识。 */\n readonly id: string;\n /** 维护者在完成真实复核后手动推进的不可变完整 Git commit ID。 */\n readonly baseCommit: string;\n /** 超过任一已配置上限时触发该提醒。 */\n readonly limits: Readonly<{\n /** 从基线到 `HEAD` 的 `first-parent` 提交数上限。 */\n readonly commits?: number;\n /** 从基线到 `HEAD` 的累计 Git `numstat` 增加行加删除行上限。 */\n readonly changedLines?: number;\n }>;\n /** 到期或无法评估时展示给人的非空提醒正文。 */\n readonly message: string;\n /** 省略时只提示;`enforcing` 会使到期或不可测量的条目令所属 Check 失败。 */\n readonly mode?: \"advisory\" | \"enforcing\";\n}\n\n/** `maintenanceReminders` 生成且完全由 Check 持有的选项。 */\nexport interface MaintenanceReminderOptions {\n /** 保留作者声明顺序的提醒政策条目。 */\n readonly entries: readonly MaintenanceReminder[];\n /** 执行已提交历史测量的 Git 可执行文件。 */\n readonly git: Readonly<{\n readonly executable: string;\n }>;\n}\n\n/** `maintenance-reminders` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type MaintenanceRemindersUnavailableCode =\n (typeof WHOLE_CHECK_UNAVAILABLE_CODE)[keyof typeof WHOLE_CHECK_UNAVAILABLE_CODE];\nexport type FirstParentHistoryUnavailableReason =\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryInvalid\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryUnavailable\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headInvalid\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headUnavailable;\n\nexport type ReminderEvaluation = Readonly<{\n readonly assessment: MaintenanceReminderAssessment;\n readonly message: string;\n}>;\n\nexport type GitCommandResult =\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"failed\" }>\n | Readonly<{ readonly kind: \"succeeded\"; readonly stdout: string }>;\n\nexport type FirstParentHistory = Readonly<{\n readonly commits: readonly string[];\n readonly headCommit: string;\n}>;\n\nexport type FirstParentHistoryResolution =\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"unavailable\"; readonly reason: FirstParentHistoryUnavailableReason }>\n | Readonly<{ readonly kind: \"succeeded\"; readonly value: FirstParentHistory }>;\n\nexport type ReminderMeasurement =\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"succeeded\"; readonly value: ReminderEvaluation }>;\n\n/**\n * 创建一个固定 ID 的普通 Check,并在其局部最终数据中评估多条维护提醒。\n *\n * @remarks 构造函数只接收项目无法可靠推断的提醒政策;它补齐 Git 可执行文件、身份、可见性和直接执行逻辑。返回值仍是普通 Check,可按现有原生对象组合规则替换完整 `options` 分支。\n * @example 创建一个单一 Check 的维护提醒\n * ```ts\n * import { defineConfig, maintenanceReminders, run } from \"@zxyycom/vibe-check\";\n *\n * // 下列 baseCommit 都是示例占位值;实际使用时,每条都必须替换为该提醒最近一次真实复核对应的完整 commit ID。\n * const maintenance = maintenanceReminders([\n * {\n * id: \"documentation-review\",\n * baseCommit: \"0123456789abcdef0123456789abcdef01234567\",\n * limits: { commits: 40, changedLines: 2_000 },\n * message: \"Review the documentation structure after this body of change.\"\n * },\n * {\n * id: \"optimization-audit\",\n * baseCommit: \"89abcdef0123456789abcdef0123456789abcdef\",\n * limits: { commits: 80 },\n * message: \"Audit optimization quality before this becomes older.\",\n * mode: \"enforcing\"\n * }\n * ]);\n *\n * const definition = defineConfig({\n * checks: [maintenance],\n * outputs: {\n * diagnosticLogging: { enabled: false },\n * machinePublication: { enabled: false },\n * progressRendering: { enabled: false }\n * }\n * });\n *\n * const result = await run(definition);\n * if (result.kind !== \"completed\") throw new Error(`Run did not complete: ${result.kind}`);\n * ```\n */\nexport function maintenanceReminders(\n entries: readonly MaintenanceReminder[]\n): TypedCheckWithOptions<\n typeof MAINTENANCE_REMINDERS_CHECK_ID,\n MaintenanceReminderOptions,\n typeof parseMaintenanceRemindersData\n> {\n return defineCheck({\n checkId: MAINTENANCE_REMINDERS_CHECK_ID,\n displayName: \"Maintenance reminders\",\n execution: executeMaintenanceReminders,\n parseData: parseMaintenanceRemindersData,\n preflight: (options) =>\n validMaintenanceReminderOptions(options)\n ? { status: \"success\", preparedOptions: options }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"maintenanceReminders options are invalid; recreate the Check with maintenanceReminders(entries) or restore its complete resolved options.\"\n }\n ]\n },\n options: {\n entries,\n git: { executable: \"git\" }\n },\n visibility: \"attention\"\n });\n}\n\n/** 在普通对象组合后验证完整的选项形状。 */\nexport function validMaintenanceReminderOptions(\n value: unknown\n): value is MaintenanceReminderOptions {\n const options = exactRecord(value, MAINTENANCE_REMINDER_OPTION_KEYS);\n return options !== undefined && validEntries(options.entries) && validGit(options.git);\n}\n\nasync function executeMaintenanceReminders(\n context: CheckExecutionContext<MaintenanceReminderOptions>\n): Promise<CheckResult<MaintenanceRemindersFinalData>> {\n if (!validMaintenanceReminderOptions(context.options))\n return unavailableResult(\"invalid-options\");\n if (context.signal.aborted)\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.executionCancelled);\n\n try {\n const history = await resolveFirstParentHistory({\n executable: context.options.git.executable,\n projectRoot: context.project.root,\n signal: context.signal\n });\n if (history.kind === \"cancelled\") {\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.executionCancelled);\n }\n\n if (history.kind === \"unavailable\") {\n return completedResult(\n context.options.entries.map((entry) =>\n reminderEvaluation(entry, unavailableAssessment(entry, null, history.reason))\n )\n );\n }\n\n const evaluations: ReminderEvaluation[] = [];\n for (const entry of context.options.entries) {\n const measurement = await measureReminder({\n entry,\n executable: context.options.git.executable,\n history: history.value,\n projectRoot: context.project.root,\n signal: context.signal\n });\n if (measurement.kind === \"cancelled\") {\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.executionCancelled);\n }\n evaluations.push(measurement.value);\n }\n return completedResult(evaluations);\n } catch {\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.internalFailure);\n }\n}\n\nasync function resolveFirstParentHistory(input: {\n readonly executable: string;\n readonly projectRoot: string;\n readonly signal: AbortSignal;\n}): Promise<FirstParentHistoryResolution> {\n const head = await runGit({\n args: [\"rev-parse\", \"--verify\", \"HEAD^{commit}\"],\n executable: input.executable,\n projectRoot: input.projectRoot,\n signal: input.signal\n });\n if (head.kind === \"cancelled\") return head;\n if (head.kind === \"failed\")\n return unavailableHistory(MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headUnavailable);\n\n const headCommit = parseCommitId(head.stdout);\n if (headCommit === null)\n return unavailableHistory(MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headInvalid);\n\n const history = await runGit({\n args: [\"rev-list\", \"--first-parent\", \"HEAD\"],\n executable: input.executable,\n projectRoot: input.projectRoot,\n signal: input.signal\n });\n if (history.kind === \"cancelled\") return history;\n if (history.kind === \"failed\") {\n return unavailableHistory(\n MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryUnavailable\n );\n }\n\n const firstParentHistory = parseFirstParentHistory(history.stdout, headCommit);\n if (firstParentHistory === undefined) {\n return unavailableHistory(MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryInvalid);\n }\n\n return {\n kind: \"succeeded\",\n value: firstParentHistory\n };\n}\n"]}
1
+ {"version":3,"file":"maintenance-reminders.mjs","sourceRoot":"","sources":["../../../../src/package-checks/maintenance-reminders/maintenance-reminders.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineCheck,\n type CheckExecutionContext,\n type CheckResult,\n type TypedCheckWithOptions\n} from \"../../check/check.ts\";\nimport {\n resolvePackageCheckAuthoringInput,\n type PackageCheckAuthoringOptions,\n type PackageCheckIdentityInput\n} from \"../check-authoring.ts\";\nimport {\n MAINTENANCE_REMINDER_UNAVAILABLE_REASON,\n parseMaintenanceRemindersData,\n type MaintenanceReminderAssessment,\n type MaintenanceRemindersFinalData\n} from \"./final-data.ts\";\nimport { runGit } from \"./maintenance-support.ts\";\nimport { exactRecord, validEntries, validGit } from \"./options-validation.ts\";\nimport {\n completedResult,\n reminderEvaluation,\n unavailableAssessment,\n unavailableHistory,\n unavailableResult\n} from \"./assessment-results.ts\";\nimport { measureReminder, parseCommitId, parseFirstParentHistory } from \"./measurement.ts\";\n\nexport const MAINTENANCE_REMINDERS_CHECK_ID = \"maintenance-reminders\";\n\nconst MAINTENANCE_REMINDER_OPTION_KEYS: readonly string[] = [\"entries\", \"git\"];\nconst WHOLE_CHECK_UNAVAILABLE_CODE = Object.freeze({\n invalidOptions: \"invalid-options\",\n executionCancelled: \"execution-cancelled\",\n internalFailure: \"maintenance-reminders-internal-failure\"\n});\n\n/** 一项维护提醒的项目政策输入。 */\nexport interface MaintenanceReminder {\n /** 在同一次构造函数调用中唯一的小写短横线命名局部标识。 */\n readonly id: string;\n /** 维护者在完成真实复核后手动推进的不可变完整 Git commit ID。 */\n readonly baseCommit: string;\n /** 超过任一已配置上限时触发该提醒。 */\n readonly limits: Readonly<{\n /** 从基线到 `HEAD` 的 `first-parent` 提交数上限。 */\n readonly commits?: number;\n /** 从基线到 `HEAD` 的累计 Git `numstat` 增加行加删除行上限。 */\n readonly changedLines?: number;\n }>;\n /** 到期或无法评估时展示给人的非空提醒正文。 */\n readonly message: string;\n /** 省略时只提示;`enforcing` 会使到期或不可测量的条目令所属 Check 失败。 */\n readonly mode?: \"advisory\" | \"enforcing\";\n}\n\n/** `maintenanceReminders` 生成且完全由 Check 持有的选项。 */\nexport interface MaintenanceReminderOptions {\n /** 保留作者声明顺序的提醒政策条目。 */\n readonly entries: readonly MaintenanceReminder[];\n /** 执行已提交历史测量的 Git 可执行文件。 */\n readonly git: Readonly<{\n readonly executable: string;\n }>;\n}\n\n/** `maintenanceReminders` 的对象式构造输入,组合提醒政策与项目 Check 声明。 */\nexport interface MaintenanceRemindersInput<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 保留作者声明顺序的提醒政策条目。 */\n readonly entries: readonly MaintenanceReminder[];\n}\n\n/** `maintenance-reminders` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type MaintenanceRemindersUnavailableCode =\n (typeof WHOLE_CHECK_UNAVAILABLE_CODE)[keyof typeof WHOLE_CHECK_UNAVAILABLE_CODE];\nexport type FirstParentHistoryUnavailableReason =\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryInvalid\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryUnavailable\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headInvalid\n | typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headUnavailable;\n\nexport type ReminderEvaluation = Readonly<{\n readonly assessment: MaintenanceReminderAssessment;\n readonly message: string;\n}>;\n\nexport type GitCommandResult =\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"failed\" }>\n | Readonly<{ readonly kind: \"succeeded\"; readonly stdout: string }>;\n\nexport type FirstParentHistory = Readonly<{\n readonly commits: readonly string[];\n readonly headCommit: string;\n}>;\n\nexport type FirstParentHistoryResolution =\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"unavailable\"; readonly reason: FirstParentHistoryUnavailableReason }>\n | Readonly<{ readonly kind: \"succeeded\"; readonly value: FirstParentHistory }>;\n\nexport type ReminderMeasurement =\n | Readonly<{ readonly kind: \"cancelled\" }>\n | Readonly<{ readonly kind: \"succeeded\"; readonly value: ReminderEvaluation }>;\n\n/**\n * 创建一个维护提醒普通 Check,并在其局部最终数据中评估多条维护提醒。\n *\n * @remarks 传入 entries 数组会保留默认 identity;对象输入可同时声明项目 Check 字段。构造函数补齐 Git 可执行文件、默认展示和直接执行逻辑,返回值仍是普通 Check,可按现有原生对象组合规则替换完整 `options` 分支。\n * @example 创建一个单一 Check 的维护提醒\n * ```ts\n * import { defineConfig, maintenanceReminders, run } from \"@zxyycom/vibe-check\";\n *\n * // 下列 baseCommit 都是示例占位值;实际使用时,每条都必须替换为该提醒最近一次真实复核对应的完整 commit ID。\n * const maintenance = maintenanceReminders([\n * {\n * id: \"documentation-review\",\n * baseCommit: \"0123456789abcdef0123456789abcdef01234567\",\n * limits: { commits: 40, changedLines: 2_000 },\n * message: \"Review the documentation structure after this body of change.\"\n * },\n * {\n * id: \"optimization-audit\",\n * baseCommit: \"89abcdef0123456789abcdef0123456789abcdef\",\n * limits: { commits: 80 },\n * message: \"Audit optimization quality before this becomes older.\",\n * mode: \"enforcing\"\n * }\n * ]);\n *\n * const definition = defineConfig({\n * checks: [maintenance],\n * outputs: {\n * diagnosticLogging: { enabled: false },\n * machinePublication: { enabled: false },\n * progressRendering: { enabled: false }\n * }\n * });\n *\n * const result = await run(definition);\n * if (result.kind !== \"completed\") throw new Error(`Run did not complete: ${result.kind}`);\n * ```\n */\nexport function maintenanceReminders(\n entries: readonly MaintenanceReminder[]\n): TypedCheckWithOptions<\n typeof MAINTENANCE_REMINDERS_CHECK_ID,\n MaintenanceReminderOptions,\n typeof parseMaintenanceRemindersData\n>;\nexport function maintenanceReminders(\n input: MaintenanceRemindersInput<typeof MAINTENANCE_REMINDERS_CHECK_ID>\n): TypedCheckWithOptions<\n typeof MAINTENANCE_REMINDERS_CHECK_ID,\n MaintenanceReminderOptions,\n typeof parseMaintenanceRemindersData\n>;\nexport function maintenanceReminders<const Id extends string>(\n input: MaintenanceRemindersInput<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<Id, MaintenanceReminderOptions, typeof parseMaintenanceRemindersData>;\nexport function maintenanceReminders(\n input: MaintenanceRemindersInput\n): TypedCheckWithOptions<string, MaintenanceReminderOptions, typeof parseMaintenanceRemindersData>;\nexport function maintenanceReminders(\n input: readonly MaintenanceReminder[] | MaintenanceRemindersInput\n): TypedCheckWithOptions<string, MaintenanceReminderOptions, typeof parseMaintenanceRemindersData> {\n if (isMaintenanceReminderEntries(input)) {\n return createMaintenanceRemindersCheck(\n {\n checkId: MAINTENANCE_REMINDERS_CHECK_ID,\n displayName: \"Maintenance reminders\",\n omitQuietPassedRow: true\n },\n input\n );\n }\n const resolvedInput = resolveMaintenanceRemindersInput(input);\n if (resolvedInput === undefined) {\n throw new TypeError(\n \"maintenanceReminders input must be entries or a closed { entries, checkId?, displayName?, enabledByFlags?, checks?, dependsOn?, observes?, maxParallel?, admissionPriority?, mutex?, resourceClaims?, omitQuietPassedRow? } object\"\n );\n }\n return createMaintenanceRemindersCheck(resolvedInput.definition, resolvedInput.entries);\n}\n\ntype PackageCheckDefinition<Id extends string> = NonNullable<\n ReturnType<typeof resolvePackageCheckAuthoringInput<Id>>\n>[\"definition\"];\n\nfunction createMaintenanceRemindersCheck<Id extends string>(\n definition: PackageCheckDefinition<Id>,\n entries: readonly MaintenanceReminder[]\n): TypedCheckWithOptions<Id, MaintenanceReminderOptions, typeof parseMaintenanceRemindersData> {\n return defineCheck({\n ...definition,\n execute: executeMaintenanceReminders,\n parseData: parseMaintenanceRemindersData,\n prepare: (options) =>\n validMaintenanceReminderOptions(options)\n ? { status: \"success\", preparedOptions: options }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"maintenanceReminders options are invalid; recreate the Check with maintenanceReminders(entries) or restore its complete resolved options.\"\n }\n ]\n },\n options: {\n entries,\n git: { executable: \"git\" }\n }\n });\n}\n\nfunction isMaintenanceReminderEntries(\n input: readonly MaintenanceReminder[] | MaintenanceRemindersInput\n): input is readonly MaintenanceReminder[] {\n return Array.isArray(input);\n}\n\nfunction resolveMaintenanceRemindersInput<Id extends string>(\n input: MaintenanceRemindersInput<Id>\n):\n | Readonly<{\n readonly definition: PackageCheckDefinition<Id>;\n readonly entries: readonly MaintenanceReminder[];\n }>\n | undefined {\n const resolved = resolvePackageCheckAuthoringInput(input, [\"entries\"], {\n checkId: MAINTENANCE_REMINDERS_CHECK_ID,\n displayName: \"Maintenance reminders\",\n omitQuietPassedRow: true\n });\n if (resolved === undefined) return undefined;\n const entries = resolved.domainOptions.entries;\n if (!Array.isArray(entries)) return undefined;\n const reminderEntries: readonly MaintenanceReminder[] = entries;\n return Object.freeze({ definition: resolved.definition, entries: reminderEntries });\n}\n\n/** 在普通对象组合后验证完整的选项形状。 */\nexport function validMaintenanceReminderOptions(\n value: unknown\n): value is MaintenanceReminderOptions {\n const options = exactRecord(value, MAINTENANCE_REMINDER_OPTION_KEYS);\n return options !== undefined && validEntries(options.entries) && validGit(options.git);\n}\n\nasync function executeMaintenanceReminders(\n context: CheckExecutionContext<MaintenanceReminderOptions>\n): Promise<CheckResult<MaintenanceRemindersFinalData>> {\n if (!validMaintenanceReminderOptions(context.options))\n return unavailableResult(\"invalid-options\");\n if (context.signal.aborted)\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.executionCancelled);\n\n try {\n const history = await resolveFirstParentHistory({\n executable: context.options.git.executable,\n projectRoot: context.project.root,\n signal: context.signal\n });\n if (history.kind === \"cancelled\") {\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.executionCancelled);\n }\n\n if (history.kind === \"unavailable\") {\n return completedResult(\n context.options.entries.map((entry) =>\n reminderEvaluation(entry, unavailableAssessment(entry, null, history.reason))\n )\n );\n }\n\n const evaluations: ReminderEvaluation[] = [];\n for (const entry of context.options.entries) {\n const measurement = await measureReminder({\n entry,\n executable: context.options.git.executable,\n history: history.value,\n projectRoot: context.project.root,\n signal: context.signal\n });\n if (measurement.kind === \"cancelled\") {\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.executionCancelled);\n }\n evaluations.push(measurement.value);\n }\n return completedResult(evaluations);\n } catch {\n return unavailableResult(WHOLE_CHECK_UNAVAILABLE_CODE.internalFailure);\n }\n}\n\nasync function resolveFirstParentHistory(input: {\n readonly executable: string;\n readonly projectRoot: string;\n readonly signal: AbortSignal;\n}): Promise<FirstParentHistoryResolution> {\n const head = await runGit({\n args: [\"rev-parse\", \"--verify\", \"HEAD^{commit}\"],\n executable: input.executable,\n projectRoot: input.projectRoot,\n signal: input.signal\n });\n if (head.kind === \"cancelled\") return head;\n if (head.kind === \"failed\")\n return unavailableHistory(MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headUnavailable);\n\n const headCommit = parseCommitId(head.stdout);\n if (headCommit === null)\n return unavailableHistory(MAINTENANCE_REMINDER_UNAVAILABLE_REASON.headInvalid);\n\n const history = await runGit({\n args: [\"rev-list\", \"--first-parent\", \"HEAD\"],\n executable: input.executable,\n projectRoot: input.projectRoot,\n signal: input.signal\n });\n if (history.kind === \"cancelled\") return history;\n if (history.kind === \"failed\") {\n return unavailableHistory(\n MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryUnavailable\n );\n }\n\n const firstParentHistory = parseFirstParentHistory(history.stdout, headCommit);\n if (firstParentHistory === undefined) {\n return unavailableHistory(MAINTENANCE_REMINDER_UNAVAILABLE_REASON.firstParentHistoryInvalid);\n }\n\n return {\n kind: \"succeeded\",\n value: firstParentHistory\n };\n}\n"]}
@@ -41,7 +41,9 @@ export async function runGit(input) {
41
41
  }
42
42
  stdout += text;
43
43
  });
44
- child.once("error", () => settle(input.signal.aborted ? { kind: "cancelled" } : { kind: "failed" }));
44
+ child.once("error", () => {
45
+ settle(input.signal.aborted ? { kind: "cancelled" } : { kind: "failed" });
46
+ });
45
47
  child.once("close", (status) => {
46
48
  if (input.signal.aborted) {
47
49
  settle({ kind: "cancelled" });
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance-support.mjs","sourceRoot":"","sources":["../../../../src/package-checks/maintenance-reminders/maintenance-support.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\n\nimport type { GitCommandResult } from \"./maintenance-reminders.ts\";\n\nconst MAX_GIT_OUTPUT_BYTES = 64 * 1024 * 1024;\n\nexport async function runGit(input: {\n readonly args: readonly string[];\n readonly executable: string;\n readonly projectRoot: string;\n readonly signal: AbortSignal;\n}): Promise<GitCommandResult> {\n if (input.signal.aborted) return { kind: \"cancelled\" };\n\n return new Promise((resolve) => {\n let settled = false;\n let outputBytes = 0;\n let stdout = \"\";\n let overflowed = false;\n let child: ReturnType<typeof spawn>;\n\n const settle = (result: GitCommandResult): void => {\n if (settled) return;\n settled = true;\n input.signal.removeEventListener(\"abort\", abort);\n resolve(result);\n };\n const abort = (): void => {\n child.kill(\"SIGTERM\");\n };\n\n try {\n child = spawn(input.executable, input.args, {\n cwd: input.projectRoot,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n windowsHide: true\n });\n } catch {\n settle({ kind: \"failed\" });\n return;\n }\n\n input.signal.addEventListener(\"abort\", abort, { once: true });\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n const text = String(chunk);\n outputBytes += Buffer.byteLength(text);\n if (outputBytes > MAX_GIT_OUTPUT_BYTES) {\n overflowed = true;\n child.kill(\"SIGTERM\");\n return;\n }\n stdout += text;\n });\n child.once(\"error\", () =>\n settle(input.signal.aborted ? { kind: \"cancelled\" } : { kind: \"failed\" })\n );\n child.once(\"close\", (status) => {\n if (input.signal.aborted) {\n settle({ kind: \"cancelled\" });\n } else if (overflowed || status !== 0) {\n settle({ kind: \"failed\" });\n } else {\n settle({ kind: \"succeeded\", stdout });\n }\n });\n });\n}\n"]}
1
+ {"version":3,"file":"maintenance-support.mjs","sourceRoot":"","sources":["../../../../src/package-checks/maintenance-reminders/maintenance-support.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\n\nimport type { GitCommandResult } from \"./maintenance-reminders.ts\";\n\nconst MAX_GIT_OUTPUT_BYTES = 64 * 1024 * 1024;\n\nexport async function runGit(input: {\n readonly args: readonly string[];\n readonly executable: string;\n readonly projectRoot: string;\n readonly signal: AbortSignal;\n}): Promise<GitCommandResult> {\n if (input.signal.aborted) return { kind: \"cancelled\" };\n\n return new Promise((resolve) => {\n let settled = false;\n let outputBytes = 0;\n let stdout = \"\";\n let overflowed = false;\n let child: ReturnType<typeof spawn>;\n\n const settle = (result: GitCommandResult): void => {\n if (settled) return;\n settled = true;\n input.signal.removeEventListener(\"abort\", abort);\n resolve(result);\n };\n const abort = (): void => {\n child.kill(\"SIGTERM\");\n };\n\n try {\n child = spawn(input.executable, input.args, {\n cwd: input.projectRoot,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n windowsHide: true\n });\n } catch {\n settle({ kind: \"failed\" });\n return;\n }\n\n input.signal.addEventListener(\"abort\", abort, { once: true });\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n const text = String(chunk);\n outputBytes += Buffer.byteLength(text);\n if (outputBytes > MAX_GIT_OUTPUT_BYTES) {\n overflowed = true;\n child.kill(\"SIGTERM\");\n return;\n }\n stdout += text;\n });\n child.once(\"error\", () => {\n settle(input.signal.aborted ? { kind: \"cancelled\" } : { kind: \"failed\" });\n });\n child.once(\"close\", (status) => {\n if (input.signal.aborted) {\n settle({ kind: \"cancelled\" });\n } else if (overflowed || status !== 0) {\n settle({ kind: \"failed\" });\n } else {\n settle({ kind: \"succeeded\", stdout });\n }\n });\n });\n}\n"]}
@@ -1,47 +1,33 @@
1
1
  import { defineCheck } from "../../check/check.mjs";
2
+ import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
2
3
  import { MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION, executeMarkdownLinkValidation } from "./execution.mjs";
3
4
  import { parseMarkdownLinkValidationData } from "./final-data.mjs";
4
5
  import { resolveMarkdownLinkValidationOptions } from "./options-resolution.mjs";
5
6
  import { validMarkdownLinkValidationOptions } from "./options-validation.mjs";
6
- /**
7
- * 使用可省略的 source、target 与 work-limit policy 构造离线 Markdown 引用 Check。
8
- *
9
- * @param options - 省略字段由 package 补齐;files 数组是完整替换值,limits fields 可分别省略;cache 省略时关闭,启用时由调用方提供 absolute、可信且可删除的 directory,其中本 Check 只维护一个 source-derived JSONL local state;调用方负责容量和删除,cache 不可用不改变 Check 结果。
10
- * @returns 固定 `markdown-link-validation` identity、完整冻结 options、parser 与执行逻辑。
11
- * @throws {TypeError} input 含未知字段、非法 target policy、cache branch/directory 或非法 work limit 时抛出。
12
- * @example 离线 Markdown 本地链接完整性
13
- * ```ts
14
- * import { defineConfig, markdownLinkValidation, run } from "@zxyycom/vibe-check";
15
- *
16
- * // 此调用方自有目录是 absolute、可删除的,并且可能保存 source-derived parse facts。
17
- * const cacheDirectory = new URL(".vibe-check/markdown-link-parse-cache", import.meta.url).pathname;
18
- * const definition = defineConfig({
19
- * checks: [
20
- * markdownLinkValidation({
21
- * cache: { enabled: true, directory: cacheDirectory }
22
- * })
23
- * ],
24
- * outputs: {
25
- * diagnosticLogging: { enabled: false },
26
- * machinePublication: { enabled: false },
27
- * progressRendering: { enabled: false }
28
- * }
29
- * });
30
- *
31
- * const result = await run(definition);
32
- * if (result.kind !== "completed") throw new Error(`Run did not complete: ${result.kind}`);
33
- * ```
34
- */
35
7
  export function markdownLinkValidation(options = {}) {
36
- const resolvedOptions = resolveMarkdownLinkValidationOptions(options);
8
+ const input = resolvePackageCheckAuthoringInput(options, [
9
+ "files",
10
+ "findingPolicy",
11
+ "requireExistingTargets",
12
+ "validateSameDocumentAnchors",
13
+ "validateCrossDocumentAnchors",
14
+ "rootExternalTargetMode",
15
+ "requireNonEmptyDirectories",
16
+ "limits",
17
+ "cache"
18
+ ], MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION);
19
+ if (input === undefined) {
20
+ throw new TypeError("markdownLinkValidation options must match the documented closed policy");
21
+ }
22
+ const resolvedOptions = resolveMarkdownLinkValidationOptions(input.domainOptions);
37
23
  if (resolvedOptions === undefined) {
38
24
  throw new TypeError("markdownLinkValidation options must match the documented closed policy");
39
25
  }
40
26
  return defineCheck({
41
- ...MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION,
42
- execution: executeMarkdownLinkValidation,
27
+ ...input.definition,
28
+ execute: executeMarkdownLinkValidation,
43
29
  parseData: parseMarkdownLinkValidationData,
44
- preflight: (preparedOptions) => validMarkdownLinkValidationOptions(preparedOptions)
30
+ prepare: (preparedOptions) => validMarkdownLinkValidationOptions(preparedOptions)
45
31
  ? { status: "success", preparedOptions }
46
32
  : {
47
33
  status: "failure",
@@ -1 +1 @@
1
- {"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,yCAAyC,EACzC,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,EAAE,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAO,GAAkC,EAAE;IAM3C,MAAM,eAAe,GAAG,oCAAoC,CAAC,OAAO,CAAC,CAAC;IACtE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,wEAAwE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,yCAAyC;QAC5C,SAAS,EAAE,6BAA6B;QACxC,SAAS,EAAE,+BAA+B;QAC1C,SAAS,EAAE,CAAC,eAAe,EAAE,EAAE,CAC7B,kCAAkC,CAAC,eAAe,CAAC;YACjD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,+IAA+I;qBAClJ;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport {\n MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION,\n executeMarkdownLinkValidation\n} from \"./execution.ts\";\nimport { parseMarkdownLinkValidationData } from \"./final-data.ts\";\nimport type {\n MarkdownLinkValidationOptions,\n ResolvedMarkdownLinkValidationOptions\n} from \"./options.ts\";\nimport { resolveMarkdownLinkValidationOptions } from \"./options-resolution.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的 source、target 与 work-limit policy 构造离线 Markdown 引用 Check。\n *\n * @param options - 省略字段由 package 补齐;files 数组是完整替换值,limits fields 可分别省略;cache 省略时关闭,启用时由调用方提供 absolute、可信且可删除的 directory,其中本 Check 只维护一个 source-derived JSONL local state;调用方负责容量和删除,cache 不可用不改变 Check 结果。\n * @returns 固定 `markdown-link-validation` identity、完整冻结 options、parser 与执行逻辑。\n * @throws {TypeError} input 含未知字段、非法 target policy、cache branch/directory 或非法 work limit 时抛出。\n * @example 离线 Markdown 本地链接完整性\n * ```ts\n * import { defineConfig, markdownLinkValidation, run } from \"@zxyycom/vibe-check\";\n *\n * // 此调用方自有目录是 absolute、可删除的,并且可能保存 source-derived parse facts。\n * const cacheDirectory = new URL(\".vibe-check/markdown-link-parse-cache\", import.meta.url).pathname;\n * const definition = defineConfig({\n * checks: [\n * markdownLinkValidation({\n * cache: { enabled: true, directory: cacheDirectory }\n * })\n * ],\n * outputs: {\n * diagnosticLogging: { enabled: false },\n * machinePublication: { enabled: false },\n * progressRendering: { enabled: false }\n * }\n * });\n *\n * const result = await run(definition);\n * if (result.kind !== \"completed\") throw new Error(`Run did not complete: ${result.kind}`);\n * ```\n */\nexport function markdownLinkValidation(\n options: MarkdownLinkValidationOptions = {}\n): TypedCheckWithOptions<\n \"markdown-link-validation\",\n ResolvedMarkdownLinkValidationOptions,\n typeof parseMarkdownLinkValidationData\n> {\n const resolvedOptions = resolveMarkdownLinkValidationOptions(options);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"markdownLinkValidation options must match the documented closed policy\");\n }\n return defineCheck({\n ...MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION,\n execution: executeMarkdownLinkValidation,\n parseData: parseMarkdownLinkValidationData,\n preflight: (preparedOptions) =>\n validMarkdownLinkValidationOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"markdownLinkValidation options are invalid; recreate the Check with markdownLinkValidation(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
1
+ {"version":3,"file":"default-check.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/default-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,iCAAiC,EAElC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yCAAyC,EACzC,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,EAAE,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAoD7E,MAAM,UAAU,sBAAsB,CACpC,OAAO,GAAkC,EAAE;IAM3C,MAAM,KAAK,GAAG,iCAAiC,CAC7C,OAAO,EACP;QACE,OAAO;QACP,eAAe;QACf,wBAAwB;QACxB,6BAA6B;QAC7B,8BAA8B;QAC9B,wBAAwB;QACxB,4BAA4B;QAC5B,QAAQ;QACR,OAAO;KACR,EACD,yCAAyC,CAC1C,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,wEAAwE,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,eAAe,GAAG,oCAAoC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAClF,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,wEAAwE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,OAAO,EAAE,6BAA6B;QACtC,SAAS,EAAE,+BAA+B;QAC1C,OAAO,EAAE,CAAC,eAAe,EAAE,EAAE,CAC3B,kCAAkC,CAAC,eAAe,CAAC;YACjD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,+IAA+I;qBAClJ;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport {\n resolvePackageCheckAuthoringInput,\n type PackageCheckIdentityInput\n} from \"../check-authoring.ts\";\nimport {\n MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION,\n executeMarkdownLinkValidation\n} from \"./execution.ts\";\nimport { parseMarkdownLinkValidationData } from \"./final-data.ts\";\nimport type {\n MarkdownLinkValidationOptions,\n ResolvedMarkdownLinkValidationOptions\n} from \"./options.ts\";\nimport { resolveMarkdownLinkValidationOptions } from \"./options-resolution.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的 source、target 与 work-limit policy 构造离线 Markdown 引用 Check。\n *\n * @param options - 省略字段由 package 补齐;files 数组是完整替换值,limits fields 可分别省略;cache 省略时关闭,启用时由调用方提供 absolute、可信且可删除的 directory,其中本 Check 只维护一个 source-derived JSONL local state;调用方负责容量和删除,cache 不可用不改变 Check 结果。\n * @returns 固定 `markdown-link-validation` identity、完整冻结 options、parser 与执行逻辑。\n * @throws {TypeError} input 含未知字段、非法 target policy、cache branch/directory 或非法 work limit 时抛出。\n * @example 离线 Markdown 本地链接完整性\n * ```ts\n * import { defineConfig, markdownLinkValidation, run } from \"@zxyycom/vibe-check\";\n *\n * // 此调用方自有目录是 absolute、可删除的,并且可能保存 source-derived parse facts。\n * const cacheDirectory = new URL(\".vibe-check/markdown-link-parse-cache\", import.meta.url).pathname;\n * const definition = defineConfig({\n * checks: [\n * markdownLinkValidation({\n * cache: { enabled: true, directory: cacheDirectory }\n * })\n * ],\n * outputs: {\n * diagnosticLogging: { enabled: false },\n * machinePublication: { enabled: false },\n * progressRendering: { enabled: false }\n * }\n * });\n *\n * const result = await run(definition);\n * if (result.kind !== \"completed\") throw new Error(`Run did not complete: ${result.kind}`);\n * ```\n */\nexport function markdownLinkValidation(\n options?: MarkdownLinkValidationOptions<\"markdown-link-validation\">\n): TypedCheckWithOptions<\n \"markdown-link-validation\",\n ResolvedMarkdownLinkValidationOptions,\n typeof parseMarkdownLinkValidationData\n>;\nexport function markdownLinkValidation<const Id extends string>(\n options: MarkdownLinkValidationOptions<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<\n Id,\n ResolvedMarkdownLinkValidationOptions,\n typeof parseMarkdownLinkValidationData\n>;\nexport function markdownLinkValidation(\n options: MarkdownLinkValidationOptions\n): TypedCheckWithOptions<\n string,\n ResolvedMarkdownLinkValidationOptions,\n typeof parseMarkdownLinkValidationData\n>;\nexport function markdownLinkValidation(\n options: MarkdownLinkValidationOptions = {}\n): TypedCheckWithOptions<\n string,\n ResolvedMarkdownLinkValidationOptions,\n typeof parseMarkdownLinkValidationData\n> {\n const input = resolvePackageCheckAuthoringInput(\n options,\n [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"limits\",\n \"cache\"\n ],\n MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION\n );\n if (input === undefined) {\n throw new TypeError(\"markdownLinkValidation options must match the documented closed policy\");\n }\n const resolvedOptions = resolveMarkdownLinkValidationOptions(input.domainOptions);\n if (resolvedOptions === undefined) {\n throw new TypeError(\"markdownLinkValidation options must match the documented closed policy\");\n }\n return defineCheck({\n ...input.definition,\n execute: executeMarkdownLinkValidation,\n parseData: parseMarkdownLinkValidationData,\n prepare: (preparedOptions) =>\n validMarkdownLinkValidationOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"markdownLinkValidation options are invalid; recreate the Check with markdownLinkValidation(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { collectProjectFiles } from "../project-files/collection.mjs";
3
3
  import { partitionProjectFilesByEligibility } from "../project-files/input-eligibility.mjs";
4
- import { appendCheckMessages } from "../../check/finding-presentation.mjs";
4
+ import { appendCheckMessages } from "../../package-tools/finding-presentation/finding-presentation.mjs";
5
5
  import { createMarkdownLocalResolver } from "./local-resolver.mjs";
6
6
  import { markdownFindingMessages } from "./finding-messages.mjs";
7
7
  import { buildMarkdownInputRejectedRecord, buildMarkdownLinkRecordCandidate } from "./records.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\n\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\nimport type { CheckExecutionContext, CheckResult } from \"../../check/check.ts\";\nimport { collectProjectFiles } from \"../project-files/collection.ts\";\nimport type { ProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { partitionProjectFilesByEligibility } from \"../project-files/input-eligibility.ts\";\nimport { appendCheckMessages } from \"../../check/finding-presentation.ts\";\nimport { createMarkdownLocalResolver, type MarkdownLocalResolver } from \"./local-resolver.ts\";\nimport type { MarkdownLinkValidationFinalData } from \"./final-data.ts\";\nimport { markdownFindingMessages } from \"./finding-messages.ts\";\nimport {\n buildMarkdownInputRejectedRecord,\n buildMarkdownLinkRecordCandidate,\n type MarkdownLinkRecordCandidate\n} from \"./records.ts\";\nimport { settledMarkdownTraversalResult } from \"./traversal-result.ts\";\nimport {\n markdownLinkUnavailableMessage,\n type MarkdownLinkValidationUnavailableReason\n} from \"./unavailable-reasons.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\nexport type { MarkdownLinkValidationUnavailableReason } from \"./unavailable-reasons.ts\";\n\nexport const MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION = {\n checkId: \"markdown-link-validation\",\n displayName: \"Markdown link validation\"\n} as const;\n\ninterface MarkdownLinkValidationRun {\n readonly options: ResolvedMarkdownLinkValidationOptions;\n readonly resolver: MarkdownLocalResolver;\n readonly signal: AbortSignal;\n}\n\ntype MarkdownLinkValidationUnavailable = Readonly<{\n readonly kind: \"unavailable\";\n readonly reason: MarkdownLinkValidationUnavailableReason;\n}>;\n\ntype MarkdownSourceDiscovery =\n | Readonly<{\n readonly kind: \"complete\";\n readonly rejectedPaths: readonly string[];\n readonly selectedPathCount: number;\n readonly sourcePaths: readonly string[];\n }>\n | MarkdownLinkValidationUnavailable;\n\ntype MarkdownSourceValidation =\n | Readonly<{\n readonly kind: \"complete\";\n readonly candidates: readonly MarkdownLinkRecordCandidate[];\n readonly occurrenceCount: number;\n }>\n | MarkdownLinkValidationUnavailable;\n\ntype MarkdownLinkTraversal =\n | Readonly<{\n readonly kind: \"complete\";\n readonly candidates: readonly MarkdownLinkRecordCandidate[];\n readonly occurrenceCount: number;\n readonly sourceFileCount: number;\n }>\n | MarkdownLinkValidationUnavailable;\n\n/** 验证本 Check 选中的 Markdown source 的离线本地链接完整性。 */\nexport async function executeMarkdownLinkValidation(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>\n): Promise<CheckResult<MarkdownLinkValidationFinalData>> {\n if (!validMarkdownLinkValidationOptions(context.options)) return unavailable(\"invalid-options\");\n const prepared = await prepareMarkdownTraversal(context);\n if (prepared.kind === \"result\") return prepared.result;\n const { rejectedPaths, traversal, resolver } = prepared;\n\n for (const candidate of traversal.candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n return appendCheckMessages(\n settledMarkdownTraversalResult({\n findingCount: traversal.candidates.length,\n findingPolicy: context.options.findingPolicy,\n occurrenceCount: traversal.occurrenceCount,\n rejectedInputCount: rejectedPaths.length,\n sourceFileCount: traversal.sourceFileCount,\n targetReadCount: resolver.targetReadCount\n }),\n markdownFindingMessages(\n traversal.candidates,\n rejectedPaths,\n context.options.findingPolicy === \"blocking\"\n )\n );\n}\n\ntype PreparedMarkdownTraversal =\n | Readonly<{\n readonly kind: \"result\";\n readonly result: CheckResult<MarkdownLinkValidationFinalData>;\n }>\n | Readonly<{\n readonly kind: \"traversal\";\n readonly rejectedPaths: readonly string[];\n readonly resolver: MarkdownLocalResolver;\n readonly traversal: Extract<MarkdownLinkTraversal, { readonly kind: \"complete\" }>;\n }>;\n\nasync function prepareMarkdownTraversal(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>\n): Promise<PreparedMarkdownTraversal> {\n if (context.signal.aborted) return result(unavailable(\"cancelled\"));\n const created = await createMarkdownLocalResolver(\n context.project.root,\n context.options.limits.maxTargetReads,\n context.options.cache,\n context.signal\n );\n if (!created.ok) return result(unavailable(created.reason));\n let prepared: PreparedMarkdownTraversal;\n try {\n prepared = await prepareCreatedMarkdownTraversal(context, created.resolver);\n } finally {\n await created.resolver.finalize();\n }\n return context.signal.aborted ? result(unavailable(\"cancelled\")) : prepared;\n}\n\nasync function prepareCreatedMarkdownTraversal(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>,\n resolver: MarkdownLocalResolver\n): Promise<PreparedMarkdownTraversal> {\n if (context.signal.aborted) return result(unavailable(\"cancelled\"));\n const sourceDiscovery = discoverMarkdownSourcePaths(context.project, context.options.files);\n if (sourceDiscovery.kind === \"unavailable\") return result(unavailable(sourceDiscovery.reason));\n if (sourceDiscovery.selectedPathCount === 0) return result(noEligibleInput());\n if (context.signal.aborted) return result(unavailable(\"cancelled\"));\n reportRejectedInputs(context, sourceDiscovery.rejectedPaths);\n const traversal = await traverseMarkdownSources(sourceDiscovery.sourcePaths, {\n resolver,\n options: context.options,\n signal: context.signal\n });\n if (traversal.kind === \"unavailable\") {\n return result(\n appendRejectedInputMessage(\n unavailable(traversal.reason),\n sourceDiscovery.rejectedPaths.length\n )\n );\n }\n if (context.signal.aborted) {\n return result(\n appendRejectedInputMessage(unavailable(\"cancelled\"), sourceDiscovery.rejectedPaths.length)\n );\n }\n return Object.freeze({\n kind: \"traversal\",\n rejectedPaths: sourceDiscovery.rejectedPaths,\n resolver,\n traversal\n });\n}\n\nfunction result(\n checkResult: CheckResult<MarkdownLinkValidationFinalData>\n): PreparedMarkdownTraversal {\n return Object.freeze({ kind: \"result\", result: checkResult });\n}\n\nfunction noEligibleInput(): CheckResult<MarkdownLinkValidationFinalData> {\n return Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } });\n}\n\nfunction discoverMarkdownSourcePaths(\n project: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>[\"project\"],\n files: ProjectFileSelection\n): MarkdownSourceDiscovery {\n try {\n const selectedPaths = collectProjectFiles(project.root, files);\n const partition = partitionProjectFilesByEligibility(selectedPaths, isMarkdownSourcePath);\n return Object.freeze({\n kind: \"complete\" as const,\n rejectedPaths: partition.rejectedPaths,\n selectedPathCount: selectedPaths.length,\n sourcePaths: partition.acceptedPaths\n });\n } catch {\n return unavailableValidation(\"source-unavailable\");\n }\n}\n\nfunction reportRejectedInputs(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>,\n paths: readonly string[]\n): void {\n for (const selectedPath of paths) {\n const record = buildMarkdownInputRejectedRecord(selectedPath);\n context.records.report({ id: record.id }, record.data);\n }\n}\n\nfunction appendRejectedInputMessage(\n checkResult: CheckResult<MarkdownLinkValidationFinalData>,\n rejectedInputCount: number\n): CheckResult<MarkdownLinkValidationFinalData> {\n if (rejectedInputCount === 0) return checkResult;\n return Object.freeze({\n ...checkResult,\n messages: Object.freeze([\n ...(checkResult.messages ?? []),\n Object.freeze({\n code: \"input-rejected\",\n level: \"warning\" as const,\n message: `${rejectedInputCount} selected markdownLinkValidation input file(s) were rejected because only .md/.markdown paths are supported; inspect this Check's Records and narrow files.include/exclude.`\n })\n ])\n });\n}\n\nfunction unavailableValidation(\n reason: MarkdownLinkValidationUnavailableReason\n): MarkdownLinkValidationUnavailable {\n return Object.freeze({ kind: \"unavailable\", reason });\n}\n\nasync function traverseMarkdownSources(\n sourcePaths: readonly string[],\n run: MarkdownLinkValidationRun\n): Promise<MarkdownLinkTraversal> {\n const candidates: MarkdownLinkRecordCandidate[] = [];\n let occurrenceCount = 0;\n let sourceFileCount = 0;\n\n // The Run's shared Scheduler owns cross-Check concurrency; this Check processes sources strictly in order.\n for (const sourcePath of sourcePaths) {\n const sourceValidation = await validateMarkdownSource(sourcePath, occurrenceCount, run);\n if (sourceValidation.kind === \"unavailable\") return sourceValidation;\n\n candidates.push(...sourceValidation.candidates);\n occurrenceCount = sourceValidation.occurrenceCount;\n sourceFileCount += 1;\n }\n\n return Object.freeze({\n kind: \"complete\" as const,\n candidates: Object.freeze(candidates),\n occurrenceCount,\n sourceFileCount\n });\n}\n\nasync function validateMarkdownSource(\n sourcePath: string,\n occurrenceCountBeforeSource: number,\n run: MarkdownLinkValidationRun\n): Promise<MarkdownSourceValidation> {\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n const sourceRead = await run.resolver.readSource(sourcePath, run.options.limits.maxMarkdownBytes);\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n if (!sourceRead.ok) return unavailableValidation(sourceRead.reason);\n\n const candidates: MarkdownLinkRecordCandidate[] = [];\n let occurrenceCount = occurrenceCountBeforeSource;\n for (const [occurrenceIndex, occurrence] of sourceRead.source.facts.occurrences.entries()) {\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n occurrenceCount += 1;\n if (occurrenceCount > run.options.limits.maxOccurrences) {\n return unavailableValidation(\"occurrence-limit-exceeded\");\n }\n\n const resolution = await run.resolver.resolve({\n source: sourceRead.source,\n rawDestination: occurrence.rawDestination,\n rootExternalTargetMode: run.options.rootExternalTargetMode,\n requireExistingTargets: run.options.requireExistingTargets,\n requireNonEmptyDirectories: run.options.requireNonEmptyDirectories,\n validateSameDocumentAnchors: run.options.validateSameDocumentAnchors,\n validateCrossDocumentAnchors: run.options.validateCrossDocumentAnchors,\n maxMarkdownBytes: run.options.limits.maxMarkdownBytes\n });\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n if (resolution.kind === \"unavailable\") return unavailableValidation(resolution.reason);\n const candidate = buildMarkdownLinkRecordCandidate(\n sourceRead.source.path,\n occurrenceIndex,\n occurrence,\n resolution\n );\n if (candidate !== undefined) candidates.push(candidate);\n }\n\n return Object.freeze({\n kind: \"complete\" as const,\n candidates: Object.freeze(candidates),\n occurrenceCount\n });\n}\n\nfunction isMarkdownSourcePath(filePath: string): boolean {\n const extension = path.extname(filePath).toLowerCase();\n return extension === \".md\" || extension === \".markdown\";\n}\n\nfunction unavailable(\n reason: MarkdownLinkValidationUnavailableReason\n): CheckResult<MarkdownLinkValidationFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code: reason },\n messages: Object.freeze([\n Object.freeze({\n code: reason,\n level: \"error\" as const,\n message: markdownLinkUnavailableMessage(reason)\n })\n ])\n });\n}\n"]}
1
+ {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\n\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\nimport type { CheckExecutionContext, CheckResult } from \"../../check/check.ts\";\nimport { collectProjectFiles } from \"../project-files/collection.ts\";\nimport type { ProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { partitionProjectFilesByEligibility } from \"../project-files/input-eligibility.ts\";\nimport { appendCheckMessages } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport { createMarkdownLocalResolver, type MarkdownLocalResolver } from \"./local-resolver.ts\";\nimport type { MarkdownLinkValidationFinalData } from \"./final-data.ts\";\nimport { markdownFindingMessages } from \"./finding-messages.ts\";\nimport {\n buildMarkdownInputRejectedRecord,\n buildMarkdownLinkRecordCandidate,\n type MarkdownLinkRecordCandidate\n} from \"./records.ts\";\nimport { settledMarkdownTraversalResult } from \"./traversal-result.ts\";\nimport {\n markdownLinkUnavailableMessage,\n type MarkdownLinkValidationUnavailableReason\n} from \"./unavailable-reasons.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\nexport type { MarkdownLinkValidationUnavailableReason } from \"./unavailable-reasons.ts\";\n\nexport const MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION = {\n checkId: \"markdown-link-validation\",\n displayName: \"Markdown link validation\"\n} as const;\n\ninterface MarkdownLinkValidationRun {\n readonly options: ResolvedMarkdownLinkValidationOptions;\n readonly resolver: MarkdownLocalResolver;\n readonly signal: AbortSignal;\n}\n\ntype MarkdownLinkValidationUnavailable = Readonly<{\n readonly kind: \"unavailable\";\n readonly reason: MarkdownLinkValidationUnavailableReason;\n}>;\n\ntype MarkdownSourceDiscovery =\n | Readonly<{\n readonly kind: \"complete\";\n readonly rejectedPaths: readonly string[];\n readonly selectedPathCount: number;\n readonly sourcePaths: readonly string[];\n }>\n | MarkdownLinkValidationUnavailable;\n\ntype MarkdownSourceValidation =\n | Readonly<{\n readonly kind: \"complete\";\n readonly candidates: readonly MarkdownLinkRecordCandidate[];\n readonly occurrenceCount: number;\n }>\n | MarkdownLinkValidationUnavailable;\n\ntype MarkdownLinkTraversal =\n | Readonly<{\n readonly kind: \"complete\";\n readonly candidates: readonly MarkdownLinkRecordCandidate[];\n readonly occurrenceCount: number;\n readonly sourceFileCount: number;\n }>\n | MarkdownLinkValidationUnavailable;\n\n/** 验证本 Check 选中的 Markdown source 的离线本地链接完整性。 */\nexport async function executeMarkdownLinkValidation(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>\n): Promise<CheckResult<MarkdownLinkValidationFinalData>> {\n if (!validMarkdownLinkValidationOptions(context.options)) return unavailable(\"invalid-options\");\n const prepared = await prepareMarkdownTraversal(context);\n if (prepared.kind === \"result\") return prepared.result;\n const { rejectedPaths, traversal, resolver } = prepared;\n\n for (const candidate of traversal.candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n return appendCheckMessages(\n settledMarkdownTraversalResult({\n findingCount: traversal.candidates.length,\n findingPolicy: context.options.findingPolicy,\n occurrenceCount: traversal.occurrenceCount,\n rejectedInputCount: rejectedPaths.length,\n sourceFileCount: traversal.sourceFileCount,\n targetReadCount: resolver.targetReadCount\n }),\n markdownFindingMessages(\n traversal.candidates,\n rejectedPaths,\n context.options.findingPolicy === \"blocking\"\n )\n );\n}\n\ntype PreparedMarkdownTraversal =\n | Readonly<{\n readonly kind: \"result\";\n readonly result: CheckResult<MarkdownLinkValidationFinalData>;\n }>\n | Readonly<{\n readonly kind: \"traversal\";\n readonly rejectedPaths: readonly string[];\n readonly resolver: MarkdownLocalResolver;\n readonly traversal: Extract<MarkdownLinkTraversal, { readonly kind: \"complete\" }>;\n }>;\n\nasync function prepareMarkdownTraversal(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>\n): Promise<PreparedMarkdownTraversal> {\n if (context.signal.aborted) return result(unavailable(\"cancelled\"));\n const created = await createMarkdownLocalResolver(\n context.project.root,\n context.options.limits.maxTargetReads,\n context.options.cache,\n context.signal\n );\n if (!created.ok) return result(unavailable(created.reason));\n let prepared: PreparedMarkdownTraversal;\n try {\n prepared = await prepareCreatedMarkdownTraversal(context, created.resolver);\n } finally {\n await created.resolver.finalize();\n }\n return context.signal.aborted ? result(unavailable(\"cancelled\")) : prepared;\n}\n\nasync function prepareCreatedMarkdownTraversal(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>,\n resolver: MarkdownLocalResolver\n): Promise<PreparedMarkdownTraversal> {\n if (context.signal.aborted) return result(unavailable(\"cancelled\"));\n const sourceDiscovery = discoverMarkdownSourcePaths(context.project, context.options.files);\n if (sourceDiscovery.kind === \"unavailable\") return result(unavailable(sourceDiscovery.reason));\n if (sourceDiscovery.selectedPathCount === 0) return result(noEligibleInput());\n if (context.signal.aborted) return result(unavailable(\"cancelled\"));\n reportRejectedInputs(context, sourceDiscovery.rejectedPaths);\n const traversal = await traverseMarkdownSources(sourceDiscovery.sourcePaths, {\n resolver,\n options: context.options,\n signal: context.signal\n });\n if (traversal.kind === \"unavailable\") {\n return result(\n appendRejectedInputMessage(\n unavailable(traversal.reason),\n sourceDiscovery.rejectedPaths.length\n )\n );\n }\n if (context.signal.aborted) {\n return result(\n appendRejectedInputMessage(unavailable(\"cancelled\"), sourceDiscovery.rejectedPaths.length)\n );\n }\n return Object.freeze({\n kind: \"traversal\",\n rejectedPaths: sourceDiscovery.rejectedPaths,\n resolver,\n traversal\n });\n}\n\nfunction result(\n checkResult: CheckResult<MarkdownLinkValidationFinalData>\n): PreparedMarkdownTraversal {\n return Object.freeze({ kind: \"result\", result: checkResult });\n}\n\nfunction noEligibleInput(): CheckResult<MarkdownLinkValidationFinalData> {\n return Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } });\n}\n\nfunction discoverMarkdownSourcePaths(\n project: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>[\"project\"],\n files: ProjectFileSelection\n): MarkdownSourceDiscovery {\n try {\n const selectedPaths = collectProjectFiles(project.root, files);\n const partition = partitionProjectFilesByEligibility(selectedPaths, isMarkdownSourcePath);\n return Object.freeze({\n kind: \"complete\" as const,\n rejectedPaths: partition.rejectedPaths,\n selectedPathCount: selectedPaths.length,\n sourcePaths: partition.acceptedPaths\n });\n } catch {\n return unavailableValidation(\"source-unavailable\");\n }\n}\n\nfunction reportRejectedInputs(\n context: CheckExecutionContext<ResolvedMarkdownLinkValidationOptions>,\n paths: readonly string[]\n): void {\n for (const selectedPath of paths) {\n const record = buildMarkdownInputRejectedRecord(selectedPath);\n context.records.report({ id: record.id }, record.data);\n }\n}\n\nfunction appendRejectedInputMessage(\n checkResult: CheckResult<MarkdownLinkValidationFinalData>,\n rejectedInputCount: number\n): CheckResult<MarkdownLinkValidationFinalData> {\n if (rejectedInputCount === 0) return checkResult;\n return Object.freeze({\n ...checkResult,\n messages: Object.freeze([\n ...(checkResult.messages ?? []),\n Object.freeze({\n code: \"input-rejected\",\n level: \"warning\" as const,\n message: `${rejectedInputCount} selected markdownLinkValidation input file(s) were rejected because only .md/.markdown paths are supported; inspect this Check's Records and narrow files.include/exclude.`\n })\n ])\n });\n}\n\nfunction unavailableValidation(\n reason: MarkdownLinkValidationUnavailableReason\n): MarkdownLinkValidationUnavailable {\n return Object.freeze({ kind: \"unavailable\", reason });\n}\n\nasync function traverseMarkdownSources(\n sourcePaths: readonly string[],\n run: MarkdownLinkValidationRun\n): Promise<MarkdownLinkTraversal> {\n const candidates: MarkdownLinkRecordCandidate[] = [];\n let occurrenceCount = 0;\n let sourceFileCount = 0;\n\n // The Run's shared Scheduler owns cross-Check concurrency; this Check processes sources strictly in order.\n for (const sourcePath of sourcePaths) {\n const sourceValidation = await validateMarkdownSource(sourcePath, occurrenceCount, run);\n if (sourceValidation.kind === \"unavailable\") return sourceValidation;\n\n candidates.push(...sourceValidation.candidates);\n occurrenceCount = sourceValidation.occurrenceCount;\n sourceFileCount += 1;\n }\n\n return Object.freeze({\n kind: \"complete\" as const,\n candidates: Object.freeze(candidates),\n occurrenceCount,\n sourceFileCount\n });\n}\n\nasync function validateMarkdownSource(\n sourcePath: string,\n occurrenceCountBeforeSource: number,\n run: MarkdownLinkValidationRun\n): Promise<MarkdownSourceValidation> {\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n const sourceRead = await run.resolver.readSource(sourcePath, run.options.limits.maxMarkdownBytes);\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n if (!sourceRead.ok) return unavailableValidation(sourceRead.reason);\n\n const candidates: MarkdownLinkRecordCandidate[] = [];\n let occurrenceCount = occurrenceCountBeforeSource;\n for (const [occurrenceIndex, occurrence] of sourceRead.source.facts.occurrences.entries()) {\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n occurrenceCount += 1;\n if (occurrenceCount > run.options.limits.maxOccurrences) {\n return unavailableValidation(\"occurrence-limit-exceeded\");\n }\n\n const resolution = await run.resolver.resolve({\n source: sourceRead.source,\n rawDestination: occurrence.rawDestination,\n rootExternalTargetMode: run.options.rootExternalTargetMode,\n requireExistingTargets: run.options.requireExistingTargets,\n requireNonEmptyDirectories: run.options.requireNonEmptyDirectories,\n validateSameDocumentAnchors: run.options.validateSameDocumentAnchors,\n validateCrossDocumentAnchors: run.options.validateCrossDocumentAnchors,\n maxMarkdownBytes: run.options.limits.maxMarkdownBytes\n });\n if (run.signal.aborted) return unavailableValidation(\"cancelled\");\n if (resolution.kind === \"unavailable\") return unavailableValidation(resolution.reason);\n const candidate = buildMarkdownLinkRecordCandidate(\n sourceRead.source.path,\n occurrenceIndex,\n occurrence,\n resolution\n );\n if (candidate !== undefined) candidates.push(candidate);\n }\n\n return Object.freeze({\n kind: \"complete\" as const,\n candidates: Object.freeze(candidates),\n occurrenceCount\n });\n}\n\nfunction isMarkdownSourcePath(filePath: string): boolean {\n const extension = path.extname(filePath).toLowerCase();\n return extension === \".md\" || extension === \".markdown\";\n}\n\nfunction unavailable(\n reason: MarkdownLinkValidationUnavailableReason\n): CheckResult<MarkdownLinkValidationFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code: reason },\n messages: Object.freeze([\n Object.freeze({\n code: reason,\n level: \"error\" as const,\n message: markdownLinkUnavailableMessage(reason)\n })\n ])\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { presentCheckFindings } from "../../check/finding-presentation.mjs";
1
+ import { presentCheckFindings } from "../../package-tools/finding-presentation/finding-presentation.mjs";
2
2
  const PRESENTED_FINDING_LIMIT = 10;
3
3
  /** Projects completed Link findings without copying raw destinations into presentation. */
4
4
  export function markdownFindingMessages(candidates, rejectedPaths, blocking) {
@@ -1 +1 @@
1
- {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAMnC,2FAA2F;AAC3F,MAAM,UAAU,uBAAuB,CACrC,UAAkD,EAClD,aAAgC,EAChC,QAAiB;IAEjB,MAAM,QAAQ,GAA+B;QAC3C,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;KACzF,CAAC;IACF,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACtC,OAAO,MAAM,CAAC,MAAM,CAAC;oBACnB,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAkB;oBACzB,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,sDAAsD;iBAC/E,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7E,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;gBAC3D,OAAO,EAAE,GAAG,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc,KAAK,MAAM,GAAG;aACjG,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CACpD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC;gBAC3E,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,yGAAyG;SAClI,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../check/finding-presentation.ts\";\nimport type { MarkdownLinkRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\ntype PresentedMarkdownFinding =\n | Readonly<{ readonly kind: \"link\"; readonly candidate: MarkdownLinkRecordCandidate }>\n | Readonly<{ readonly kind: \"input-rejected\"; readonly path: string }>;\n\n/** Projects completed Link findings without copying raw destinations into presentation. */\nexport function markdownFindingMessages(\n candidates: readonly MarkdownLinkRecordCandidate[],\n rejectedPaths: readonly string[],\n blocking: boolean\n): readonly CheckMessage[] {\n const findings: PresentedMarkdownFinding[] = [\n ...candidates.map((candidate) => Object.freeze({ kind: \"link\" as const, candidate })),\n ...rejectedPaths.map((path) => Object.freeze({ kind: \"input-rejected\" as const, path }))\n ];\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: (finding) => {\n if (finding.kind === \"input-rejected\") {\n return Object.freeze({\n code: \"finding-detail\",\n level: \"warning\" as const,\n message: `${finding.path}: selected input is not a supported Markdown source.`\n });\n }\n const { occurrenceKind, range, reason, sourcePath } = finding.candidate.data;\n return Object.freeze({\n code: \"finding-detail\",\n level: blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${sourcePath}:${range.start.line}:${range.start.column} ${occurrenceKind}: ${reason}.`\n });\n },\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some((finding) => finding.kind === \"link\" && blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional Markdown link finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n"]}
1
+ {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kEAAkE,CAAC;AAGxG,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAMnC,2FAA2F;AAC3F,MAAM,UAAU,uBAAuB,CACrC,UAAkD,EAClD,aAAgC,EAChC,QAAiB;IAEjB,MAAM,QAAQ,GAA+B;QAC3C,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;KACzF,CAAC;IACF,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACtC,OAAO,MAAM,CAAC,MAAM,CAAC;oBACnB,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAkB;oBACzB,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,sDAAsD;iBAC/E,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7E,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;gBAC3D,OAAO,EAAE,GAAG,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc,KAAK,MAAM,GAAG;aACjG,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CACpD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC;gBAC3E,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,yGAAyG;SAClI,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport type { MarkdownLinkRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\ntype PresentedMarkdownFinding =\n | Readonly<{ readonly kind: \"link\"; readonly candidate: MarkdownLinkRecordCandidate }>\n | Readonly<{ readonly kind: \"input-rejected\"; readonly path: string }>;\n\n/** Projects completed Link findings without copying raw destinations into presentation. */\nexport function markdownFindingMessages(\n candidates: readonly MarkdownLinkRecordCandidate[],\n rejectedPaths: readonly string[],\n blocking: boolean\n): readonly CheckMessage[] {\n const findings: PresentedMarkdownFinding[] = [\n ...candidates.map((candidate) => Object.freeze({ kind: \"link\" as const, candidate })),\n ...rejectedPaths.map((path) => Object.freeze({ kind: \"input-rejected\" as const, path }))\n ];\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: (finding) => {\n if (finding.kind === \"input-rejected\") {\n return Object.freeze({\n code: \"finding-detail\",\n level: \"warning\" as const,\n message: `${finding.path}: selected input is not a supported Markdown source.`\n });\n }\n const { occurrenceKind, range, reason, sourcePath } = finding.candidate.data;\n return Object.freeze({\n code: \"finding-detail\",\n level: blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${sourcePath}:${range.start.line}:${range.start.column} ${occurrenceKind}: ${reason}.`\n });\n },\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some((finding) => finding.kind === \"link\" && blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional Markdown link finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n"]}
@@ -138,9 +138,7 @@ function isMarkdownAstNode(value) {
138
138
  return typeof value.type === "string";
139
139
  }
140
140
  function sourceRangeFromPosition(position) {
141
- if (position === undefined ||
142
- position.start.offset === undefined ||
143
- position.end.offset === undefined) {
141
+ if (position?.start.offset === undefined || position?.end.offset === undefined) {
144
142
  return null;
145
143
  }
146
144
  return Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-parser.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/markdown-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import GithubSlugger from \"github-slugger\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { frontmatterFromMarkdown } from \"mdast-util-frontmatter\";\nimport { gfmFromMarkdown } from \"mdast-util-gfm\";\nimport { frontmatter } from \"micromark-extension-frontmatter\";\nimport { gfm } from \"micromark-extension-gfm\";\n\ninterface MarkdownAstPoint {\n readonly line: number;\n readonly column: number;\n readonly offset?: number;\n}\n\ninterface MarkdownAstPosition {\n readonly start: MarkdownAstPoint;\n readonly end: MarkdownAstPoint;\n}\n\ninterface MarkdownAstNode {\n readonly type: string;\n readonly position?: MarkdownAstPosition;\n readonly children?: readonly MarkdownAstNode[];\n readonly value?: string;\n readonly url?: string;\n readonly identifier?: string;\n readonly alt?: string | null;\n}\n\ntype MarkdownOccurrenceKind = \"image\" | \"link\";\n\ninterface MarkdownSourcePosition {\n readonly line: number;\n readonly column: number;\n}\n\ninterface MarkdownSourceRange {\n readonly startOffset: number;\n readonly endOffset: number;\n readonly start: MarkdownSourcePosition;\n readonly end: MarkdownSourcePosition;\n}\n\ninterface MarkdownLinkOccurrence {\n readonly kind: MarkdownOccurrenceKind;\n readonly rawDestination: string;\n readonly range: MarkdownSourceRange;\n}\n\ninterface MarkdownHeading {\n readonly slug: string;\n readonly range: MarkdownSourceRange;\n}\n\ninterface ParsedMarkdownLinkFacts {\n readonly occurrences: readonly MarkdownLinkOccurrence[];\n readonly headings: readonly MarkdownHeading[];\n}\n\ntype MarkdownLinkParseResult =\n | Readonly<{\n readonly ok: true;\n readonly facts: ParsedMarkdownLinkFacts;\n }>\n | Readonly<{\n readonly ok: false;\n readonly reason: \"markdown-parse-failure\";\n }>;\n\n/**\n * Link-private Markdown grammar adapter. It deliberately exposes facts rather\n * than the dependency AST, so resolver ownership starts after parsing.\n */\nexport function parseMarkdownLinkFacts(markdown: string): MarkdownLinkParseResult {\n if (hasUnpairedSurrogate(markdown)) {\n return parseFailure();\n }\n\n try {\n const tree: unknown = fromMarkdown(markdown, {\n extensions: [gfm(), frontmatter([\"yaml\"])],\n mdastExtensions: [gfmFromMarkdown(), frontmatterFromMarkdown([\"yaml\"])]\n });\n if (!isMarkdownAstNode(tree)) {\n return parseFailure();\n }\n return collectMarkdownLinkFacts(tree);\n } catch {\n return parseFailure();\n }\n}\n\nfunction collectMarkdownLinkFacts(tree: MarkdownAstNode): MarkdownLinkParseResult {\n const definitions = definitionsByIdentifier(tree);\n const occurrences: MarkdownLinkOccurrence[] = [];\n const headings: MarkdownHeading[] = [];\n const slugger = new GithubSlugger();\n\n forEachNode(tree, (node) => {\n const occurrence = occurrenceFromNode(node, definitions);\n if (occurrence !== null) {\n occurrences.push(occurrence);\n }\n\n if (node.type === \"heading\") {\n const heading = headingFromNode(node, slugger);\n if (heading === null) {\n throw new Error(\"Markdown heading did not include a source range.\");\n }\n headings.push(heading);\n }\n });\n\n return Object.freeze({\n ok: true as const,\n facts: Object.freeze({\n occurrences: Object.freeze(occurrences),\n headings: Object.freeze(headings)\n })\n });\n}\n\nfunction definitionsByIdentifier(tree: MarkdownAstNode): ReadonlyMap<string, string> {\n const definitions = new Map<string, string>();\n\n forEachNode(tree, (node) => {\n if (node.type !== \"definition\") {\n return;\n }\n if (node.identifier === undefined || node.url === undefined) {\n throw new Error(\"Markdown definition was missing a destination.\");\n }\n if (!definitions.has(node.identifier)) {\n definitions.set(node.identifier, node.url);\n }\n });\n\n return definitions;\n}\n\nfunction occurrenceFromNode(\n node: MarkdownAstNode,\n definitions: ReadonlyMap<string, string>\n): MarkdownLinkOccurrence | null {\n if (node.type === \"link\") {\n return occurrenceFromResource(node, \"link\");\n }\n if (node.type === \"image\") {\n return occurrenceFromResource(node, \"image\");\n }\n if (node.type === \"linkReference\") {\n return occurrenceFromReference(node, \"link\", definitions);\n }\n if (node.type === \"imageReference\") {\n return occurrenceFromReference(node, \"image\", definitions);\n }\n return null;\n}\n\nfunction occurrenceFromResource(\n node: MarkdownAstNode,\n kind: MarkdownOccurrenceKind\n): MarkdownLinkOccurrence | null {\n if (node.url === undefined) {\n throw new Error(\"Markdown occurrence was missing a destination.\");\n }\n return occurrenceWithDestination(node, kind, node.url);\n}\n\nfunction occurrenceWithDestination(\n node: MarkdownAstNode,\n kind: MarkdownOccurrenceKind,\n rawDestination: string\n): MarkdownLinkOccurrence | null {\n const range = sourceRangeFromPosition(node.position);\n if (range === null) {\n throw new Error(\"Markdown occurrence did not include a source range.\");\n }\n return Object.freeze({ kind, rawDestination, range });\n}\n\nfunction occurrenceFromReference(\n node: MarkdownAstNode,\n kind: MarkdownOccurrenceKind,\n definitions: ReadonlyMap<string, string>\n): MarkdownLinkOccurrence | null {\n if (node.identifier === undefined) {\n throw new Error(\"Markdown reference was missing an identifier.\");\n }\n const rawDestination = definitions.get(node.identifier);\n if (rawDestination === undefined) {\n return null;\n }\n return occurrenceWithDestination(node, kind, rawDestination);\n}\n\nfunction headingFromNode(node: MarkdownAstNode, slugger: GithubSlugger): MarkdownHeading | null {\n const range = sourceRangeFromPosition(node.position);\n if (range === null) {\n return null;\n }\n return Object.freeze({\n slug: slugger.slug(markdownText(node)),\n range\n });\n}\n\nfunction markdownText(node: MarkdownAstNode): string {\n if (node.value !== undefined) {\n return node.value;\n }\n if (node.children !== undefined) {\n return node.children.map(markdownText).join(\"\");\n }\n if (node.type === \"image\" || node.type === \"imageReference\") {\n return node.alt ?? \"\";\n }\n return \"\";\n}\n\nfunction isMarkdownAstNode(value: unknown): value is MarkdownAstNode {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"type\" in value) ||\n !(\"children\" in value) ||\n !Array.isArray(value.children)\n ) {\n return false;\n }\n return typeof value.type === \"string\";\n}\n\nfunction sourceRangeFromPosition(\n position: MarkdownAstPosition | undefined\n): MarkdownSourceRange | null {\n if (\n position === undefined ||\n position.start.offset === undefined ||\n position.end.offset === undefined\n ) {\n return null;\n }\n\n return Object.freeze({\n startOffset: position.start.offset,\n endOffset: position.end.offset,\n start: Object.freeze({ line: position.start.line, column: position.start.column }),\n end: Object.freeze({ line: position.end.line, column: position.end.column })\n });\n}\n\nfunction forEachNode(root: MarkdownAstNode, visitor: (node: MarkdownAstNode) => void): void {\n const nodes: MarkdownAstNode[] = [root];\n\n while (nodes.length > 0) {\n const node = nodes.pop();\n if (node === undefined) {\n return;\n }\n visitor(node);\n if (node.children !== undefined) {\n for (let index = node.children.length - 1; index >= 0; index -= 1) {\n const child = node.children[index];\n if (child !== undefined) {\n nodes.push(child);\n }\n }\n }\n }\n}\n\nfunction hasUnpairedSurrogate(markdown: string): boolean {\n for (let index = 0; index < markdown.length; index += 1) {\n const codeUnit = markdown.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const nextCodeUnit = markdown.charCodeAt(index + 1);\n if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff)) {\n return true;\n }\n index += 1;\n continue;\n }\n if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction parseFailure(): MarkdownLinkParseResult {\n return Object.freeze({ ok: false as const, reason: \"markdown-parse-failure\" as const });\n}\n\nexport type {\n MarkdownHeading,\n MarkdownLinkOccurrence,\n MarkdownLinkParseResult,\n MarkdownOccurrenceKind,\n MarkdownSourcePosition,\n MarkdownSourceRange,\n ParsedMarkdownLinkFacts\n};\n"]}
1
+ {"version":3,"file":"markdown-parser.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/markdown-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import GithubSlugger from \"github-slugger\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { frontmatterFromMarkdown } from \"mdast-util-frontmatter\";\nimport { gfmFromMarkdown } from \"mdast-util-gfm\";\nimport { frontmatter } from \"micromark-extension-frontmatter\";\nimport { gfm } from \"micromark-extension-gfm\";\n\ninterface MarkdownAstPoint {\n readonly line: number;\n readonly column: number;\n readonly offset?: number;\n}\n\ninterface MarkdownAstPosition {\n readonly start: MarkdownAstPoint;\n readonly end: MarkdownAstPoint;\n}\n\ninterface MarkdownAstNode {\n readonly type: string;\n readonly position?: MarkdownAstPosition;\n readonly children?: readonly MarkdownAstNode[];\n readonly value?: string;\n readonly url?: string;\n readonly identifier?: string;\n readonly alt?: string | null;\n}\n\ntype MarkdownOccurrenceKind = \"image\" | \"link\";\n\ninterface MarkdownSourcePosition {\n readonly line: number;\n readonly column: number;\n}\n\ninterface MarkdownSourceRange {\n readonly startOffset: number;\n readonly endOffset: number;\n readonly start: MarkdownSourcePosition;\n readonly end: MarkdownSourcePosition;\n}\n\ninterface MarkdownLinkOccurrence {\n readonly kind: MarkdownOccurrenceKind;\n readonly rawDestination: string;\n readonly range: MarkdownSourceRange;\n}\n\ninterface MarkdownHeading {\n readonly slug: string;\n readonly range: MarkdownSourceRange;\n}\n\ninterface ParsedMarkdownLinkFacts {\n readonly occurrences: readonly MarkdownLinkOccurrence[];\n readonly headings: readonly MarkdownHeading[];\n}\n\ntype MarkdownLinkParseResult =\n | Readonly<{\n readonly ok: true;\n readonly facts: ParsedMarkdownLinkFacts;\n }>\n | Readonly<{\n readonly ok: false;\n readonly reason: \"markdown-parse-failure\";\n }>;\n\n/**\n * Link-private Markdown grammar adapter. It deliberately exposes facts rather\n * than the dependency AST, so resolver ownership starts after parsing.\n */\nexport function parseMarkdownLinkFacts(markdown: string): MarkdownLinkParseResult {\n if (hasUnpairedSurrogate(markdown)) {\n return parseFailure();\n }\n\n try {\n const tree: unknown = fromMarkdown(markdown, {\n extensions: [gfm(), frontmatter([\"yaml\"])],\n mdastExtensions: [gfmFromMarkdown(), frontmatterFromMarkdown([\"yaml\"])]\n });\n if (!isMarkdownAstNode(tree)) {\n return parseFailure();\n }\n return collectMarkdownLinkFacts(tree);\n } catch {\n return parseFailure();\n }\n}\n\nfunction collectMarkdownLinkFacts(tree: MarkdownAstNode): MarkdownLinkParseResult {\n const definitions = definitionsByIdentifier(tree);\n const occurrences: MarkdownLinkOccurrence[] = [];\n const headings: MarkdownHeading[] = [];\n const slugger = new GithubSlugger();\n\n forEachNode(tree, (node) => {\n const occurrence = occurrenceFromNode(node, definitions);\n if (occurrence !== null) {\n occurrences.push(occurrence);\n }\n\n if (node.type === \"heading\") {\n const heading = headingFromNode(node, slugger);\n if (heading === null) {\n throw new Error(\"Markdown heading did not include a source range.\");\n }\n headings.push(heading);\n }\n });\n\n return Object.freeze({\n ok: true as const,\n facts: Object.freeze({\n occurrences: Object.freeze(occurrences),\n headings: Object.freeze(headings)\n })\n });\n}\n\nfunction definitionsByIdentifier(tree: MarkdownAstNode): ReadonlyMap<string, string> {\n const definitions = new Map<string, string>();\n\n forEachNode(tree, (node) => {\n if (node.type !== \"definition\") {\n return;\n }\n if (node.identifier === undefined || node.url === undefined) {\n throw new Error(\"Markdown definition was missing a destination.\");\n }\n if (!definitions.has(node.identifier)) {\n definitions.set(node.identifier, node.url);\n }\n });\n\n return definitions;\n}\n\nfunction occurrenceFromNode(\n node: MarkdownAstNode,\n definitions: ReadonlyMap<string, string>\n): MarkdownLinkOccurrence | null {\n if (node.type === \"link\") {\n return occurrenceFromResource(node, \"link\");\n }\n if (node.type === \"image\") {\n return occurrenceFromResource(node, \"image\");\n }\n if (node.type === \"linkReference\") {\n return occurrenceFromReference(node, \"link\", definitions);\n }\n if (node.type === \"imageReference\") {\n return occurrenceFromReference(node, \"image\", definitions);\n }\n return null;\n}\n\nfunction occurrenceFromResource(\n node: MarkdownAstNode,\n kind: MarkdownOccurrenceKind\n): MarkdownLinkOccurrence | null {\n if (node.url === undefined) {\n throw new Error(\"Markdown occurrence was missing a destination.\");\n }\n return occurrenceWithDestination(node, kind, node.url);\n}\n\nfunction occurrenceWithDestination(\n node: MarkdownAstNode,\n kind: MarkdownOccurrenceKind,\n rawDestination: string\n): MarkdownLinkOccurrence | null {\n const range = sourceRangeFromPosition(node.position);\n if (range === null) {\n throw new Error(\"Markdown occurrence did not include a source range.\");\n }\n return Object.freeze({ kind, rawDestination, range });\n}\n\nfunction occurrenceFromReference(\n node: MarkdownAstNode,\n kind: MarkdownOccurrenceKind,\n definitions: ReadonlyMap<string, string>\n): MarkdownLinkOccurrence | null {\n if (node.identifier === undefined) {\n throw new Error(\"Markdown reference was missing an identifier.\");\n }\n const rawDestination = definitions.get(node.identifier);\n if (rawDestination === undefined) {\n return null;\n }\n return occurrenceWithDestination(node, kind, rawDestination);\n}\n\nfunction headingFromNode(node: MarkdownAstNode, slugger: GithubSlugger): MarkdownHeading | null {\n const range = sourceRangeFromPosition(node.position);\n if (range === null) {\n return null;\n }\n return Object.freeze({\n slug: slugger.slug(markdownText(node)),\n range\n });\n}\n\nfunction markdownText(node: MarkdownAstNode): string {\n if (node.value !== undefined) {\n return node.value;\n }\n if (node.children !== undefined) {\n return node.children.map(markdownText).join(\"\");\n }\n if (node.type === \"image\" || node.type === \"imageReference\") {\n return node.alt ?? \"\";\n }\n return \"\";\n}\n\nfunction isMarkdownAstNode(value: unknown): value is MarkdownAstNode {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"type\" in value) ||\n !(\"children\" in value) ||\n !Array.isArray(value.children)\n ) {\n return false;\n }\n return typeof value.type === \"string\";\n}\n\nfunction sourceRangeFromPosition(\n position: MarkdownAstPosition | undefined\n): MarkdownSourceRange | null {\n if (position?.start.offset === undefined || position?.end.offset === undefined) {\n return null;\n }\n\n return Object.freeze({\n startOffset: position.start.offset,\n endOffset: position.end.offset,\n start: Object.freeze({ line: position.start.line, column: position.start.column }),\n end: Object.freeze({ line: position.end.line, column: position.end.column })\n });\n}\n\nfunction forEachNode(root: MarkdownAstNode, visitor: (node: MarkdownAstNode) => void): void {\n const nodes: MarkdownAstNode[] = [root];\n\n while (nodes.length > 0) {\n const node = nodes.pop();\n if (node === undefined) {\n return;\n }\n visitor(node);\n if (node.children !== undefined) {\n for (let index = node.children.length - 1; index >= 0; index -= 1) {\n const child = node.children[index];\n if (child !== undefined) {\n nodes.push(child);\n }\n }\n }\n }\n}\n\nfunction hasUnpairedSurrogate(markdown: string): boolean {\n for (let index = 0; index < markdown.length; index += 1) {\n const codeUnit = markdown.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const nextCodeUnit = markdown.charCodeAt(index + 1);\n if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff)) {\n return true;\n }\n index += 1;\n continue;\n }\n if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction parseFailure(): MarkdownLinkParseResult {\n return Object.freeze({ ok: false as const, reason: \"markdown-parse-failure\" as const });\n}\n\nexport type {\n MarkdownHeading,\n MarkdownLinkOccurrence,\n MarkdownLinkParseResult,\n MarkdownOccurrenceKind,\n MarkdownSourcePosition,\n MarkdownSourceRange,\n ParsedMarkdownLinkFacts\n};\n"]}
@@ -1,7 +1,8 @@
1
1
  import { canonicalizeJsonObject } from "../../data-boundary/canonical-data.mjs";
2
- import { hasExactPlainRecordKeys, hasRequiredAndOptionalRecordKeys, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
2
+ import { hasRequiredAndOptionalRecordKeys, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
3
3
  import { defaultProjectFileSelection, resolveProjectFileSelection, snapshotProjectFileSelection } from "../project-files/configuration.mjs";
4
4
  import { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from "../code-quality-findings/policy.mjs";
5
+ import { resolveOptionalLocalCacheOptions } from "../local-cache-options.mjs";
5
6
  import { validMarkdownLinkValidationOptions } from "./options-validation.mjs";
6
7
  const DEFAULT_LIMITS = Object.freeze({
7
8
  maxMarkdownBytes: 1_048_576,
@@ -21,7 +22,7 @@ export function resolveMarkdownLinkValidationOptions(value) {
21
22
  const limits = resolvedLimits(input.limits);
22
23
  const files = resolvedFiles(input.files);
23
24
  const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);
24
- const cache = resolvedCache(input.cache);
25
+ const cache = resolveOptionalLocalCacheOptions(input.cache);
25
26
  if (limits === undefined ||
26
27
  files === undefined ||
27
28
  findingPolicy === undefined ||
@@ -62,22 +63,6 @@ function isMarkdownLinkValidationInput(input) {
62
63
  required: []
63
64
  }));
64
65
  }
65
- function resolvedCache(value) {
66
- if (value === undefined)
67
- return Object.freeze({ enabled: false });
68
- const cache = snapshotClosedRecord(value);
69
- if (cache === undefined)
70
- return undefined;
71
- if (hasExactPlainRecordKeys(cache, ["enabled"]) && cache.enabled === false) {
72
- return Object.freeze({ enabled: false });
73
- }
74
- if (hasExactPlainRecordKeys(cache, ["enabled", "directory"]) &&
75
- cache.enabled === true &&
76
- typeof cache.directory === "string") {
77
- return Object.freeze({ enabled: true, directory: cache.directory });
78
- }
79
- return undefined;
80
- }
81
66
  function resolvedFiles(value) {
82
67
  return value === undefined
83
68
  ? snapshotProjectFileSelection(DEFAULT_FILES)