@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
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vibe Check
2
2
 
3
- Vibe Check 是面向 Bun 项目的 TypeScript 质量检查库。你可以直接使用随包提供的代码、JSON、Schema、Markdown 和维护检查,也可以把项目自己的规则写成 Check,然后在项目脚本、测试或 CI 中获得结构化结果。
3
+ Vibe Check 是通用 TypeScript 质量门禁工具,提供可组合 Check、类型安全 API 和结构化结果。你可以直接使用随包提供的代码、JSON、Schema、Markdown 和维护检查,也可以把项目自己的规则写成 Check,然后在项目脚本、测试或 CI 中运行它们。
4
4
 
5
5
  所有公开能力都从 `@zxyycom/vibe-check` package root 导入。Vibe Check 不要求额外的配置文件,也不提供 CLI:检查内容、组合方式和运行时机都由你的 TypeScript 代码决定。
6
6
 
@@ -10,16 +10,31 @@ Vibe Check 是面向 Bun 项目的 TypeScript 质量检查库。你可以直接
10
10
  npm install @zxyycom/vibe-check
11
11
  ```
12
12
 
13
- npm 负责安装 package;应用代码和质量脚本使用 **Bun `>=1.3.14`** 执行。安装完成后,可以用 `bun run <file>` 运行下面的示例。
13
+ npm 负责安装 package;应用代码和质量脚本的最低运行要求是 **Node `>=24.18`**。安装完成后,可以用 `node <file>` 运行下面的示例。
14
+
15
+ 升级前查看随包的[变更日志](./docs/changelog.md),确认对应版本的变化与必要调整。
16
+
17
+ ## 随包提供的 Check
18
+
19
+ 如果项目需要的是常见质量检查,可以先从以下函数开始,而不必自己实现 `execution`。除 `maintenanceReminders(entries)` 与 `secretDetection({ files })` 有必填输入外,其余函数都可以无参调用;每份指南都包含最小用法、options、默认值、结果和安全边界。
20
+
21
+ | 你想检查什么 | 使用的导出 | 额外环境准备 |
22
+ | --- | --- | --- |
23
+ | 重复代码 | [`duplicateDetection(options?)`](./docs/checks/duplicate-detection.md) | 无需另装分析器。 |
24
+ | 文件代码行指标 | [`fileMetrics(options?)`](./docs/checks/file-metrics.md) | 环境中有兼容精确 SCC 4.0.0 输出契约的 `scc` command。 |
25
+ | 函数规模、复杂度、最大嵌套和参数数量 | [`functionMetrics(options?)`](./docs/checks/function-metrics.md) | 无需另装分析器。 |
26
+ | JSON 语法和输入范围 | [`jsonValidation(options?)`](./docs/checks/json-validation.md) | 无。 |
27
+ | JSON 与 Schema 的匹配关系 | [`jsonSchemaValidation(options?)`](./docs/checks/json-schema-validation.md) | 使用远程 Schema 时,需显式允许对应 HTTPS source 并具备网络访问条件。 |
28
+ | 本地 Markdown 链接与锚点 | [`markdownLinkValidation(options?)`](./docs/checks/markdown-link-validation.md) | 无。 |
29
+ | 基于 Git 历史的维护提醒 | [`maintenanceReminders(entries)`](./docs/checks/maintenance-reminders.md) | 项目根目录是 Git repository,且环境可以执行 `git`。 |
30
+ | 高置信 PEM private key | [`secretDetection({ files })`](./docs/checks/secret-detection.md) | 无需另装分析器。 |
31
+
32
+ `duplicateDetection`、`fileMetrics`、`functionMetrics` 和 `markdownLinkValidation` 默认把普通 Finding 作为 non-blocking 警告保留下来;需要让 Finding 直接使 Check 失败时,在对应 options 中设置 `findingPolicy: "blocking"`。文件选择、阈值、外部工具和具体结果字段以各 Check 指南为准。
14
33
 
15
34
  ## 自定义 Check 快速开始
16
35
 
17
36
  下面的 `quality.ts` 展示一条完整的最小路径:定义 bundle 大小规则、运行它,并确认 Check 通过。为使示例能够独立运行,`actualBytes` 使用固定输入;接入项目时,把这部分替换为项目真实的测量逻辑即可。
18
37
 
19
- - `defineCheck(...)` 定义一项检查,以及通过或失败时要返回的数据。
20
- - `defineConfig(...)` 把一项或多项 Check 组成可重复运行的 Project Definition。
21
- - `run(...)` 执行 Definition,并返回本次运行的结果。
22
-
23
38
  示例保留默认的进度输出,但关闭 machine publication,因此第一次运行不会写入 `run.json` 或 `records.ndjson`:
24
39
 
25
40
  ```ts
