@zxyycom/vibe-check 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -1,34 +1,93 @@
1
- # 按作用位置选择回调(Hook)
1
+ # 生命周期位置与函数契约
2
2
 
3
- 当你知道想在“执行前准备”“检查时决定结果”“显示时调整文本”或“结束后处理统计”,却不确定应该使用哪个回调时,从本文选择接入位置。本文按接入位置说明公开回调的分工;字段签名以 installed declarations 为准,项目定义与本次运行的参数归属见 [API 机制](../api-mechanics.md#参数应该放在哪里)。
3
+ 本页用“逻辑位置 → 实际执行契约”定位 Vibe Check 的扩展点。逻辑位置只说明某项职责相对领域事实发生的阶段;实际执行契约才定义路径、输入、调用次数、顺序、控制权和失败。相邻时点不表示共享 Hook。
4
4
 
5
- ## 先按三条链路理解位置
5
+ 状态标记为:**当前公开**(package API)、**当前 Project**(Project Gate 自有)、**当前内部**(运行时私有)、**相邻 Change**(已有 owner、尚未接线)或**逻辑保留**(没有当前消费者)。只有当前实际契约给出可调用路径和签名。
6
6
 
7
- - **单项 Check**:被 Scheduler 准入 → `preflight` 准备 options → `execution` 形成结果 → Product 验证并结算。某项准备被阻断时不会继续 execution;不同 Check 可以并发。
8
- - **人读说明**:Check 用 `presentCheckFindings` 将 Finding 转成 messages 并附到自己的结果 → Product 显示明细时用 progress `formatter` 调整预览文本。前者在 Check 生成说明的位置,后者在终端显示的位置,两者都不替代检查结果的判定。
9
- - **调度策略**:graph 准备好后,可选 `prepare` 形成当前 Run 的策略 → Scheduler 调用 `decide` 零次或多次,每次同步返回一个 select / wait proposal → Scheduler 停止准入、等待已启动任务并封闭统计 → `measurementHooks` 观察终态 → 存在 terminal context 时调用可选 `complete`。simple strategy 不经过 `prepare`。
7
+ ## 当前时间线
10
8
 
11
- 完整 Run 的验证、取消与输出衔接仍由 [API 生命周期](../api-mechanics.md#一次-run-的生命周期)说明。
9
+ ```text
10
+ Definition / Controls validation
11
+ → effective flag selection
12
+ → static graph and admission-strategy preparation
13
+ → Scheduler admission
14
+ → admitted Check: prepare → execute → settle
15
+ → sealed Scheduler measurement
16
+ → internal summary → terminalEffects[] → prepared terminalEffect
17
+ → effective Check aggregation
18
+ → Run result and output closure
19
+ → Project Gate initial result → resultContributor → exit/transcript
20
+ ```
12
21
 
13
- ## 回调的配置位置与权限
22
+ 早期取消、无效图和策略准备失败不会形成 sealed terminal measurement。Check `prepare` 只在该 Check 获准入后运行;它不是 invocation-wide hook。
14
23
 
15
- 先确定要在什么位置做什么,再选择对应字段。下表用于定位,不是一条所有回调都会执行的串行流程:不同 Check 可以并发,progress 也会随运行持续呈现。
24
+ ## Product Check
16
25
 
17
- | 作用位置与目的 | 写在哪里 | 接收什么、产生什么 | 能改变的范围 |
26
+ | 逻辑位置 | 状态与路径 | 职责、顺序与失败 | owner |
18
27
  | --- | --- | --- | --- |
19
- | **调度开始前:准备本次调度策略** | Definition 的 [`scheduler.admissionPolicy.strategy`](scheduling.md#已准备的-custom-strategy) 选择 `kind: "prepared"`,提供 `prepare` | 接收静态 graph,返回本次使用的 `decide` 与可选 `complete` | 准备策略自己的运行状态,不执行 Check。 |
20
- | **调度选择时:决定建议先运行哪项** | [simple strategy 的 `decide`](scheduling.md#自定义准入-policy),或 `prepare` 返回值中的 `decide` | 接收当前准入 context,同步返回 select / wait proposal | 只提出选择,Scheduler 仍检查依赖、互斥、容量与取消。 |
21
- | **单项 Check 被准入后、执行前:准备 options** | [`preflight`](extending-check-lifecycle.md#preflight准备阻止或带-fallback-继续) | 接收 authored options 和 signal,返回 prepared options、fallback 或阻断结果 | 影响这项 Check 是否继续及其 execution 输入,不是整个 Run 的前置 hook。 |
22
- | **单项 Check 执行时:检查并决定自己的结果** | [`defineCheck({ execution, ... })`](extending-check-lifecycle.md) | 接收 Check context,返回四态 terminal result,可报告 Records | 形成这项 Check 的领域结果;Product 验证并封闭事实,不开放事后改写结果的通用 hook。 |
23
- | **Check 生成 Finding 说明时:选择如何描述发现** | [`presentCheckFindings({ message, omittedMessage, ... })`](presenting-findings.md) | 单项 Finding 或省略集合转成 `CheckMessage`,helper 返回 messages | 由 Check 将说明附到自己的结果;不是终端 renderer,也不负责决定通过或失败。 |
24
- | **终端显示已结算 Check 的明细时:调整预览文本** | Definition 或 Controls 的 [`outputs.progressRendering.formatter`](run-outputs.md#配置-preview-文本) | 接收选中项的默认文本和预算,同步返回替代文本 | 只改变终端预览,不改写完整 Records、messages 或 Check outcome。 |
25
- | **调度停止且已启动任务结束后:观察终态统计** | Definition 的 [`scheduler.measurementHooks`](scheduling.md#观察终态-measurement) | 接收冻结的 graph、settlement observations 与 raw measurement | 消费或保存终态观察,不能重跑任务或改写 Check facts。 |
26
- | **终态观察交付后:完成本次已准备策略** | `prepare` 返回值中的可选 `complete` | 存在 sealed terminal context 时接收该 context,至多调用一次 | 完成策略自己的终态工作;不是保证所有失败路径都会调用的通用 `finally`。 |
28
+ | 单项 options 准备 | **当前公开**:`Definition.checks[].prepare`,`CheckPreparation` | admitted Check 至多一次、早于 `execute`;block、throw 或非法结果只将该 Check 结算为 unavailable。 | [自定义 Check](extending-check-lifecycle.md) |
29
+ | 开始执行 | **当前内部**:`CheckExecutionLifecycle.started` | prepare 成功后、execute 前同步投影;不能控制结果。 | Product Run |
30
+ | 领域执行 | **当前公开**:`Definition.checks[].execute` | 形成本 Check result、messages 与 Records。 | [自定义 Check](extending-check-lifecycle.md) |
31
+ | 单项结算 | **当前内部**:`CheckExecutionLifecycle.settled` | Core 接受唯一终态事实后同步一次,覆盖 control、dependency、preparation、execution 和取消。 | Product result model |
27
32
 
28
- ## 结算结果与结算后工作
33
+ ```ts
34
+ const check = defineCheck({
35
+ checkId: "license-policy",
36
+ displayName: "License policy",
37
+ options: { denied: ["GPL-3.0-only"] },
38
+ prepare(options) {
39
+ return { status: "success", preparedOptions: options };
40
+ },
41
+ execute({ options }) {
42
+ return { status: "passed", data: { deniedCount: options.denied.length } };
43
+ }
44
+ });
45
+ ```
29
46
 
30
- **“结算结果”和“结算后做事”不同。** Check 的 `execution` 与领域 policy 决定本项结果;本次 `checkAggregation` 从已结算状态派生 Run aggregate,它是配置而不是回调。若要根据完整 `RunResult` 决定 CI 退出码或做项目后处理,在项目代码 `await run(...)` 之后处理;这不是 Product 提供的另一组生命周期 hook。
47
+ ## Project / invocation
31
48
 
32
- ## 回调失败如何反馈
49
+ | 逻辑位置 | 状态与路径 | 职责、顺序与失败 | owner |
50
+ | --- | --- | --- | --- |
51
+ | Project facts 准备 | **相邻 Change** | `add-project-change-flags` 拥有选择前 Project facts;本 Change 不建立 callback。 | Project Definition owner |
52
+ | 有效选择完成 | **当前内部**:`InvocationLifecycle.selectionSettled()` | 所有 flag-control settlements 被接受后、Scheduler graph run 前一次;与逐 Check 生命周期分离。 | Project Run owner |
53
+ | 批量有效输入准备 | **相邻 Change** | `batch-declared-project-file-inputs` 拥有选择后的输入屏障。 | Project Run owner |
54
+ | 有效 Check 汇总 | **当前公开**:`RunControls.checkAggregation(checks)` | 完整结算后至多一次;接收只读、canonical-order 的有效 `CoreCheck[]`,必须同步返回四态。省略时 Product strict-all;throw、Promise 或非法返回直接拒绝 `run`,不是 `RunResult` hook。 | [API 机制](../api-mechanics.md#runcontrols-与-check-aggregation) |
55
+
56
+ ## Admission / Scheduler
57
+
58
+ | 逻辑位置 | 状态与路径 | 职责、顺序与失败 | owner |
59
+ | --- | --- | --- | --- |
60
+ | 策略准备 | **当前公开**:prepared strategy `prepare(context)` | static graph 有效后至多一次,返回 `decide` 和可选 `terminalEffect`。 | [调度 Check](scheduling.md) |
61
+ | 准入决策 | **当前公开**:simple/prepared `.decide(context)` | 每个 decision boundary 同步提出 select/wait;Scheduler 验证并转换状态。 | Scheduler |
62
+ | accepted action 测量 | **当前内部**:private collector | accepted transition 后记录,下一次 decide 只读取冻结 prefix。 | Scheduler owner |
63
+ | 终态摘要 | **当前内部**:summary participant | sealed context 后最先运行并自行 contain writer failure。 | Scheduler owner |
64
+ | 终态作用 | **当前公开**:`scheduler.terminalEffects[]` | internal summary 后依声明顺序 await;任一失败不阻止后续作用。 | [调度 Check](scheduling.md) |
65
+ | prepared 策略终态作用 | **当前公开**:prepared `terminalEffect` | public effects 后、sealed context 存在时至多一次;与数组共享 `outputs.terminalEffects`。 | Scheduler owner |
66
+ | 必达资源释放 | **逻辑保留** | 没有当前公开消费者;terminalEffect 不是 `finally`。 | future Change |
67
+
68
+ terminal effect 可读取冻结 `SchedulerMeasurementContext`,不能修改 Scheduler 或 Check 结果。任一公开或 prepared effect 失败会使 `outputs.terminalEffects` 为 failed;正常 completed Run 映射为 `kind: "output"` / `scheduler-terminal-effects-failed`,取消或其它 primary failure 保持原结果。
69
+
70
+ ## Run output
71
+
72
+ | 逻辑位置 | 状态与路径 | 职责、顺序与失败 | owner |
73
+ | --- | --- | --- | --- |
74
+ | Check preview | **当前公开**:`outputs.progressRendering.formatter` | 只格式化受预算限制的显示文本。 | [Run outputs](run-outputs.md) |
75
+ | terminal-effect readback | **当前公开**:`RunResult.outputs.terminalEffects` | 汇总 Definition effects 与 prepared effect;Controls 不能注入。 | Run output owner |
76
+ | Run result handling / policy | **逻辑保留** | 调用方在 `await run(...)` 后自行处理;Product 未提供内部 policy hook。 | future Change |
77
+
78
+ ## Project Gate
79
+
80
+ | 逻辑位置 | 状态与路径 | 职责、顺序与失败 | owner |
81
+ | --- | --- | --- | --- |
82
+ | Gate 结果贡献 | **当前 Project**:`PROJECT_GATE_RUN_CONFIG.resultContributor(context)` | exact candidate Run 形成 `initialResult` 后至多一次;只能返回已验证 message list。 | Project Gate |
83
+ | Gate 结果决定 | **当前内部**:initial result → contribution → exit mapper | adapter 追加 messages、原样保留 initial status;throw 或非法列表为 unavailable。 | Project Gate owner |
84
+ | transcript 完成 | **当前内部**:`ProjectGateTranscript.complete` | final result 与 exit 已确定后写入一次;失败 fail closed。 | Project Gate owner |
85
+
86
+ `resultContributor` 不是 package API、插件系统或完整结果 transform。它能读 `initialResult`、selection、candidate、timing 与 Run facts,但不能重写 status。
87
+
88
+ ## 精确契约
33
89
 
34
- `preflight` / `execution` 的失败由 owning Check 结算。progress formatter、measurement Hooks 与 prepared `complete` 的失败通过对应 output status 反馈,并保留已形成的 Check facts;原本正常完成的 Run 会成为 `kind: "output"`,已有取消或执行失败则保留主结果。完整优先级见[输出状态与失败处理](run-outputs.md#输出状态与失败处理)。
90
+ - Check authoring、取消、reason 和 callback context: [自定义 Check](extending-check-lifecycle.md)。
91
+ - Definition validation、closed grammar 和 fingerprint:Project Definition owner(工作区维护材料)。
92
+ - Scheduler measurement、策略及 output priority: [调度 Check](scheduling.md) 与 [Run outputs](run-outputs.md)。
93
+ - Gate candidate binding、result contribution、exit 与 transcript:Project Gate owner(工作区维护材料)。
@@ -1,6 +1,15 @@
1
1
  # 读取 Check 依赖与类型化数据
2
2
 
3
- 需要把一项 Check 的结果交给另一项使用时,先声明 direct `dependsOn` 或 `observes`,再通过 dependency reader 读取上游结果,并用 provider parser 恢复业务类型。需要上游通过才开始时选择 `dependsOn`;需要审计任意终态时选择 `observes`。这些关系还约束 Scheduler 准入,调度预算见[调度 Check](scheduling.md)。
3
+ 需要把一项 Check 的结果交给另一项使用时,先声明 direct `dependsOn` 或 `observes`,再通过 dependency reader 读取上游结果,并用 provider parser 恢复业务类型。需要上游通过才开始时选择 `dependsOn`;需要审计任意终态时选择 `observes`。若同一次 Run 的 direct prerequisite 还必须交接不能 canonicalize 的 reference(例如 `Map` 或 typed bytes),provider 在 `defineCheck` 中声明 `handoff: true`,consumer 才能以 provider object 读取它。这些关系还约束 Scheduler 准入,调度预算见[调度 Check](scheduling.md)。
4
+
5
+ ## 先选择读取契约
6
+
7
+ | consumer 要解决的问题 | provider 声明与 consumer 读取 | 不能获得的能力 |
8
+ | --- | --- | --- |
9
+ | 只需要已结算的 canonical final data,或需要审计任意终态 | 以 `dependsOn` 或 `observes` 声明 relation;使用 string `get(checkId)` 或 `list()` | 不保留原始 reference identity,也不能读取未声明或传递 provider。 |
10
+ | 必须在同一次 Run 内交接不可 canonicalize 的 reference | provider 声明 `handoff: true`,在 `passed` 返回 `handoff`;consumer 将 provider 设为 direct `dependsOn` 并调用 `get(provider)` | 不授权 `observes`、string ID、传递 provider 或任何 Run 外读取;reference 不会发布。 |
11
+
12
+ `handoff: true` 是唯一的 authoring declaration:它必须写在 `defineCheck(...)` 的 executable provider 上,不是数据、parser、serializer 或 author 创建的 token。Product 在 package-runtime 内部的 WeakMap 注册该 provider identity;identity 只连接已定义 provider、Definition 与 execution,不是 package API 或跨 package instance 的兼容协议。每次 Run 的 private store 才暂存已接受的 handoff reference。`handoff` 只可为 executable provider 的精确 `true`;container、其它值和自有 `undefined` 都会在 Definition validation 被拒绝。
4
13
 
5
14
  ## 完整运行示例
6
15
 
@@ -17,6 +26,8 @@ type ChangedFilesData = Readonly<{
17
26
  const changedFiles = defineCheck({
18
27
  checkId: "changed-files",
19
28
  displayName: "Changed files",
29
+ // `true` 是唯一的 runtime declaration;返回值的 handoff 类型由 execution 自动推断。
30
+ handoff: true,
20
31
  parseData(data): ChangedFilesData {
21
32
  if (
22
33
  data.version !== CHANGED_FILES_DATA_VERSION ||
@@ -27,10 +38,14 @@ const changedFiles = defineCheck({
27
38
  }
28
39
  return { files: data.files, version: data.version };
29
40
  },
30
- execution() {
41
+ execute() {
42
+ const bytesByPath = new Map<string, Uint8Array>([
43
+ ["src/index.ts", new TextEncoder().encode("export {}\n")]
44
+ ]);
31
45
  return {
32
46
  status: "passed",
33
- data: { files: ["src/index.ts"], version: CHANGED_FILES_DATA_VERSION }
47
+ data: { files: ["src/index.ts"], version: CHANGED_FILES_DATA_VERSION },
48
+ handoff: bytesByPath
34
49
  };
35
50
  }
36
51
  });
@@ -39,12 +54,21 @@ const analyzeChangedFiles = defineCheck({
39
54
  checkId: "analyze-changed-files",
40
55
  displayName: "Analyze changed files",
41
56
  dependsOn: [changedFiles.checkId],
42
- execution({ dependencies }) {
43
- const read = dependencies.get(changedFiles.checkId);
57
+ execute({ dependencies }) {
58
+ const read = dependencies.get(changedFiles);
44
59
  if (!read.ok) return { status: "unavailable", reason: { code: read.error.code } };
45
60
 
61
+ // canonical data 仍在 parser 边界;handoff 保留 same-Run reference identity。
46
62
  const data = changedFiles.parseData(read.data);
47
- return { status: "passed", data: { analyzedFileCount: data.files.length } };
63
+ const firstFile = data.files[0];
64
+ const firstFileBytes = firstFile === undefined ? undefined : read.handoff.get(firstFile);
65
+ if (firstFileBytes === undefined) {
66
+ return { status: "unavailable", reason: { code: "changed-file-bytes-unavailable" } };
67
+ }
68
+ return {
69
+ status: "passed",
70
+ data: { analyzedByteCount: firstFileBytes.byteLength, analyzedFileCount: data.files.length }
71
+ };
48
72
  }
49
73
  });
50
74
 
@@ -61,7 +85,13 @@ const result = await run(definition);
61
85
  if (result.kind !== "completed") throw new Error(`Run did not complete: ${result.kind}`);
62
86
  ```
63
87
 
64
- 上例先收窄 `get` 的 `ok`,再显式调用 producer 的 `parseData`。`dependsOn` 保证 callback 只在 provider `passed` 后开始;`!read.ok` 仍作为读取边界防御。八个随包 Check 都提供 `parseData` 和同实现的 package-root parser,名称与类型见各自指南。
88
+ 上例的 `handoff: true` 是 provider 的最小 runtime declaration;`passed` result 中的 `Map<string, Uint8Array>` 自动成为 provider-aware read 的 handoff 类型。provider 只能在 `passed` branch 返回同型、non-null 的 `handoff`;`dependencies.get(changedFiles)` 只在 current Run 中由 direct `dependsOn` consumer 成功,返回 provider 的 canonical `data` 和同一 `Map` reference。fan-out consumer 读取的也是这个引用,而 repeated Run 不共享它。
89
+
90
+ 先收窄 `get` 的 `ok`,再显式调用 producer 的 `parseData(read.data)`:parser 继续只负责 detached、deep-frozen canonical data,绝不解析或 clone `handoff`。`dependsOn` 保证 callback 只在 provider `passed` 后开始;`!read.ok` 仍是读取边界防御。九个随包 Check 都提供 `parseData` 和同实现的 package-root parser,名称与类型见各自指南。
91
+
92
+ provider-object read 的失败不返回上游 `data` 或 `handoff`:输入不是 `handoff: true` 定义的 provider,或不是 effective direct `dependsOn` 时,错误为 `dependency-not-declared`;已获 direct authorization 但本次 execution 没有接受到该 provider 的 `passed` handoff 时,错误为 `upstream-handoff-unavailable`。consumer 必须像示例一样先处理 `!read.ok`,不能把 TypeScript 推断当作运行时授权。
93
+
94
+ handoff 保留 identity,因此 Product 不会 freeze、clone、serialize、缓存或验证其领域含义。producer 与所有 consumer 必须把它作为 immutable observation:上例不调用 `Map#set`,也不改写其中的 `Uint8Array`。execution graph 结束时 Product 清空自己的 private-store reference;该 `clear()` **不是** disposer,不会调用 `close`、`dispose` 或任意 symbol hook。真实资源的创建者/调用方必须以显式 graph ordering、consumer `try/finally` 或 Run 外层 lifecycle 在最后一个 consumer 后清理,不能依赖 handoff store、GC 或 machine/diagnostic publication。
65
95
 
66
96
  ## 批量审计 direct outcomes
67
97
 
@@ -72,7 +102,7 @@ const auditChangedFiles = defineCheck({
72
102
  checkId: "audit-changed-files",
73
103
  displayName: "Audit changed files",
74
104
  observes: [changedFiles.checkId, analyzeChangedFiles.checkId],
75
- execution({ dependencies }) {
105
+ execute({ dependencies }) {
76
106
  const observations = dependencies.list();
77
107
  const readable = observations.filter(
78
108
  ({ outcome }) =>
@@ -104,7 +134,7 @@ const auditChangedFiles = defineCheck({
104
134
 
105
135
  ## Provider 类型与解析边界
106
136
 
107
- 通过 `defineCheck({ execution, parseData })` 建立 typed provider:同步 parser 的返回类型同时约束该 Check 的 `passed` / `failed` data,返回值保留必需的 `parseData`。普通递归 `Check` 类型本身不声明 parser;仅写 `satisfies Check` 或 inline `defineConfig` 不建立该类型关系。没有 parser 的普通 Check 仍合法,container 则不能声明 parser。
137
+ 通过 `defineCheck({ execute, parseData })` 建立 typed provider:同步 parser 的返回类型同时约束该 Check 的 `passed` / `failed` data,返回值保留必需的 `parseData`。普通递归 `Check` 类型本身不声明 parser;仅写 `satisfies Check` 或 inline `defineConfig` 不建立该类型关系。没有 parser 的普通 Check 仍合法,container 则不能声明 parser。
108
138
 
109
139
  TypeScript 拒绝 async 或返回 `PromiseLike` 的 parser,即使推断结果类型很宽。canonical JSON 中非 callable 的 `then` 字段仍是普通数据。JavaScript 或显式 cast author object 上的 function parser 可以通过 runtime Definition validation,但不会因此取得 TypeScript 关系;自有 `parseData: undefined` 规范化为省略。
110
140
 
@@ -115,7 +145,8 @@ parser 接收 Check-facts-owned 的 detached、deep-frozen canonical object,
115
145
  ## Direct relation 与读取规则
116
146
 
117
147
  - `dependsOn` 与 `observes` 命名同一 Definition 中的 executable Check。两者各自可继承父 collection;精确数组完整替换(`[]` 清空),`inherit({ add, remove })` 显式增删后去重。一个 provider 不得同时出现在两类 relation 中。
118
- - `dependsOn` 等所有 direct provider 通过才允许本 Check 的 preflight/execution;任一 provider 非 `passed` 时,本 Check 在 author work 前成为 `unavailable / dependency-not-passed`,reason 带 direct blocker `checkIds`,duration 为 `null`。`observes` 只等待终态,不要求通过。
148
+ - `dependsOn` 等所有 direct provider 通过才允许本 Check 的 preparation/execution;任一 provider 非 `passed` 时,本 Check 在 author work 前成为 `unavailable / dependency-not-passed`,reason 带 direct blocker `checkIds`,duration 为 `null`。`observes` 只等待终态,不要求通过。
119
149
  - `get(checkId)` 是 non-generic string read,只授权 normalized effective `dependsOn ∪ observes` 的 direct ID(包括各自继承项)。未声明、传递或 malformed ID 返回不泄露 upstream fact 的 `dependency-not-declared`。
150
+ - `get(provider)` 是 provider-aware read,只接受以 `handoff: true` 定义的 provider object,并且只授权 normalized effective direct `dependsOn`。成功时固定为该 provider literal `checkId`、`status: "passed"`、canonical `data` 与 typed `handoff`;direct `observes`、transitive、未声明、lookalike provider 或本次未接受 handoff 都 fail closed,不泄露 upstream data/reference。它不改变 string `get(checkId)` 或 `list()` 的授权、shape 与四态 observation。
120
151
  - 已声明 provider 的 `passed` / `failed` 返回 `ok: true`、status 与 canonical data;`not-applicable` / `unavailable` 返回 `ok: false`、该 status 与 `upstream-data-unavailable`。TypeScript 类型本身不授予访问权。
121
152
  - `list()` 无参返回同一 direct union 的完整四态 observations,按 normalized effective direct ID 稳定排序并去重;数组、每项与 Core-owned outcome 都冻结。不读取传递、未声明或 ambient executed Checks,也不提供 Records、scheduler timing 或全局历史。
@@ -25,7 +25,7 @@ if (!Object.isFrozen(selectedPaths)) {
25
25
 
26
26
  ## 共享的 files 选择语义
27
27
 
28
- 需要选择项目文件的随包 Check 使用 `{ source, include, exclude }`:`source` 明确选择 `filesystem` 或 `git-worktree`,include/exclude 使用 project-root-relative、`/` 分隔的 minimatch glob,点号开头的路径也参与匹配,exclude 优先。来源不可用时不切换来源;Check 将它结算为 `unavailable`,下方独立工具则同步 throw。
28
+ 需要选择项目文件的随包 Check 使用 `{ source, include, exclude }`:`source` 明确选择 `filesystem` 或 `git-worktree`,include/exclude 使用 project-root-relative、`/` 分隔的 minimatch glob,点号开头的路径也参与匹配,exclude 优先。Project change regions 复用同一 include/exclude matcher,但只对 Git 已得出的 changed-path candidates 匹配,不重新枚举 project files。来源不可用时不切换来源;Check 将它结算为 `unavailable`,下方独立工具则同步 throw。
29
29
 
30
30
  `defaultProjectFileSelection` 是深冻结、可组合的基线,不是全局配置。它排除常见 VCS/Product state、dependencies、build/generated、cache、coverage、log、temporary 与 virtual-environment paths。`duplicateDetection`、`fileMetrics` 与 `jsonSchemaValidation` 原样采用该基线;`functionMetrics`、`jsonValidation` 与 `markdownLinkValidation` 保留 source/exclude,按支持文件类型派生默认 include。`secretDetection` 要求显式完整 selection。精确默认列表可从导出值读取,各 Check 的实际默认与 eligibility 见其指南。
31
31
 
@@ -35,12 +35,12 @@ Check constructor 接受省略字段时,由 owning Check 物化默认值;显
35
35
 
36
36
  每次调用都必须给出 `projectRoot` 与完整 `selection: { source, include, exclude }`:
37
37
 
38
- | 输入 | 要求与作用 |
39
- | --- | --- |
40
- | `projectRoot` | 非空且不含 U+0000 的路径;相对路径从调用时的工作目录解析,绝对路径直接使用。示例的 `"."` 是调用方显式选择当前目录,并非省略字段的默认值。 |
41
- | `selection.source` | 只能是 `"filesystem"` 或 `"git-worktree"`,决定候选路径来源。 |
42
- | `selection.include` | 无空洞的字符串数组,每项是相对 root、使用 `/` 的 glob;路径至少命中一项才被选中,`[]` 不选择任何路径。 |
43
- | `selection.exclude` | 同样是无空洞的字符串数组;命中任一 glob 就排除,`[]` 不增加排除条件。排除优先于包含。 |
38
+ | 输入 | 要求与作用 |
39
+ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | `projectRoot` | 非空且不含 U+0000 的路径;相对路径从调用时的工作目录解析,绝对路径直接使用。示例的 `"."` 是调用方显式选择当前目录,并非省略字段的默认值。 |
41
+ | `selection.source` | 只能是 `"filesystem"` 或 `"git-worktree"`,决定候选路径来源。 |
42
+ | `selection.include` | 无空洞的字符串数组,每项是相对 root、使用 `/` 的 glob;路径至少命中一项才被选中,`[]` 不选择任何路径。 |
43
+ | `selection.exclude` | 同样是无空洞的字符串数组;命中任一 glob 就排除,`[]` 不增加排除条件。排除优先于包含。 |
44
44
 
45
45
  这些对象只接受列出的自有数据字段,不接受额外字段或 getter/setter;数组也不接受额外属性或 accessor 元素。工具不在遗漏 root 时替调用方选择目录;显式 root 不是路径隔离、文件系统沙箱或文件内容可读性的承诺。
46
46
 
@@ -0,0 +1,155 @@
1
+ # 执行外部命令的 Check
2
+
3
+ `commandCheck(...)` 将一个单一、无 shell 的外部 command 接入 ordinary Check lifecycle。Product 负责进程启动、协作取消、超时、受限输出捕获和默认终态;调用方可在 spawn 前解析本次 environment,并在完整命令结果上完成领域结算。
4
+
5
+ 默认模式适合 exit status 已足够表达检查结果的工具。需要将完整 command 的 stdout/stderr 转为领域 data、Records 或 typed provider 时,使用 `afterCommand`;工具协议、参数语义、解析规则和保存的业务数据始终由调用方拥有。
6
+
7
+ ## 最小用法
8
+
9
+ 下例以当前 Node executable 构造一个通过的 Check。`process.execPath` 是绝对 executable path,不依赖 shell 或 `PATH`;省略的 environment 使用 exact-empty,output 使用 discard。
10
+
11
+ ```ts
12
+ import { commandCheck, defineConfig, run } from "@zxyycom/vibe-check";
13
+
14
+ const nodeProbe = commandCheck({
15
+ checkId: "node-probe",
16
+ displayName: "Node probe",
17
+ executable: process.execPath,
18
+ arguments: ["--eval", "process.exit(0)"],
19
+ timeoutMs: 5_000,
20
+ outputByteLimit: 64 * 1024
21
+ });
22
+
23
+ const definition = defineConfig({
24
+ checks: [nodeProbe],
25
+ outputs: {
26
+ diagnosticLogging: { enabled: false },
27
+ machinePublication: { enabled: false },
28
+ progressRendering: { enabled: false }
29
+ }
30
+ });
31
+
32
+ const result = await run(definition);
33
+ if (result.kind !== "completed") throw new Error(`Run did not complete: ${result.kind}`);
34
+ const outcome = result.snapshot.checks.find(
35
+ ({ checkId }) => checkId === nodeProbe.checkId
36
+ )?.outcome;
37
+ if (outcome?.status !== "passed" || outcome.data.exitCode !== 0) {
38
+ throw new Error("Node probe did not produce the expected passed outcome");
39
+ }
40
+ ```
41
+
42
+ ## 输入与 ordinary Check 组合
43
+
44
+ `commandCheck<Id>(input)` 返回 ordinary Check,且 `checkId` 保留调用方的 literal type。`checkId`、`displayName`、`executable`、`timeoutMs` 与 `outputByteLimit` 必填;constructor 对 closed input policy 做 runtime validation,非法 input 抛出 `TypeError`。preparation 再次无法验证 options 时,该 Check 结算为 `unavailable / invalid-options`。
45
+
46
+ 它还接受 ordinary authoring 的 `enabledByFlags`、`checks`、`dependsOn`、`observes`、`maxParallel`、`admissionPriority`、`mutex`、`resourceClaims` 与 `omitQuietPassedRow`。选择、依赖和调度语义由[自定义 Check](extending-check-lifecycle.md)与[调度 Check](scheduling.md)拥有。
47
+
48
+ | 字段 | 要求与默认值 |
49
+ | --- | --- |
50
+ | `executable` | 必填:非空且不含 NUL 的 executable;可为绝对 path 或由平台在最终 environment 中解析的名称。 |
51
+ | `arguments` | 可选,默认 `[]`:dense readonly string array;元素可为空但不得含 NUL,每个元素作为独立 argv 传递。 |
52
+ | `workingDirectory` | 可选,默认 project root:非空且不含 NUL;relative path 从 project root 解析,absolute path 保持原 target。 |
53
+ | `environment` | 可选,默认 `{ mode: "exact" }`。它与 `resolveEnvironment` 互斥,见[环境](#环境)。 |
54
+ | `resolveEnvironment` | 可选:在 spawn 前为本次 invocation 返回 closed environment policy,见[环境](#环境)。 |
55
+ | `timeoutMs` | 必填:正安全整数,限定一次 command execution。 |
56
+ | `outputByteLimit` | 必填:正安全整数,stdout 和 stderr 各自的 byte ceiling。 |
57
+ | `output` | 可选,默认 `{ mode: "discard" }`。见[输出](#输出)。 |
58
+ | `afterCommand` | 可选:完整 numeric-exit command 的 caller-owned completion,见[调用方完成阶段](#调用方完成阶段)。 |
59
+
60
+ command 由 executable 和独立 arguments 表示,不是 shell string、pipeline 或 workflow。
61
+
62
+ ## 环境
63
+
64
+ 环境是 closed policy。静态 `environment` 与 invocation-time `resolveEnvironment` 互斥;两者都省略时,child 使用 exact-empty environment。
65
+
66
+ | policy | child base environment |
67
+ | --- | --- |
68
+ | `{ mode: "exact", variables? }` | 只使用 `variables` 中的 `Record<string, string>`;省略 variables 即 exact-empty。 |
69
+ | `{ mode: "inherit", overrides? }` | execution start snapshot `process.env`;string override 覆盖 key,`null` 删除 key。 |
70
+
71
+ 这张 policy 只确定 caller base environment。Product 在它之后加入固定 plain-text/no-color variables:`CARGO_TERM_COLOR=never`、`CLICOLOR=0`、`CLICOLOR_FORCE=0`、`FORCE_COLOR=0`、`NO_COLOR=1`、`PNPM_CONFIG_COLOR=false`、`PY_COLORS=0`、`TERM=dumb`、`UV_NO_COLOR=1` 与 `npm_config_color=false`。这些 keys 最后覆盖静态 policy 或 resolver 返回 policy 中的同名 value;不能通过此 API 请求 colorized child output。
72
+
73
+ `resolveEnvironment(context)` 在 spawn 前接收 `project`、direct `dependencies`、prepared command `options` 和取消 `signal`,并返回(或 resolve 为)同一张 policy 表中的值。其返回值同样先作为 caller base environment,再由 Product 加入上述固定 keys。它适合把当前 project 或已声明依赖转换为本次 command 的最小环境:
74
+
75
+ ```ts
76
+ const projectCommand = commandCheck({
77
+ checkId: "project-command",
78
+ displayName: "Project command",
79
+ executable: process.execPath,
80
+ arguments: ["--eval", "process.exit(0)"],
81
+ resolveEnvironment: ({ project }) => ({
82
+ mode: "exact",
83
+ variables: { PROJECT_ROOT: project.root }
84
+ }),
85
+ timeoutMs: 5_000,
86
+ outputByteLimit: 64 * 1024
87
+ });
88
+ ```
89
+
90
+ resolver throw 或返回非法 policy 时,不启动 child,Check 结算为 `unavailable / command-environment-resolution-failed`。environment names、values 与 policy object 拒绝 unknown fields、accessor/prototype tricks、`undefined`、非 string 值及 NUL;resolved environment 不会自动进入 Check facts、messages 或 diagnostics。
91
+
92
+ ## 输出
93
+
94
+ `output` 只选择 child material 的处理边界,不改变默认 terminal mapping。
95
+
96
+ | policy | 行为 |
97
+ | --- | --- |
98
+ | `{ mode: "discard" }` | 默认。Product 在受 `outputByteLimit` 约束的 invocation memory 中捕获 stdout/stderr,并在结算后释放;它不自动发布 child material。 |
99
+ | `{ mode: "transcript" }` | Product 将 running state 与 final status metadata、raw stdout、raw stderr 原子写入此 Check artifact directory 的固定 `process.log`。 |
100
+
101
+ transcript 是显式 opt-in artifact capability。没有 `artifactDirectory`,或 running/final write 失败时,Check 为 `unavailable / command-transcript-unavailable`。`process.log` 不包含 executable、arguments、environment 或 native error text。
102
+
103
+ ## 调用方完成阶段
104
+
105
+ `afterCommand` 把完成 callback 与可选 typed-provider parser 放在同一个对象:
106
+
107
+ ```ts
108
+ const reportCommand = commandCheck({
109
+ checkId: "report-command",
110
+ displayName: "Report command",
111
+ executable: process.execPath,
112
+ arguments: ["--eval", 'process.stdout.write("report")'],
113
+ timeoutMs: 5_000,
114
+ outputByteLimit: 64 * 1024,
115
+ afterCommand: {
116
+ execute: ({ command, records }) => {
117
+ records.report({ id: "report-command" }, { stdoutLength: command.stdout.length });
118
+ return { status: "passed", data: { report: command.stdout } };
119
+ },
120
+ parseData: (data) => {
121
+ if (typeof data.report !== "string") throw new TypeError("report must be a string");
122
+ return { report: data.report };
123
+ }
124
+ }
125
+ });
126
+ ```
127
+
128
+ Product 只在 child 具有 numeric exit,且未取消、未 timeout、未达到 output limit、未被 signal 终止时调用 `afterCommand.execute`。若选择 transcript,final write 也必须先成功。callback context 是 ordinary `CheckExecutionContext` 加上 invocation-local `command: { exitCode, stdout, stderr }`;它可以返回普通 `CheckResult` 并按 ordinary Check contract 报告 Records。这个返回值取代完整命令的默认 exit-code mapping。
129
+
130
+ 存在 `parseData` 时,返回值是 typed provider Check,parser 负责验证 callback 返回的 data;没有 parser 时,返回值仍是 ordinary Check。`stdout`、`stderr` 仅在 callback context 中提供,不会因 callback 存在而自动发布。调用方决定是否把派生数据或 Records 放入自己的结果边界,并负责其中的敏感信息处理。
131
+
132
+ ## 默认终态与失败边界
133
+
134
+ 未使用 `afterCommand` 时,完整 numeric exit 的 `passed` 和 `failed` 返回 `CommandCheckFinalData` 的 `{ exitCode: number }`;command-owned unavailable 分支使用 `CommandCheckUnavailableReasonCode`。
135
+
136
+ | process cause | 默认 Check terminal outcome |
137
+ | --- | --- |
138
+ | exit code `0` | `passed / { exitCode: 0 }` |
139
+ | numeric nonzero exit | `failed / { exitCode }` |
140
+ | startup failure | `unavailable / command-start-failed` |
141
+ | resolver throw 或非法 policy | `unavailable / command-environment-resolution-failed` |
142
+ | timeout | `unavailable / command-timeout` |
143
+ | stdout 或 stderr 达到 byte limit | `unavailable / command-output-limit-exceeded` |
144
+ | 非 timeout、非 cancellation signal | `unavailable / command-terminated-by-signal` |
145
+ | transcript capability 或 write failure | `unavailable / command-transcript-unavailable` |
146
+ | 无法验证 prepared options | `unavailable / invalid-options` |
147
+ | Core 观察到 caller cancellation | `unavailable / execution-cancelled` |
148
+
149
+ 同时出现多个底层终态标记时,Product 以 **nonzero exit → cancellation → timeout → max-buffer → signal → startup failure → zero exit** 的顺序选择默认 cause。只有完整 numeric exit 才能进入 `afterCommand`;其它分支保留 Product-owned mapping。callback 自身的 throw 或 settlement 继续由 ordinary Check/Core lifecycle 处理。
150
+
151
+ ## 安全边界与公开类型
152
+
153
+ 默认 exact-empty environment 与 discard output 避免 ambient credential 和 child material 自动进入结果或日志。选择 `inherit`、`transcript` 或在 `afterCommand` 发布派生数据时,调用方负责对应 environment、artifact 和结果边界的访问控制、保留和清理。
154
+
155
+ package root 提供 `commandCheck` 及 `CommandCheckInput`、`CommandCheck`、`CommandCheckWithAfterCommand`、`TypedCommandCheck`、`CommandCheckEnvironment`、`CommandEnvironmentContext`、`CommandEnvironmentResolver`、`AfterCommand`、`AfterCommandContext`、`AfterCommandExecution`、`CompletedCommand`、`CommandCheckOutput`、`CommandCheckFinalData` 与 `CommandCheckUnavailableReasonCode`;精确签名见安装包 declarations。它不提供 shell、pipeline、workflow 或 process-exit adapter,也不保证平台解析的 command 存在。
@@ -0,0 +1,140 @@
1
+ # Core 数据工具:JSON 规范化与结构快照
2
+
3
+ 这两组公开 Core 工具让调用方复用 Core 的数据处理规则:取得独立的 JSON 数据副本、生成确定性文本或字节,
4
+ 或检查配置对象和数组的外层结构。它们都从 package root 导入,无需创建 Check、Project Definition 或 Run。
5
+ 工具只负责下表所列的数据处理;调用方仍负责字段含义、取值范围和业务规则。
6
+
7
+ ## 选择工具
8
+
9
+ 两组工具解决不同问题,不是一条必须依次调用的流水线。
10
+
11
+ | 需要的结果 | 选择 | 成功结果 | 不符合输入规则时 |
12
+ | --- | --- | --- | --- |
13
+ | 独立、递归冻结的 JSON 数据副本 | `canonicalizeJsonValue`;顶层必须是非数组对象时用 `canonicalizeJsonObject` | 规范化后的 JSON 值或对象 | 返回 `undefined` |
14
+ | 确定性 JSON 文本或 UTF-8 字节 | `canonicalJsonText` / `canonicalJsonBytes` | 文本 / `Uint8Array`,内部已执行规范化,无须先调用 `canonicalize*` | 抛出 `TypeError` |
15
+ | 字段恰好匹配的配置对象,或无空洞的标准数组 | `snapshotExactClosedRecord` / `snapshotClosedArray` | 冻结的浅副本,保留字段值或元素的引用 | 返回 `undefined` |
16
+
17
+ JSON 规范化/序列化工具只接受下文定义的 JSON 数据;结构快照不要求字段值或元素是 JSON,因而也适合包含
18
+ 回调的配置。两组工具可分别使用:不先做结构快照,也能规范化或序列化;不先规范化,也能做结构快照。
19
+ 输入可以是程序构造的值,也可以是解析得到的数据;是否来自外部,不改变各工具的输入规则。
20
+
21
+ ## 取得独立的 JSON 副本
22
+
23
+ 当需要保留一份不会被调用方后续修改影响的数据时,使用规范化工具。对象版本直接约束顶层类型;
24
+ value 版本也接受数组和 JSON 基本值。两者都会递归复制并冻结支持的数据,而不是冻结原对象。
25
+
26
+ ```ts
27
+ import { canonicalizeJsonObject, canonicalizeJsonValue } from "@zxyycom/vibe-check";
28
+
29
+ const authoredLimits = { maxFindings: 10 };
30
+ const limits = canonicalizeJsonObject(authoredLimits);
31
+ if (limits === undefined) throw new TypeError("Expected JSON object limits.");
32
+
33
+ authoredLimits.maxFindings = 20;
34
+ if (limits.maxFindings !== 10 || !Object.isFrozen(limits)) {
35
+ throw new Error("Expected an independent frozen limits object.");
36
+ }
37
+
38
+ // 顶层不一定是对象时,选择 value 版本。
39
+ const fileList = canonicalizeJsonValue(["src/index.ts"]);
40
+ if (!Array.isArray(fileList) || !Object.isFrozen(fileList)) {
41
+ throw new Error("Expected a frozen JSON array.");
42
+ }
43
+ ```
44
+
45
+ ## 生成确定性文本或字节
46
+
47
+ 调用方先决定哪些字段参与比较或缓存身份,再选择文本或字节输出。同一组数据仅改变对象属性的插入顺序,
48
+ 不会改变输出;数组元素顺序仍然有意义。字节版本可直接用于摘要计算或二进制接口,不要求调用方重复编码步骤。
49
+ 摘要计算本身和缓存 key 的完整性不由这些工具负责。
50
+
51
+ ```ts
52
+ import { canonicalJsonBytes, canonicalJsonText } from "@zxyycom/vibe-check";
53
+
54
+ // 调用方决定哪些字段影响计算结果;工具只负责一致的数据表示。
55
+ const cacheInputs = { mode: "strict", paths: ["src/index.ts"] };
56
+ const keyText = canonicalJsonText(cacheInputs);
57
+ const keyBytes = canonicalJsonBytes(cacheInputs);
58
+
59
+ if (
60
+ keyText !== canonicalJsonText({ paths: ["src/index.ts"], mode: "strict" }) ||
61
+ new TextDecoder().decode(keyBytes) !== keyText
62
+ ) {
63
+ throw new Error("Expected one deterministic representation for the selected cache inputs.");
64
+ }
65
+ ```
66
+
67
+ ## 检查含回调的配置结构
68
+
69
+ 结构快照可保留函数、`undefined` 和嵌套引用。先检查外层有哪些字段,再验证字段内容;需要检查嵌套数组时,
70
+ 单独调用数组工具。它们不把整个配置转换为 JSON,也不深复制或冻结回调及其关联对象。
71
+
72
+ ```ts
73
+ import { snapshotClosedArray, snapshotExactClosedRecord } from "@zxyycom/vibe-check";
74
+
75
+ const onComplete = () => "done";
76
+ const authoredTask = { name: "build", onComplete, paths: ["src/index.ts"] };
77
+ const task = snapshotExactClosedRecord(authoredTask, ["name", "onComplete", "paths"]);
78
+ if (task === undefined || typeof task.name !== "string" || typeof task.onComplete !== "function") {
79
+ throw new TypeError("Expected a closed task configuration with a name and callback.");
80
+ }
81
+
82
+ // 外层字段检查不验证 paths 的内容;数组结构和元素语义分别检查。
83
+ const selectedFiles = snapshotClosedArray(task.paths);
84
+ if (selectedFiles === undefined || !selectedFiles.every((path) => typeof path === "string")) {
85
+ throw new TypeError("Expected a dense list of file paths.");
86
+ }
87
+ if (task.onComplete !== onComplete || task.paths !== authoredTask.paths) {
88
+ throw new Error("Expected the shallow snapshot to preserve callback and nested references.");
89
+ }
90
+ ```
91
+
92
+ ## Canonical JSON
93
+
94
+ ### 输入与副本
95
+
96
+ 输入接受 `null`、boolean、string、有限 number、使用 `Array.prototype` 的无空洞数组,以及使用
97
+ `Object.prototype` 或 null prototype 的对象。拒绝 `undefined`、非有限 number、function、symbol、bigint、
98
+ 循环引用、存取器属性、不可枚举的自有属性、数组额外自有属性和其它原型。数组自身的标准 `length` 属性是例外。
99
+ 共享但非循环的引用可以接受,规范化结果不承诺保留原引用之间的别名关系。
100
+
101
+ `canonicalizeJsonValue` 返回独立、递归冻结的 JSON 值;`canonicalizeJsonObject` 额外要求顶层为非数组对象。
102
+ 数值 `-0` 转换为 `0`。结果中的对象使用 **null prototype**,没有继承的对象方法;检查属性时使用
103
+ `Object.hasOwn`,不要调用 `result.hasOwnProperty`。结果数组仍使用 `Array.prototype`。
104
+
105
+ `CanonicalJsonPrimitive`、`CanonicalJsonValue` 和 `CanonicalJsonObject` 只描述静态数据结构,便于声明参数和结果。
106
+ 它们不是运行时验证凭证:例如普通 `number` 类型仍可表示 `NaN`,对象类型也不能证明数据已冻结、具有 null prototype
107
+ 或没有循环。有限数值和其它输入约束只能由规范化函数在运行时检查,不能通过类型标注或断言取得。
108
+
109
+ ### 确定性序列化
110
+
111
+ `canonicalJsonText` 输出无额外空白的 JSON 文本。对象 key 按 JavaScript 字符串 `<` 比较的顺序排列,
112
+ 数组保留元素顺序,`-0` 输出为 `0`;字符串和其余基本值按 JSON 表示规则输出。
113
+ `canonicalJsonBytes` 返回该文本的 UTF-8 编码。这些表示规则属于公开契约,不随内部重构任意改变;
114
+ 它们不承诺遵循其它 canonical-JSON 标准或执行 Unicode normalization。
115
+
116
+ **规范化对象不是已序列化的规范文本。** `JSON.stringify` 对整数索引属性的枚举顺序不同:对于含 `"2"`、`"10"`
117
+ 两个 key 的对象,原生序列化先输出 `"2"`,`canonicalJsonText` 则先输出 `"10"`。需要上述确定性格式时,
118
+ 直接使用 `canonicalJsonText` 或 `canonicalJsonBytes`,不要以 `JSON.stringify(canonicalizeJsonObject(...))` 替代。
119
+
120
+ ## 闭合快照
121
+
122
+ `snapshotExactClosedRecord(value, keys)` 要求顶层是非数组的 plain/null-prototype 对象,且自有 key 恰好匹配
123
+ 调用方提供的无重复 string 列表;所有自有属性必须是可枚举的数据属性。缺字段、多字段、symbol key、存取器属性或
124
+ 不可枚举属性都会被拒绝。`keys` 应由调用方持有并保持稳定;成功结果是使用 `Object.prototype` 的冻结浅副本。
125
+
126
+ `snapshotClosedArray(value)` 要求使用 `Array.prototype` 的无空洞数组,除标准 `length` 与可枚举索引外没有其它
127
+ 自有属性,也没有存取器属性。成功结果是冻结的标准数组浅副本。
128
+
129
+ 两种快照均不检查字段值或元素的业务类型,也不要求它们是 JSON:函数、`undefined`、嵌套对象和引用可以保留。
130
+ 嵌套内容不会被复制或递归冻结,`-0` 不会被转换。浅副本固定的是外层结构,不是整棵数据的内容;
131
+ 需要独立 JSON 副本时选择规范化工具,不要把浅快照当作深层验证结果。
132
+
133
+ ## 执行与适用边界
134
+
135
+ 工具读取属性描述符,不调用输入的 getter 或 `toJSON` 方法。反射 Proxy 时仍可能执行其 trap;
136
+ trap 抛出导致输入无法读取时,按所选工具的失败模型返回 `undefined` 或抛出 `TypeError`,不承诺隔离 trap 的副作用。
137
+ 这不是任意 JavaScript 对象的安全沙箱。
138
+
139
+ 这些工具不解析 JSON 文本,不替代领域 schema 或字段验证,也不提供签名、认证、保密性或文件系统权限控制。
140
+ 调用方按实际用途选择工具及失败处理,不必为了使用它们引入 Core 的运行生命周期。