@zxyycom/vibe-check 0.0.1 → 0.0.2

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 (950) hide show
  1. package/README.md +47 -74
  2. package/dist/esm/cache/cache-json-by-key.mjs +189 -0
  3. package/dist/esm/cache/cache-json-by-key.mjs.map +1 -0
  4. package/dist/esm/check/check.mjs.map +1 -1
  5. package/dist/esm/check/finding-presentation.mjs +40 -0
  6. package/dist/esm/check/finding-presentation.mjs.map +1 -0
  7. package/dist/esm/check/inherited-collection.mjs +1 -1
  8. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  9. package/dist/esm/check-settlement/fact-validation.mjs +17 -23
  10. package/dist/esm/check-settlement/fact-validation.mjs.map +1 -1
  11. package/dist/esm/check-settlement/outcome-normalization.mjs +9 -19
  12. package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -1
  13. package/dist/esm/check-settlement/reason-shape.mjs +12 -0
  14. package/dist/esm/check-settlement/reason-shape.mjs.map +1 -0
  15. package/dist/esm/check-settlement/record-store.mjs +14 -17
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/check-settlement/session.mjs +8 -2
  18. package/dist/esm/check-settlement/session.mjs.map +1 -1
  19. package/dist/esm/data-boundary/closed-values.mjs +16 -0
  20. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  21. package/dist/esm/data-boundary/value-shapes.mjs +9 -0
  22. package/dist/esm/data-boundary/value-shapes.mjs.map +1 -1
  23. package/dist/esm/index.mjs +9 -2
  24. package/dist/esm/index.mjs.map +1 -1
  25. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs +56 -0
  26. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  27. package/dist/esm/learned-critical-path/duration-model/prediction.mjs +122 -0
  28. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  29. package/dist/esm/learned-critical-path/duration-model/preparation.mjs +41 -0
  30. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  31. package/dist/esm/learned-critical-path/duration-model/recording.mjs +109 -0
  32. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +1 -0
  33. package/dist/esm/learned-critical-path/duration-model/storage.mjs +187 -0
  34. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +1 -0
  35. package/dist/esm/learned-critical-path/selection-layers.mjs +28 -0
  36. package/dist/esm/learned-critical-path/selection-layers.mjs.map +1 -0
  37. package/dist/esm/learned-critical-path/static-decision.mjs +55 -0
  38. package/dist/esm/learned-critical-path/static-decision.mjs.map +1 -0
  39. package/dist/esm/learned-critical-path/strategy.mjs +179 -0
  40. package/dist/esm/learned-critical-path/strategy.mjs.map +1 -0
  41. package/dist/esm/machine-output/v4/atomic-publication.mjs +1 -15
  42. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  43. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs +40 -0
  44. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -0
  45. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs +48 -0
  46. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -0
  47. package/dist/esm/package-checks/code-quality-findings/policy.mjs +20 -0
  48. package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +15 -7
  50. package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +1 -1
  54. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  55. package/dist/esm/package-checks/duplicate-detection/execution.mjs +44 -18
  56. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  57. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +59 -0
  58. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -0
  59. package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs +55 -0
  60. package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs.map +1 -0
  61. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  62. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  63. package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +1 -1
  64. package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -1
  65. package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +15 -5
  66. package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -1
  67. package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +5 -4
  68. package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -1
  69. package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +22 -47
  70. package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -1
  71. package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +20 -25
  72. package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -1
  73. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  74. package/dist/esm/package-checks/duplicate-detection/records.mjs +27 -6
  75. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  76. package/dist/esm/package-checks/file-metrics/execution.mjs +10 -17
  77. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  78. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +22 -0
  79. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -0
  80. package/dist/esm/package-checks/file-metrics/options-resolution.mjs +11 -43
  81. package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -1
  82. package/dist/esm/package-checks/file-metrics/options-validation.mjs +15 -25
  83. package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -1
  84. package/dist/esm/package-checks/file-metrics/records.mjs +2 -9
  85. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  86. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  87. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  88. package/dist/esm/package-checks/file-metrics/scc/parser.mjs +4 -4
  89. package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -1
  90. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +2 -2
  91. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  92. package/dist/esm/package-checks/function-metrics/analysis.mjs +56 -15
  93. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  94. package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs +550 -0
  95. package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs.map +1 -0
  96. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +332 -0
  97. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -0
  98. package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs +7 -0
  99. package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs.map +1 -0
  100. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +24 -0
  101. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -0
  102. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs +113 -0
  103. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs.map +1 -0
  104. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs +180 -0
  105. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -0
  106. package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs +121 -0
  107. package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs.map +1 -0
  108. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +217 -0
  109. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -0
  110. package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs +96 -0
  111. package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs.map +1 -0
  112. package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs +76 -0
  113. package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs.map +1 -0
  114. package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs +88 -0
  115. package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs.map +1 -0
  116. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +466 -0
  117. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -0
  118. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +289 -0
  119. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -0
  120. package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs +38 -0
  121. package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs.map +1 -0
  122. package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs +44 -0
  123. package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs.map +1 -0
  124. package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs +113 -0
  125. package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs.map +1 -0
  126. package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs +247 -0
  127. package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs.map +1 -0
  128. package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs +16 -0
  129. package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs.map +1 -0
  130. package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs +103 -0
  131. package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs.map +1 -0
  132. package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs +55 -0
  133. package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs.map +1 -0
  134. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +100 -0
  135. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -0
  136. package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs +367 -0
  137. package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs.map +1 -0
  138. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +260 -0
  139. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -0
  140. package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs +53 -0
  141. package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs.map +1 -0
  142. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +306 -0
  143. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -0
  144. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +402 -0
  145. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -0
  146. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +214 -0
  147. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -0
  148. package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs +75 -0
  149. package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs.map +1 -0
  150. package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs +32 -0
  151. package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs.map +1 -0
  152. package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs +47 -0
  153. package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs.map +1 -0
  154. package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs +22 -0
  155. package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs.map +1 -0
  156. package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs +142 -0
  157. package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs.map +1 -0
  158. package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs +94 -0
  159. package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs.map +1 -0
  160. package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs +149 -0
  161. package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs.map +1 -0
  162. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +79 -0
  163. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -0
  164. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +606 -0
  165. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -0
  166. package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs +31 -0
  167. package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs.map +1 -0
  168. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +23 -0
  169. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -0
  170. package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs +492 -0
  171. package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs.map +1 -0
  172. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +542 -0
  173. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -0
  174. package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs +141 -0
  175. package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs.map +1 -0
  176. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +62 -0
  177. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -0
  178. package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs +154 -0
  179. package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs.map +1 -0
  180. package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs +36 -0
  181. package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs.map +1 -0
  182. package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs +56 -0
  183. package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs.map +1 -0
  184. package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs +2 -0
  185. package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs.map +1 -0
  186. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +108 -0
  187. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -0
  188. package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs +24 -0
  189. package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs.map +1 -0
  190. package/dist/esm/package-checks/function-metrics/constructor.mjs +2 -2
  191. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  192. package/dist/esm/package-checks/function-metrics/execution.mjs +51 -33
  193. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  194. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +75 -0
  195. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -0
  196. package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs +28 -0
  197. package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs.map +1 -0
  198. package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -1
  199. package/dist/esm/package-checks/function-metrics/measurement.mjs +161 -26
  200. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  201. package/dist/esm/package-checks/function-metrics/options-resolution.mjs +30 -63
  202. package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -1
  203. package/dist/esm/package-checks/function-metrics/options-validation.mjs +27 -32
  204. package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -1
  205. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  206. package/dist/esm/package-checks/function-metrics/records.mjs +31 -1
  207. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  208. package/dist/esm/package-checks/function-metrics/target-files.mjs +6 -67
  209. package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -1
  210. package/dist/esm/package-checks/{file-metrics/scc → host-environment}/csv.mjs +1 -0
  211. package/dist/esm/package-checks/host-environment/csv.mjs.map +1 -0
  212. package/dist/esm/package-checks/host-environment/git.mjs +1 -1
  213. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  214. package/dist/esm/package-checks/host-environment/process.mjs +5 -0
  215. package/dist/esm/package-checks/host-environment/process.mjs.map +1 -0
  216. package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -1
  217. package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +15 -17
  218. package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -1
  219. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  220. package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -1
  221. package/dist/esm/package-checks/json-validation/options-validation.mjs +4 -10
  222. package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -1
  223. package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -1
  224. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +9 -3
  225. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  226. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +27 -24
  227. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  228. package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +82 -53
  229. package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -1
  230. package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -1
  231. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +36 -0
  232. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -0
  233. package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -1
  234. package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +2 -2
  235. package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -1
  236. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +26 -4
  237. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  238. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +24 -11
  239. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  240. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  241. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +185 -0
  242. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -0
  243. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs +131 -0
  244. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs.map +1 -0
  245. package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +58 -57
  246. package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -1
  247. package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs +54 -0
  248. package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs.map +1 -0
  249. package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs +16 -0
  250. package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs.map +1 -0
  251. package/dist/esm/package-checks/project-files/collection.mjs +1 -1
  252. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  253. package/dist/esm/package-checks/project-files/configuration.mjs +2 -10
  254. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  255. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +1 -1
  256. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  257. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +1 -1
  258. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  259. package/dist/esm/package-checks/project-files/public-collection.mjs +56 -0
  260. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -0
  261. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +1 -1
  262. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  263. package/dist/esm/package-checks/secret-detection/classification.mjs +15 -0
  264. package/dist/esm/package-checks/secret-detection/classification.mjs.map +1 -0
  265. package/dist/esm/package-checks/secret-detection/default-check.mjs +39 -0
  266. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -0
  267. package/dist/esm/package-checks/secret-detection/execution.mjs +172 -0
  268. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -0
  269. package/dist/esm/package-checks/secret-detection/final-data.mjs +33 -0
  270. package/dist/esm/package-checks/secret-detection/final-data.mjs.map +1 -0
  271. package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs +30 -0
  272. package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs.map +1 -0
  273. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +153 -0
  274. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -0
  275. package/dist/esm/package-checks/secret-detection/options-resolution.mjs +40 -0
  276. package/dist/esm/package-checks/secret-detection/options-resolution.mjs.map +1 -0
  277. package/dist/esm/package-checks/secret-detection/options-validation.mjs +22 -0
  278. package/dist/esm/package-checks/secret-detection/options-validation.mjs.map +1 -0
  279. package/dist/esm/package-checks/secret-detection/options.mjs +2 -0
  280. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -0
  281. package/dist/esm/package-checks/secret-detection/records.mjs +31 -0
  282. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -0
  283. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +85 -0
  284. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -0
  285. package/dist/esm/project-definition/check-tree/authoring.mjs +12 -172
  286. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  287. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +171 -0
  288. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -0
  289. package/dist/esm/project-definition/check-tree/collection-authoring.mjs +16 -0
  290. package/dist/esm/project-definition/check-tree/collection-authoring.mjs.map +1 -0
  291. package/dist/esm/project-definition/check-tree/materialization.mjs +9 -1
  292. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  293. package/dist/esm/project-definition/check-tree/resolution.mjs +45 -13
  294. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  295. package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs +73 -0
  296. package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs.map +1 -0
  297. package/dist/esm/project-definition/declarative-snapshot.mjs +73 -0
  298. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -0
  299. package/dist/esm/project-definition/output-defaults.mjs +18 -1
  300. package/dist/esm/project-definition/output-defaults.mjs.map +1 -1
  301. package/dist/esm/project-definition/output-validation.mjs +15 -15
  302. package/dist/esm/project-definition/output-validation.mjs.map +1 -1
  303. package/dist/esm/project-definition/progress-rendering-output.mjs +52 -0
  304. package/dist/esm/project-definition/progress-rendering-output.mjs.map +1 -0
  305. package/dist/esm/project-definition/project-definition-validation.mjs +100 -16
  306. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  307. package/dist/esm/project-definition/project-definition.mjs +52 -47
  308. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  309. package/dist/esm/project-definition/resource-unit-mapping.mjs +21 -0
  310. package/dist/esm/project-definition/resource-unit-mapping.mjs.map +1 -0
  311. package/dist/esm/project-definition/scheduler-policy.mjs +2 -0
  312. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -0
  313. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +54 -0
  314. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -0
  315. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs +2 -0
  316. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -0
  317. package/dist/esm/project-run/admission-strategy-provider/provider.mjs +23 -0
  318. package/dist/esm/project-run/admission-strategy-provider/provider.mjs.map +1 -0
  319. package/dist/esm/project-run/aggregation.mjs +7 -5
  320. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  321. package/dist/esm/project-run/check-execution/callback.mjs +35 -8
  322. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  323. package/dist/esm/project-run/check-execution/console-capture.mjs +220 -0
  324. package/dist/esm/project-run/check-execution/console-capture.mjs.map +1 -0
  325. package/dist/esm/project-run/check-execution/dependencies.mjs +21 -3
  326. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  327. package/dist/esm/project-run/check-execution/execution-finalization.mjs +54 -13
  328. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  329. package/dist/esm/project-run/check-execution/execution-settlement.mjs +13 -9
  330. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  331. package/dist/esm/project-run/check-execution/flag-controls.mjs +87 -0
  332. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -0
  333. package/dist/esm/project-run/check-execution/lifecycle.mjs +2 -0
  334. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -0
  335. package/dist/esm/project-run/check-execution/messages.mjs +5 -0
  336. package/dist/esm/project-run/check-execution/messages.mjs.map +1 -1
  337. package/dist/esm/project-run/check-execution/plan.mjs +9 -5
  338. package/dist/esm/project-run/check-execution/plan.mjs.map +1 -1
  339. package/dist/esm/project-run/check-execution/preflight.mjs +18 -32
  340. package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -1
  341. package/dist/esm/project-run/check-execution/resolved-checks.mjs +100 -58
  342. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  343. package/dist/esm/project-run/check-execution/resolved-execution-result.mjs +2 -0
  344. package/dist/esm/project-run/check-execution/resolved-execution-result.mjs.map +1 -0
  345. package/dist/esm/project-run/{completion.mjs → completion/completion.mjs} +16 -38
  346. package/dist/esm/project-run/completion/completion.mjs.map +1 -0
  347. package/dist/esm/project-run/{machine-publication.mjs → completion/machine-publication.mjs} +1 -1
  348. package/dist/esm/project-run/completion/machine-publication.mjs.map +1 -0
  349. package/dist/esm/project-run/completion/result-resolver.mjs +36 -0
  350. package/dist/esm/project-run/completion/result-resolver.mjs.map +1 -0
  351. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  352. package/dist/esm/project-run/controls/outputs-override-validation.mjs +67 -47
  353. package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -1
  354. package/dist/esm/project-run/controls/validation-result.mjs.map +1 -1
  355. package/dist/esm/project-run/controls/validation.mjs +75 -11
  356. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  357. package/dist/esm/project-run/diagnostic-logging/logger.mjs +100 -161
  358. package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -1
  359. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +159 -0
  360. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -0
  361. package/dist/esm/project-run/invocation/candidate.mjs +61 -0
  362. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -0
  363. package/dist/esm/project-run/invocation/creation.mjs +79 -0
  364. package/dist/esm/project-run/invocation/creation.mjs.map +1 -0
  365. package/dist/esm/project-run/invocation/paths.mjs +77 -0
  366. package/dist/esm/project-run/invocation/paths.mjs.map +1 -0
  367. package/dist/esm/project-run/invocation/progress.mjs +30 -0
  368. package/dist/esm/project-run/invocation/progress.mjs.map +1 -0
  369. package/dist/esm/project-run/{invocation.mjs → invocation/run.mjs} +78 -92
  370. package/dist/esm/project-run/invocation/run.mjs.map +1 -0
  371. package/dist/esm/project-run/invocation/scheduler.mjs +57 -0
  372. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -0
  373. package/dist/esm/project-run/{output-configuration.mjs → outputs/configuration.mjs} +3 -2
  374. package/dist/esm/project-run/outputs/configuration.mjs.map +1 -0
  375. package/dist/esm/project-run/outputs/status.mjs +105 -0
  376. package/dist/esm/project-run/outputs/status.mjs.map +1 -0
  377. package/dist/esm/project-run/progress-rendering/presentation.mjs +112 -18
  378. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  379. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +108 -19
  380. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  381. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +30 -4
  382. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  383. package/dist/esm/project-run/progress-rendering/renderer.mjs +5 -2
  384. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  385. package/dist/esm/project-run/project-context.mjs +1 -1
  386. package/dist/esm/project-run/project-context.mjs.map +1 -1
  387. package/dist/esm/project-run/result.mjs +2 -0
  388. package/dist/esm/project-run/result.mjs.map +1 -1
  389. package/dist/esm/project-run/run.mjs +1 -1
  390. package/dist/esm/project-run/run.mjs.map +1 -1
  391. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +166 -0
  392. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -0
  393. package/dist/esm/project-run/task-scheduler/admission-core/core.mjs +163 -0
  394. package/dist/esm/project-run/task-scheduler/admission-core/core.mjs.map +1 -0
  395. package/dist/esm/project-run/task-scheduler/admission-core/input.mjs +119 -0
  396. package/dist/esm/project-run/task-scheduler/admission-core/input.mjs.map +1 -0
  397. package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs +124 -0
  398. package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs.map +1 -0
  399. package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs +99 -0
  400. package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs.map +1 -0
  401. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +198 -0
  402. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -0
  403. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +151 -0
  404. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -0
  405. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +121 -0
  406. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -0
  407. package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs +65 -0
  408. package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs.map +1 -0
  409. package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs +25 -0
  410. package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs.map +1 -0
  411. package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs +55 -0
  412. package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs.map +1 -0
  413. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs +46 -0
  414. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +1 -0
  415. package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs +110 -0
  416. package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs.map +1 -0
  417. package/dist/esm/project-run/task-scheduler/execution-state.mjs +34 -5
  418. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  419. package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs +46 -0
  420. package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs.map +1 -0
  421. package/dist/esm/project-run/task-scheduler/graph-validation.mjs +54 -26
  422. package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -1
  423. package/dist/esm/project-run/task-scheduler/graph.mjs +79 -3
  424. package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -1
  425. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +207 -0
  426. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -0
  427. package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs +116 -0
  428. package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs.map +1 -0
  429. package/dist/esm/project-run/task-scheduler/measurement/policy.mjs +67 -0
  430. package/dist/esm/project-run/task-scheduler/measurement/policy.mjs.map +1 -0
  431. package/dist/esm/project-run/task-scheduler/measurement/summary.mjs +123 -0
  432. package/dist/esm/project-run/task-scheduler/measurement/summary.mjs.map +1 -0
  433. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +158 -0
  434. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -0
  435. package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +90 -62
  436. package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -1
  437. package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +20 -6
  438. package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -1
  439. package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +5 -105
  440. package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -1
  441. package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +0 -9
  442. package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -1
  443. package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +48 -28
  444. package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -1
  445. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +89 -0
  446. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -0
  447. package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs +94 -0
  448. package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs.map +1 -0
  449. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +66 -0
  450. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -0
  451. package/dist/esm/project-run/task-scheduler/scheduler.mjs +171 -114
  452. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  453. package/docs/api-mechanics.md +64 -137
  454. package/docs/changelog.md +157 -0
  455. package/docs/checks/duplicate-detection.md +111 -59
  456. package/docs/checks/file-metrics.md +46 -43
  457. package/docs/checks/function-metrics.md +100 -163
  458. package/docs/checks/json-schema-validation.md +43 -36
  459. package/docs/checks/json-validation.md +38 -25
  460. package/docs/checks/maintenance-reminders.md +41 -29
  461. package/docs/checks/markdown-link-validation.md +82 -54
  462. package/docs/checks/secret-detection.md +129 -0
  463. package/docs/examples/artifacts/mixed-outcomes/definition.ts +5 -5
  464. package/docs/guides/cache-results.md +63 -0
  465. package/docs/guides/callbacks.md +34 -0
  466. package/docs/guides/check-dependencies.md +121 -0
  467. package/docs/guides/collecting-project-files.md +59 -0
  468. package/docs/guides/extending-check-lifecycle.md +112 -0
  469. package/docs/guides/finding-waivers.md +45 -0
  470. package/docs/guides/learned-scheduling.md +83 -0
  471. package/docs/guides/presenting-findings.md +54 -0
  472. package/docs/guides/run-outputs.md +145 -0
  473. package/docs/guides/scheduling.md +208 -0
  474. package/docs/guides/simulating-admission.md +55 -0
  475. package/docs/output.md +11 -20
  476. package/licenses/Lizard-1.24.0-MIT.txt +30 -0
  477. package/{third-party-licenses/momoa-3.3.12-LICENSE → licenses/Lizard-1.24.0-lizard.py-Apache-2.0.txt} +1 -0
  478. package/licenses/Pygments-2.18.0-BSD-2-Clause.txt +25 -0
  479. package/licenses/analyzer-translations-NOTICE.md +24 -0
  480. package/licenses/lizard-1.24.0-provenance.json +957 -0
  481. package/package.json +18 -6
  482. package/src/cache/cache-json-by-key.ts +304 -0
  483. package/src/check/check.ts +67 -17
  484. package/src/check/finding-presentation.ts +67 -0
  485. package/src/check/inherited-collection.ts +1 -1
  486. package/src/check-settlement/fact-validation.ts +29 -39
  487. package/src/check-settlement/outcome-normalization.ts +17 -35
  488. package/src/check-settlement/reason-shape.ts +20 -0
  489. package/src/check-settlement/record-store.ts +18 -15
  490. package/src/check-settlement/session.ts +12 -3
  491. package/src/data-boundary/closed-values.ts +29 -0
  492. package/src/data-boundary/value-shapes.ts +12 -0
  493. package/src/index.ts +70 -2
  494. package/src/learned-critical-path/duration-model/bounded-history.ts +108 -0
  495. package/src/learned-critical-path/duration-model/prediction.ts +181 -0
  496. package/src/learned-critical-path/duration-model/preparation.ts +77 -0
  497. package/src/learned-critical-path/duration-model/recording.ts +208 -0
  498. package/src/learned-critical-path/duration-model/storage.ts +252 -0
  499. package/src/learned-critical-path/selection-layers.ts +72 -0
  500. package/src/learned-critical-path/static-decision.ts +105 -0
  501. package/src/learned-critical-path/strategy.ts +299 -0
  502. package/src/machine-output/v4/atomic-publication.ts +1 -16
  503. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +46 -0
  504. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +95 -0
  505. package/src/package-checks/code-quality-findings/policy.ts +23 -0
  506. package/src/package-checks/duplicate-detection/area-policy.ts +24 -13
  507. package/src/package-checks/duplicate-detection/cache/identity.ts +1 -1
  508. package/src/package-checks/duplicate-detection/default-check.ts +1 -1
  509. package/src/package-checks/duplicate-detection/execution.ts +82 -22
  510. package/src/package-checks/duplicate-detection/finding-messages.ts +75 -0
  511. package/src/package-checks/duplicate-detection/finding-waiver-identity.ts +68 -0
  512. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  513. package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +1 -1
  514. package/src/package-checks/duplicate-detection/jscpd/json-report.ts +24 -5
  515. package/src/package-checks/duplicate-detection/jscpd/scanner.ts +6 -7
  516. package/src/package-checks/duplicate-detection/options-resolution.ts +32 -57
  517. package/src/package-checks/duplicate-detection/options-validation.ts +23 -31
  518. package/src/package-checks/duplicate-detection/options.ts +21 -1
  519. package/src/package-checks/duplicate-detection/records.ts +65 -12
  520. package/src/package-checks/file-metrics/execution.ts +16 -17
  521. package/src/package-checks/file-metrics/finding-messages.ts +29 -0
  522. package/src/package-checks/file-metrics/options-resolution.ts +19 -52
  523. package/src/package-checks/file-metrics/options-validation.ts +23 -32
  524. package/src/package-checks/file-metrics/records.ts +11 -23
  525. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  526. package/src/package-checks/file-metrics/scc/parser.ts +4 -4
  527. package/src/package-checks/file-metrics/scc/scanner.ts +2 -2
  528. package/src/package-checks/function-metrics/analysis.ts +76 -21
  529. package/src/package-checks/function-metrics/analyzer/analysis-context.ts +749 -0
  530. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +421 -0
  531. package/src/package-checks/function-metrics/analyzer/contracts.ts +54 -0
  532. package/src/package-checks/function-metrics/analyzer/extension-output.ts +261 -0
  533. package/src/package-checks/function-metrics/analyzer/extensions/extension-base.ts +33 -0
  534. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +27 -0
  535. package/src/package-checks/function-metrics/analyzer/extensions/lizardnd.ts +144 -0
  536. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +345 -0
  537. package/src/package-checks/function-metrics/analyzer/extensions/registry.ts +157 -0
  538. package/src/package-checks/function-metrics/analyzer/pipeline.ts +311 -0
  539. package/src/package-checks/function-metrics/analyzer/port-facade.ts +142 -0
  540. package/src/package-checks/function-metrics/analyzer/reader-registry.ts +84 -0
  541. package/src/package-checks/function-metrics/analyzer/readers/csharp.ts +110 -0
  542. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +501 -0
  543. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +294 -0
  544. package/src/package-checks/function-metrics/analyzer/readers/gdscript.ts +42 -0
  545. package/src/package-checks/function-metrics/analyzer/readers/go.ts +53 -0
  546. package/src/package-checks/function-metrics/analyzer/readers/java-body-states.ts +141 -0
  547. package/src/package-checks/function-metrics/analyzer/readers/java.ts +270 -0
  548. package/src/package-checks/function-metrics/analyzer/readers/javascript.ts +19 -0
  549. package/src/package-checks/function-metrics/analyzer/readers/kotlin.ts +120 -0
  550. package/src/package-checks/function-metrics/analyzer/readers/lua.ts +68 -0
  551. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +107 -0
  552. package/src/package-checks/function-metrics/analyzer/readers/perl.ts +340 -0
  553. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +246 -0
  554. package/src/package-checks/function-metrics/analyzer/readers/php.ts +63 -0
  555. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +306 -0
  556. package/src/package-checks/function-metrics/analyzer/readers/python.ts +431 -0
  557. package/src/package-checks/function-metrics/analyzer/readers/r.ts +234 -0
  558. package/src/package-checks/function-metrics/analyzer/readers/ruby.ts +88 -0
  559. package/src/package-checks/function-metrics/analyzer/readers/rust.ts +47 -0
  560. package/src/package-checks/function-metrics/analyzer/readers/scala.ts +60 -0
  561. package/src/package-checks/function-metrics/analyzer/readers/solidity.ts +32 -0
  562. package/src/package-checks/function-metrics/analyzer/readers/st.ts +161 -0
  563. package/src/package-checks/function-metrics/analyzer/readers/swift.ts +116 -0
  564. package/src/package-checks/function-metrics/analyzer/readers/tsx.ts +165 -0
  565. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +90 -0
  566. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +593 -0
  567. package/src/package-checks/function-metrics/analyzer/readers/vue.ts +43 -0
  568. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +35 -0
  569. package/src/package-checks/function-metrics/analyzer/shared/clike.ts +541 -0
  570. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +682 -0
  571. package/src/package-checks/function-metrics/analyzer/shared/golike.ts +143 -0
  572. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +75 -0
  573. package/src/package-checks/function-metrics/analyzer/shared/rubylike.ts +161 -0
  574. package/src/package-checks/function-metrics/analyzer/shared/script-language.ts +50 -0
  575. package/src/package-checks/function-metrics/analyzer-adapter.ts +84 -0
  576. package/src/package-checks/function-metrics/analyzer-worker-contract.ts +10 -0
  577. package/src/package-checks/function-metrics/analyzer-worker-port.ts +150 -0
  578. package/src/package-checks/function-metrics/analyzer-worker.ts +31 -0
  579. package/src/package-checks/function-metrics/constructor.ts +2 -2
  580. package/src/package-checks/function-metrics/execution.ts +94 -39
  581. package/src/package-checks/function-metrics/finding-messages.ts +95 -0
  582. package/src/package-checks/function-metrics/finding-waiver-identity.ts +36 -0
  583. package/src/package-checks/function-metrics/measurement-model.ts +15 -1
  584. package/src/package-checks/function-metrics/measurement.ts +221 -36
  585. package/src/package-checks/function-metrics/options-resolution.ts +39 -75
  586. package/src/package-checks/function-metrics/options-validation.ts +30 -39
  587. package/src/package-checks/function-metrics/options.ts +27 -11
  588. package/src/package-checks/function-metrics/records.ts +73 -7
  589. package/src/package-checks/function-metrics/target-files.ts +10 -70
  590. package/src/package-checks/{file-metrics/scc → host-environment}/csv.ts +1 -2
  591. package/src/package-checks/host-environment/git.ts +2 -2
  592. package/src/package-checks/host-environment/process.ts +10 -0
  593. package/src/package-checks/json-schema-validation/final-data.ts +8 -0
  594. package/src/package-checks/json-schema-validation/options-validation.ts +16 -23
  595. package/src/package-checks/json-schema-validation/options.ts +23 -0
  596. package/src/package-checks/json-validation/final-data.ts +5 -0
  597. package/src/package-checks/json-validation/options-validation.ts +4 -18
  598. package/src/package-checks/maintenance-reminders/final-data.ts +18 -0
  599. package/src/package-checks/markdown-link-validation/default-check.ts +9 -3
  600. package/src/package-checks/markdown-link-validation/execution.ts +51 -57
  601. package/src/package-checks/markdown-link-validation/filesystem-probes.ts +108 -51
  602. package/src/package-checks/markdown-link-validation/final-data.ts +5 -0
  603. package/src/package-checks/markdown-link-validation/finding-messages.ts +48 -0
  604. package/src/package-checks/markdown-link-validation/local-resolution.ts +17 -9
  605. package/src/package-checks/markdown-link-validation/local-resolver.ts +5 -2
  606. package/src/package-checks/markdown-link-validation/options-resolution.ts +31 -3
  607. package/src/package-checks/markdown-link-validation/options-validation.ts +27 -19
  608. package/src/package-checks/markdown-link-validation/options.ts +15 -0
  609. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +246 -0
  610. package/src/package-checks/markdown-link-validation/parse-facts-cache.ts +154 -0
  611. package/src/package-checks/markdown-link-validation/resolver-engine.ts +75 -65
  612. package/src/package-checks/markdown-link-validation/source-reader.ts +86 -0
  613. package/src/package-checks/markdown-link-validation/unavailable-reasons.ts +42 -0
  614. package/src/package-checks/project-files/collection.ts +1 -1
  615. package/src/package-checks/project-files/configuration.ts +3 -14
  616. package/src/package-checks/project-files/gitlink-revision.ts +1 -1
  617. package/src/package-checks/project-files/gitlink-worktree.ts +1 -1
  618. package/src/package-checks/project-files/public-collection.ts +92 -0
  619. package/src/package-checks/project-files/revision-worktree-files.ts +1 -1
  620. package/src/package-checks/secret-detection/classification.ts +30 -0
  621. package/src/package-checks/secret-detection/default-check.ts +50 -0
  622. package/src/package-checks/secret-detection/execution.ts +247 -0
  623. package/src/package-checks/secret-detection/final-data.ts +57 -0
  624. package/src/package-checks/secret-detection/finding-waiver-identity.ts +37 -0
  625. package/src/package-checks/secret-detection/input-preparation.ts +233 -0
  626. package/src/package-checks/secret-detection/options-resolution.ts +65 -0
  627. package/src/package-checks/secret-detection/options-validation.ts +27 -0
  628. package/src/package-checks/secret-detection/options.ts +36 -0
  629. package/src/package-checks/secret-detection/records.ts +77 -0
  630. package/src/package-checks/secret-detection/secretlint/adapter.ts +123 -0
  631. package/src/project-definition/check-tree/authoring.ts +29 -230
  632. package/src/project-definition/check-tree/check-fields-authoring.ts +227 -0
  633. package/src/project-definition/check-tree/collection-authoring.ts +13 -0
  634. package/src/project-definition/check-tree/materialization.ts +9 -1
  635. package/src/project-definition/check-tree/resolution.ts +80 -22
  636. package/src/project-definition/check-tree/scheduling-authoring.ts +114 -0
  637. package/src/project-definition/declarative-snapshot.ts +87 -0
  638. package/src/project-definition/output-defaults.ts +32 -1
  639. package/src/project-definition/output-validation.ts +15 -15
  640. package/src/project-definition/progress-rendering-output.ts +121 -0
  641. package/src/project-definition/project-definition-validation.ts +117 -18
  642. package/src/project-definition/project-definition.ts +198 -61
  643. package/src/project-definition/resource-unit-mapping.ts +25 -0
  644. package/src/project-definition/scheduler-policy.ts +553 -0
  645. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +80 -0
  646. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +27 -0
  647. package/src/project-run/admission-strategy-provider/provider.ts +45 -0
  648. package/src/project-run/aggregation.ts +10 -5
  649. package/src/project-run/check-execution/callback.ts +50 -8
  650. package/src/project-run/check-execution/console-capture.ts +262 -0
  651. package/src/project-run/check-execution/dependencies.ts +43 -6
  652. package/src/project-run/check-execution/execution-finalization.ts +99 -25
  653. package/src/project-run/check-execution/execution-settlement.ts +19 -11
  654. package/src/project-run/check-execution/flag-controls.ts +132 -0
  655. package/src/project-run/check-execution/lifecycle.ts +21 -0
  656. package/src/project-run/check-execution/messages.ts +8 -0
  657. package/src/project-run/check-execution/plan.ts +12 -8
  658. package/src/project-run/check-execution/preflight.ts +23 -43
  659. package/src/project-run/check-execution/resolved-checks.ts +165 -126
  660. package/src/project-run/check-execution/resolved-execution-result.ts +22 -0
  661. package/src/project-run/{completion.ts → completion/completion.ts} +17 -57
  662. package/src/project-run/{machine-publication.ts → completion/machine-publication.ts} +4 -4
  663. package/src/project-run/completion/result-resolver.ts +60 -0
  664. package/src/project-run/controls/contract.ts +25 -2
  665. package/src/project-run/controls/outputs-override-validation.ts +83 -60
  666. package/src/project-run/controls/validation-result.ts +17 -6
  667. package/src/project-run/controls/validation.ts +107 -12
  668. package/src/project-run/diagnostic-logging/logger.ts +132 -207
  669. package/src/project-run/diagnostic-logging/observation-rendering.ts +203 -0
  670. package/src/project-run/invocation/candidate.ts +86 -0
  671. package/src/project-run/invocation/creation.ts +116 -0
  672. package/src/project-run/invocation/paths.ts +154 -0
  673. package/src/project-run/invocation/progress.ts +38 -0
  674. package/src/project-run/{invocation.ts → invocation/run.ts} +125 -120
  675. package/src/project-run/invocation/scheduler.ts +75 -0
  676. package/src/project-run/{output-configuration.ts → outputs/configuration.ts} +6 -5
  677. package/src/project-run/outputs/status.ts +161 -0
  678. package/src/project-run/progress-rendering/presentation.ts +118 -26
  679. package/src/project-run/progress-rendering/renderer-formatting.ts +166 -19
  680. package/src/project-run/progress-rendering/renderer-lifecycle.ts +38 -3
  681. package/src/project-run/progress-rendering/renderer.ts +13 -2
  682. package/src/project-run/project-context.ts +3 -2
  683. package/src/project-run/result.ts +49 -3
  684. package/src/project-run/run.ts +7 -6
  685. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +316 -0
  686. package/src/project-run/task-scheduler/admission-core/core.ts +278 -0
  687. package/src/project-run/task-scheduler/admission-core/input.ts +138 -0
  688. package/src/project-run/task-scheduler/admission-core/projection.ts +164 -0
  689. package/src/project-run/task-scheduler/admission-core/selection-index.ts +165 -0
  690. package/src/project-run/task-scheduler/admission-core/selection-query.ts +295 -0
  691. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +252 -0
  692. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +236 -0
  693. package/src/project-run/task-scheduler/admission-core/selection.ts +140 -0
  694. package/src/project-run/task-scheduler/admission-core/trace.ts +177 -0
  695. package/src/project-run/task-scheduler/admission-scope-layers.ts +44 -0
  696. package/src/project-run/task-scheduler/admission-selection-policy.ts +116 -0
  697. package/src/project-run/task-scheduler/critical-path-ranking.ts +76 -0
  698. package/src/project-run/task-scheduler/custom-admission-policy.ts +128 -0
  699. package/src/project-run/task-scheduler/execution-state.ts +97 -6
  700. package/src/project-run/task-scheduler/forced-block-effect-replay.ts +68 -0
  701. package/src/project-run/task-scheduler/graph-validation.ts +77 -31
  702. package/src/project-run/task-scheduler/graph.ts +111 -3
  703. package/src/project-run/task-scheduler/measurement/diagnostics.ts +261 -0
  704. package/src/project-run/task-scheduler/measurement/integrals.ts +177 -0
  705. package/src/project-run/task-scheduler/measurement/policy.ts +105 -0
  706. package/src/project-run/task-scheduler/measurement/summary.ts +175 -0
  707. package/src/project-run/task-scheduler/measurement/timing.ts +190 -0
  708. package/src/project-run/task-scheduler/scheduler-admission-decision.ts +143 -134
  709. package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +34 -9
  710. package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +28 -170
  711. package/src/project-run/task-scheduler/scheduler-decision-model.ts +36 -40
  712. package/src/project-run/task-scheduler/scheduler-decision.ts +68 -36
  713. package/src/project-run/task-scheduler/scheduler-observation.ts +124 -0
  714. package/src/project-run/task-scheduler/scheduler-task-lifecycle.ts +150 -0
  715. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +95 -0
  716. package/src/project-run/task-scheduler/scheduler.ts +216 -171
  717. package/types/cache/cache-json-by-key.d.ts +53 -0
  718. package/types/check/check.d.ts +62 -17
  719. package/types/check/finding-presentation.d.ts +25 -0
  720. package/types/check/inherited-collection.d.ts +1 -1
  721. package/types/check-settlement/reason-shape.d.ts +5 -0
  722. package/types/check-settlement/record-store.d.ts +2 -2
  723. package/types/check-settlement/session.d.ts +3 -1
  724. package/types/data-boundary/closed-values.d.ts +8 -0
  725. package/types/data-boundary/value-shapes.d.ts +3 -0
  726. package/types/index.d.ts +22 -7
  727. package/types/learned-critical-path/duration-model/bounded-history.d.ts +34 -0
  728. package/types/learned-critical-path/duration-model/prediction.d.ts +32 -0
  729. package/types/learned-critical-path/duration-model/preparation.d.ts +28 -0
  730. package/types/learned-critical-path/duration-model/recording.d.ts +28 -0
  731. package/types/learned-critical-path/duration-model/storage.d.ts +12 -0
  732. package/types/learned-critical-path/selection-layers.d.ts +14 -0
  733. package/types/learned-critical-path/static-decision.d.ts +3 -0
  734. package/types/learned-critical-path/strategy.d.ts +35 -0
  735. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +7 -0
  736. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +34 -0
  737. package/types/package-checks/code-quality-findings/policy.d.ts +4 -0
  738. package/types/package-checks/duplicate-detection/area-policy.d.ts +1 -1
  739. package/types/package-checks/duplicate-detection/finding-messages.d.ts +7 -0
  740. package/types/package-checks/duplicate-detection/finding-waiver-identity.d.ts +3 -0
  741. package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +1 -1
  742. package/types/package-checks/duplicate-detection/options.d.ts +18 -1
  743. package/types/package-checks/duplicate-detection/records.d.ts +20 -3
  744. package/types/package-checks/file-metrics/finding-messages.d.ts +4 -0
  745. package/types/package-checks/file-metrics/records.d.ts +5 -10
  746. package/types/package-checks/file-metrics/scc/parser.d.ts +4 -4
  747. package/types/package-checks/function-metrics/analysis.d.ts +1 -1
  748. package/types/package-checks/function-metrics/analyzer/analysis-context.d.ts +174 -0
  749. package/types/package-checks/function-metrics/analyzer/analysis-model.d.ts +135 -0
  750. package/types/package-checks/function-metrics/analyzer/contracts.d.ts +48 -0
  751. package/types/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.d.ts +13 -0
  752. package/types/package-checks/function-metrics/analyzer/extensions/lizardnd.d.ts +28 -0
  753. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +99 -0
  754. package/types/package-checks/function-metrics/analyzer/extensions/registry.d.ts +34 -0
  755. package/types/package-checks/function-metrics/analyzer/pipeline.d.ts +67 -0
  756. package/types/package-checks/function-metrics/analyzer/port-facade.d.ts +38 -0
  757. package/types/package-checks/function-metrics/analyzer/reader-registry.d.ts +18 -0
  758. package/types/package-checks/function-metrics/analyzer/readers/csharp.d.ts +22 -0
  759. package/types/package-checks/function-metrics/analyzer/readers/erlang.d.ts +22 -0
  760. package/types/package-checks/function-metrics/analyzer/readers/fortran.d.ts +29 -0
  761. package/types/package-checks/function-metrics/analyzer/readers/gdscript.d.ts +18 -0
  762. package/types/package-checks/function-metrics/analyzer/readers/go.d.ts +18 -0
  763. package/types/package-checks/function-metrics/analyzer/readers/java-body-states.d.ts +18 -0
  764. package/types/package-checks/function-metrics/analyzer/readers/java.d.ts +44 -0
  765. package/types/package-checks/function-metrics/analyzer/readers/javascript.d.ts +14 -0
  766. package/types/package-checks/function-metrics/analyzer/readers/kotlin.d.ts +23 -0
  767. package/types/package-checks/function-metrics/analyzer/readers/lua.d.ts +16 -0
  768. package/types/package-checks/function-metrics/analyzer/readers/objc.d.ts +18 -0
  769. package/types/package-checks/function-metrics/analyzer/readers/perl.d.ts +28 -0
  770. package/types/package-checks/function-metrics/analyzer/readers/php-states.d.ts +41 -0
  771. package/types/package-checks/function-metrics/analyzer/readers/php.d.ts +22 -0
  772. package/types/package-checks/function-metrics/analyzer/readers/plsql.d.ts +24 -0
  773. package/types/package-checks/function-metrics/analyzer/readers/python.d.ts +50 -0
  774. package/types/package-checks/function-metrics/analyzer/readers/r.d.ts +22 -0
  775. package/types/package-checks/function-metrics/analyzer/readers/ruby.d.ts +16 -0
  776. package/types/package-checks/function-metrics/analyzer/readers/rust.d.ts +20 -0
  777. package/types/package-checks/function-metrics/analyzer/readers/scala.d.ts +20 -0
  778. package/types/package-checks/function-metrics/analyzer/readers/solidity.d.ts +19 -0
  779. package/types/package-checks/function-metrics/analyzer/readers/st.d.ts +37 -0
  780. package/types/package-checks/function-metrics/analyzer/readers/swift.d.ts +30 -0
  781. package/types/package-checks/function-metrics/analyzer/readers/tsx.d.ts +15 -0
  782. package/types/package-checks/function-metrics/analyzer/readers/ttcn.d.ts +22 -0
  783. package/types/package-checks/function-metrics/analyzer/readers/typescript.d.ts +35 -0
  784. package/types/package-checks/function-metrics/analyzer/readers/vue.d.ts +18 -0
  785. package/types/package-checks/function-metrics/analyzer/readers/zig.d.ts +19 -0
  786. package/types/package-checks/function-metrics/analyzer/shared/clike.d.ts +101 -0
  787. package/types/package-checks/function-metrics/analyzer/shared/code-reader.d.ts +176 -0
  788. package/types/package-checks/function-metrics/analyzer/shared/golike.d.ts +39 -0
  789. package/types/package-checks/function-metrics/analyzer/shared/js-style-regex.d.ts +16 -0
  790. package/types/package-checks/function-metrics/analyzer/shared/rubylike.d.ts +40 -0
  791. package/types/package-checks/function-metrics/analyzer/shared/script-language.d.ts +17 -0
  792. package/types/package-checks/function-metrics/analyzer-adapter.d.ts +26 -0
  793. package/types/package-checks/function-metrics/analyzer-worker-contract.d.ts +5 -0
  794. package/types/package-checks/function-metrics/analyzer-worker-port.d.ts +24 -0
  795. package/types/package-checks/function-metrics/analyzer-worker.d.ts +1 -0
  796. package/types/package-checks/function-metrics/constructor.d.ts +1 -1
  797. package/types/package-checks/function-metrics/execution.d.ts +5 -2
  798. package/types/package-checks/function-metrics/finding-messages.d.ts +9 -0
  799. package/types/package-checks/function-metrics/finding-waiver-identity.d.ts +2 -0
  800. package/types/package-checks/function-metrics/measurement-model.d.ts +13 -1
  801. package/types/package-checks/function-metrics/measurement.d.ts +22 -7
  802. package/types/package-checks/function-metrics/options.d.ts +23 -10
  803. package/types/package-checks/function-metrics/records.d.ts +24 -5
  804. package/types/package-checks/function-metrics/target-files.d.ts +4 -3
  805. package/types/package-checks/host-environment/csv.d.ts +2 -0
  806. package/types/package-checks/host-environment/git.d.ts +1 -1
  807. package/types/package-checks/host-environment/process.d.ts +5 -0
  808. package/types/package-checks/json-schema-validation/final-data.d.ts +8 -0
  809. package/types/package-checks/json-schema-validation/options.d.ts +31 -3
  810. package/types/package-checks/json-validation/final-data.d.ts +5 -0
  811. package/types/package-checks/maintenance-reminders/final-data.d.ts +18 -0
  812. package/types/package-checks/markdown-link-validation/default-check.d.ts +9 -3
  813. package/types/package-checks/markdown-link-validation/execution.d.ts +1 -3
  814. package/types/package-checks/markdown-link-validation/final-data.d.ts +5 -0
  815. package/types/package-checks/markdown-link-validation/finding-messages.d.ts +4 -0
  816. package/types/package-checks/markdown-link-validation/local-resolution.d.ts +12 -6
  817. package/types/package-checks/markdown-link-validation/local-resolver.d.ts +2 -1
  818. package/types/package-checks/markdown-link-validation/options.d.ts +15 -0
  819. package/types/package-checks/markdown-link-validation/parse-facts-cache-payload.d.ts +24 -0
  820. package/types/package-checks/markdown-link-validation/parse-facts-cache.d.ts +13 -0
  821. package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +6 -4
  822. package/types/package-checks/markdown-link-validation/source-reader.d.ts +11 -0
  823. package/types/package-checks/markdown-link-validation/unavailable-reasons.d.ts +4 -0
  824. package/types/package-checks/project-files/public-collection.d.ts +16 -0
  825. package/types/package-checks/secret-detection/classification.d.ts +12 -0
  826. package/types/package-checks/secret-detection/default-check.d.ts +11 -0
  827. package/types/package-checks/secret-detection/execution.d.ts +14 -0
  828. package/types/package-checks/secret-detection/final-data.d.ts +15 -0
  829. package/types/package-checks/secret-detection/finding-waiver-identity.d.ts +5 -0
  830. package/types/package-checks/secret-detection/input-preparation.d.ts +24 -0
  831. package/types/package-checks/secret-detection/options-resolution.d.ts +6 -0
  832. package/types/package-checks/secret-detection/options-validation.d.ts +3 -0
  833. package/types/package-checks/secret-detection/options.d.ts +32 -0
  834. package/types/package-checks/secret-detection/records.d.ts +35 -0
  835. package/types/package-checks/secret-detection/secretlint/adapter.d.ts +28 -0
  836. package/types/project-definition/check-tree/authoring.d.ts +11 -14
  837. package/types/project-definition/check-tree/check-fields-authoring.d.ts +25 -0
  838. package/types/project-definition/check-tree/collection-authoring.d.ts +2 -0
  839. package/types/project-definition/check-tree/resolution.d.ts +8 -3
  840. package/types/project-definition/check-tree/scheduling-authoring.d.ts +19 -0
  841. package/types/project-definition/declarative-snapshot.d.ts +7 -0
  842. package/types/project-definition/output-defaults.d.ts +7 -0
  843. package/types/project-definition/output-validation.d.ts +2 -1
  844. package/types/project-definition/progress-rendering-output.d.ts +41 -0
  845. package/types/project-definition/project-definition.d.ts +61 -16
  846. package/types/project-definition/resource-unit-mapping.d.ts +4 -0
  847. package/types/project-definition/scheduler-policy.d.ts +497 -0
  848. package/types/project-run/admission-strategy-provider/custom-strategy-preparation.d.ts +9 -0
  849. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +23 -0
  850. package/types/project-run/admission-strategy-provider/provider.d.ts +13 -0
  851. package/types/project-run/aggregation.d.ts +1 -1
  852. package/types/project-run/check-execution/callback.d.ts +5 -1
  853. package/types/project-run/check-execution/console-capture.d.ts +18 -0
  854. package/types/project-run/check-execution/dependencies.d.ts +1 -1
  855. package/types/project-run/check-execution/execution-finalization.d.ts +17 -7
  856. package/types/project-run/check-execution/execution-settlement.d.ts +5 -2
  857. package/types/project-run/check-execution/flag-controls.d.ts +27 -0
  858. package/types/project-run/check-execution/lifecycle.d.ts +20 -0
  859. package/types/project-run/check-execution/messages.d.ts +2 -0
  860. package/types/project-run/check-execution/plan.d.ts +2 -3
  861. package/types/project-run/check-execution/preflight.d.ts +6 -5
  862. package/types/project-run/check-execution/resolved-checks.d.ts +32 -38
  863. package/types/project-run/check-execution/resolved-execution-result.d.ts +21 -0
  864. package/types/project-run/{completion.d.ts → completion/completion.d.ts} +4 -4
  865. package/types/project-run/{machine-publication.d.ts → completion/machine-publication.d.ts} +3 -3
  866. package/types/project-run/completion/result-resolver.d.ts +4 -0
  867. package/types/project-run/controls/contract.d.ts +25 -2
  868. package/types/project-run/controls/outputs-override-validation.d.ts +2 -1
  869. package/types/project-run/controls/validation-result.d.ts +12 -4
  870. package/types/project-run/diagnostic-logging/logger.d.ts +34 -4
  871. package/types/project-run/diagnostic-logging/observation-rendering.d.ts +7 -0
  872. package/types/project-run/invocation/candidate.d.ts +12 -0
  873. package/types/project-run/{invocation-creation.d.ts → invocation/creation.d.ts} +3 -3
  874. package/types/project-run/invocation/paths.d.ts +40 -0
  875. package/types/project-run/invocation/progress.d.ts +11 -0
  876. package/types/project-run/invocation/run.d.ts +43 -0
  877. package/types/project-run/invocation/scheduler.d.ts +16 -0
  878. package/types/project-run/outputs/configuration.d.ts +3 -0
  879. package/types/project-run/outputs/status.d.ts +48 -0
  880. package/types/project-run/progress-rendering/presentation.d.ts +9 -5
  881. package/types/project-run/progress-rendering/renderer-formatting.d.ts +8 -0
  882. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +6 -1
  883. package/types/project-run/progress-rendering/renderer.d.ts +7 -1
  884. package/types/project-run/project-context.d.ts +2 -1
  885. package/types/project-run/result.d.ts +37 -3
  886. package/types/project-run/run.d.ts +6 -5
  887. package/types/project-run/task-scheduler/admission-core/compiled-graph.d.ts +31 -0
  888. package/types/project-run/task-scheduler/admission-core/core.d.ts +57 -0
  889. package/types/project-run/task-scheduler/admission-core/input.d.ts +4 -0
  890. package/types/project-run/task-scheduler/admission-core/projection.d.ts +22 -0
  891. package/types/project-run/task-scheduler/admission-core/selection-index.d.ts +61 -0
  892. package/types/project-run/task-scheduler/admission-core/selection-query.d.ts +28 -0
  893. package/types/project-run/task-scheduler/admission-core/selection-seed.d.ts +9 -0
  894. package/types/project-run/task-scheduler/admission-core/selection-transition.d.ts +4 -0
  895. package/types/project-run/task-scheduler/admission-core/selection.d.ts +20 -0
  896. package/types/project-run/task-scheduler/admission-scope-layers.d.ts +8 -0
  897. package/types/project-run/task-scheduler/admission-selection-policy.d.ts +31 -0
  898. package/types/project-run/task-scheduler/critical-path-ranking.d.ts +19 -0
  899. package/types/project-run/task-scheduler/custom-admission-policy.d.ts +6 -0
  900. package/types/project-run/task-scheduler/execution-state.d.ts +43 -1
  901. package/types/project-run/task-scheduler/forced-block-effect-replay.d.ts +9 -0
  902. package/types/project-run/task-scheduler/graph-validation.d.ts +3 -2
  903. package/types/project-run/task-scheduler/graph.d.ts +15 -0
  904. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +47 -0
  905. package/types/project-run/task-scheduler/measurement/integrals.d.ts +27 -0
  906. package/types/project-run/task-scheduler/measurement/policy.d.ts +10 -0
  907. package/types/project-run/task-scheduler/measurement/summary.d.ts +3 -0
  908. package/types/project-run/task-scheduler/measurement/timing.d.ts +33 -0
  909. package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +13 -1
  910. package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +20 -19
  911. package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +38 -22
  912. package/types/project-run/task-scheduler/scheduler-decision.d.ts +4 -1
  913. package/types/project-run/task-scheduler/scheduler-observation.d.ts +14 -0
  914. package/types/project-run/task-scheduler/scheduler-task-lifecycle.d.ts +18 -0
  915. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +9 -0
  916. package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +0 -1
  917. package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +0 -64
  918. package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +0 -1
  919. package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +0 -17
  920. package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +0 -1
  921. package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +0 -138
  922. package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +0 -1
  923. package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +0 -35
  924. package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +0 -1
  925. package/dist/esm/package-checks/host-environment/process/command.mjs +0 -13
  926. package/dist/esm/package-checks/host-environment/process/command.mjs.map +0 -1
  927. package/dist/esm/project-run/completion.mjs.map +0 -1
  928. package/dist/esm/project-run/invocation-creation.mjs +0 -111
  929. package/dist/esm/project-run/invocation-creation.mjs.map +0 -1
  930. package/dist/esm/project-run/invocation.mjs.map +0 -1
  931. package/dist/esm/project-run/machine-publication.mjs.map +0 -1
  932. package/dist/esm/project-run/output-configuration.mjs.map +0 -1
  933. package/dist/esm/project-run/output-status.mjs +0 -43
  934. package/dist/esm/project-run/output-status.mjs.map +0 -1
  935. package/src/package-checks/function-metrics/lizard/availability.ts +0 -90
  936. package/src/package-checks/function-metrics/lizard/csv.ts +0 -20
  937. package/src/package-checks/function-metrics/lizard/parser.ts +0 -179
  938. package/src/package-checks/function-metrics/lizard/scanner.ts +0 -62
  939. package/src/package-checks/host-environment/process/command.ts +0 -21
  940. package/src/project-run/invocation-creation.ts +0 -160
  941. package/src/project-run/output-status.ts +0 -69
  942. package/types/package-checks/file-metrics/scc/csv.d.ts +0 -1
  943. package/types/package-checks/function-metrics/lizard/availability.d.ts +0 -11
  944. package/types/package-checks/function-metrics/lizard/csv.d.ts +0 -1
  945. package/types/package-checks/function-metrics/lizard/parser.d.ts +0 -17
  946. package/types/package-checks/function-metrics/lizard/scanner.d.ts +0 -15
  947. package/types/package-checks/host-environment/process/command.d.ts +0 -7
  948. package/types/project-run/invocation.d.ts +0 -34
  949. package/types/project-run/output-configuration.d.ts +0 -3
  950. package/types/project-run/output-status.d.ts +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-validation/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,SAAS,WAAW,CAClB,KAAc,EACd,IAAuB;IAEvB,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,MAAM,KAAK,SAAS,IAAI,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5F,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,OAAO,CACL,OAAO,KAAK,SAAS;QACrB,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAC1C,CAAC;AACJ,CAAC","sourcesContent":["import {\n hasExactPlainRecordKeys,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport type { ResolvedJsonValidationOptions } from \"./options.ts\";\n\nfunction exactRecord(\n value: unknown,\n keys: readonly string[]\n): Readonly<Record<string, unknown>> | undefined {\n const record = snapshotClosedRecord(value);\n return record !== undefined && hasExactPlainRecordKeys(record, keys) ? record : undefined;\n}\n\nfunction positiveSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nexport function validJsonValidationOptions(value: unknown): value is ResolvedJsonValidationOptions {\n const options = exactRecord(value, [\"files\", \"maximumBytes\"]);\n return (\n options !== undefined &&\n validProjectFileSelection(options.files) &&\n positiveSafeInteger(options.maximumBytes)\n );\n}\n"]}