@@ -61,94 +76,52 @@ if (outcome?.status !== "passed" || outcome.data.actualBytes !== 82_000) {
61
76
  运行它:
62
77
 
63
78
  ```sh
64
- bun run quality.ts
79
+ node quality.ts
65
80
  ```
66
81
 
67
82
  `RunResult.kind === "completed"` 表示这次 Run 已经完整结算,不等于其中每项 Check 都通过。示例继续读取 `bundle-size` 的 `outcome.status`,并在结果不符合预期时让脚本失败。
68
83
 
69
- ## 随包提供的 Check
70
-
71
- 如果项目需要的是常见质量检查,可以先从以下函数开始,而不必自己实现 `execution`。除 `maintenanceReminders(entries)` 必须接收提醒条目外,其余函数都可以无参调用;每份指南都包含最小用法、options、默认值、结果和安全边界。
72
-
73
- | 你想检查什么 | 使用的导出 | 运行前提 |
74
- | --- | --- | --- |
75
- | 重复代码 | [`duplicateDetection(options?)`](./docs/checks/duplicate-detection.md) | package 使用随安装依赖提供的兼容 jscpd v5。 |
76
- | 文件代码行指标 | [`fileMetrics(options?)`](./docs/checks/file-metrics.md) | 环境中有兼容 SCC 3.7.0 输出契约的 `scc` command。 |
77
- | 函数规模、复杂度和参数数量 | [`functionMetrics(options?)`](./docs/checks/function-metrics.md) | 环境中有兼容 Lizard 1.23 输出契约的 `lizard` command。 |
78
- | JSON 语法和输入范围 | [`jsonValidation(options?)`](./docs/checks/json-validation.md) | 只读取本地文件,不执行 command 或网络请求。 |
79
- | JSON 与 Schema 的匹配关系 | [`jsonSchemaValidation(options?)`](./docs/checks/json-schema-validation.md) | 默认离线;只有显式允许的 HTTPS source 才会触发网络请求。 |
80
- | 本地 Markdown 链接与锚点 | [`markdownLinkValidation(options?)`](./docs/checks/markdown-link-validation.md) | 只读取 policy 允许的本地路径,不执行 command 或网络请求。 |
81
- | 基于 Git 历史的维护提醒 | [`maintenanceReminders(entries)`](./docs/checks/maintenance-reminders.md) | 项目根目录是 Git repository,且环境可以执行 `git`。 |
82
-
83
- `duplicateDetection`、`fileMetrics`、`functionMetrics` 和 `markdownLinkValidation` 默认把普通 Finding 作为 non-blocking 警告保留下来;需要让 Finding 直接使 Check 失败时,在对应 options 中设置 `findingPolicy: "blocking"`。文件选择、阈值、外部工具和具体结果字段以各 Check 指南为准。
84
-
85
- ## 自定义 Check API
86
-
87
- 只使用随包 Check 时,可以跳过本节。需要表达项目自己的规则时,通常只需要定义 Check、组成 Definition、运行并读取结果;preflight、依赖调度、waiver 对账、聚合和取消等进阶能力放在[深入 API 机制](./docs/api-mechanics.md)中。
84
+ ## 运行、配置与读取结果
88
85
 
89
- ### 定义 Check
86
+ `defineConfig(...)` 定义可复用的 Checks、options、依赖、scheduler 和默认 outputs;`run(definition, controls?)` 的第二个参数只设置本次根目录、flags、取消、产物与日志目标、output overrides 和显式 aggregation。Controls 不能替换 Check 或 scheduler;字段位置和覆盖规则见 [API 机制](./docs/api-mechanics.md#参数应该放在哪里)。
90
87
 
91
- `defineCheck(value)` 接受一个普通 Check object,并保留 `checkId`、options 和 final data 的 TypeScript inference。常用字段如下:
88
+ 默认最多并行运行四个 Check,显示进度并把 machine files 写入 `artifacts/vibe-check`;diagnostic logging 默认关闭。上例显式关闭 machine publication。配置方法见[输出指南](./docs/guides/run-outputs.md)与[调度指南](./docs/guides/scheduling.md)。
92
89
 
93
- | 字段 | 用途 |
94
- | --- | --- |
95
- | `checkId` | 在同一 Definition 中唯一的稳定标识;用于查找 outcome、Record、message 和 duration。 |
96
- | `displayName` | 进度和人读结果中显示的名称。 |
97
- | `execution(context)` | 执行检查并返回一个 terminal outcome。省略时,当前节点只用于组织子 `checks`。 |
98
- | `options` | 当前 Check 的配置;Run 会把准备后的只读副本交给 `context.options`。 |
99
- | `checks` | 可选的子 Check 列表,用于组织一组相关规则。 |
90
+ 先判断 `RunResult.kind`;对有 snapshot 的结果,再按 `checkId` 读取 `snapshot.checks[].outcome` 的 `passed`、`failed`、`not-applicable` 或 `unavailable`。`completed` 不代表质量通过:CI 应显式判断目标 outcomes,或配置并读取 [`checkAggregation`](./docs/api-mechanics.md#runcontrols-与-check-aggregation),再决定退出码。
100
91
 
101
- `execution` 可以同步返回,也可以返回 `Promise`。它通过 `context` 读取当前 options、project root、flags、已声明依赖的数据、取消 signal,并可用 `records.report(...)` 保存不决定终态的补充事实。
92
+ ## 按任务继续阅读
102
93
 
103
- | 返回状态 | 何时使用 |
104
- | --- | --- |
105
- | `passed` | 检查完成且满足规则;同时返回主要 final `data`。 |
106
- | `failed` | 检查完成但不满足规则;同时返回主要 final `data`。 |
107
- | `not-applicable` | 当前输入没有适用的工作;可以附带 reason。 |
108
- | `unavailable` | 无法形成可信结果;必须附带 reason。 |
94
+ 只读当前任务需要的专题;精确 overload、泛型推断和字段 JSDoc 以安装包中的 `types/**.d.ts` 为准。
109
95
 
110
- final `data` 和 supplemental Record 使用 object-shaped canonical JSON。Check 可以附带有序的人读 `messages`,但通用 API 不保证每个结果都有 message。
96
+ - [API 机制](./docs/api-mechanics.md):Run 生命周期、组合继承、结果与 aggregation。
97
+ - [选择回调位置](./docs/guides/callbacks.md):确定执行前、检查中、显示时或结束后的接入点。
98
+ - [自定义 Check](./docs/guides/extending-check-lifecycle.md):options 准备、callback context、Records 与协作取消。
99
+ - [Check 依赖与类型化数据](./docs/guides/check-dependencies.md):`dependsOn` / `observes`、读取授权与 provider parser。
100
+ - [Run 输出与诊断](./docs/guides/run-outputs.md):输出配置、progress、日志与失败处理。
101
+ - [调度 Check](./docs/guides/scheduling.md):并发资源、准入策略与终态观察。
102
+ - [机器输出契约](./docs/output.md):供其他工具读取 `run.json`、`records.ndjson` 与 schemas。
111
103
 
112
- ### 组成 Project Definition
104
+ 以下可选工具由项目代码或自定义 Check 显式调用:
113
105
 
114
- `defineConfig({ checks, ... })` 组成可重复运行的 Project Definition,并补齐未声明的默认值。最常调整的默认项是:
115
-
116
- | 配置 | 默认值 | 效果 |
106
+ | 目的 | 工具与接入方式 | 详解 |
117
107
  | --- | --- | --- |
118
- | `outputs.progressRendering.enabled` | `true` | 在终端呈现 Check 生命周期与汇总。 |
119
- | `outputs.machinePublication.enabled` | `true` | 把 `run.json` 和 `records.ndjson` 写入 `artifacts/vibe-check`。 |
120
- | `outputs.diagnosticLogging.enabled` | `false` | 需要排障时写入 invocation-specific 日志。 |
121
- | `scheduler.maxParallel` | `4` | 限制最外层 Check 并行数。 |
122
-
123
- `outputs` 和 `scheduler` 都可以只覆盖需要改变的 nested field;同一份 Definition 可以安全地传给多次 `run(...)`。
124
-
125
- ### 运行并读取结果
126
-
127
- `run(definition, controls?)` 执行一次独立 invocation。常用 controls 包括 `projectRoot`、`flags`、`signal` 和仅对本次运行生效的 `outputs` overrides。
108
+ | 按一份完整 selection 收集项目文件 path | `collectProjectFiles(...)` 在普通项目代码或 custom Check 内返回冻结的 relative path 快照 | [收集项目文件](./docs/guides/collecting-project-files.md) |
109
+ | 按完整语义 key 复用本地 JSON 计算 | `cacheJsonByKey(...)` 在普通项目代码或 Check 内返回一次调用的缓存结果 | [缓存计算结果](./docs/guides/cache-results.md) |
110
+ | 对账完整 Finding 集合与 waiver audit | `reconcileFindingWaivers(...)` 在 Finding 形成后返回 disposition 与 audit | [对账 Finding waiver](./docs/guides/finding-waivers.md) |
111
+ | 生成有限的 Finding 人读摘要 | `presentCheckFindings(...)` 返回 `CheckMessage[]`,由 producing Check 附到自己的 terminal result | [呈现 Check Finding](./docs/guides/presenting-findings.md) |
112
+ | 在不执行 Check 的前提下分析静态 admission 分支 | `createAdmissionGraph(...)` 独立创建 immutable simulation,不需要 `run(...)` 或 custom policy | [模拟 AdmissionGraph](./docs/guides/simulating-admission.md) |
113
+ | 为重复 Run 准备基于本地时长 history 的选择策略 | `createLearnedCriticalPathStrategy(...)` 的返回值接入 `scheduler.admissionPolicy` 的 custom strategy | [learned critical-path strategy](./docs/guides/learned-scheduling.md) |
128
114
 
129
- 读取结果时分两层判断:
130
-
131
- 1. 先读取 `RunResult.kind`,确认 invocation 是完整结算、配置错误、规划失败、输出失败、执行失败还是被取消。
132
- 2. 对有 snapshot 的结果,按 `checkId` 查找 `snapshot.checks[].outcome`,再处理 `passed`、`failed`、`not-applicable` 或 `unavailable`。
133
-
134
- 合法运行中,即使某项 Check 返回 `failed`,Run 仍可能是 `kind: "completed"`。如果 CI 需要因质量 Finding 退出非零状态,调用方必须像快速开始那样显式判断目标 outcome,或配置并读取 invocation-level aggregation。
135
-
136
- ## 输出与进阶用法
137
-
138
- - [深入 API 机制](./docs/api-mechanics.md)说明 options preflight、依赖、组合、aggregation、finding waiver、cancellation 和 output failure 边界。
139
- - [机器输出契约](./docs/output.md)说明 `run.json`、`records.ndjson` 和对应 schemas;只有需要把结果交给其他工具时才需要读取它。
140
- - 精确 overload、泛型推断和字段 JSDoc 以安装包中的 `types/**.d.ts` 为准。
115
+ 各随包 Check 的 `parse…Data` 导出用于解析该 Check 的 final data;完整签名与类型见相应 Check 指南及 installed declarations。
141
116
 
142
117
  ## 包内结构与调试
143
118
 
144
119
  业务代码始终从 `@zxyycom/vibe-check` 导入。安装包中的 `index.mjs` 是公开 runtime entry,`types/**.d.ts` 提供 TypeScript declarations;source maps、`src/**.ts` 和可读的 `dist/esm/**.mjs` 用于堆栈定位与实现检查,不是额外的 public import path。
145
120
 
146
- 安装包还包含机器输出文档、v4 run / Record schemas 和一组完整 artifact example,便于需要消费机器结果的工具核对实际 bytes。
147
-
148
121
  ## 分发与兼容范围
149
122
 
150
- npm 只负责分发和安装 package;受支持的产品 host 是 **Bun `>=1.3.14`**。通过 npm 安装不表示 Node.js runtime 已受支持。
151
-
152
123
  当前 public contract 只有 `@zxyycom/vibe-check` package root 的程序化 API。CLI、`bin`、plugin API、CommonJS/browser entry 和 subpath imports 都不在支持范围内。
153
124
 
154
- `0.0.x` patch 之间不承诺 package-level 兼容。项目应提交 lockfile,并在升级前检查对应版本的变更。Vibe Check 使用 MIT License,完整许可文本随 package 一起安装。
125
+ `0.0.x` patch 之间不承诺 package-level 兼容。项目应提交 lockfile,并在升级前检查对应版本的变更。
126
+
127
+ 随包法律材料包括根 `LICENSE` 中的 Vibe Check MIT 文本,以及 `licenses/` 中的分析器翻译归属说明、第三方许可原文与来源记录。npm 依赖作为独立包安装,其许可声明及随附法律材料由各依赖包提供。
@@ -0,0 +1,189 @@
1
+ /** caller-keyed canonical JSON cache 的公开存储边界。 */
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { promises as fs } from "node:fs";
4
+ import { isAbsolute, join } from "node:path";
5
+ import { canonicalizeJsonObject, canonicalJsonBytes } from "../data-boundary/canonical-data.mjs";
6
+ import { hasExactPlainRecordKeys, snapshotClosedRecord } from "../data-boundary/closed-values.mjs";
7
+ const CACHE_API_VERSION = "caller-keyed-json-v1";
8
+ const CACHE_ENVELOPE_KEYS = ["cacheFormatVersion", "identityDigest", "payload"];
9
+ /**
10
+ * 按 caller 提供的完整 semantic key 复用本地 canonical JSON object。
11
+ *
12
+ * cache hit 不会跳过或重放 Check settlement、Records、messages、duration 或 side effects。读取或写入失败
13
+ * 只通过返回的 observation 可见;只要 `compute` 与 `parse` 成功,就仍返回本次 computation 的 value。
14
+ * 不提供依赖发现、默认目录、lock/single-flight、TTL/LRU、cleanup、remote cache 或 tamper protection。
15
+ */
16
+ export async function cacheJsonByKey(authoredOptions) {
17
+ const options = parseOptions(authoredOptions);
18
+ const identityDigest = cacheIdentityDigest(options);
19
+ const targetPath = join(options.directory, `${identityDigest}.json`);
20
+ const cached = await readCacheEntry({ identityDigest, parse: options.parse, targetPath });
21
+ if (cached.hit) {
22
+ return Object.freeze({
23
+ read: "hit",
24
+ source: "cache",
25
+ value: cached.value,
26
+ write: "not-attempted"
27
+ });
28
+ }
29
+ const payload = canonicalizeJsonObject(await options.compute());
30
+ if (payload === undefined) {
31
+ throw new TypeError("cacheJsonByKey compute must return a canonical JSON object");
32
+ }
33
+ const value = parseSynchronously(options.parse, payload, "computed value");
34
+ const stored = await publishCacheEntry({
35
+ directory: options.directory,
36
+ identityDigest,
37
+ parse: options.parse,
38
+ payload,
39
+ targetPath
40
+ });
41
+ return Object.freeze({
42
+ read: cached.read,
43
+ source: "computed",
44
+ value,
45
+ write: stored ? "stored" : "failed"
46
+ });
47
+ }
48
+ function parseOptions(value) {
49
+ const record = snapshotClosedRecord(value);
50
+ if (record === undefined ||
51
+ !hasExactPlainRecordKeys(record, [
52
+ "compute",
53
+ "directory",
54
+ "key",
55
+ "namespace",
56
+ "parse",
57
+ "version"
58
+ ])) {
59
+ throw new TypeError("cacheJsonByKey options must be a closed object");
60
+ }
61
+ const { compute, directory, key, namespace, parse, version } = record;
62
+ if (typeof compute !== "function" || typeof parse !== "function") {
63
+ throw new TypeError("cacheJsonByKey compute and parse must be functions");
64
+ }
65
+ if (typeof directory !== "string" ||
66
+ directory.length === 0 ||
67
+ directory.includes("\0") ||
68
+ !isAbsolute(directory)) {
69
+ throw new TypeError("cacheJsonByKey directory must be a non-empty absolute path without U+0000");
70
+ }
71
+ if (typeof namespace !== "string" || namespace.length === 0) {
72
+ throw new TypeError("cacheJsonByKey namespace must be a non-empty string");
73
+ }
74
+ if (typeof version !== "string" || version.length === 0) {
75
+ throw new TypeError("cacheJsonByKey version must be a non-empty string");
76
+ }
77
+ if (typeof key !== "string" || key.length === 0) {
78
+ throw new TypeError("cacheJsonByKey key must be a non-empty string");
79
+ }
80
+ const typedOptions = {
81
+ compute: value.compute,
82
+ directory: value.directory,
83
+ key: value.key,
84
+ namespace: value.namespace,
85
+ parse: value.parse,
86
+ version: value.version
87
+ };
88
+ if (typedOptions.compute !== compute ||
89
+ typedOptions.directory !== directory ||
90
+ typedOptions.key !== key ||
91
+ typedOptions.namespace !== namespace ||
92
+ typedOptions.parse !== parse ||
93
+ typedOptions.version !== version) {
94
+ throw new TypeError("cacheJsonByKey options changed during validation");
95
+ }
96
+ return Object.freeze(typedOptions);
97
+ }
98
+ function cacheIdentityDigest(options) {
99
+ return createHash("sha256")
100
+ .update(canonicalJsonBytes({
101
+ cacheApiVersion: CACHE_API_VERSION,
102
+ key: options.key,
103
+ namespace: options.namespace,
104
+ payloadVersion: options.version
105
+ }))
106
+ .digest("hex");
107
+ }
108
+ async function readCacheEntry(input) {
109
+ let source;
110
+ try {
111
+ source = await fs.readFile(input.targetPath, "utf8");
112
+ }
113
+ catch (error) {
114
+ return isMissingPath(error)
115
+ ? Object.freeze({ hit: false, read: "miss" })
116
+ : Object.freeze({ hit: false, read: "failed" });
117
+ }
118
+ try {
119
+ const envelope = parseEnvelope(JSON.parse(source), input.identityDigest);
120
+ if (envelope === undefined)
121
+ return Object.freeze({ hit: false, read: "invalid" });
122
+ return Object.freeze({
123
+ hit: true,
124
+ value: parseSynchronously(input.parse, envelope.payload, "cached payload")
125
+ });
126
+ }
127
+ catch {
128
+ return Object.freeze({ hit: false, read: "invalid" });
129
+ }
130
+ }
131
+ function parseEnvelope(value, identityDigest) {
132
+ const record = snapshotClosedRecord(value);
133
+ if (record === undefined || !hasExactPlainRecordKeys(record, CACHE_ENVELOPE_KEYS))
134
+ return undefined;
135
+ if (record.cacheFormatVersion !== CACHE_API_VERSION || record.identityDigest !== identityDigest) {
136
+ return undefined;
137
+ }
138
+ const payload = canonicalizeJsonObject(record.payload);
139
+ return payload === undefined ? undefined : Object.freeze({ payload });
140
+ }
141
+ function parseSynchronously(parse, payload, subject) {
142
+ const value = parse(payload);
143
+ if (isThenable(value))
144
+ throw new TypeError(`cacheJsonByKey parse must synchronously return ${subject}`);
145
+ return value;
146
+ }
147
+ function isThenable(value) {
148
+ return (((typeof value === "object" && value !== null) || typeof value === "function") &&
149
+ typeof value.then === "function");
150
+ }
151
+ async function publishCacheEntry(input) {
152
+ const temporaryPath = join(input.directory, `.vibe-check-cache-${randomUUID()}.tmp`);
153
+ try {
154
+ await fs.mkdir(input.directory, { recursive: true });
155
+ await fs.writeFile(temporaryPath, JSON.stringify({
156
+ cacheFormatVersion: CACHE_API_VERSION,
157
+ identityDigest: input.identityDigest,
158
+ payload: input.payload
159
+ }), { encoding: "utf8", flag: "wx" });
160
+ }
161
+ catch {
162
+ await fs.rm(temporaryPath, { force: true }).catch(() => undefined);
163
+ return false;
164
+ }
165
+ try {
166
+ await fs.rename(temporaryPath, input.targetPath);
167
+ return true;
168
+ }
169
+ catch (error) {
170
+ if (isConcurrentTargetConflict(error)) {
171
+ const concurrent = await readCacheEntry({
172
+ identityDigest: input.identityDigest,
173
+ parse: input.parse,
174
+ targetPath: input.targetPath
175
+ });
176
+ await fs.rm(temporaryPath, { force: true }).catch(() => undefined);
177
+ return concurrent.hit;
178
+ }
179
+ await fs.rm(temporaryPath, { force: true }).catch(() => undefined);
180
+ return false;
181
+ }
182
+ }
183
+ function isConcurrentTargetConflict(error) {
184
+ return (typeof error === "object" && error !== null && error.code === "EEXIST");
185
+ }
186
+ function isMissingPath(error) {
187
+ return (typeof error === "object" && error !== null && error.code === "ENOENT");
188
+ }
189
+ //# sourceMappingURL=cache-json-by-key.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-json-by-key.mjs","sourceRoot":"","sources":["../../../src/cache/cache-json-by-key.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAElG,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACjD,MAAM,mBAAmB,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,SAAS,CAAU,CAAC;AAiDzF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,eAAyC;IAEzC,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,cAAc,OAAO,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1F,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO;QACP,UAAU;KACX,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,UAAU;QAClB,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;KACpC,CAAC,CAAC;AACL,CAAC;AAWD,SAAS,YAAY,CAAmB,KAA+B;IACrE,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,IACE,MAAM,KAAK,SAAS;QACpB,CAAC,uBAAuB,CAAC,MAAM,EAAE;YAC/B,SAAS;YACT,WAAW;YACX,KAAK;YACL,WAAW;YACX,OAAO;YACP,SAAS;SACV,CAAC,EACF,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACtE,IAAI,OAAO,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QACjE,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;IAC5E,CAAC;IACD,IACE,OAAO,SAAS,KAAK,QAAQ;QAC7B,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxB,CAAC,UAAU,CAAC,SAAS,CAAC,EACtB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,YAAY,GAAqB;QACrC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,IACE,YAAY,CAAC,OAAO,KAAK,OAAO;QAChC,YAAY,CAAC,SAAS,KAAK,SAAS;QACpC,YAAY,CAAC,GAAG,KAAK,GAAG;QACxB,YAAY,CAAC,SAAS,KAAK,SAAS;QACpC,YAAY,CAAC,KAAK,KAAK,KAAK;QAC5B,YAAY,CAAC,OAAO,KAAK,OAAO,EAChC,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA8B;IACzD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CACL,kBAAkB,CAAC;QACjB,eAAe,EAAE,iBAAiB;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,OAAO;KAChC,CAAC,CACH;SACA,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAMD,KAAK,UAAU,cAAc,CAC3B,KAIE;IAEF,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC7C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QACzE,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;SAC3E,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,KAAc,EACd,cAAsB;IAEtB,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC;QAC/E,OAAO,SAAS,CAAC;IACnB,IAAI,MAAM,CAAC,kBAAkB,KAAK,iBAAiB,IAAI,MAAM,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;QAChG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,kBAAkB,CACzB,KAA4B,EAC5B,OAA4B,EAC5B,OAAe;IAEf,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,UAAU,CAAC,KAAK,CAAC;QACnB,MAAM,IAAI,SAAS,CAAC,kDAAkD,OAAO,EAAE,CAAC,CAAC;IACnF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;QAC9E,OAAQ,KAA4B,CAAC,IAAI,KAAK,UAAU,CACzD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAME;IAEF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,qBAAqB,UAAU,EAAE,MAAM,CAAC,CAAC;IACrF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,SAAS,CAChB,aAAa,EACb,IAAI,CAAC,SAAS,CAAC;YACb,kBAAkB,EAAE,iBAAiB;YACrC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,EACF,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CACjC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC;gBACtC,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnE,OAAO,UAAU,CAAC,GAAG,CAAC;QACxB,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IAChD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAC/F,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAC/F,CAAC;AACJ,CAAC","sourcesContent":["/** caller-keyed canonical JSON cache 的公开存储边界。 */\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { isAbsolute, join } from \"node:path\";\n\nimport {\n canonicalizeJsonObject,\n canonicalJsonBytes,\n type CanonicalJsonObject\n} from \"../data-boundary/canonical-data.ts\";\nimport { hasExactPlainRecordKeys, snapshotClosedRecord } from \"../data-boundary/closed-values.ts\";\n\nconst CACHE_API_VERSION = \"caller-keyed-json-v1\";\nconst CACHE_ENVELOPE_KEYS = [\"cacheFormatVersion\", \"identityDigest\", \"payload\"] as const;\n\n/**\n * `cacheJsonByKey` 的 caller-owned identity、payload parser 与 computation。\n *\n * `key` 必须覆盖所有会改变 computation 结果的输入、实现、options、toolchain 与声明的外部状态;\n * 不能放入 secret 或低熵敏感值。`directory` 是调用方信任、可自行删除的本地状态空间。\n */\ntype NonThenable<T extends object> = T & Readonly<{ readonly then?: undefined }>;\n\n/** Caller-keyed JSON cache 的 options。 */\nexport interface CacheJsonByKeyOptions<T extends object> {\n /** cache miss、读取失败或 payload 无效时执行的 sync/async computation。 */\n readonly compute: () => unknown;\n /** 调用方信任、可自行清理的 absolute local directory。 */\n readonly directory: string;\n /** 覆盖所有影响 computation 结果的完整 semantic key;不得包含 secret 或低熵敏感值。 */\n readonly key: string;\n /** 调用方为这一类缓存选择的非空 identity namespace。 */\n readonly namespace: string;\n /** 同步验证 cached/computed canonical JSON object,并返回调用方的 typed value。 */\n readonly parse: (value: unknown) => NonThenable<T>;\n /** 调用方控制、在 payload 或 computation contract 改变时更新的非空版本。 */\n readonly version: string;\n}\n\n/** `cacheJsonByKey` 返回的闭合 cache observation 与本次 parser value。 */\nexport type CacheJsonByKeyResult<T extends object> =\n | Readonly<{\n /** 已读取并通过 parser 验证现有 payload。 */\n readonly read: \"hit\";\n /** 本次 value 来自 cache,不调用 `compute`。 */\n readonly source: \"cache\";\n /** `parse` 返回的调用方 typed value。 */\n readonly value: T;\n /** cache hit 不尝试重新写入。 */\n readonly write: \"not-attempted\";\n }>\n | Readonly<{\n /** 没有 entry、读取失败,或已有 payload 未通过 identity/parser 验证。 */\n readonly read: \"failed\" | \"invalid\" | \"miss\";\n /** 本次 value 来自成功的 `compute` 与 `parse`。 */\n readonly source: \"computed\";\n /** `parse` 返回的调用方 typed value。 */\n readonly value: T;\n /** 新 payload 已存储,或存储失败但 typed value 仍可使用。 */\n readonly write: \"failed\" | \"stored\";\n }>;\n\n/**\n * 按 caller 提供的完整 semantic key 复用本地 canonical JSON object。\n *\n * cache hit 不会跳过或重放 Check settlement、Records、messages、duration 或 side effects。读取或写入失败\n * 只通过返回的 observation 可见;只要 `compute` 与 `parse` 成功,就仍返回本次 computation 的 value。\n * 不提供依赖发现、默认目录、lock/single-flight、TTL/LRU、cleanup、remote cache 或 tamper protection。\n */\nexport async function cacheJsonByKey<T extends object>(\n authoredOptions: CacheJsonByKeyOptions<T>\n): Promise<CacheJsonByKeyResult<T>> {\n const options = parseOptions(authoredOptions);\n const identityDigest = cacheIdentityDigest(options);\n const targetPath = join(options.directory, `${identityDigest}.json`);\n const cached = await readCacheEntry({ identityDigest, parse: options.parse, targetPath });\n if (cached.hit) {\n return Object.freeze({\n read: \"hit\",\n source: \"cache\",\n value: cached.value,\n write: \"not-attempted\"\n });\n }\n\n const payload = canonicalizeJsonObject(await options.compute());\n if (payload === undefined) {\n throw new TypeError(\"cacheJsonByKey compute must return a canonical JSON object\");\n }\n const value = parseSynchronously(options.parse, payload, \"computed value\");\n const stored = await publishCacheEntry({\n directory: options.directory,\n identityDigest,\n parse: options.parse,\n payload,\n targetPath\n });\n return Object.freeze({\n read: cached.read,\n source: \"computed\",\n value,\n write: stored ? \"stored\" : \"failed\"\n });\n}\n\ntype ParsedOptions<T extends object> = Readonly<{\n readonly compute: () => unknown;\n readonly directory: string;\n readonly key: string;\n readonly namespace: string;\n readonly parse: (value: unknown) => T;\n readonly version: string;\n}>;\n\nfunction parseOptions<T extends object>(value: CacheJsonByKeyOptions<T>): ParsedOptions<T> {\n const record = snapshotClosedRecord(value);\n if (\n record === undefined ||\n !hasExactPlainRecordKeys(record, [\n \"compute\",\n \"directory\",\n \"key\",\n \"namespace\",\n \"parse\",\n \"version\"\n ])\n ) {\n throw new TypeError(\"cacheJsonByKey options must be a closed object\");\n }\n const { compute, directory, key, namespace, parse, version } = record;\n if (typeof compute !== \"function\" || typeof parse !== \"function\") {\n throw new TypeError(\"cacheJsonByKey compute and parse must be functions\");\n }\n if (\n typeof directory !== \"string\" ||\n directory.length === 0 ||\n directory.includes(\"\\0\") ||\n !isAbsolute(directory)\n ) {\n throw new TypeError(\n \"cacheJsonByKey directory must be a non-empty absolute path without U+0000\"\n );\n }\n if (typeof namespace !== \"string\" || namespace.length === 0) {\n throw new TypeError(\"cacheJsonByKey namespace must be a non-empty string\");\n }\n if (typeof version !== \"string\" || version.length === 0) {\n throw new TypeError(\"cacheJsonByKey version must be a non-empty string\");\n }\n if (typeof key !== \"string\" || key.length === 0) {\n throw new TypeError(\"cacheJsonByKey key must be a non-empty string\");\n }\n const typedOptions: ParsedOptions<T> = {\n compute: value.compute,\n directory: value.directory,\n key: value.key,\n namespace: value.namespace,\n parse: value.parse,\n version: value.version\n };\n if (\n typedOptions.compute !== compute ||\n typedOptions.directory !== directory ||\n typedOptions.key !== key ||\n typedOptions.namespace !== namespace ||\n typedOptions.parse !== parse ||\n typedOptions.version !== version\n ) {\n throw new TypeError(\"cacheJsonByKey options changed during validation\");\n }\n return Object.freeze(typedOptions);\n}\n\nfunction cacheIdentityDigest(options: ParsedOptions<object>): string {\n return createHash(\"sha256\")\n .update(\n canonicalJsonBytes({\n cacheApiVersion: CACHE_API_VERSION,\n key: options.key,\n namespace: options.namespace,\n payloadVersion: options.version\n })\n )\n .digest(\"hex\");\n}\n\ntype CacheRead<T extends object> =\n | Readonly<{ readonly hit: true; readonly value: T }>\n | Readonly<{ readonly hit: false; readonly read: \"failed\" | \"invalid\" | \"miss\" }>;\n\nasync function readCacheEntry<T extends object>(\n input: Readonly<{\n readonly identityDigest: string;\n readonly parse: (value: unknown) => T;\n readonly targetPath: string;\n }>\n): Promise<CacheRead<T>> {\n let source: string;\n try {\n source = await fs.readFile(input.targetPath, \"utf8\");\n } catch (error: unknown) {\n return isMissingPath(error)\n ? Object.freeze({ hit: false, read: \"miss\" })\n : Object.freeze({ hit: false, read: \"failed\" });\n }\n try {\n const envelope = parseEnvelope(JSON.parse(source), input.identityDigest);\n if (envelope === undefined) return Object.freeze({ hit: false, read: \"invalid\" });\n return Object.freeze({\n hit: true,\n value: parseSynchronously(input.parse, envelope.payload, \"cached payload\")\n });\n } catch {\n return Object.freeze({ hit: false, read: \"invalid\" });\n }\n}\n\nfunction parseEnvelope(\n value: unknown,\n identityDigest: string\n): Readonly<{ readonly payload: CanonicalJsonObject }> | undefined {\n const record = snapshotClosedRecord(value);\n if (record === undefined || !hasExactPlainRecordKeys(record, CACHE_ENVELOPE_KEYS))\n return undefined;\n if (record.cacheFormatVersion !== CACHE_API_VERSION || record.identityDigest !== identityDigest) {\n return undefined;\n }\n const payload = canonicalizeJsonObject(record.payload);\n return payload === undefined ? undefined : Object.freeze({ payload });\n}\n\nfunction parseSynchronously<T extends object>(\n parse: (value: unknown) => T,\n payload: CanonicalJsonObject,\n subject: string\n): T {\n const value = parse(payload);\n if (isThenable(value))\n throw new TypeError(`cacheJsonByKey parse must synchronously return ${subject}`);\n return value;\n}\n\nfunction isThenable(value: unknown): boolean {\n return (\n ((typeof value === \"object\" && value !== null) || typeof value === \"function\") &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nasync function publishCacheEntry<T extends object>(\n input: Readonly<{\n readonly directory: string;\n readonly identityDigest: string;\n readonly parse: (value: unknown) => T;\n readonly payload: CanonicalJsonObject;\n readonly targetPath: string;\n }>\n): Promise<boolean> {\n const temporaryPath = join(input.directory, `.vibe-check-cache-${randomUUID()}.tmp`);\n try {\n await fs.mkdir(input.directory, { recursive: true });\n await fs.writeFile(\n temporaryPath,\n JSON.stringify({\n cacheFormatVersion: CACHE_API_VERSION,\n identityDigest: input.identityDigest,\n payload: input.payload\n }),\n { encoding: \"utf8\", flag: \"wx\" }\n );\n } catch {\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n return false;\n }\n\n try {\n await fs.rename(temporaryPath, input.targetPath);\n return true;\n } catch (error: unknown) {\n if (isConcurrentTargetConflict(error)) {\n const concurrent = await readCacheEntry({\n identityDigest: input.identityDigest,\n parse: input.parse,\n targetPath: input.targetPath\n });\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n return concurrent.hit;\n }\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n return false;\n }\n}\n\nfunction isConcurrentTargetConflict(error: unknown): boolean {\n return (\n typeof error === \"object\" && error !== null && (error as { code?: unknown }).code === \"EEXIST\"\n );\n}\n\nfunction isMissingPath(error: unknown): boolean {\n return (\n typeof error === \"object\" && error !== null && (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"check.mjs","sourceRoot":"","sources":["../../../src/check/check.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EACP,0BAA0B,EAC1B,gCAAgC,EACjC,MAAM,2BAA2B,CAAC;AAuenC,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import type { CanonicalJsonObject, CanonicalJsonValue } from \"../data-boundary/canonical-json.ts\";\nimport type { InheritableCheckCollection } from \"./inherited-collection.ts\";\n\nexport {\n inherit,\n isInheritedCheckCollection,\n snapshotInheritedCheckCollection\n} from \"./inherited-collection.ts\";\nexport type {\n InheritCheckCollectionInput,\n InheritableCheckCollection,\n InheritedCheckCollection\n} from \"./inherited-collection.ts\";\n\n/** Check 无法给出 final data 时返回的受控 reason code。 */\nexport type CheckReason = Readonly<{\n /** 由 owning Check 定义、供调用方诊断的稳定 code。 */\n readonly code: string;\n}>;\n\n/** `not-applicable` Check result 的可选 reason。 */\nexport type CheckNotApplicableReason = CheckReason;\n/** author callback 明确返回 `unavailable` 时必须提供的 reason。 */\nexport type CheckDeclaredUnavailableReason = CheckReason;\n\n/** `unavailable` Check outcome 的 reason;可列出导致当前 Check 不可用的上游 Check。 */\nexport type CheckUnavailableReason = Readonly<{\n /** 由当前 Check 或 Product 边界给出的受控原因。 */\n readonly code: string;\n /** 仅在上游关系有助于定位时给出的相关 Check IDs。 */\n readonly checkIds?: readonly string[];\n}>;\n\n/** 终端 Check message 的 presentation severity。 */\nexport type CheckMessageLevel = \"info\" | \"warning\" | \"error\";\n\n/** 由 Check author 附加到 terminal result 的补充消息。 */\nexport interface CheckMessage {\n /** 人读 presentation 使用的 severity。 */\n readonly level: CheckMessageLevel;\n /** owning Check namespace 内的稳定 message code。 */\n readonly code: string;\n /** 非空消息正文;Product 保留 author 提供的字符串。 */\n readonly message: string;\n}\n\n/** 可附加到每个 {@link CheckResult} branch 的有序 terminal messages。 */\nexport interface CheckResultMessages {\n /** 省略、`undefined` 或空数组都表示没有 supplemental messages。 */\n readonly messages?: readonly CheckMessage[];\n}\n\n/** 已结算 Check 在人读 progress 中的可见性。 */\nexport type CheckVisibility = \"always\" | \"attention\";\n\n/**\n * Check callback 的 terminal result。\n *\n * @typeParam FinalData - `passed` 或 `failed` 时保留为 canonical final data 的业务对象。\n * @remarks `not-applicable` 与 `unavailable` 不携带 final data;普通 callback、Record 或取消失败由\n * Product 转换为 `unavailable`,而不是抛出为 Run 的成功结果。\n */\nexport type CheckResult<FinalData extends object = object> = Readonly<\n (\n | {\n /** Check 已产生通过的 final data。 */\n readonly status: \"passed\";\n /** 此 Check 的主要终态事实。 */\n readonly data: FinalData;\n }\n | {\n /** Check 已产生失败的 final data。 */\n readonly status: \"failed\";\n /** 此 Check 的主要终态事实。 */\n readonly data: FinalData;\n }\n | {\n /** Check 在当前 invocation 中不适用。 */\n readonly status: \"not-applicable\";\n /** 不适用的可选受控原因。 */\n readonly reason?: CheckNotApplicableReason;\n }\n | {\n /** Check 不能提供 terminal data。 */\n readonly status: \"unavailable\";\n /** 不可用的受控原因。 */\n readonly reason: CheckDeclaredUnavailableReason;\n }\n ) &\n CheckResultMessages\n>;\n\n/** 已 materialize 到 Core snapshot 的 Check terminal outcome。 */\nexport type CheckOutcome = Readonly<\n | {\n /** 已 materialize 的通过 outcome。 */\n readonly status: \"passed\";\n /** 已 canonicalize 的 primary final fact。 */\n readonly data: CanonicalJsonObject;\n }\n | {\n /** 已 materialize 的失败 outcome。 */\n readonly status: \"failed\";\n /** 已 canonicalize 的 primary final fact。 */\n readonly data: CanonicalJsonObject;\n }\n | {\n /** 已 materialize 的不适用 outcome。 */\n readonly status: \"not-applicable\";\n /** 不适用的可选受控原因。 */\n readonly reason?: CheckNotApplicableReason;\n }\n | {\n /** 已 materialize 的不可用 outcome。 */\n readonly status: \"unavailable\";\n /** 包含相关 upstream Check IDs 的受控原因。 */\n readonly reason: CheckUnavailableReason;\n }\n>;\n\n/** 将 callback options 转为不可变观察值的递归 utility type。 */\nexport type DeepReadonly<T> = T extends string | number | boolean | null\n ? T\n : T extends readonly (infer Item)[]\n ? readonly DeepReadonly<Item>[]\n : T extends object\n ? { readonly [Key in keyof T]: DeepReadonly<T[Key]> }\n : never;\n\n/** callback 写入 supplemental Record 时的 Check-local identity。 */\ninterface RecordIdentityInput {\n /** 在当前 Check 内唯一的 Record ID。 */\n readonly id: string;\n}\n\n/** callback 写入 supplemental Records 的 Product-owned reporter。 */\ninterface CheckRecordReporter {\n /** 记录一个补充事实;它不决定 Check 的 terminal status。 */\n report(identity: RecordIdentityInput, data: object): void;\n}\n\n/** 读取已声明 dependency final data 时的失败原因。 */\nexport type DependencyReadError = Readonly<\n | {\n /** 当前 Check 未声明所请求的 dependency ID。 */\n readonly code: \"dependency-not-declared\";\n /** 被拒绝的 dependency ID。 */\n readonly checkId: string;\n }\n | {\n /** 已声明 upstream 没有可读取的 final data。 */\n readonly code: \"upstream-data-unavailable\";\n /** 没有 final data 的 direct dependency ID。 */\n readonly checkId: string;\n /** 阻止 readback 的 upstream terminal status。 */\n readonly status: \"not-applicable\" | \"unavailable\";\n }\n>;\n\n/** {@link CheckDependencies.get} 的受控 readback 结果。 */\nexport type DependencyReadResult = Readonly<\n | {\n /** 成功读取 direct dependency final data。 */\n readonly ok: true;\n /** 被读取的 direct dependency ID。 */\n readonly checkId: string;\n /** upstream 已结算为 `passed` 或 `failed` 的 status。 */\n readonly status: \"passed\" | \"failed\";\n /** 已与原对象脱离的上游依赖终态数据。 */\n readonly data: CanonicalJsonObject;\n }\n | {\n /** dependency data 不可读取。 */\n readonly ok: false;\n /** 失败的授权或 upstream-data reason。 */\n readonly error: DependencyReadError;\n }\n>;\n\n/** 当前 Check 的已规范化直接 dependencies 的 data reader。 */\nexport interface CheckDependencies {\n /**\n * 读取一个直接 dependency 的 canonical final data。\n *\n * @returns 已声明且为 `passed`/`failed` 的 dependency 返回其 data;未声明或没有 final data 时返回\n * `ok: false`,不会授权 transitive dependency。\n */\n get(checkId: string): DependencyReadResult;\n}\n\n/** callback 可读取的、由 Product 规范化的项目上下文。 */\nexport interface CheckProjectContext {\n /** 本次 Run 使用的绝对项目根目录。 */\n readonly root: string;\n /** 已去重、排序的 caller-supplied flags。 */\n readonly flags: readonly string[];\n}\n\n/**\n * Check callback 收到的 Product-owned execution context。\n *\n * @typeParam Options - 此 Check preflight 后传给 execution 的 options shape。\n */\nexport interface CheckExecutionContext<Options extends object> {\n /** 读取当前 Check 的已声明 direct dependencies。 */\n readonly dependencies: CheckDependencies;\n /** 深度只读、canonical 的 invocation-local prepared Check options。 */\n readonly options: DeepReadonly<Options>;\n /** 已规范化的项目根与 flags。 */\n readonly project: CheckProjectContext;\n /** 写入 supplemental Records 的 reporter。 */\n readonly records: CheckRecordReporter;\n /** 本次 invocation 的 cancellation signal。 */\n readonly signal: AbortSignal;\n}\n\n/**\n * 一个 Check 的 callback signature。\n *\n * @typeParam Options - callback 从 context 读取的 prepared options shape。\n * @returns terminal Check result 或其 Promise。\n */\nexport type CheckExecution<Options extends object = object> = (\n this: void,\n context: CheckExecutionContext<Options>\n) => CheckResult | Promise<CheckResult>;\n\n/**\n * 在 Check execution 前,可选地为本次 invocation 准备 options。\n *\n * @remarks `signal` 与同一次 callback execution 使用同一个 cancellation signal;实现应在可等待工作中\n * 协作退出,而不是留下悬挂 work。bivariant callback 保持具体 options Check 可进入普通递归 Check\n * collection;Product 仍只会用该 Check 自己的 authored options 调用它。精确结果见\n * {@link CheckPreflightResult}。\n */\nexport type CheckPreflight<\n AuthoredOptions extends object = object,\n PreparedOptions extends object = AuthoredOptions\n> = {\n bivarianceHack(\n this: void,\n options: DeepReadonly<AuthoredOptions>,\n signal: AbortSignal\n ): CheckPreflightResult<PreparedOptions> | Promise<CheckPreflightResult<PreparedOptions>>;\n}[\"bivarianceHack\"];\n\n/**\n * Check-owned preflight 的判别结果。\n *\n * `failure/block` 不允许 fallback,直接以 owning reason 结算为 unavailable;`failure/continue` 必须给出\n * fallback 并继续 execution。两种进入 execution 的值都只属于本次 invocation,Product canonicalize/freeze\n * 后传递,不会改写 Definition 中 authored options。两个 failure 分支都必须给出 reason;continue reason\n * 是 Check-owned diagnostic identity,当前不会单独 materialize 为 outcome,调用方通过 messages 与后续\n * outcome 观察结果;block 物理上不含 fallback 字段。\n */\nexport type CheckPreflightResult<PreparedOptions extends object = object> = Readonly<\n | {\n readonly status: \"success\";\n readonly preparedOptions: PreparedOptions;\n readonly messages?: readonly CheckMessage[];\n }\n | {\n readonly status: \"failure\";\n readonly action: \"block\";\n readonly reason: CheckDeclaredUnavailableReason;\n readonly messages?: readonly CheckMessage[];\n }\n | {\n readonly status: \"failure\";\n readonly action: \"continue\";\n readonly fallback: PreparedOptions;\n readonly reason: CheckReason;\n readonly messages?: readonly CheckMessage[];\n }\n>;\n\n/**\n * 普通递归 Check authoring value 的共享字段。\n *\n * @typeParam AuthoredOptions - Definition 中的 declarative options shape。\n * @typeParam PreparedOptions - preflight 后 callback 接收的 invocation-local options shape。\n * @remarks 该值可以同时有 `execution` 和 `checks`;只有 executable node 产生 final Check fact。\n */\ninterface CheckBase<AuthoredOptions extends object, PreparedOptions extends object> {\n /** 在 Definition 内唯一的 stable Check ID。 */\n readonly checkId: string;\n /** 人读 progress 与 output 使用的非空名称。 */\n readonly displayName: string;\n /** Check-owned declarative options;默认 Check 的嵌套 branch 以普通对象组合替换。 */\n readonly options?: AuthoredOptions;\n /** 可执行节点的 callback;省略时此节点只承载递归 children。 */\n execution?(\n this: void,\n context: CheckExecutionContext<PreparedOptions>\n ): CheckResult | Promise<CheckResult>;\n /** 继承 scheduling context 的 child Checks,不会单独形成 container result。 */\n readonly checks?: readonly Check[];\n /** 直接 prerequisite Check IDs,或对父 dependency collection 的显式 edit。 */\n readonly dependsOn?: InheritableCheckCollection<string>;\n /** 此 Check 及其 descendants 的最大并行预算。 */\n readonly maxParallel?: number;\n /** 共享资源名称,或对父 mutex collection 的显式 edit。 */\n readonly mutex?: InheritableCheckCollection<string>;\n /** 已结算 Check 的人读可见性;可执行节点默认 `always`。 */\n readonly visibility?: CheckVisibility;\n}\n\n/**\n * 判断两个 options shape 是否互相可赋值;互相可赋值时 execution 不需要 preparation 转换。\n */\ntype HasSameOptionsShape<AuthoredOptions extends object, PreparedOptions extends object> = [\n AuthoredOptions\n] extends [PreparedOptions]\n ? [PreparedOptions] extends [AuthoredOptions]\n ? true\n : false\n : false;\n\n/** Prepared shape 不同时,preflight 是建立安全转换的必填边界。 */\ntype CheckPreflightField<AuthoredOptions extends object, PreparedOptions extends object> =\n HasSameOptionsShape<AuthoredOptions, PreparedOptions> extends true\n ? Readonly<{ readonly preflight?: CheckPreflight<AuthoredOptions, PreparedOptions> }>\n : Readonly<{ readonly preflight: CheckPreflight<AuthoredOptions, PreparedOptions> }>;\n\n/**\n * Project Definition 中的普通递归 Check authoring value。\n *\n * @typeParam AuthoredOptions - Definition 中的 declarative options shape。\n * @typeParam PreparedOptions - preflight 后 callback 接收的 invocation-local options shape。\n * @remarks Definition 只闭合 authored JSON options;preflight 在同一 Run 的所有 execution 前作为全局\n * barrier 执行。`PreparedOptions` 与 `AuthoredOptions` 不同时必须提供 preflight;同形时可以省略。它不进入\n * declarative fingerprint 或 machine output。\n */\nexport type Check<\n AuthoredOptions extends object = object,\n PreparedOptions extends object = AuthoredOptions\n> = CheckBase<AuthoredOptions, PreparedOptions> &\n CheckPreflightField<AuthoredOptions, PreparedOptions>;\n\nexport type EmptyCheckOptions = Readonly<Record<never, never>>;\n\n/**\n * 防止宽泛的 parser 标注擦除 `PromiseLike`。canonical `then` field 可以保存 JSON data,\n * 但不能保存使该值成为 thenable 的 callable。\n */\ntype NonThenableData = Readonly<{ readonly then?: CanonicalJsonValue }>;\n\n/**\n * 将 canonical dependency data 还原为 provider final-data shape 的同步 parser。\n *\n * @typeParam FinalData - provider 在 `passed`/`failed` result 中声明的 final-data shape。\n * @remarks Product 不调用此 parser;provider 负责不受信任或跨版本 data 的业务验证。\n */\nexport type CheckDataParser<FinalData extends object = object> = (\n this: void,\n data: CanonicalJsonObject\n) => FinalData & NonThenableData;\n\ntype CheckAuthoringBase<\n Id extends string,\n AuthoredOptions extends object,\n PreparedOptions extends object\n> = Omit<CheckBase<AuthoredOptions, PreparedOptions>, \"checkId\" | \"execution\" | \"options\"> &\n CheckPreflightField<AuthoredOptions, PreparedOptions> &\n Readonly<{ readonly checkId: Id }>;\n\ninterface OrdinaryCheckFields<PreparedOptions extends object> {\n execution?(\n this: void,\n context: CheckExecutionContext<PreparedOptions>\n ): CheckResult | Promise<CheckResult>;\n readonly parseData?: never;\n}\n\nexport type CheckWithOptions<\n Id extends string,\n AuthoredOptions extends object,\n PreparedOptions extends object = AuthoredOptions\n> = CheckAuthoringBase<Id, AuthoredOptions, PreparedOptions> &\n OrdinaryCheckFields<PreparedOptions> &\n Readonly<{\n readonly options: AuthoredOptions;\n }>;\n\nexport type CheckWithoutOptions<Id extends string> = CheckAuthoringBase<\n Id,\n EmptyCheckOptions,\n EmptyCheckOptions\n> &\n OrdinaryCheckFields<EmptyCheckOptions> &\n Readonly<{\n readonly options?: never;\n }>;\n\ninterface TypedCheckFields<PreparedOptions extends object, Parser extends CheckDataParser> {\n /**\n * 将 canonical runtime data 还原为 provider data。\n *\n * 启发式边界:同版本且受信任的 provider 若由测试保证 data shape,可仅将它实现为\n * identity/type anchor。这不验证 JavaScript 或基于 cast 的 producer、历史或跨版本 artifact,\n * 也不验证不受信任输入。\n */\n readonly parseData: Parser;\n\n execution(\n this: void,\n context: CheckExecutionContext<PreparedOptions>\n ): CheckResult<NoInfer<ReturnType<Parser>>> | Promise<CheckResult<NoInfer<ReturnType<Parser>>>>;\n}\n\nexport type TypedCheckWithOptions<\n Id extends string,\n AuthoredOptions extends object,\n Parser extends CheckDataParser,\n PreparedOptions extends object = AuthoredOptions\n> = CheckAuthoringBase<Id, AuthoredOptions, PreparedOptions> &\n TypedCheckFields<PreparedOptions, Parser> &\n Readonly<{\n readonly options: AuthoredOptions;\n }>;\n\nexport type TypedCheckWithoutOptions<\n Id extends string,\n Parser extends CheckDataParser\n> = CheckAuthoringBase<Id, EmptyCheckOptions, EmptyCheckOptions> &\n TypedCheckFields<EmptyCheckOptions, Parser> &\n Readonly<{\n readonly options?: never;\n }>;\n\n/**\n * 定义一个 Check,同时保留 literal `checkId`、options 与 typed-provider parser 的 inference。\n *\n * @remarks 此函数负责 authoring inference;{@link run} 负责 Project Definition validation。\n * @example 定义带 options、Records 与 messages 的自定义 Check\n * ```ts\n * function hasValidLicensePolicyOptions(options: object): boolean {\n * const denied: unknown = Reflect.get(options, \"denied\");\n * return (\n * Object.keys(options).length === 1 &&\n * Object.hasOwn(options, \"denied\") &&\n * Array.isArray(denied) &&\n * denied.every((license) => typeof license === \"string\")\n * );\n * }\n *\n * const licensePolicy = defineCheck({\n * checkId: \"license-policy\",\n * displayName: \"License policy\",\n * options: { denied: [\"GPL-3.0-only\"] },\n * preflight(options) {\n * return hasValidLicensePolicyOptions(options)\n * ? { status: \"success\", preparedOptions: options }\n * : { status: \"failure\", action: \"block\", reason: { code: \"invalid-options\" } };\n * },\n * visibility: \"attention\",\n * execution({ options, records, signal }) {\n * if (signal.aborted) return { status: \"unavailable\", reason: { code: \"cancelled\" } };\n *\n * const deniedCount = options.denied.length;\n * if (deniedCount > 0) {\n * records.report({ id: \"denied-license\" }, { count: deniedCount });\n * return {\n * status: \"failed\",\n * data: { deniedCount },\n * messages: [{ level: \"warning\", code: \"denied-license\", message: \"Denied licenses found.\" }]\n * };\n * }\n * return { status: \"passed\", data: { deniedCount: 0 } };\n * }\n * });\n * ```\n */\nexport function defineCheck<\n const Id extends string,\n AuthoredOptions extends object,\n PreparedOptions extends object = AuthoredOptions\n>(\n value: CheckWithOptions<Id, AuthoredOptions, PreparedOptions>\n): CheckWithOptions<Id, AuthoredOptions, PreparedOptions>;\nexport function defineCheck<const Id extends string>(\n value: CheckWithoutOptions<Id>\n): CheckWithoutOptions<Id>;\nexport function defineCheck<\n const Id extends string,\n AuthoredOptions extends object,\n const Parser extends CheckDataParser,\n PreparedOptions extends object = AuthoredOptions\n>(\n value: TypedCheckWithOptions<Id, AuthoredOptions, Parser, PreparedOptions>\n): TypedCheckWithOptions<Id, AuthoredOptions, Parser, PreparedOptions>;\nexport function defineCheck<const Id extends string, const Parser extends CheckDataParser>(\n value: TypedCheckWithoutOptions<Id, Parser>\n): TypedCheckWithoutOptions<Id, Parser>;\nexport function defineCheck(value: Check): Check {\n return value;\n}\n"]}
1
+ {"version":3,"file":"check.mjs","sourceRoot":"","sources":["../../../src/check/check.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EACP,0BAA0B,EAC1B,gCAAgC,EACjC,MAAM,2BAA2B,CAAC;AAyhBnC,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import type { CanonicalJsonObject, CanonicalJsonValue } from \"../data-boundary/canonical-json.ts\";\nimport type { InheritableCheckCollection } from \"./inherited-collection.ts\";\n\nexport {\n inherit,\n isInheritedCheckCollection,\n snapshotInheritedCheckCollection\n} from \"./inherited-collection.ts\";\nexport type {\n InheritCheckCollectionInput,\n InheritableCheckCollection,\n InheritedCheckCollection\n} from \"./inherited-collection.ts\";\n\n/** Check 无法给出 final data 时返回的受控 reason code。 */\nexport type CheckReason = Readonly<{\n /** 由 owning Check 定义、供调用方诊断的稳定 code。 */\n readonly code: string;\n}>;\n\n/** `not-applicable` Check result 的可选 reason。 */\nexport type CheckNotApplicableReason = CheckReason;\n/** author callback 明确返回 `unavailable` 时必须提供的 reason。 */\nexport type CheckDeclaredUnavailableReason = CheckReason;\n\n/** `unavailable` Check outcome 的 reason;可列出导致当前 Check 不可用的上游 Check。 */\nexport type CheckUnavailableReason = Readonly<{\n /** 由当前 Check 或 Product 边界给出的受控原因。 */\n readonly code: string;\n /** 仅在上游关系有助于定位时给出的相关 Check IDs。 */\n readonly checkIds?: readonly string[];\n}>;\n\n/** 终端 Check message 的 presentation severity。 */\nexport type CheckMessageLevel = \"info\" | \"warning\" | \"error\";\n\n/** 由 Check author 附加到 terminal result 的补充消息。 */\nexport interface CheckMessage {\n /** 人读 presentation 使用的 severity。 */\n readonly level: CheckMessageLevel;\n /** owning Check namespace 内的稳定 message code。 */\n readonly code: string;\n /** 非空消息正文;Product 保留 author 提供的字符串。 */\n readonly message: string;\n}\n\n/** 可附加到每个 {@link CheckResult} branch 的有序 terminal messages。 */\nexport interface CheckResultMessages {\n /** 省略、`undefined` 或空数组都表示没有 supplemental messages。 */\n readonly messages?: readonly CheckMessage[];\n}\n\n/** 已结算 Check 在人读 progress 中的可见性。 */\nexport type CheckVisibility = \"always\" | \"attention\";\n\n/** Check Task 在 admission 到 settlement 期间持有的静态 named resource units。 */\nexport type CheckResourceClaims = Readonly<Record<string, number>>;\n\n/** 多 flag Check 启用条件使用的集合 predicate。 */\nexport type CheckFlagEnablementMode = \"all\" | \"any\" | \"none\" | \"not-all\";\n\n/** executable Check 的声明式多 flag 启用条件。 */\nexport interface CheckFlagEnablement {\n /** 非空 flag token 集合;Definition 会去重并稳定排序。 */\n readonly flags: readonly [string, ...string[]];\n /** 对声明 token 与本次 Run flags 执行的 presence predicate。 */\n readonly mode: CheckFlagEnablementMode;\n /**\n * 条件命中时是否启动本 Check 的传递 `dependsOn` prerequisite;省略时保持只选择直接命中 Check 的兼容行为。\n * `observes` 不参与此选择,且 dependency 自己的 flag 条件不会阻止本次已启动的 prerequisite。\n */\n readonly propagateDependsOn?: true;\n}\n\n/**\n * Check callback 的 terminal result。\n *\n * @typeParam FinalData - `passed` 或 `failed` 时保留为 canonical final data 的业务对象。\n * @remarks `not-applicable` 与 `unavailable` 不携带 final data;普通 callback、Record 或取消失败由\n * Product 转换为 `unavailable`,而不是抛出为 Run 的成功结果。\n */\nexport type CheckResult<FinalData extends object = object> = Readonly<\n (\n | {\n /** Check 已产生通过的 final data。 */\n readonly status: \"passed\";\n /** 此 Check 的主要终态事实。 */\n readonly data: FinalData;\n }\n | {\n /** Check 已产生失败的 final data。 */\n readonly status: \"failed\";\n /** 此 Check 的主要终态事实。 */\n readonly data: FinalData;\n }\n | {\n /** Check 在当前 invocation 中不适用。 */\n readonly status: \"not-applicable\";\n /** 不适用的可选受控原因。 */\n readonly reason?: CheckNotApplicableReason;\n }\n | {\n /** Check 不能提供 terminal data。 */\n readonly status: \"unavailable\";\n /** 不可用的受控原因。 */\n readonly reason: CheckDeclaredUnavailableReason;\n }\n ) &\n CheckResultMessages\n>;\n\n/** 已 materialize 到 Core snapshot 的 Check terminal outcome。 */\nexport type CheckOutcome = Readonly<\n | {\n /** 已 materialize 的通过 outcome。 */\n readonly status: \"passed\";\n /** 已 canonicalize 的 primary final fact。 */\n readonly data: CanonicalJsonObject;\n }\n | {\n /** 已 materialize 的失败 outcome。 */\n readonly status: \"failed\";\n /** 已 canonicalize 的 primary final fact。 */\n readonly data: CanonicalJsonObject;\n }\n | {\n /** 已 materialize 的不适用 outcome。 */\n readonly status: \"not-applicable\";\n /** 不适用的可选受控原因。 */\n readonly reason?: CheckNotApplicableReason;\n }\n | {\n /** 已 materialize 的不可用 outcome。 */\n readonly status: \"unavailable\";\n /** 包含相关 upstream Check IDs 的受控原因。 */\n readonly reason: CheckUnavailableReason;\n }\n>;\n\n/** 将 callback options 转为不可变观察值的递归 utility type。 */\nexport type DeepReadonly<T> = T extends string | number | boolean | null\n ? T\n : T extends readonly (infer Item)[]\n ? readonly DeepReadonly<Item>[]\n : T extends object\n ? { readonly [Key in keyof T]: DeepReadonly<T[Key]> }\n : never;\n\n/** callback 写入 supplemental Record 时的 Check-local identity。 */\ninterface RecordIdentityInput {\n /** 在当前 Check 内唯一的 Record ID。 */\n readonly id: string;\n}\n\n/** callback 写入 supplemental Records 的 Product-owned reporter。 */\ninterface CheckRecordReporter {\n /** 记录一个补充事实;它不决定 Check 的 terminal status。 */\n report(identity: RecordIdentityInput, data: object): void;\n}\n\n/** 读取已声明 direct relation final data 时的失败原因。 */\nexport type DependencyReadError = Readonly<\n | {\n /** 当前 Check 未声明所请求的 direct relation ID。 */\n readonly code: \"dependency-not-declared\";\n /** 被拒绝的 direct relation ID。 */\n readonly checkId: string;\n }\n | {\n /** 已声明 upstream 没有可读取的 final data。 */\n readonly code: \"upstream-data-unavailable\";\n /** 没有 final data 的 direct relation ID。 */\n readonly checkId: string;\n /** 阻止 readback 的 upstream terminal status。 */\n readonly status: \"not-applicable\" | \"unavailable\";\n }\n>;\n\n/** {@link CheckDependencies.get} 的受控 readback 结果。 */\nexport type DependencyReadResult = Readonly<\n | {\n /** 成功读取 direct relation final data。 */\n readonly ok: true;\n /** 被读取的 direct relation ID。 */\n readonly checkId: string;\n /** upstream 已结算为 `passed` 或 `failed` 的 status。 */\n readonly status: \"passed\" | \"failed\";\n /** 已与原对象脱离的上游依赖终态数据。 */\n readonly data: CanonicalJsonObject;\n }\n | {\n /** direct relation data 不可读取。 */\n readonly ok: false;\n /** 失败的授权或 upstream-data reason。 */\n readonly error: DependencyReadError;\n }\n>;\n\n/** 当前 Check 的一个已规范化直接 relation 及其完整终态事实。 */\nexport type DependencyObservation = Readonly<{\n /** 已规范化、稳定排序的 direct relation ID。 */\n readonly checkId: string;\n /** Core 已结算并冻结的四态 outcome。 */\n readonly outcome: CheckOutcome;\n}>;\n\n/** 当前 Check 的已规范化直接 relation outcomes 的 data reader。 */\nexport interface CheckDependencies {\n /**\n * 读取一个直接 relation 的 canonical final data。\n *\n * @returns 已声明的 `dependsOn` 或 `observes` relation 且为 `passed`/`failed` 的 Check 返回其 data;\n * 未声明或没有 final data 时返回 `ok: false`,不会授权 transitive Check。\n */\n get(checkId: string): DependencyReadResult;\n\n /**\n * 枚举当前 Check 的全部已规范化 direct relation outcomes。\n *\n * @returns 按有效 direct relation ID 稳定排序、深度冻结的 `{ checkId, outcome }` observations;只含当前\n * Check 显式或继承得到的 `dependsOn` / `observes` relation,不暴露 scheduler 历史、transitive 或未声明\n * Check。\n */\n list(): readonly DependencyObservation[];\n}\n\n/** callback 可读取的、由 Product 规范化的项目上下文。 */\nexport interface CheckProjectContext {\n /** 本次 Run 使用的绝对项目根目录。 */\n readonly root: string;\n /** 已去重、排序的 caller-supplied flags。 */\n readonly flags: readonly string[];\n}\n\n/**\n * Check callback 收到的 Product-owned execution context。\n *\n * @typeParam Options - 此 Check preflight 后传给 execution 的 options shape。\n */\nexport interface CheckExecutionContext<Options extends object> {\n /** 当前 Check 的 absolute invocation artifact directory;caller 未授予时为 `null`。 */\n readonly artifactDirectory: string | null;\n /** 读取当前 Check 的已声明 direct relations。 */\n readonly dependencies: CheckDependencies;\n /** 同一次 invocation 内由 Product 统一提供的 identity。 */\n readonly invocationId: string;\n /** 深度只读、canonical 的 invocation-local prepared Check options。 */\n readonly options: DeepReadonly<Options>;\n /** 已规范化的项目根与 flags。 */\n readonly project: CheckProjectContext;\n /** 写入 supplemental Records 的 reporter。 */\n readonly records: CheckRecordReporter;\n /** 本次 invocation 的 cancellation signal。 */\n readonly signal: AbortSignal;\n}\n\n/**\n * 一个 Check 的 callback signature。\n *\n * @typeParam Options - callback 从 context 读取的 prepared options shape。\n * @returns terminal Check result 或其 Promise。\n */\nexport type CheckExecution<Options extends object = object> = (\n this: void,\n context: CheckExecutionContext<Options>\n) => CheckResult | Promise<CheckResult>;\n\n/**\n * 在 Check execution 前,可选地为本次 invocation 准备 options。\n *\n * @remarks `signal` 与同一次 callback execution 使用同一个 cancellation signal;实现应在可等待工作中\n * 协作退出,而不是留下悬挂 work。bivariant callback 保持具体 options Check 可进入普通递归 Check\n * collection;Product 仍只会用该 Check 自己的 authored options 调用它。精确结果见\n * {@link CheckPreflightResult}。\n */\nexport type CheckPreflight<\n AuthoredOptions extends object = object,\n PreparedOptions extends object = AuthoredOptions\n> = {\n bivarianceHack(\n this: void,\n options: DeepReadonly<AuthoredOptions>,\n signal: AbortSignal\n ): CheckPreflightResult<PreparedOptions> | Promise<CheckPreflightResult<PreparedOptions>>;\n}[\"bivarianceHack\"];\n\n/**\n * Check-owned preflight 的判别结果。\n *\n * `failure/block` 不允许 fallback,直接以 owning reason 结算为 unavailable;`failure/continue` 必须给出\n * fallback 并继续 execution。两种进入 execution 的值都只属于本次 invocation,Product canonicalize/freeze\n * 后传递,不会改写 Definition 中 authored options。两个 failure 分支都必须给出 reason;continue reason\n * 是 Check-owned diagnostic identity,当前不会单独 materialize 为 outcome,调用方通过 messages 与后续\n * outcome 观察结果;block 物理上不含 fallback 字段。\n */\nexport type CheckPreflightResult<PreparedOptions extends object = object> = Readonly<\n | {\n readonly status: \"success\";\n readonly preparedOptions: PreparedOptions;\n readonly messages?: readonly CheckMessage[];\n }\n | {\n readonly status: \"failure\";\n readonly action: \"block\";\n readonly reason: CheckDeclaredUnavailableReason;\n readonly messages?: readonly CheckMessage[];\n }\n | {\n readonly status: \"failure\";\n readonly action: \"continue\";\n readonly fallback: PreparedOptions;\n readonly reason: CheckReason;\n readonly messages?: readonly CheckMessage[];\n }\n>;\n\n/**\n * 普通递归 Check authoring value 的共享字段。\n *\n * @typeParam AuthoredOptions - Definition 中的 declarative options shape。\n * @typeParam PreparedOptions - preflight 后 callback 接收的 invocation-local options shape。\n * @remarks 该值可以同时有 `execution` 和 `checks`;只有 executable node 产生 final Check fact。\n */\ninterface CheckBase<AuthoredOptions extends object, PreparedOptions extends object> {\n /** 在 Definition 内唯一的 stable Check ID。 */\n readonly checkId: string;\n /** 人读 progress 与 output 使用的非空名称。 */\n readonly displayName: string;\n /** Check-owned declarative options;默认 Check 的嵌套 branch 以普通对象组合替换。 */\n readonly options?: AuthoredOptions;\n /** 仅当多 flag presence predicate 匹配时启用 executable Check;省略时始终启用。 */\n readonly enabledByFlags?: CheckFlagEnablement;\n /** 可执行节点的 callback;省略时此节点只承载递归 children。 */\n execution?(\n this: void,\n context: CheckExecutionContext<PreparedOptions>\n ): CheckResult | Promise<CheckResult>;\n /** 继承 scheduling context 的 child Checks,不会单独形成 container result。 */\n readonly checks?: readonly Check[];\n /** 必须全部 `passed` 才能开始当前 Check author work 的直接 prerequisite Check IDs。 */\n readonly dependsOn?: InheritableCheckCollection<string>;\n /** 等待任意 terminal outcome 并授权当前 Check readback 的直接 observation Check IDs。 */\n readonly observes?: InheritableCheckCollection<string>;\n /** 此 Check 及其 descendants 的最大并行预算。 */\n readonly maxParallel?: number;\n /** 同一 ready admission 层级中的静态优先级;省略时继承并最终规范化为 `0`。 */\n readonly admissionPriority?: number;\n /** 共享资源名称,或对父 mutex collection 的显式 edit。 */\n readonly mutex?: InheritableCheckCollection<string>;\n /** 静态 named resource claims;省略时继承,显式 mapping 完整替换。 */\n readonly resourceClaims?: CheckResourceClaims;\n /** 已结算 Check 的人读可见性;可执行节点默认 `always`。 */\n readonly visibility?: CheckVisibility;\n}\n\n/**\n * 判断两个 options shape 是否互相可赋值;互相可赋值时 execution 不需要 preparation 转换。\n */\ntype HasSameOptionsShape<AuthoredOptions extends object, PreparedOptions extends object> = [\n AuthoredOptions\n] extends [PreparedOptions]\n ? [PreparedOptions] extends [AuthoredOptions]\n ? true\n : false\n : false;\n\n/** Prepared shape 不同时,preflight 是建立安全转换的必填边界。 */\ntype CheckPreflightField<AuthoredOptions extends object, PreparedOptions extends object> =\n HasSameOptionsShape<AuthoredOptions, PreparedOptions> extends true\n ? Readonly<{ readonly preflight?: CheckPreflight<AuthoredOptions, PreparedOptions> }>\n : Readonly<{ readonly preflight: CheckPreflight<AuthoredOptions, PreparedOptions> }>;\n\n/**\n * Project Definition 中的普通递归 Check authoring value。\n *\n * @typeParam AuthoredOptions - Definition 中的 declarative options shape。\n * @typeParam PreparedOptions - preflight 后 callback 接收的 invocation-local options shape。\n * @remarks Definition 只闭合 authored JSON options;每个 admitted Check 先在自身 Task lifecycle 内执行\n * preflight,随后才执行 callback。`PreparedOptions` 与 `AuthoredOptions` 不同时必须提供 preflight;同形时可以\n * 省略。它不进入 declarative fingerprint 或 machine output。\n */\nexport type Check<\n AuthoredOptions extends object = object,\n PreparedOptions extends object = AuthoredOptions\n> = CheckBase<AuthoredOptions, PreparedOptions> &\n CheckPreflightField<AuthoredOptions, PreparedOptions>;\n\nexport type EmptyCheckOptions = Readonly<Record<never, never>>;\n\n/**\n * 防止宽泛的 parser 标注擦除 `PromiseLike`。canonical `then` field 可以保存 JSON data,\n * 但不能保存使该值成为 thenable 的 callable。\n */\ntype NonThenableData = Readonly<{ readonly then?: CanonicalJsonValue }>;\n\n/**\n * 将 canonical direct-relation data 还原为 provider final-data shape 的同步 parser。\n *\n * @typeParam FinalData - provider 在 `passed`/`failed` result 中声明的 final-data shape。\n * @remarks Product 不调用此 parser;provider 负责不受信任或跨版本 data 的业务验证。\n */\nexport type CheckDataParser<FinalData extends object = object> = (\n this: void,\n data: CanonicalJsonObject\n) => FinalData & NonThenableData;\n\ntype CheckAuthoringBase<\n Id extends string,\n AuthoredOptions extends object,\n PreparedOptions extends object\n> = Omit<CheckBase<AuthoredOptions, PreparedOptions>, \"checkId\" | \"execution\" | \"options\"> &\n CheckPreflightField<AuthoredOptions, PreparedOptions> &\n Readonly<{ readonly checkId: Id }>;\n\ninterface OrdinaryCheckFields<PreparedOptions extends object> {\n execution?(\n this: void,\n context: CheckExecutionContext<PreparedOptions>\n ): CheckResult | Promise<CheckResult>;\n readonly parseData?: never;\n}\n\nexport type CheckWithOptions<\n Id extends string,\n AuthoredOptions extends object,\n PreparedOptions extends object = AuthoredOptions\n> = CheckAuthoringBase<Id, AuthoredOptions, PreparedOptions> &\n OrdinaryCheckFields<PreparedOptions> &\n Readonly<{\n readonly options: AuthoredOptions;\n }>;\n\nexport type CheckWithoutOptions<Id extends string> = CheckAuthoringBase<\n Id,\n EmptyCheckOptions,\n EmptyCheckOptions\n> &\n OrdinaryCheckFields<EmptyCheckOptions> &\n Readonly<{\n readonly options?: never;\n }>;\n\ninterface TypedCheckFields<PreparedOptions extends object, Parser extends CheckDataParser> {\n /**\n * 将 canonical runtime data 还原为 provider data。\n *\n * 启发式边界:同版本且受信任的 provider 若由测试保证 data shape,可仅将它实现为\n * identity/type anchor。这不验证 JavaScript 或基于 cast 的 producer、历史或跨版本 artifact,\n * 也不验证不受信任输入。\n */\n readonly parseData: Parser;\n\n execution(\n this: void,\n context: CheckExecutionContext<PreparedOptions>\n ): CheckResult<NoInfer<ReturnType<Parser>>> | Promise<CheckResult<NoInfer<ReturnType<Parser>>>>;\n}\n\nexport type TypedCheckWithOptions<\n Id extends string,\n AuthoredOptions extends object,\n Parser extends CheckDataParser,\n PreparedOptions extends object = AuthoredOptions\n> = CheckAuthoringBase<Id, AuthoredOptions, PreparedOptions> &\n TypedCheckFields<PreparedOptions, Parser> &\n Readonly<{\n readonly options: AuthoredOptions;\n }>;\n\nexport type TypedCheckWithoutOptions<\n Id extends string,\n Parser extends CheckDataParser\n> = CheckAuthoringBase<Id, EmptyCheckOptions, EmptyCheckOptions> &\n TypedCheckFields<EmptyCheckOptions, Parser> &\n Readonly<{\n readonly options?: never;\n }>;\n\n/**\n * 定义一个 Check,同时保留 literal `checkId`、options 与 typed-provider parser 的 inference。\n *\n * @remarks 此函数负责 authoring inference;{@link run} 负责 Project Definition validation。\n * @example 定义带 options、Records 与 messages 的自定义 Check\n * ```ts\n * import { defineCheck, defineConfig, run } from \"@zxyycom/vibe-check\";\n *\n * function hasValidLicensePolicyOptions(options: object): boolean {\n * const denied: unknown = Reflect.get(options, \"denied\");\n * return (\n * Object.keys(options).length === 1 &&\n * Object.hasOwn(options, \"denied\") &&\n * Array.isArray(denied) &&\n * denied.every((license) => typeof license === \"string\")\n * );\n * }\n *\n * const licensePolicy = defineCheck({\n * checkId: \"license-policy\",\n * displayName: \"License policy\",\n * options: { denied: [\"GPL-3.0-only\"] },\n * preflight(options) {\n * return hasValidLicensePolicyOptions(options)\n * ? { status: \"success\", preparedOptions: options }\n * : { status: \"failure\", action: \"block\", reason: { code: \"invalid-options\" } };\n * },\n * visibility: \"attention\",\n * execution({ options, records, signal }) {\n * if (signal.aborted) return { status: \"unavailable\", reason: { code: \"cancelled\" } };\n *\n * const deniedCount = options.denied.length;\n * if (deniedCount > 0) {\n * records.report({ id: \"denied-license\" }, { count: deniedCount });\n * return {\n * status: \"failed\",\n * data: { deniedCount },\n * messages: [{ level: \"warning\", code: \"denied-license\", message: \"Denied licenses found.\" }]\n * };\n * }\n * return { status: \"passed\", data: { deniedCount: 0 } };\n * }\n * });\n * ```\n */\nexport function defineCheck<\n const Id extends string,\n AuthoredOptions extends object,\n PreparedOptions extends object = AuthoredOptions\n>(\n value: CheckWithOptions<Id, AuthoredOptions, PreparedOptions>\n): CheckWithOptions<Id, AuthoredOptions, PreparedOptions>;\nexport function defineCheck<const Id extends string>(\n value: CheckWithoutOptions<Id>\n): CheckWithoutOptions<Id>;\nexport function defineCheck<\n const Id extends string,\n AuthoredOptions extends object,\n const Parser extends CheckDataParser,\n PreparedOptions extends object = AuthoredOptions\n>(\n value: TypedCheckWithOptions<Id, AuthoredOptions, Parser, PreparedOptions>\n): TypedCheckWithOptions<Id, AuthoredOptions, Parser, PreparedOptions>;\nexport function defineCheck<const Id extends string, const Parser extends CheckDataParser>(\n value: TypedCheckWithoutOptions<Id, Parser>\n): TypedCheckWithoutOptions<Id, Parser>;\nexport function defineCheck(value: Check): Check {\n return value;\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 将调用方已经稳定排序的 Finding 投影为有界 Check messages。
3
+ *
4
+ * `limit`、安全字段和超限后的深入查看说明都由 producing Check 决定。Product 不读取 Finding
5
+ * shape,也不猜测完整明细位于 Records、artifact、transcript 或其它位置。
6
+ */
7
+ export function presentCheckFindings(input) {
8
+ assertFindingLimit(input.limit);
9
+ if (input.findings.length === 0)
10
+ return Object.freeze([]);
11
+ const presentedFindings = input.findings.slice(0, input.limit);
12
+ const messages = presentedFindings.map((finding, index) => Object.freeze({ ...input.message(finding, index) }));
13
+ const omittedFindings = Object.freeze(input.findings.slice(input.limit));
14
+ if (omittedFindings.length > 0) {
15
+ messages.push(Object.freeze({
16
+ ...input.omittedMessage(Object.freeze({
17
+ omittedFindings,
18
+ omittedCount: omittedFindings.length,
19
+ presentedCount: presentedFindings.length,
20
+ totalCount: input.findings.length
21
+ }))
22
+ }));
23
+ }
24
+ return Object.freeze(messages);
25
+ }
26
+ /** Appends presentation-only messages without changing the owning terminal result. */
27
+ export function appendCheckMessages(result, messages) {
28
+ if (messages.length === 0)
29
+ return result;
30
+ return Object.freeze({
31
+ ...result,
32
+ messages: Object.freeze([...(result.messages ?? []), ...messages])
33
+ });
34
+ }
35
+ function assertFindingLimit(limit) {
36
+ if (!Number.isSafeInteger(limit) || limit < 0) {
37
+ throw new TypeError("Finding presentation limit must be a non-negative safe integer");
38
+ }
39
+ }
40
+ //# sourceMappingURL=finding-presentation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-presentation.mjs","sourceRoot":"","sources":["../../../src/check/finding-presentation.ts"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAU,KAK7C;IACC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE1D,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CACxD,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CACpD,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,MAAM,CAAC;YACZ,GAAG,KAAK,CAAC,cAAc,CACrB,MAAM,CAAC,MAAM,CAAC;gBACZ,eAAe;gBACf,YAAY,EAAE,eAAe,CAAC,MAAM;gBACpC,cAAc,EAAE,iBAAiB,CAAC,MAAM;gBACxC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aAClC,CAAC,CACH;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CACjC,MAAyB,EACzB,QAAiC;IAEjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,MAAM;QACT,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;KACnE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC","sourcesContent":["import type { CheckMessage, CheckResult } from \"./check.ts\";\n\n/**\n * 将 Check-owned Finding 投影为有界 terminal messages 所需的超限上下文。\n * 完整 Finding facts 与深入查看位置继续由调用方拥有。\n */\nexport interface FindingOverflowContext<Finding> {\n readonly omittedFindings: readonly Finding[];\n readonly omittedCount: number;\n readonly presentedCount: number;\n readonly totalCount: number;\n}\n\n/**\n * 将调用方已经稳定排序的 Finding 投影为有界 Check messages。\n *\n * `limit`、安全字段和超限后的深入查看说明都由 producing Check 决定。Product 不读取 Finding\n * shape,也不猜测完整明细位于 Records、artifact、transcript 或其它位置。\n */\nexport function presentCheckFindings<Finding>(input: {\n readonly findings: readonly Finding[];\n readonly limit: number;\n readonly message: (finding: Finding, index: number) => CheckMessage;\n readonly omittedMessage: (context: FindingOverflowContext<Finding>) => CheckMessage;\n}): readonly CheckMessage[] {\n assertFindingLimit(input.limit);\n if (input.findings.length === 0) return Object.freeze([]);\n\n const presentedFindings = input.findings.slice(0, input.limit);\n const messages = presentedFindings.map((finding, index) =>\n Object.freeze({ ...input.message(finding, index) })\n );\n const omittedFindings = Object.freeze(input.findings.slice(input.limit));\n if (omittedFindings.length > 0) {\n messages.push(\n Object.freeze({\n ...input.omittedMessage(\n Object.freeze({\n omittedFindings,\n omittedCount: omittedFindings.length,\n presentedCount: presentedFindings.length,\n totalCount: input.findings.length\n })\n )\n })\n );\n }\n return Object.freeze(messages);\n}\n\n/** Appends presentation-only messages without changing the owning terminal result. */\nexport function appendCheckMessages<Data extends object>(\n result: CheckResult<Data>,\n messages: readonly CheckMessage[]\n): CheckResult<Data> {\n if (messages.length === 0) return result;\n return Object.freeze({\n ...result,\n messages: Object.freeze([...(result.messages ?? []), ...messages])\n });\n}\n\nfunction assertFindingLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit < 0) {\n throw new TypeError(\"Finding presentation limit must be a non-negative safe integer\");\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  const INHERITED_CHECK_COLLECTION = Symbol("vibe-check.inherited-check-collection");
2
2
  const inheritedCollections = new WeakSet();
3
3
  /**
4
- * 创建可用于 `dependsOn` 或 `mutex` 的受信任继承编辑。
4
+ * 创建可用于 `dependsOn`、`observes` 或 `mutex` 的受信任继承编辑。
5
5
  *
6
6
  * @typeParam T - 要添加或移除的 collection item 类型。
7
7
  * @param value - 至少提供 `add` 或 `remove` 的 edit;空数组可显式表示不添加或不移除。
@@ -1 +1 @@
1
- {"version":3,"file":"inherited-collection.mjs","sourceRoot":"","sources":["../../../src/check/inherited-collection.ts"],"names":[],"mappings":"AAAA,MAAM,0BAA0B,GAAkB,MAAM,CAAC,uCAAuC,CAAC,CAAC;AAyBlG,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAE,CAAC;AAI3C;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAI,KAAqC;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,0BAA0B,CAAC,EAAE,IAAa,EAAE,CAAC;IACzE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,0BAA0B,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxF,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gCAAgC,CAC9C,KAAwC;IAExC,IAAI,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACtD,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,gCAAgC,CAC5C,QAAQ,EACR,GAAG,EACH,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAC5C,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC1C,IAAI,KAAK,KAAK,QAAQ;gBAAE,SAAS,GAAG,IAAI,CAAC;QAC3C,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,gCAAgC,CACvC,QAAiC,EACjC,GAAgB,EAChB,UAA0C;IAE1C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;QACvC,OAAO,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnF,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE;QACnC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,UAA0C;IAE1C,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC;AAClG,CAAC","sourcesContent":["const INHERITED_CHECK_COLLECTION: unique symbol = Symbol(\"vibe-check.inherited-check-collection\");\n\n/** 使用 {@link inherit} 对父 Check 的 string collection 做显式增删的输入。 */\nexport type InheritCheckCollectionInput<T> = Readonly<\n | { readonly add: readonly T[]; readonly remove?: readonly T[] }\n | { readonly add?: readonly T[]; readonly remove: readonly T[] }\n>;\n\n/**\n * 由 {@link inherit} 创建、带有不可伪造 marker 的 collection edit。\n *\n * @remarks Definition validation 不接受看起来相同的 plain object。\n */\nexport type InheritedCheckCollection<T> = InheritCheckCollectionInput<T> &\n Readonly<{\n readonly [INHERITED_CHECK_COLLECTION]: true;\n }>;\n\n/**\n * 可以直接替换父 collection 的数组,或由 {@link inherit} 表示的显式 edit。\n *\n * @typeParam T - collection item 类型。\n */\nexport type InheritableCheckCollection<T> = readonly T[] | InheritedCheckCollection<T>;\n\nconst inheritedCollections = new WeakSet();\n\ntype InheritedCollectionEntry = \"data\" | \"invalid\" | \"marker\";\n\n/**\n * 创建可用于 `dependsOn` 或 `mutex` 的受信任继承编辑。\n *\n * @typeParam T - 要添加或移除的 collection item 类型。\n * @param value - 至少提供 `add` 或 `remove` 的 edit;空数组可显式表示不添加或不移除。\n * @returns 只有此函数创建的值会被 Definition validation 识别为 inherited collection。\n */\nexport function inherit<T>(value: InheritCheckCollectionInput<T>): InheritedCheckCollection<T> {\n const result = { ...value, [INHERITED_CHECK_COLLECTION]: true as const };\n Object.defineProperty(result, INHERITED_CHECK_COLLECTION, { enumerable: false });\n inheritedCollections.add(result);\n return result;\n}\n\nexport function isInheritedCheckCollection(\n value: unknown\n): value is InheritedCheckCollection<unknown> {\n return typeof value === \"object\" && value !== null && inheritedCollections.has(value);\n}\n\n/** Copies the trusted marker while preserving the authoring data's closed shape. */\nexport function snapshotInheritedCheckCollection(\n value: InheritedCheckCollection<unknown>\n): Readonly<Record<string, unknown>> | undefined {\n try {\n if (!hasPlainObjectPrototype(value)) return undefined;\n const snapshot: Record<string, unknown> = {};\n let hasMarker = false;\n for (const key of Reflect.ownKeys(value)) {\n const entry = snapshotInheritedCollectionEntry(\n snapshot,\n key,\n Object.getOwnPropertyDescriptor(value, key)\n );\n if (entry === \"invalid\") return undefined;\n if (entry === \"marker\") hasMarker = true;\n }\n return hasMarker ? Object.freeze(snapshot) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction hasPlainObjectPrototype(value: object): boolean {\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction snapshotInheritedCollectionEntry(\n snapshot: Record<string, unknown>,\n key: PropertyKey,\n descriptor: PropertyDescriptor | undefined\n): InheritedCollectionEntry {\n if (!isDataDescriptor(descriptor)) return \"invalid\";\n if (key === INHERITED_CHECK_COLLECTION) {\n return descriptor.enumerable || descriptor.value !== true ? \"invalid\" : \"marker\";\n }\n if (typeof key !== \"string\" || descriptor.enumerable !== true) return \"invalid\";\n Object.defineProperty(snapshot, key, {\n configurable: true,\n enumerable: true,\n value: descriptor.value,\n writable: true\n });\n return \"data\";\n}\n\nfunction isDataDescriptor(\n descriptor: PropertyDescriptor | undefined\n): descriptor is PropertyDescriptor {\n return descriptor !== undefined && descriptor.get === undefined && descriptor.set === undefined;\n}\n"]}
1
+ {"version":3,"file":"inherited-collection.mjs","sourceRoot":"","sources":["../../../src/check/inherited-collection.ts"],"names":[],"mappings":"AAAA,MAAM,0BAA0B,GAAkB,MAAM,CAAC,uCAAuC,CAAC,CAAC;AAyBlG,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAE,CAAC;AAI3C;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAI,KAAqC;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,0BAA0B,CAAC,EAAE,IAAa,EAAE,CAAC;IACzE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,0BAA0B,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxF,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gCAAgC,CAC9C,KAAwC;IAExC,IAAI,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACtD,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,gCAAgC,CAC5C,QAAQ,EACR,GAAG,EACH,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAC5C,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC1C,IAAI,KAAK,KAAK,QAAQ;gBAAE,SAAS,GAAG,IAAI,CAAC;QAC3C,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,gCAAgC,CACvC,QAAiC,EACjC,GAAgB,EAChB,UAA0C;IAE1C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;QACvC,OAAO,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnF,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE;QACnC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,UAA0C;IAE1C,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC;AAClG,CAAC","sourcesContent":["const INHERITED_CHECK_COLLECTION: unique symbol = Symbol(\"vibe-check.inherited-check-collection\");\n\n/** 使用 {@link inherit} 对父 Check 的 string collection 做显式增删的输入。 */\nexport type InheritCheckCollectionInput<T> = Readonly<\n | { readonly add: readonly T[]; readonly remove?: readonly T[] }\n | { readonly add?: readonly T[]; readonly remove: readonly T[] }\n>;\n\n/**\n * 由 {@link inherit} 创建、带有不可伪造 marker 的 collection edit。\n *\n * @remarks Definition validation 不接受看起来相同的 plain object。\n */\nexport type InheritedCheckCollection<T> = InheritCheckCollectionInput<T> &\n Readonly<{\n readonly [INHERITED_CHECK_COLLECTION]: true;\n }>;\n\n/**\n * 可以直接替换父 collection 的数组,或由 {@link inherit} 表示的显式 edit。\n *\n * @typeParam T - collection item 类型。\n */\nexport type InheritableCheckCollection<T> = readonly T[] | InheritedCheckCollection<T>;\n\nconst inheritedCollections = new WeakSet();\n\ntype InheritedCollectionEntry = \"data\" | \"invalid\" | \"marker\";\n\n/**\n * 创建可用于 `dependsOn`、`observes` 或 `mutex` 的受信任继承编辑。\n *\n * @typeParam T - 要添加或移除的 collection item 类型。\n * @param value - 至少提供 `add` 或 `remove` 的 edit;空数组可显式表示不添加或不移除。\n * @returns 只有此函数创建的值会被 Definition validation 识别为 inherited collection。\n */\nexport function inherit<T>(value: InheritCheckCollectionInput<T>): InheritedCheckCollection<T> {\n const result = { ...value, [INHERITED_CHECK_COLLECTION]: true as const };\n Object.defineProperty(result, INHERITED_CHECK_COLLECTION, { enumerable: false });\n inheritedCollections.add(result);\n return result;\n}\n\nexport function isInheritedCheckCollection(\n value: unknown\n): value is InheritedCheckCollection<unknown> {\n return typeof value === \"object\" && value !== null && inheritedCollections.has(value);\n}\n\n/** Copies the trusted marker while preserving the authoring data's closed shape. */\nexport function snapshotInheritedCheckCollection(\n value: InheritedCheckCollection<unknown>\n): Readonly<Record<string, unknown>> | undefined {\n try {\n if (!hasPlainObjectPrototype(value)) return undefined;\n const snapshot: Record<string, unknown> = {};\n let hasMarker = false;\n for (const key of Reflect.ownKeys(value)) {\n const entry = snapshotInheritedCollectionEntry(\n snapshot,\n key,\n Object.getOwnPropertyDescriptor(value, key)\n );\n if (entry === \"invalid\") return undefined;\n if (entry === \"marker\") hasMarker = true;\n }\n return hasMarker ? Object.freeze(snapshot) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction hasPlainObjectPrototype(value: object): boolean {\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction snapshotInheritedCollectionEntry(\n snapshot: Record<string, unknown>,\n key: PropertyKey,\n descriptor: PropertyDescriptor | undefined\n): InheritedCollectionEntry {\n if (!isDataDescriptor(descriptor)) return \"invalid\";\n if (key === INHERITED_CHECK_COLLECTION) {\n return descriptor.enumerable || descriptor.value !== true ? \"invalid\" : \"marker\";\n }\n if (typeof key !== \"string\" || descriptor.enumerable !== true) return \"invalid\";\n Object.defineProperty(snapshot, key, {\n configurable: true,\n enumerable: true,\n value: descriptor.value,\n writable: true\n });\n return \"data\";\n}\n\nfunction isDataDescriptor(\n descriptor: PropertyDescriptor | undefined\n): descriptor is PropertyDescriptor {\n return descriptor !== undefined && descriptor.get === undefined && descriptor.set === undefined;\n}\n"]}