1
+ {"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/json-validation/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5E,OAAO,CACL,OAAO,KAAK,SAAS;QACrB,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC,CAC5C,CAAC;AACJ,CAAC","sourcesContent":["import { snapshotExactClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport type { ResolvedJsonValidationOptions } from \"./options.ts\";\n\nexport function validJsonValidationOptions(value: unknown): value is ResolvedJsonValidationOptions {\n const options = snapshotExactClosedRecord(value, [\"files\", \"maximumBytes\"]);\n return (\n options !== undefined &&\n validProjectFileSelection(options.files) &&\n isPositiveSafeInteger(options.maximumBytes)\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/maintenance-reminders/final-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport {\n exactFinalDataRecord,\n finalDataArray,\n invalidFinalData,\n nonNegativeSafeInteger\n} from \"../final-data-parsing.ts\";\n\nconst EMPTY_EXCEEDED: readonly [] = Object.freeze([]);\n\nconst FULL_COMMIT_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i;\nconst REMINDER_ID = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;\n\n/** 单条维护提醒无法测量时使用的稳定 reason code。 */\nexport const MAINTENANCE_REMINDER_UNAVAILABLE_REASON = Object.freeze({\n baseCommitUnavailable: \"base-commit-unavailable\",\n baseNotFirstParentAncestor: \"base-not-first-parent-ancestor\",\n firstParentHistoryInvalid: \"first-parent-history-invalid\",\n firstParentHistoryUnavailable: \"first-parent-history-unavailable\",\n headInvalid: \"head-invalid\",\n headUnavailable: \"head-unavailable\",\n numstatInvalid: \"numstat-invalid\",\n numstatUnavailable: \"numstat-unavailable\"\n} as const);\n\nexport type MaintenanceReminderMode = \"advisory\" | \"enforcing\";\n\n/** 单条维护提醒无法测量时保留在 final data 中的稳定 reason。 */\nexport type MaintenanceReminderUnavailableReason =\n (typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON)[keyof typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON];\n\nconst MAINTENANCE_REMINDER_UNAVAILABLE_REASONS: readonly MaintenanceReminderUnavailableReason[] =\n Object.freeze(Object.values(MAINTENANCE_REMINDER_UNAVAILABLE_REASON));\n\n/** 判断 unknown value 是否为维护提醒的稳定局部 ID。 */\nexport function isMaintenanceReminderId(value: unknown): value is string {\n return typeof value === \"string\" && REMINDER_ID.test(value);\n}\n\n/** 判断 unknown value 是否为 Git 的完整 SHA-1 或 SHA-256 commit ID。 */\nexport function isMaintenanceCommitId(value: unknown): value is string {\n return typeof value === \"string\" && FULL_COMMIT_ID.test(value);\n}\n\nexport type MeasuredMaintenanceReminderAssessment = Readonly<{\n readonly assessment: \"clear\" | \"due\";\n readonly baseCommit: string;\n readonly changedLines: number;\n readonly commitCount: number;\n readonly exceeded: readonly (\"commits\" | \"changed-lines\")[];\n readonly headCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n}>;\n\nexport type UnavailableMaintenanceReminderAssessment = Readonly<{\n readonly assessment: \"unavailable\";\n readonly baseCommit: string;\n readonly changedLines: null;\n readonly commitCount: null;\n readonly exceeded: readonly [];\n readonly headCommit: string | null;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n readonly reason: MaintenanceReminderUnavailableReason;\n}>;\n\n/** 单条维护提醒的 measured 或 unavailable discriminated assessment。 */\nexport type MaintenanceReminderAssessment =\n | MeasuredMaintenanceReminderAssessment\n | UnavailableMaintenanceReminderAssessment;\n\n/** `maintenance-reminders` 在 passed/failed outcome 中发布的主数据。 */\nexport interface MaintenanceRemindersFinalData {\n readonly entries: readonly MaintenanceReminderAssessment[];\n}\n\n/** 验证 discriminated entry assessments 并脱离 canonical final data。 */\nexport function parseMaintenanceRemindersData(data: unknown): MaintenanceRemindersFinalData {\n const value = exactFinalDataRecord(data, [\"entries\"], \"maintenanceReminders\");\n const entries = finalDataArray(value.entries, \"maintenanceReminders\");\n const parsedEntries: MaintenanceReminderAssessment[] = [];\n const ids = new Set<string>();\n for (const entry of entries) {\n const parsed = parseAssessment(entry);\n if (ids.has(parsed.id)) throw invalidFinalData(\"maintenanceReminders\");\n ids.add(parsed.id);\n parsedEntries.push(parsed);\n }\n return Object.freeze({ entries: Object.freeze(parsedEntries) });\n}\n\nfunction parseAssessment(value: unknown): MaintenanceReminderAssessment {\n const record = assessmentRecord(value);\n const identity = assessmentIdentity(record);\n if (record.assessment === \"unavailable\") {\n return parseUnavailableAssessment(record, identity);\n }\n return parseMeasuredAssessment(record, identity);\n}\n\nfunction assessmentRecord(value: unknown): Readonly<Record<string, unknown>> {\n return exactFinalDataRecord(\n value,\n valueAssessment(value) === \"unavailable\"\n ? unavailableAssessmentKeys()\n : measuredAssessmentKeys(),\n \"maintenanceReminders\"\n );\n}\n\nfunction unavailableAssessmentKeys(): readonly string[] {\n return [\n \"assessment\",\n \"baseCommit\",\n \"changedLines\",\n \"commitCount\",\n \"exceeded\",\n \"headCommit\",\n \"id\",\n \"mode\",\n \"reason\"\n ];\n}\n\nfunction measuredAssessmentKeys(): readonly string[] {\n return [\n \"assessment\",\n \"baseCommit\",\n \"changedLines\",\n \"commitCount\",\n \"exceeded\",\n \"headCommit\",\n \"id\",\n \"mode\"\n ];\n}\n\nfunction assessmentIdentity(record: Readonly<Record<string, unknown>>): Readonly<{\n readonly baseCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n}> {\n const id = isMaintenanceReminderId(record.id) ? record.id : undefined;\n const mode = record.mode === \"advisory\" || record.mode === \"enforcing\" ? record.mode : undefined;\n const baseCommit = isMaintenanceCommitId(record.baseCommit) ? record.baseCommit : undefined;\n if (id === undefined || mode === undefined || baseCommit === undefined)\n throw invalidFinalData(\"maintenanceReminders\");\n return { baseCommit, id, mode };\n}\n\nfunction parseMeasuredAssessment(\n record: Readonly<Record<string, unknown>>,\n identity: Readonly<{\n readonly baseCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n }>\n): MeasuredMaintenanceReminderAssessment {\n if (record.assessment !== \"clear\" && record.assessment !== \"due\")\n throw invalidFinalData(\"maintenanceReminders\");\n const commitCount = nonNegativeSafeInteger(record.commitCount);\n const changedLines = nonNegativeSafeInteger(record.changedLines);\n const headCommit = isMaintenanceCommitId(record.headCommit) ? record.headCommit : undefined;\n const exceeded = parseExceeded(record.exceeded);\n if (\n commitCount === undefined ||\n changedLines === undefined ||\n headCommit === undefined ||\n exceeded === undefined ||\n (record.assessment === \"clear\" ? exceeded.length !== 0 : exceeded.length === 0)\n ) {\n throw invalidFinalData(\"maintenanceReminders\");\n }\n return Object.freeze({\n assessment: record.assessment,\n baseCommit: identity.baseCommit,\n changedLines,\n commitCount,\n exceeded,\n headCommit,\n id: identity.id,\n mode: identity.mode\n });\n}\n\nfunction parseUnavailableAssessment(\n record: Readonly<Record<string, unknown>>,\n identity: Readonly<{\n readonly baseCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n }>\n): UnavailableMaintenanceReminderAssessment {\n const exceeded = finalDataArray(record.exceeded, \"maintenanceReminders\");\n const headCommit = record.headCommit;\n if (\n record.changedLines !== null ||\n record.commitCount !== null ||\n exceeded.length !== 0 ||\n (headCommit !== null && !isMaintenanceCommitId(headCommit)) ||\n !isUnavailableReason(record.reason)\n ) {\n throw invalidFinalData(\"maintenanceReminders\");\n }\n return Object.freeze({\n assessment: \"unavailable\",\n baseCommit: identity.baseCommit,\n changedLines: null,\n commitCount: null,\n exceeded: EMPTY_EXCEEDED,\n headCommit,\n id: identity.id,\n mode: identity.mode,\n reason: record.reason\n });\n}\n\nfunction valueAssessment(value: unknown): unknown {\n return snapshotClosedRecord(value)?.assessment;\n}\n\nfunction parseExceeded(value: unknown): readonly (\"commits\" | \"changed-lines\")[] | undefined {\n const entries = finalDataArray(value, \"maintenanceReminders\");\n const exceeded: (\"commits\" | \"changed-lines\")[] = [];\n const uniqueEntries = new Set<string>();\n for (const entry of entries) {\n if ((entry !== \"commits\" && entry !== \"changed-lines\") || uniqueEntries.has(entry)) {\n return undefined;\n }\n uniqueEntries.add(entry);\n exceeded.push(entry);\n }\n return Object.freeze(exceeded);\n}\n\nfunction isUnavailableReason(value: unknown): value is MaintenanceReminderUnavailableReason {\n return MAINTENANCE_REMINDER_UNAVAILABLE_REASONS.some((reason) => reason === value);\n}\n"]}
1
+ {"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/maintenance-reminders/final-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { snapshotClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport {\n exactFinalDataRecord,\n finalDataArray,\n invalidFinalData,\n nonNegativeSafeInteger\n} from \"../final-data-parsing.ts\";\n\nconst EMPTY_EXCEEDED: readonly [] = Object.freeze([]);\n\nconst FULL_COMMIT_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i;\nconst REMINDER_ID = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;\n\n/** 单条维护提醒无法测量时使用的稳定 reason code。 */\nexport const MAINTENANCE_REMINDER_UNAVAILABLE_REASON = Object.freeze({\n baseCommitUnavailable: \"base-commit-unavailable\",\n baseNotFirstParentAncestor: \"base-not-first-parent-ancestor\",\n firstParentHistoryInvalid: \"first-parent-history-invalid\",\n firstParentHistoryUnavailable: \"first-parent-history-unavailable\",\n headInvalid: \"head-invalid\",\n headUnavailable: \"head-unavailable\",\n numstatInvalid: \"numstat-invalid\",\n numstatUnavailable: \"numstat-unavailable\"\n} as const);\n\nexport type MaintenanceReminderMode = \"advisory\" | \"enforcing\";\n\n/** 单条维护提醒无法测量时保留在 final data 中的稳定 reason。 */\nexport type MaintenanceReminderUnavailableReason =\n (typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON)[keyof typeof MAINTENANCE_REMINDER_UNAVAILABLE_REASON];\n\nconst MAINTENANCE_REMINDER_UNAVAILABLE_REASONS: readonly MaintenanceReminderUnavailableReason[] =\n Object.freeze(Object.values(MAINTENANCE_REMINDER_UNAVAILABLE_REASON));\n\n/** 判断 unknown value 是否为维护提醒的稳定局部 ID。 */\nexport function isMaintenanceReminderId(value: unknown): value is string {\n return typeof value === \"string\" && REMINDER_ID.test(value);\n}\n\n/** 判断 unknown value 是否为 Git 的完整 SHA-1 或 SHA-256 commit ID。 */\nexport function isMaintenanceCommitId(value: unknown): value is string {\n return typeof value === \"string\" && FULL_COMMIT_ID.test(value);\n}\n\nexport type MeasuredMaintenanceReminderAssessment = Readonly<{\n /** 未超过任何阈值时为 clear;至少严格超过一个阈值时为 due。 */\n readonly assessment: \"clear\" | \"due\";\n /** reminder 配置锁定的完整基线 commit ID。 */\n readonly baseCommit: string;\n /** first-parent 区间内 numstat additions 与 deletions 的总和。 */\n readonly changedLines: number;\n /** 从 HEAD 沿 first-parent 到 baseCommit 的 commit 数。 */\n readonly commitCount: number;\n /** 实际值严格超过配置上限的维度;clear assessment 时为空。 */\n readonly exceeded: readonly (\"commits\" | \"changed-lines\")[];\n /** 测量时 HEAD 的完整 commit ID。 */\n readonly headCommit: string;\n /** Definition 中该 reminder 的稳定局部 ID。 */\n readonly id: string;\n /** due 或 unavailable 是否阻断 Check 的配置模式。 */\n readonly mode: MaintenanceReminderMode;\n}>;\n\nexport type UnavailableMaintenanceReminderAssessment = Readonly<{\n /** 表示该 reminder 未能形成计数测量。 */\n readonly assessment: \"unavailable\";\n /** reminder 配置锁定的完整基线 commit ID。 */\n readonly baseCommit: string;\n /** unavailable assessment 不发布 partial changed-line count。 */\n readonly changedLines: null;\n /** unavailable assessment 不发布 partial commit count。 */\n readonly commitCount: null;\n /** unavailable assessment 不判定任何阈值已超过。 */\n readonly exceeded: readonly [];\n /** 已成功解析时的完整 HEAD commit ID;解析 HEAD 失败时为 null。 */\n readonly headCommit: string | null;\n /** Definition 中该 reminder 的稳定局部 ID。 */\n readonly id: string;\n /** due 或 unavailable 是否阻断 Check 的配置模式。 */\n readonly mode: MaintenanceReminderMode;\n /** 未能测量的稳定机器可读原因。 */\n readonly reason: MaintenanceReminderUnavailableReason;\n}>;\n\n/** 单条维护提醒的 measured 或 unavailable discriminated assessment。 */\nexport type MaintenanceReminderAssessment =\n | MeasuredMaintenanceReminderAssessment\n | UnavailableMaintenanceReminderAssessment;\n\n/** `maintenance-reminders` 在 passed/failed outcome 中发布的主数据。 */\nexport interface MaintenanceRemindersFinalData {\n /** 每个已配置 reminder 的唯一 assessment,按 Definition 顺序发布。 */\n readonly entries: readonly MaintenanceReminderAssessment[];\n}\n\n/** 验证 discriminated entry assessments 并脱离 canonical final data。 */\nexport function parseMaintenanceRemindersData(data: unknown): MaintenanceRemindersFinalData {\n const value = exactFinalDataRecord(data, [\"entries\"], \"maintenanceReminders\");\n const entries = finalDataArray(value.entries, \"maintenanceReminders\");\n const parsedEntries: MaintenanceReminderAssessment[] = [];\n const ids = new Set<string>();\n for (const entry of entries) {\n const parsed = parseAssessment(entry);\n if (ids.has(parsed.id)) throw invalidFinalData(\"maintenanceReminders\");\n ids.add(parsed.id);\n parsedEntries.push(parsed);\n }\n return Object.freeze({ entries: Object.freeze(parsedEntries) });\n}\n\nfunction parseAssessment(value: unknown): MaintenanceReminderAssessment {\n const record = assessmentRecord(value);\n const identity = assessmentIdentity(record);\n if (record.assessment === \"unavailable\") {\n return parseUnavailableAssessment(record, identity);\n }\n return parseMeasuredAssessment(record, identity);\n}\n\nfunction assessmentRecord(value: unknown): Readonly<Record<string, unknown>> {\n return exactFinalDataRecord(\n value,\n valueAssessment(value) === \"unavailable\"\n ? unavailableAssessmentKeys()\n : measuredAssessmentKeys(),\n \"maintenanceReminders\"\n );\n}\n\nfunction unavailableAssessmentKeys(): readonly string[] {\n return [\n \"assessment\",\n \"baseCommit\",\n \"changedLines\",\n \"commitCount\",\n \"exceeded\",\n \"headCommit\",\n \"id\",\n \"mode\",\n \"reason\"\n ];\n}\n\nfunction measuredAssessmentKeys(): readonly string[] {\n return [\n \"assessment\",\n \"baseCommit\",\n \"changedLines\",\n \"commitCount\",\n \"exceeded\",\n \"headCommit\",\n \"id\",\n \"mode\"\n ];\n}\n\nfunction assessmentIdentity(record: Readonly<Record<string, unknown>>): Readonly<{\n readonly baseCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n}> {\n const id = isMaintenanceReminderId(record.id) ? record.id : undefined;\n const mode = record.mode === \"advisory\" || record.mode === \"enforcing\" ? record.mode : undefined;\n const baseCommit = isMaintenanceCommitId(record.baseCommit) ? record.baseCommit : undefined;\n if (id === undefined || mode === undefined || baseCommit === undefined)\n throw invalidFinalData(\"maintenanceReminders\");\n return { baseCommit, id, mode };\n}\n\nfunction parseMeasuredAssessment(\n record: Readonly<Record<string, unknown>>,\n identity: Readonly<{\n readonly baseCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n }>\n): MeasuredMaintenanceReminderAssessment {\n if (record.assessment !== \"clear\" && record.assessment !== \"due\")\n throw invalidFinalData(\"maintenanceReminders\");\n const commitCount = nonNegativeSafeInteger(record.commitCount);\n const changedLines = nonNegativeSafeInteger(record.changedLines);\n const headCommit = isMaintenanceCommitId(record.headCommit) ? record.headCommit : undefined;\n const exceeded = parseExceeded(record.exceeded);\n if (\n commitCount === undefined ||\n changedLines === undefined ||\n headCommit === undefined ||\n exceeded === undefined ||\n (record.assessment === \"clear\" ? exceeded.length !== 0 : exceeded.length === 0)\n ) {\n throw invalidFinalData(\"maintenanceReminders\");\n }\n return Object.freeze({\n assessment: record.assessment,\n baseCommit: identity.baseCommit,\n changedLines,\n commitCount,\n exceeded,\n headCommit,\n id: identity.id,\n mode: identity.mode\n });\n}\n\nfunction parseUnavailableAssessment(\n record: Readonly<Record<string, unknown>>,\n identity: Readonly<{\n readonly baseCommit: string;\n readonly id: string;\n readonly mode: MaintenanceReminderMode;\n }>\n): UnavailableMaintenanceReminderAssessment {\n const exceeded = finalDataArray(record.exceeded, \"maintenanceReminders\");\n const headCommit = record.headCommit;\n if (\n record.changedLines !== null ||\n record.commitCount !== null ||\n exceeded.length !== 0 ||\n (headCommit !== null && !isMaintenanceCommitId(headCommit)) ||\n !isUnavailableReason(record.reason)\n ) {\n throw invalidFinalData(\"maintenanceReminders\");\n }\n return Object.freeze({\n assessment: \"unavailable\",\n baseCommit: identity.baseCommit,\n changedLines: null,\n commitCount: null,\n exceeded: EMPTY_EXCEEDED,\n headCommit,\n id: identity.id,\n mode: identity.mode,\n reason: record.reason\n });\n}\n\nfunction valueAssessment(value: unknown): unknown {\n return snapshotClosedRecord(value)?.assessment;\n}\n\nfunction parseExceeded(value: unknown): readonly (\"commits\" | \"changed-lines\")[] | undefined {\n const entries = finalDataArray(value, \"maintenanceReminders\");\n const exceeded: (\"commits\" | \"changed-lines\")[] = [];\n const uniqueEntries = new Set<string>();\n for (const entry of entries) {\n if ((entry !== \"commits\" && entry !== \"changed-lines\") || uniqueEntries.has(entry)) {\n return undefined;\n }\n uniqueEntries.add(entry);\n exceeded.push(entry);\n }\n return Object.freeze(exceeded);\n}\n\nfunction isUnavailableReason(value: unknown): value is MaintenanceReminderUnavailableReason {\n return MAINTENANCE_REMINDER_UNAVAILABLE_REASONS.some((reason) => reason === value);\n}\n"]}
@@ -6,15 +6,21 @@ import { validMarkdownLinkValidationOptions } from "./options-validation.mjs";
6
6
  /**
7
7
  * 使用可省略的 source、target 与 work-limit policy 构造离线 Markdown 引用 Check。
8
8
  *
9
- * @param options - 省略字段由 package 补齐;files 数组是完整替换值,limits fields 可分别省略。
9
+ * @param options - 省略字段由 package 补齐;files 数组是完整替换值,limits fields 可分别省略;cache 省略时关闭,启用时由调用方提供 absolute、可信且可删除的 directory,其中本 Check 只维护一个 source-derived JSONL local state;调用方负责容量和删除,cache 不可用不改变 Check 结果。
10
10
  * @returns 固定 `markdown-link-validation` identity、完整冻结 options、parser 与执行逻辑。
11
- * @throws {TypeError} input 含未知字段、非法 target policy 或非法 work limit 时抛出。
11
+ * @throws {TypeError} input 含未知字段、非法 target policy、cache branch/directory 或非法 work limit 时抛出。
12
12
  * @example 离线 Markdown 本地链接完整性
13
13
  * ```ts
14
14
  * import { defineConfig, markdownLinkValidation, run } from "@zxyycom/vibe-check";
15
15
  *
16
+ * // 此调用方自有目录是 absolute、可删除的,并且可能保存 source-derived parse facts。
17
+ * const cacheDirectory = new URL(".vibe-check/markdown-link-parse-cache", import.meta.url).pathname;
16
18
  * const definition = defineConfig({
17
- * checks: [markdownLinkValidation()],
19
+ * checks: [
20
+ * markdownLinkValidation({
21
+ * cache: { enabled: true, directory: cacheDirectory }
22
+ * })
23
+ * ],
18
24
  * outputs: {
19
25
  * diagnosticLogging: { enabled: false },
20
26
  * machinePublication: { enabled: false },
@@ -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;;;;;;;;;;;;;;;;;;;;;;GAsBG;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 可分别省略。\n * @returns 固定 `markdown-link-validation` identity、完整冻结 options、parser 与执行逻辑。\n * @throws {TypeError} input 含未知字段、非法 target policy 或非法 work limit 时抛出。\n * @example 离线 Markdown 本地链接完整性\n * ```ts\n * import { defineConfig, markdownLinkValidation, run } from \"@zxyycom/vibe-check\";\n *\n * const definition = defineConfig({\n * checks: [markdownLinkValidation()],\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,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,9 +1,12 @@
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
5
  import { createMarkdownLocalResolver } from "./local-resolver.mjs";
6
+ import { markdownFindingMessages } from "./finding-messages.mjs";
5
7
  import { buildMarkdownInputRejectedRecord, buildMarkdownLinkRecordCandidate } from "./records.mjs";
6
8
  import { settledMarkdownTraversalResult } from "./traversal-result.mjs";
9
+ import { markdownLinkUnavailableMessage } from "./unavailable-reasons.mjs";
7
10
  import { validMarkdownLinkValidationOptions } from "./options-validation.mjs";
8
11
  export const MARKDOWN_LINK_VALIDATION_CHECK_DEFINITION = {
9
12
  checkId: "markdown-link-validation",
@@ -16,25 +19,35 @@ export async function executeMarkdownLinkValidation(context) {
16
19
  const prepared = await prepareMarkdownTraversal(context);
17
20
  if (prepared.kind === "result")
18
21
  return prepared.result;
19
- const { rejectedInputCount, traversal, resolver } = prepared;
22
+ const { rejectedPaths, traversal, resolver } = prepared;
20
23
  for (const candidate of traversal.candidates) {
21
24
  context.records.report({ id: candidate.id }, candidate.data);
22
25
  }
23
- return settledMarkdownTraversalResult({
26
+ return appendCheckMessages(settledMarkdownTraversalResult({
24
27
  findingCount: traversal.candidates.length,
25
28
  findingPolicy: context.options.findingPolicy,
26
29
  occurrenceCount: traversal.occurrenceCount,
27
- rejectedInputCount,
30
+ rejectedInputCount: rejectedPaths.length,
28
31
  sourceFileCount: traversal.sourceFileCount,
29
32
  targetReadCount: resolver.targetReadCount
30
- });
33
+ }), markdownFindingMessages(traversal.candidates, rejectedPaths, context.options.findingPolicy === "blocking"));
31
34
  }
32
35
  async function prepareMarkdownTraversal(context) {
33
36
  if (context.signal.aborted)
34
37
  return result(unavailable("cancelled"));
35
- const created = await createMarkdownLocalResolver(context.project.root, context.options.limits.maxTargetReads);
38
+ const created = await createMarkdownLocalResolver(context.project.root, context.options.limits.maxTargetReads, context.options.cache, context.signal);
36
39
  if (!created.ok)
37
40
  return result(unavailable(created.reason));
41
+ let prepared;
42
+ try {
43
+ prepared = await prepareCreatedMarkdownTraversal(context, created.resolver);
44
+ }
45
+ finally {
46
+ await created.resolver.finalize();
47
+ }
48
+ return context.signal.aborted ? result(unavailable("cancelled")) : prepared;
49
+ }
50
+ async function prepareCreatedMarkdownTraversal(context, resolver) {
38
51
  if (context.signal.aborted)
39
52
  return result(unavailable("cancelled"));
40
53
  const sourceDiscovery = discoverMarkdownSourcePaths(context.project, context.options.files);
@@ -46,7 +59,7 @@ async function prepareMarkdownTraversal(context) {
46
59
  return result(unavailable("cancelled"));
47
60
  reportRejectedInputs(context, sourceDiscovery.rejectedPaths);
48
61
  const traversal = await traverseMarkdownSources(sourceDiscovery.sourcePaths, {
49
- resolver: created.resolver,
62
+ resolver,
50
63
  options: context.options,
51
64
  signal: context.signal
52
65
  });
@@ -58,8 +71,8 @@ async function prepareMarkdownTraversal(context) {
58
71
  }
59
72
  return Object.freeze({
60
73
  kind: "traversal",
61
- rejectedInputCount: sourceDiscovery.rejectedPaths.length,
62
- resolver: created.resolver,
74
+ rejectedPaths: sourceDiscovery.rejectedPaths,
75
+ resolver,
63
76
  traversal
64
77
  });
65
78
  }
@@ -112,6 +125,7 @@ async function traverseMarkdownSources(sourcePaths, run) {
112
125
  const candidates = [];
113
126
  let occurrenceCount = 0;
114
127
  let sourceFileCount = 0;
128
+ // The Run's shared Scheduler owns cross-Check concurrency; this Check processes sources strictly in order.
115
129
  for (const sourcePath of sourcePaths) {
116
130
  const sourceValidation = await validateMarkdownSource(sourcePath, occurrenceCount, run);
117
131
  if (sourceValidation.kind === "unavailable")
@@ -177,23 +191,12 @@ function unavailable(reason) {
177
191
  status: "unavailable",
178
192
  reason: { code: reason },
179
193
  messages: Object.freeze([
180
- Object.freeze({ code: reason, level: "error", message: unavailableMessage(reason) })
194
+ Object.freeze({
195
+ code: reason,
196
+ level: "error",
197
+ message: markdownLinkUnavailableMessage(reason)
198
+ })
181
199
  ])
182
200
  });
183
201
  }
184
- function unavailableMessage(reason) {
185
- return UNAVAILABLE_MESSAGES[reason];
186
- }
187
- const UNAVAILABLE_MESSAGES = {
188
- "invalid-options": "markdownLinkValidation options are invalid; recreate the Check with markdownLinkValidation(options) or restore its complete resolved options.",
189
- "project-root-unavailable": "Markdown link validation could not resolve the project root; check that the path exists and is accessible.",
190
- "source-unavailable": "A selected Markdown source could not be collected, read, decoded, or contained safely; check the file source and permissions.",
191
- "source-too-large": "A selected Markdown source exceeds maxMarkdownBytes; narrow the file selection or raise the bounded limit.",
192
- "markdown-parse-failed": "A selected Markdown source could not be parsed completely; inspect that document's Markdown syntax and encoding.",
193
- "invalid-local-destination": "A local Markdown destination could not be parsed safely; inspect the affected link destination syntax.",
194
- "target-unavailable": "A local Markdown target could not be probed or read safely; check the target path, permissions, size, and encoding.",
195
- "occurrence-limit-exceeded": "Markdown link validation exceeded maxOccurrences; narrow the source selection or raise the bounded limit.",
196
- "target-read-limit-exceeded": "Markdown link validation exceeded maxTargetReads; narrow the source selection or raise the bounded limit.",
197
- cancelled: "Markdown link validation was cancelled before it could form a complete result; inspect the caller's cancellation reason and retry if appropriate."
198
- };
199
202
  //# sourceMappingURL=execution.mjs.map
@@ -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 {\n createMarkdownLocalResolver,\n type MarkdownLocalResolutionReason,\n type MarkdownLocalResolver,\n type MarkdownSourceReadFailureReason\n} from \"./local-resolver.ts\";\nimport type { MarkdownLinkValidationFinalData } from \"./final-data.ts\";\nimport {\n buildMarkdownInputRejectedRecord,\n buildMarkdownLinkRecordCandidate,\n type MarkdownLinkRecordCandidate\n} from \"./records.ts\";\nimport { settledMarkdownTraversalResult } from \"./traversal-result.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.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\n/** `markdown-link-validation` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type MarkdownLinkValidationUnavailableReason =\n | \"invalid-options\"\n | \"cancelled\"\n | \"occurrence-limit-exceeded\"\n | \"project-root-unavailable\"\n | MarkdownLocalResolutionReason\n | MarkdownSourceReadFailureReason;\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 { rejectedInputCount, traversal, resolver } = prepared;\n\n for (const candidate of traversal.candidates) {\n context.records.report({ id: candidate.id }, candidate.data);\n }\n return settledMarkdownTraversalResult({\n findingCount: traversal.candidates.length,\n findingPolicy: context.options.findingPolicy,\n occurrenceCount: traversal.occurrenceCount,\n rejectedInputCount,\n sourceFileCount: traversal.sourceFileCount,\n targetReadCount: resolver.targetReadCount\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 rejectedInputCount: number;\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 );\n if (!created.ok) return result(unavailable(created.reason));\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: created.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 rejectedInputCount: sourceDiscovery.rejectedPaths.length,\n resolver: created.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 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({ code: reason, level: \"error\" as const, message: unavailableMessage(reason) })\n ])\n });\n}\n\nfunction unavailableMessage(reason: MarkdownLinkValidationUnavailableReason): string {\n return UNAVAILABLE_MESSAGES[reason];\n}\n\nconst UNAVAILABLE_MESSAGES: Readonly<Record<MarkdownLinkValidationUnavailableReason, string>> = {\n \"invalid-options\":\n \"markdownLinkValidation options are invalid; recreate the Check with markdownLinkValidation(options) or restore its complete resolved options.\",\n \"project-root-unavailable\":\n \"Markdown link validation could not resolve the project root; check that the path exists and is accessible.\",\n \"source-unavailable\":\n \"A selected Markdown source could not be collected, read, decoded, or contained safely; check the file source and permissions.\",\n \"source-too-large\":\n \"A selected Markdown source exceeds maxMarkdownBytes; narrow the file selection or raise the bounded limit.\",\n \"markdown-parse-failed\":\n \"A selected Markdown source could not be parsed completely; inspect that document's Markdown syntax and encoding.\",\n \"invalid-local-destination\":\n \"A local Markdown destination could not be parsed safely; inspect the affected link destination syntax.\",\n \"target-unavailable\":\n \"A local Markdown target could not be probed or read safely; check the target path, permissions, size, and encoding.\",\n \"occurrence-limit-exceeded\":\n \"Markdown link validation exceeded maxOccurrences; narrow the source selection or raise the bounded limit.\",\n \"target-read-limit-exceeded\":\n \"Markdown link validation exceeded maxTargetReads; narrow the source selection or raise the bounded limit.\",\n cancelled:\n \"Markdown link validation was cancelled before it could form a complete result; inspect the caller's cancellation reason and retry if appropriate.\"\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 \"../../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"]}
@@ -6,71 +6,88 @@ export async function probeRootContainedPath(canonicalProjectRoot, candidatePath
6
6
  if (!isWithinRoot(canonicalProjectRoot, candidatePath)) {
7
7
  return Object.freeze({ kind: "outside" });
8
8
  }
9
- let pendingSegments = relativeSegments(canonicalProjectRoot, candidatePath);
10
- let currentPath = canonicalProjectRoot;
11
- let symlinkHops = 0;
12
- while (pendingSegments.length > 0) {
13
- const segment = pendingSegments.shift();
14
- if (segment === undefined) {
15
- return Object.freeze({ kind: "unavailable" });
16
- }
17
- const nextPath = path.join(currentPath, segment);
18
- let status;
19
- try {
20
- status = await lstat(nextPath);
21
- }
22
- catch (error) {
23
- if (isNotFound(error)) {
24
- return Object.freeze({ kind: "missing", absolutePath: nextPath });
25
- }
26
- return Object.freeze({ kind: "unavailable" });
27
- }
28
- if (!status.isSymbolicLink()) {
29
- currentPath = nextPath;
30
- continue;
31
- }
32
- if (symlinkHops >= 40) {
33
- return Object.freeze({ kind: "unavailable" });
34
- }
35
- symlinkHops += 1;
36
- let linkDestination;
37
- try {
38
- linkDestination = path.resolve(path.dirname(nextPath), await readlink(nextPath));
39
- }
40
- catch {
41
- return Object.freeze({ kind: "unavailable" });
42
- }
43
- if (!isWithinRoot(canonicalProjectRoot, linkDestination)) {
44
- return Object.freeze({ kind: "outside" });
45
- }
46
- pendingSegments = [
47
- ...relativeSegments(canonicalProjectRoot, linkDestination),
48
- ...pendingSegments
49
- ];
50
- currentPath = canonicalProjectRoot;
9
+ let state = {
10
+ currentPath: canonicalProjectRoot,
11
+ pendingSegments: relativeSegments(canonicalProjectRoot, candidatePath),
12
+ symlinkHops: 0
13
+ };
14
+ while (state.pendingSegments.length > 0) {
15
+ const advance = await advanceRootContainedPathProbe(canonicalProjectRoot, state);
16
+ if (!isRootContainedPathProbeState(advance))
17
+ return advance;
18
+ state = advance;
51
19
  }
52
- return Object.freeze({ kind: "contained", absolutePath: currentPath });
20
+ return Object.freeze({ kind: "contained", absolutePath: state.currentPath });
53
21
  }
54
- export async function probeEndpoint(targetPath) {
55
- let status;
22
+ function isRootContainedPathProbeState(value) {
23
+ return "currentPath" in value;
24
+ }
25
+ async function advanceRootContainedPathProbe(canonicalProjectRoot, state) {
26
+ const [segment, ...remainingSegments] = state.pendingSegments;
27
+ if (segment === undefined)
28
+ return Object.freeze({ kind: "unavailable" });
29
+ const nextPath = path.join(state.currentPath, segment);
30
+ const pathStatus = await rootContainedPathStatus(nextPath);
31
+ if (pathStatus.kind !== "status")
32
+ return pathStatus;
33
+ if (!pathStatus.status.isSymbolicLink()) {
34
+ return remainingSegments.length === 0
35
+ ? Object.freeze({
36
+ kind: "contained",
37
+ absolutePath: nextPath,
38
+ endpoint: endpointFromStatus(pathStatus.status)
39
+ })
40
+ : Object.freeze({
41
+ currentPath: nextPath,
42
+ pendingSegments: remainingSegments,
43
+ symlinkHops: state.symlinkHops
44
+ });
45
+ }
46
+ return advanceThroughContainedSymlink(canonicalProjectRoot, nextPath, remainingSegments, state.symlinkHops);
47
+ }
48
+ async function rootContainedPathStatus(nextPath) {
56
49
  try {
57
- status = await lstat(targetPath);
50
+ return Object.freeze({ kind: "status", status: await lstat(nextPath) });
58
51
  }
59
52
  catch (error) {
60
53
  return isNotFound(error)
61
- ? Object.freeze({ kind: "missing" })
54
+ ? Object.freeze({ kind: "missing", absolutePath: nextPath })
62
55
  : Object.freeze({ kind: "unavailable" });
63
56
  }
64
- if (status.isSymbolicLink()) {
57
+ }
58
+ async function advanceThroughContainedSymlink(canonicalProjectRoot, linkPath, remainingSegments, symlinkHops) {
59
+ if (symlinkHops >= 40)
65
60
  return Object.freeze({ kind: "unavailable" });
61
+ let linkDestination;
62
+ try {
63
+ linkDestination = path.resolve(path.dirname(linkPath), await readlink(linkPath));
66
64
  }
67
- if (status.isDirectory()) {
68
- return Object.freeze({ kind: "directory" });
65
+ catch {
66
+ return Object.freeze({ kind: "unavailable" });
69
67
  }
70
- if (status.isFile()) {
71
- return Object.freeze({ kind: "file" });
68
+ if (!isWithinRoot(canonicalProjectRoot, linkDestination)) {
69
+ return Object.freeze({ kind: "outside" });
72
70
  }
73
- return Object.freeze({ kind: "unsupported" });
71
+ return Object.freeze({
72
+ currentPath: canonicalProjectRoot,
73
+ pendingSegments: [
74
+ ...relativeSegments(canonicalProjectRoot, linkDestination),
75
+ ...remainingSegments
76
+ ],
77
+ symlinkHops: symlinkHops + 1
78
+ });
79
+ }
80
+ export async function probeEndpoint(targetPath) {
81
+ let status;
82
+ try {
83
+ status = await lstat(targetPath);
84
+ }
85
+ catch (error) {
86
+ return isNotFound(error)
87
+ ? Object.freeze({ kind: "missing" })
88
+ : Object.freeze({ kind: "unavailable" });
89
+ }
90
+ return endpointFromStatus(status);
74
91
  }
75
92
  export async function readRegularFile(filePath, maxBytes) {
76
93
  let handle;
@@ -106,4 +123,16 @@ async function readBoundedBytes(handle, maxBytes) {
106
123
  }
107
124
  return offset > maxBytes ? null : bytes.slice(0, offset);
108
125
  }
126
+ function endpointFromStatus(status) {
127
+ if (status.isSymbolicLink()) {
128
+ return Object.freeze({ kind: "unavailable" });
129
+ }
130
+ if (status.isDirectory()) {
131
+ return Object.freeze({ kind: "directory" });
132
+ }
133
+ if (status.isFile()) {
134
+ return Object.freeze({ kind: "file" });
135
+ }
136
+ return Object.freeze({ kind: "unsupported" });
137
+ }
109
138
  //# sourceMappingURL=filesystem-probes.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-probes.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/filesystem-probes.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from \"node:fs\";\nimport { lstat, open, readlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n isNotFound,\n isWithinRoot,\n relativeSegments,\n type EndpointProbe,\n type RootProbe\n} from \"./local-resolution.ts\";\n\nexport async function probeRootContainedPath(\n canonicalProjectRoot: string,\n candidatePath: string\n): Promise<RootProbe> {\n if (!isWithinRoot(canonicalProjectRoot, candidatePath)) {\n return Object.freeze({ kind: \"outside\" as const });\n }\n let pendingSegments = relativeSegments(canonicalProjectRoot, candidatePath);\n let currentPath = canonicalProjectRoot;\n let symlinkHops = 0;\n\n while (pendingSegments.length > 0) {\n const segment = pendingSegments.shift();\n if (segment === undefined) {\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n const nextPath = path.join(currentPath, segment);\n let status: Awaited<ReturnType<typeof lstat>>;\n try {\n status = await lstat(nextPath);\n } catch (error: unknown) {\n if (isNotFound(error)) {\n return Object.freeze({ kind: \"missing\" as const, absolutePath: nextPath });\n }\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n if (!status.isSymbolicLink()) {\n currentPath = nextPath;\n continue;\n }\n if (symlinkHops >= 40) {\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n symlinkHops += 1;\n let linkDestination: string;\n try {\n linkDestination = path.resolve(path.dirname(nextPath), await readlink(nextPath));\n } catch {\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n if (!isWithinRoot(canonicalProjectRoot, linkDestination)) {\n return Object.freeze({ kind: \"outside\" as const });\n }\n pendingSegments = [\n ...relativeSegments(canonicalProjectRoot, linkDestination),\n ...pendingSegments\n ];\n currentPath = canonicalProjectRoot;\n }\n\n return Object.freeze({ kind: \"contained\" as const, absolutePath: currentPath });\n}\n\nexport async function probeEndpoint(targetPath: string): Promise<EndpointProbe> {\n let status: Awaited<ReturnType<typeof lstat>>;\n try {\n status = await lstat(targetPath);\n } catch (error: unknown) {\n return isNotFound(error)\n ? Object.freeze({ kind: \"missing\" as const })\n : Object.freeze({ kind: \"unavailable\" as const });\n }\n if (status.isSymbolicLink()) {\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n if (status.isDirectory()) {\n return Object.freeze({ kind: \"directory\" as const });\n }\n if (status.isFile()) {\n return Object.freeze({ kind: \"file\" as const });\n }\n return Object.freeze({ kind: \"unsupported\" as const });\n}\n\nexport async function readRegularFile(\n filePath: string,\n maxBytes: number\n): Promise<\n | Readonly<{ readonly ok: true; readonly bytes: Uint8Array }>\n | Readonly<{ readonly ok: false; readonly reason: \"too-large\" | \"unavailable\" }>\n> {\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n try {\n handle = await open(filePath, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));\n const status = await handle.stat();\n if (!status.isFile()) {\n return Object.freeze({ ok: false as const, reason: \"unavailable\" as const });\n }\n if (status.size > maxBytes) {\n return Object.freeze({ ok: false as const, reason: \"too-large\" as const });\n }\n const bytes = await readBoundedBytes(handle, maxBytes);\n return bytes === null\n ? Object.freeze({ ok: false as const, reason: \"too-large\" as const })\n : Object.freeze({ ok: true as const, bytes });\n } catch {\n return Object.freeze({ ok: false as const, reason: \"unavailable\" as const });\n } finally {\n await handle?.close().catch(() => undefined);\n }\n}\n\nasync function readBoundedBytes(\n handle: Awaited<ReturnType<typeof open>>,\n maxBytes: number\n): Promise<Uint8Array | null> {\n const bytes = new Uint8Array(maxBytes + 1);\n let offset = 0;\n while (offset < bytes.byteLength) {\n const result = await handle.read(bytes, offset, bytes.byteLength - offset, offset);\n if (result.bytesRead === 0) break;\n offset += result.bytesRead;\n }\n return offset > maxBytes ? null : bytes.slice(0, offset);\n}\n"]}
1
+ {"version":3,"file":"filesystem-probes.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/filesystem-probes.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from \"node:fs\";\nimport { lstat, open, readlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n isNotFound,\n isWithinRoot,\n relativeSegments,\n type ExistingEndpointProbe,\n type EndpointProbe,\n type RootProbe\n} from \"./local-resolution.ts\";\n\ninterface RootContainedPathProbeState {\n readonly currentPath: string;\n readonly pendingSegments: readonly string[];\n readonly symlinkHops: number;\n}\n\ntype RootContainedPathProbeAdvance = RootProbe | RootContainedPathProbeState;\ntype RootContainedPathStatus =\n | RootProbe\n | Readonly<{ readonly kind: \"status\"; readonly status: Awaited<ReturnType<typeof lstat>> }>;\n\nexport async function probeRootContainedPath(\n canonicalProjectRoot: string,\n candidatePath: string\n): Promise<RootProbe> {\n if (!isWithinRoot(canonicalProjectRoot, candidatePath)) {\n return Object.freeze({ kind: \"outside\" as const });\n }\n let state: RootContainedPathProbeState = {\n currentPath: canonicalProjectRoot,\n pendingSegments: relativeSegments(canonicalProjectRoot, candidatePath),\n symlinkHops: 0\n };\n\n while (state.pendingSegments.length > 0) {\n const advance = await advanceRootContainedPathProbe(canonicalProjectRoot, state);\n if (!isRootContainedPathProbeState(advance)) return advance;\n state = advance;\n }\n\n return Object.freeze({ kind: \"contained\" as const, absolutePath: state.currentPath });\n}\n\nfunction isRootContainedPathProbeState(\n value: RootContainedPathProbeAdvance\n): value is RootContainedPathProbeState {\n return \"currentPath\" in value;\n}\n\nasync function advanceRootContainedPathProbe(\n canonicalProjectRoot: string,\n state: RootContainedPathProbeState\n): Promise<RootContainedPathProbeAdvance> {\n const [segment, ...remainingSegments] = state.pendingSegments;\n if (segment === undefined) return Object.freeze({ kind: \"unavailable\" as const });\n const nextPath = path.join(state.currentPath, segment);\n const pathStatus = await rootContainedPathStatus(nextPath);\n if (pathStatus.kind !== \"status\") return pathStatus;\n if (!pathStatus.status.isSymbolicLink()) {\n return remainingSegments.length === 0\n ? Object.freeze({\n kind: \"contained\" as const,\n absolutePath: nextPath,\n endpoint: endpointFromStatus(pathStatus.status)\n })\n : Object.freeze({\n currentPath: nextPath,\n pendingSegments: remainingSegments,\n symlinkHops: state.symlinkHops\n });\n }\n return advanceThroughContainedSymlink(\n canonicalProjectRoot,\n nextPath,\n remainingSegments,\n state.symlinkHops\n );\n}\n\nasync function rootContainedPathStatus(nextPath: string): Promise<RootContainedPathStatus> {\n try {\n return Object.freeze({ kind: \"status\" as const, status: await lstat(nextPath) });\n } catch (error: unknown) {\n return isNotFound(error)\n ? Object.freeze({ kind: \"missing\" as const, absolutePath: nextPath })\n : Object.freeze({ kind: \"unavailable\" as const });\n }\n}\n\nasync function advanceThroughContainedSymlink(\n canonicalProjectRoot: string,\n linkPath: string,\n remainingSegments: readonly string[],\n symlinkHops: number\n): Promise<RootContainedPathProbeAdvance> {\n if (symlinkHops >= 40) return Object.freeze({ kind: \"unavailable\" as const });\n let linkDestination: string;\n try {\n linkDestination = path.resolve(path.dirname(linkPath), await readlink(linkPath));\n } catch {\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n if (!isWithinRoot(canonicalProjectRoot, linkDestination)) {\n return Object.freeze({ kind: \"outside\" as const });\n }\n return Object.freeze({\n currentPath: canonicalProjectRoot,\n pendingSegments: [\n ...relativeSegments(canonicalProjectRoot, linkDestination),\n ...remainingSegments\n ],\n symlinkHops: symlinkHops + 1\n });\n}\n\nexport async function probeEndpoint(targetPath: string): Promise<EndpointProbe> {\n let status: Awaited<ReturnType<typeof lstat>>;\n try {\n status = await lstat(targetPath);\n } catch (error: unknown) {\n return isNotFound(error)\n ? Object.freeze({ kind: \"missing\" as const })\n : Object.freeze({ kind: \"unavailable\" as const });\n }\n return endpointFromStatus(status);\n}\n\nexport async function readRegularFile(\n filePath: string,\n maxBytes: number\n): Promise<\n | Readonly<{ readonly ok: true; readonly bytes: Uint8Array }>\n | Readonly<{ readonly ok: false; readonly reason: \"too-large\" | \"unavailable\" }>\n> {\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n try {\n handle = await open(filePath, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));\n const status = await handle.stat();\n if (!status.isFile()) {\n return Object.freeze({ ok: false as const, reason: \"unavailable\" as const });\n }\n if (status.size > maxBytes) {\n return Object.freeze({ ok: false as const, reason: \"too-large\" as const });\n }\n const bytes = await readBoundedBytes(handle, maxBytes);\n return bytes === null\n ? Object.freeze({ ok: false as const, reason: \"too-large\" as const })\n : Object.freeze({ ok: true as const, bytes });\n } catch {\n return Object.freeze({ ok: false as const, reason: \"unavailable\" as const });\n } finally {\n await handle?.close().catch(() => undefined);\n }\n}\n\nasync function readBoundedBytes(\n handle: Awaited<ReturnType<typeof open>>,\n maxBytes: number\n): Promise<Uint8Array | null> {\n const bytes = new Uint8Array(maxBytes + 1);\n let offset = 0;\n while (offset < bytes.byteLength) {\n const result = await handle.read(bytes, offset, bytes.byteLength - offset, offset);\n if (result.bytesRead === 0) break;\n offset += result.bytesRead;\n }\n return offset > maxBytes ? null : bytes.slice(0, offset);\n}\n\nfunction endpointFromStatus(status: Awaited<ReturnType<typeof lstat>>): ExistingEndpointProbe {\n if (status.isSymbolicLink()) {\n return Object.freeze({ kind: \"unavailable\" as const });\n }\n if (status.isDirectory()) {\n return Object.freeze({ kind: \"directory\" as const });\n }\n if (status.isFile()) {\n return Object.freeze({ kind: \"file\" as const });\n }\n return Object.freeze({ kind: \"unsupported\" as const });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/final-data.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAWlC,gDAAgD;AAChD,MAAM,UAAU,+BAA+B,CAAC,IAAa;IAC3D,MAAM,KAAK,GAAG,oBAAoB,CAChC,IAAI,EACJ,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,CAAC,EAC/F,wBAAwB,CACzB,CAAC;IACF,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5E,IACE,eAAe,KAAK,SAAS;QAC7B,eAAe,KAAK,SAAS;QAC7B,eAAe,KAAK,SAAS;QAC7B,YAAY,KAAK,SAAS;QAC1B,kBAAkB,KAAK,SAAS;QAChC,eAAe,GAAG,eAAe;QACjC,YAAY,GAAG,kBAAkB;QACjC,YAAY,GAAG,kBAAkB,GAAG,eAAe,EACnD,CAAC;QACD,MAAM,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,eAAe;QACf,eAAe;QACf,eAAe;QACf,YAAY;QACZ,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n exactFinalDataRecord,\n invalidFinalData,\n nonNegativeSafeInteger\n} from \"../final-data-parsing.ts\";\n\n/** `markdown-link-validation` 在 passed/failed outcome 中发布的主数据。 */\nexport interface MarkdownLinkValidationFinalData {\n readonly sourceFileCount: number;\n readonly occurrenceCount: number;\n readonly targetReadCount: number;\n readonly findingCount: number;\n readonly rejectedInputCount: number;\n}\n\n/** 验证计数不变量并脱离一份 canonical final-data object。 */\nexport function parseMarkdownLinkValidationData(data: unknown): MarkdownLinkValidationFinalData {\n const value = exactFinalDataRecord(\n data,\n [\"sourceFileCount\", \"occurrenceCount\", \"targetReadCount\", \"findingCount\", \"rejectedInputCount\"],\n \"markdownLinkValidation\"\n );\n const sourceFileCount = nonNegativeSafeInteger(value.sourceFileCount);\n const occurrenceCount = nonNegativeSafeInteger(value.occurrenceCount);\n const targetReadCount = nonNegativeSafeInteger(value.targetReadCount);\n const findingCount = nonNegativeSafeInteger(value.findingCount);\n const rejectedInputCount = nonNegativeSafeInteger(value.rejectedInputCount);\n if (\n sourceFileCount === undefined ||\n occurrenceCount === undefined ||\n targetReadCount === undefined ||\n findingCount === undefined ||\n rejectedInputCount === undefined ||\n targetReadCount > occurrenceCount ||\n findingCount < rejectedInputCount ||\n findingCount - rejectedInputCount > occurrenceCount\n ) {\n throw invalidFinalData(\"markdownLinkValidation\");\n }\n return Object.freeze({\n sourceFileCount,\n occurrenceCount,\n targetReadCount,\n findingCount,\n rejectedInputCount\n });\n}\n"]}
1
+ {"version":3,"file":"final-data.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/final-data.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAgBlC,gDAAgD;AAChD,MAAM,UAAU,+BAA+B,CAAC,IAAa;IAC3D,MAAM,KAAK,GAAG,oBAAoB,CAChC,IAAI,EACJ,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,CAAC,EAC/F,wBAAwB,CACzB,CAAC;IACF,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5E,IACE,eAAe,KAAK,SAAS;QAC7B,eAAe,KAAK,SAAS;QAC7B,eAAe,KAAK,SAAS;QAC7B,YAAY,KAAK,SAAS;QAC1B,kBAAkB,KAAK,SAAS;QAChC,eAAe,GAAG,eAAe;QACjC,YAAY,GAAG,kBAAkB;QACjC,YAAY,GAAG,kBAAkB,GAAG,eAAe,EACnD,CAAC;QACD,MAAM,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,eAAe;QACf,eAAe;QACf,eAAe;QACf,YAAY;QACZ,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n exactFinalDataRecord,\n invalidFinalData,\n nonNegativeSafeInteger\n} from \"../final-data-parsing.ts\";\n\n/** `markdown-link-validation` 在 passed/failed outcome 中发布的主数据。 */\nexport interface MarkdownLinkValidationFinalData {\n /** 已成功读取并完成 Markdown link occurrence 提取的 source 文件数。 */\n readonly sourceFileCount: number;\n /** 从已处理 source 中提取的 semantic link occurrence 数。 */\n readonly occurrenceCount: number;\n /** 进入 direct endpoint validation 的 logical occurrence 数,包括 target memo hit。 */\n readonly targetReadCount: number;\n /** occurrence finding 与 rejected input 的合计数。 */\n readonly findingCount: number;\n /** files policy 已选中、但因不是 `.md`/`.markdown` path 而被拒绝的输入数。 */\n readonly rejectedInputCount: number;\n}\n\n/** 验证计数不变量并脱离一份 canonical final-data object。 */\nexport function parseMarkdownLinkValidationData(data: unknown): MarkdownLinkValidationFinalData {\n const value = exactFinalDataRecord(\n data,\n [\"sourceFileCount\", \"occurrenceCount\", \"targetReadCount\", \"findingCount\", \"rejectedInputCount\"],\n \"markdownLinkValidation\"\n );\n const sourceFileCount = nonNegativeSafeInteger(value.sourceFileCount);\n const occurrenceCount = nonNegativeSafeInteger(value.occurrenceCount);\n const targetReadCount = nonNegativeSafeInteger(value.targetReadCount);\n const findingCount = nonNegativeSafeInteger(value.findingCount);\n const rejectedInputCount = nonNegativeSafeInteger(value.rejectedInputCount);\n if (\n sourceFileCount === undefined ||\n occurrenceCount === undefined ||\n targetReadCount === undefined ||\n findingCount === undefined ||\n rejectedInputCount === undefined ||\n targetReadCount > occurrenceCount ||\n findingCount < rejectedInputCount ||\n findingCount - rejectedInputCount > occurrenceCount\n ) {\n throw invalidFinalData(\"markdownLinkValidation\");\n }\n return Object.freeze({\n sourceFileCount,\n occurrenceCount,\n targetReadCount,\n findingCount,\n rejectedInputCount\n });\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { presentCheckFindings } from "../../check/finding-presentation.mjs";
2
+ const PRESENTED_FINDING_LIMIT = 10;
3
+ /** Projects completed Link findings without copying raw destinations into presentation. */
4
+ export function markdownFindingMessages(candidates, rejectedPaths, blocking) {
5
+ const findings = [
6
+ ...candidates.map((candidate) => Object.freeze({ kind: "link", candidate })),
7
+ ...rejectedPaths.map((path) => Object.freeze({ kind: "input-rejected", path }))
8
+ ];
9
+ return presentCheckFindings({
10
+ findings,
11
+ limit: PRESENTED_FINDING_LIMIT,
12
+ message: (finding) => {
13
+ if (finding.kind === "input-rejected") {
14
+ return Object.freeze({
15
+ code: "finding-detail",
16
+ level: "warning",
17
+ message: `${finding.path}: selected input is not a supported Markdown source.`
18
+ });
19
+ }
20
+ const { occurrenceKind, range, reason, sourcePath } = finding.candidate.data;
21
+ return Object.freeze({
22
+ code: "finding-detail",
23
+ level: blocking ? "error" : "warning",
24
+ message: `${sourcePath}:${range.start.line}:${range.start.column} ${occurrenceKind}: ${reason}.`
25
+ });
26
+ },
27
+ omittedMessage: ({ omittedCount, omittedFindings }) => Object.freeze({
28
+ code: "findings-omitted",
29
+ level: omittedFindings.some((finding) => finding.kind === "link" && blocking)
30
+ ? "error"
31
+ : "warning",
32
+ message: `${omittedCount} additional Markdown link finding(s) were not shown; inspect this Check's Records for the complete set.`
33
+ })
34
+ });
35
+ }
36
+ //# sourceMappingURL=finding-messages.mjs.map