@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
@@ -6,7 +6,11 @@ const defaultProgressRefreshScheduler = Object.freeze({
6
6
  schedule: (refresh, intervalMs) => {
7
7
  const interval = setInterval(refresh, intervalMs);
8
8
  interval.unref();
9
- return Object.freeze({ cancel: () => clearInterval(interval) });
9
+ return Object.freeze({
10
+ cancel: () => {
11
+ clearInterval(interval);
12
+ }
13
+ });
10
14
  }
11
15
  });
12
16
  /** Owns terminal progress and its optional file tee; terminal output survives a file-only failure. */
@@ -48,7 +52,9 @@ export function createProgressRendering(configuration, statuses, dependencies =
48
52
  return renderer;
49
53
  writer = createProgressTee({
50
54
  file: dependencies.file ?? null,
51
- onFileFailure: () => statuses.failed("progressRendering"),
55
+ onFileFailure: () => {
56
+ statuses.failed("progressRendering");
57
+ },
52
58
  terminal: (dependencies.writerFactory ?? defaultProgressWriter)()
53
59
  });
54
60
  renderer = createProgressRenderer(writer, dependencies.clock, configuration);
@@ -107,9 +113,15 @@ export function createProgressRendering(configuration, statuses, dependencies =
107
113
  };
108
114
  return Object.freeze({
109
115
  close,
110
- prepared: (totalChecks) => render(Object.freeze({ kind: "prepared", totalChecks })),
111
- lifecycle: Object.freeze({
112
- flagControlCompleted: () => render(Object.freeze({ kind: "flag-control-completed" })),
116
+ prepared: (totalChecks, quietPassOmissionConfiguredCount) => {
117
+ render(Object.freeze({ kind: "prepared", quietPassOmissionConfiguredCount, totalChecks }));
118
+ },
119
+ invocationLifecycle: Object.freeze({
120
+ selectionSettled: () => {
121
+ render(Object.freeze({ kind: "flag-control-completed" }));
122
+ }
123
+ }),
124
+ checkLifecycle: Object.freeze({
113
125
  settled: (fact) => {
114
126
  render(Object.freeze({
115
127
  kind: "settled",
@@ -119,7 +131,7 @@ export function createProgressRendering(configuration, statuses, dependencies =
119
131
  messages: fact.messages,
120
132
  outcome: fact.outcome,
121
133
  records: fact.records,
122
- visibility: fact.visibility
134
+ omitQuietPassedRow: fact.omitQuietPassedRow
123
135
  }));
124
136
  runningCheckIds.delete(fact.checkId);
125
137
  if (runningCheckIds.size === 0)
@@ -127,7 +139,12 @@ export function createProgressRendering(configuration, statuses, dependencies =
127
139
  },
128
140
  started: (fact) => {
129
141
  runningCheckIds.add(fact.checkId);
130
- render(Object.freeze({ kind: "started", checkId: fact.checkId, displayName: fact.displayName }));
142
+ render(Object.freeze({
143
+ kind: "started",
144
+ checkId: fact.checkId,
145
+ displayName: fact.displayName,
146
+ omitQuietPassedRow: fact.omitQuietPassedRow
147
+ }));
131
148
  startRefresh();
132
149
  }
133
150
  }),
@@ -144,15 +161,18 @@ export function createProgressRendering(configuration, statuses, dependencies =
144
161
  });
145
162
  }
146
163
  function inertProgressRendering() {
147
- const lifecycle = Object.freeze({
148
- flagControlCompleted: () => undefined,
164
+ const invocationLifecycle = Object.freeze({
165
+ selectionSettled: () => undefined
166
+ });
167
+ const checkLifecycle = Object.freeze({
149
168
  settled: (_fact) => undefined,
150
169
  started: (_fact) => undefined
151
170
  });
152
171
  return Object.freeze({
153
172
  close: () => undefined,
154
- prepared: (_totalChecks) => undefined,
155
- lifecycle,
173
+ prepared: (_totalChecks, _quietPassOmissionConfiguredCount) => undefined,
174
+ checkLifecycle,
175
+ invocationLifecycle,
156
176
  final: (_input) => undefined
157
177
  });
158
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/presentation.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, mkdirSync, openSync, writeSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport type {\n CheckExecutionLifecycle,\n CheckSettledFact,\n CheckStartedFact\n} from \"../check-execution/lifecycle.ts\";\nimport {\n createProgressRenderer,\n type ProgressClock,\n type ProgressFeedback,\n type ProgressOutcomeCounts,\n type ProgressWriter\n} from \"./renderer.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport type { OutputStatuses } from \"../outputs/status.ts\";\nexport interface ProgressRendering {\n /** Closes only an already-created file tee; it never creates a writer after pre-work termination. */\n readonly close: () => void;\n readonly final: (input: ProgressFinalFeedback) => void;\n readonly lifecycle: CheckExecutionLifecycle;\n readonly prepared: (totalChecks: number) => void;\n}\nexport interface ProgressFinalFeedback {\n readonly counts: ProgressOutcomeCounts;\n readonly elapsedMs: number;\n readonly execution: \"cancelled\" | \"completed\";\n}\nexport type ProgressWriterFactory = () => ProgressWriter;\n\nexport interface ProgressRefreshSchedule {\n cancel(): void;\n}\n\nexport interface ProgressRefreshScheduler {\n schedule(refresh: () => void, intervalMs: number): ProgressRefreshSchedule;\n}\n\nexport interface ProgressRenderingDependencies {\n readonly clock?: ProgressClock;\n /** Caller-owned exact progress transcript target for this invocation; `null` keeps terminal-only output. */\n readonly file?: string | null;\n readonly refreshScheduler?: ProgressRefreshScheduler;\n readonly writerFactory?: ProgressWriterFactory;\n}\n\nconst PROGRESS_REFRESH_INTERVAL_MS = 5_000;\n\nconst defaultProgressRefreshScheduler: ProgressRefreshScheduler = Object.freeze({\n schedule: (refresh: () => void, intervalMs: number) => {\n const interval = setInterval(refresh, intervalMs);\n interval.unref();\n return Object.freeze({ cancel: () => clearInterval(interval) });\n }\n});\n\n/** Owns terminal progress and its optional file tee; terminal output survives a file-only failure. */\nexport function createProgressRendering(\n configuration: ResolvedProgressRenderingOutput,\n statuses: OutputStatuses,\n dependencies: ProgressRenderingDependencies = {}\n): ProgressRendering {\n if (!configuration.enabled) return inertProgressRendering();\n let terminalFailed = false;\n let closed = false;\n const runningCheckIds = new Set<string>();\n let renderer: ReturnType<typeof createProgressRenderer> | undefined;\n let writer: ProgressWriter | undefined;\n let refreshSchedule: ProgressRefreshSchedule | undefined;\n\n const failTerminalRendering = (): void => {\n if (terminalFailed) return;\n terminalFailed = true;\n const activeSchedule = refreshSchedule;\n refreshSchedule = undefined;\n try {\n activeSchedule?.cancel();\n } catch {\n // The output is already failed; a scheduler cleanup fault must not reach Check execution.\n }\n statuses.failed(\"progressRendering\");\n };\n\n const stopRefresh = (): void => {\n const activeSchedule = refreshSchedule;\n refreshSchedule = undefined;\n try {\n activeSchedule?.cancel();\n } catch {\n failTerminalRendering();\n }\n };\n\n const createRenderer = (): ReturnType<typeof createProgressRenderer> => {\n if (renderer !== undefined) return renderer;\n writer = createProgressTee({\n file: dependencies.file ?? null,\n onFileFailure: () => statuses.failed(\"progressRendering\"),\n terminal: (dependencies.writerFactory ?? defaultProgressWriter)()\n });\n renderer = createProgressRenderer(writer, dependencies.clock, configuration);\n return renderer;\n };\n\n const render = (feedback: ProgressFeedback): void => {\n if (terminalFailed) return;\n try {\n createRenderer().render(feedback);\n if (feedback.kind === \"final\") statuses.succeeded(\"progressRendering\");\n } catch {\n failTerminalRendering();\n }\n };\n\n const refresh = (): void => {\n if (terminalFailed) return;\n try {\n renderer?.refresh();\n } catch {\n failTerminalRendering();\n }\n };\n\n const startRefresh = (): void => {\n if (\n terminalFailed ||\n refreshSchedule !== undefined ||\n runningCheckIds.size === 0 ||\n renderer?.refreshesRunningRegion !== true\n ) {\n return;\n }\n try {\n refreshSchedule = (dependencies.refreshScheduler ?? defaultProgressRefreshScheduler).schedule(\n refresh,\n PROGRESS_REFRESH_INTERVAL_MS\n );\n } catch {\n failTerminalRendering();\n }\n };\n\n const close = (): void => {\n if (closed) return;\n closed = true;\n stopRefresh();\n if (writer === undefined) return;\n try {\n writer.close?.();\n } catch {\n // A terminal writer close is an output failure; a tee contains file-only failures itself.\n statuses.failed(\"progressRendering\");\n }\n };\n\n return Object.freeze({\n close,\n prepared: (totalChecks: number) => render(Object.freeze({ kind: \"prepared\", totalChecks })),\n lifecycle: Object.freeze({\n flagControlCompleted: () => render(Object.freeze({ kind: \"flag-control-completed\" })),\n settled: (fact: CheckSettledFact) => {\n render(\n Object.freeze({\n kind: \"settled\",\n checkId: fact.checkId,\n displayName: fact.displayName,\n durationMs: fact.durationMs,\n messages: fact.messages,\n outcome: fact.outcome,\n records: fact.records,\n visibility: fact.visibility\n })\n );\n runningCheckIds.delete(fact.checkId);\n if (runningCheckIds.size === 0) stopRefresh();\n },\n started: (fact: CheckStartedFact) => {\n runningCheckIds.add(fact.checkId);\n render(\n Object.freeze({ kind: \"started\", checkId: fact.checkId, displayName: fact.displayName })\n );\n startRefresh();\n }\n }),\n final: (input: ProgressFinalFeedback) => {\n stopRefresh();\n render(\n Object.freeze({\n counts: input.counts,\n elapsedMs: input.elapsedMs,\n execution: input.execution,\n kind: \"final\"\n })\n );\n close();\n }\n });\n}\nfunction inertProgressRendering(): ProgressRendering {\n const lifecycle = Object.freeze({\n flagControlCompleted: (): void => undefined,\n settled: (_fact: CheckSettledFact): void => undefined,\n started: (_fact: CheckStartedFact): void => undefined\n });\n return Object.freeze({\n close: (): void => undefined,\n prepared: (_totalChecks: number): void => undefined,\n lifecycle,\n final: (_input: ProgressFinalFeedback): void => undefined\n });\n}\nfunction defaultProgressWriter(): ProgressWriter {\n return Object.freeze({\n color: process.stdout.isTTY === true && process.env.NO_COLOR === undefined,\n isTTY: process.stdout.isTTY === true,\n term: process.env.TERM,\n write: (content: string) => {\n process.stdout.write(content);\n }\n });\n}\n\nfunction createProgressTee(\n input: Readonly<{\n readonly file: string | null;\n readonly onFileFailure: () => void;\n readonly terminal: ProgressWriter;\n }>\n): ProgressWriter {\n if (input.file === null) return input.terminal;\n let descriptor: number | undefined;\n let fileFailed = false;\n let closed = false;\n const failFile = (): void => {\n if (fileFailed) return;\n fileFailed = true;\n input.onFileFailure();\n };\n try {\n mkdirSync(dirname(input.file), { recursive: true });\n descriptor = openSync(input.file, \"wx\");\n } catch {\n failFile();\n }\n return Object.freeze({\n close: (): void => {\n if (closed) return;\n closed = true;\n if (descriptor === undefined) return;\n try {\n closeSync(descriptor);\n } catch {\n failFile();\n }\n descriptor = undefined;\n },\n color: input.terminal.color,\n isTTY: input.terminal.isTTY,\n term: input.terminal.term,\n write: (content: string): void => {\n input.terminal.write(content);\n if (fileFailed || descriptor === undefined) return;\n try {\n writeFileBuffer(descriptor, content);\n } catch {\n failFile();\n }\n }\n });\n}\n\nfunction writeFileBuffer(descriptor: number, content: string): void {\n const bytes = Buffer.from(content, \"utf8\");\n let offset = 0;\n while (offset < bytes.length) {\n const written = writeSync(descriptor, bytes, offset, bytes.length - offset, null);\n if (written <= 0) throw new Error(\"Progress log append made no progress\");\n offset += written;\n }\n}\n"]}
1
+ {"version":3,"file":"presentation.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EACL,sBAAsB,EAKvB,MAAM,eAAe,CAAC;AAkCvB,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAE3C,MAAM,+BAA+B,GAA6B,MAAM,CAAC,MAAM,CAAC;IAC9E,QAAQ,EAAE,CAAC,OAAmB,EAAE,UAAkB,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAClD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,GAAG,EAAE;gBACX,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,sGAAsG;AACtG,MAAM,UAAU,uBAAuB,CACrC,aAA8C,EAC9C,QAAwB,EACxB,YAAY,GAAkC,EAAE;IAEhD,IAAI,CAAC,aAAa,CAAC,OAAO;QAAE,OAAO,sBAAsB,EAAE,CAAC;IAC5D,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,IAAI,QAA+D,CAAC;IACpE,IAAI,MAAkC,CAAC;IACvC,IAAI,eAAoD,CAAC;IAEzD,MAAM,qBAAqB,GAAG,GAAS,EAAE;QACvC,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QACtB,MAAM,cAAc,GAAG,eAAe,CAAC;QACvC,eAAe,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC;YACH,cAAc,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0FAA0F;QAC5F,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,MAAM,cAAc,GAAG,eAAe,CAAC;QACvC,eAAe,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC;YACH,cAAc,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAA8C,EAAE;QACrE,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,GAAG,iBAAiB,CAAC;YACzB,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI;YAC/B,aAAa,EAAE,GAAG,EAAE;gBAClB,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YACD,QAAQ,EAAE,CAAC,YAAY,CAAC,aAAa,IAAI,qBAAqB,CAAC,EAAE;SAClE,CAAC,CAAC;QACH,QAAQ,GAAG,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC7E,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,QAA0B,EAAQ,EAAE;QAClD,IAAI,cAAc;YAAE,OAAO;QAC3B,IAAI,CAAC;YACH,cAAc,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;gBAAE,QAAQ,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,cAAc;YAAE,OAAO;QAC3B,IAAI,CAAC;YACH,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,IACE,cAAc;YACd,eAAe,KAAK,SAAS;YAC7B,eAAe,CAAC,IAAI,KAAK,CAAC;YAC1B,QAAQ,EAAE,sBAAsB,KAAK,IAAI,EACzC,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,eAAe,GAAG,CAAC,YAAY,CAAC,gBAAgB,IAAI,+BAA+B,CAAC,CAAC,QAAQ,CAC3F,OAAO,EACP,4BAA4B,CAC7B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,WAAW,EAAE,CAAC;QACd,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,0FAA0F;YAC1F,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK;QACL,QAAQ,EAAE,CAAC,WAAmB,EAAE,gCAAwC,EAAE,EAAE;YAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,gCAAgC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC;YACjC,gBAAgB,EAAE,GAAG,EAAE;gBACrB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;SACF,CAAC;QACF,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,CAAC,IAAsB,EAAE,EAAE;gBAClC,MAAM,CACJ,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;iBAC5C,CAAC,CACH,CAAC;gBACF,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC;oBAAE,WAAW,EAAE,CAAC;YAChD,CAAC;YACD,OAAO,EAAE,CAAC,IAAsB,EAAE,EAAE;gBAClC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAClC,MAAM,CACJ,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;iBAC5C,CAAC,CACH,CAAC;gBACF,YAAY,EAAE,CAAC;YACjB,CAAC;SACF,CAAC;QACF,KAAK,EAAE,CAAC,KAA4B,EAAE,EAAE;YACtC,WAAW,EAAE,CAAC;YACd,MAAM,CACJ,MAAM,CAAC,MAAM,CAAC;gBACZ,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,OAAO;aACd,CAAC,CACH,CAAC;YACF,KAAK,EAAE,CAAC;QACV,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AACD,SAAS,sBAAsB;IAC7B,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;QACxC,gBAAgB,EAAE,GAAS,EAAE,CAAC,SAAS;KACxC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,CAAC,KAAuB,EAAQ,EAAE,CAAC,SAAS;QACrD,OAAO,EAAE,CAAC,KAAuB,EAAQ,EAAE,CAAC,SAAS;KACtD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,GAAS,EAAE,CAAC,SAAS;QAC5B,QAAQ,EAAE,CAAC,YAAoB,EAAE,iCAAyC,EAAQ,EAAE,CAAC,SAAS;QAC9F,cAAc;QACd,mBAAmB;QACnB,KAAK,EAAE,CAAC,MAA6B,EAAQ,EAAE,CAAC,SAAS;KAC1D,CAAC,CAAC;AACL,CAAC;AACD,SAAS,qBAAqB;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAC1E,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;QACpC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACxB,KAIE;IAEF,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC/C,IAAI,UAA8B,CAAC;IACnC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,UAAU;YAAE,OAAO;QACvB,UAAU,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC;IACF,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,GAAS,EAAE;YAChB,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO;YACrC,IAAI,CAAC;gBACH,SAAS,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QAC3B,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QAC3B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;QACzB,KAAK,EAAE,CAAC,OAAe,EAAQ,EAAE;YAC/B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,UAAU,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO;YACnD,IAAI,CAAC;gBACH,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;QAClF,IAAI,OAAO,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1E,MAAM,IAAI,OAAO,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import { closeSync, mkdirSync, openSync, writeSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport type {\n CheckExecutionLifecycle,\n InvocationLifecycle,\n CheckSettledFact,\n CheckStartedFact\n} from \"../check-execution/lifecycle.ts\";\nimport {\n createProgressRenderer,\n type ProgressClock,\n type ProgressFeedback,\n type ProgressOutcomeCounts,\n type ProgressWriter\n} from \"./renderer.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport type { OutputStatuses } from \"../outputs/status.ts\";\nexport interface ProgressRendering {\n /** Closes only an already-created file tee; it never creates a writer after pre-work termination. */\n readonly close: () => void;\n readonly final: (input: ProgressFinalFeedback) => void;\n readonly checkLifecycle: CheckExecutionLifecycle;\n readonly invocationLifecycle: InvocationLifecycle;\n readonly prepared: (totalChecks: number, quietPassOmissionConfiguredCount: number) => void;\n}\nexport interface ProgressFinalFeedback {\n readonly counts: ProgressOutcomeCounts;\n readonly elapsedMs: number;\n readonly execution: \"cancelled\" | \"completed\";\n}\nexport type ProgressWriterFactory = () => ProgressWriter;\n\nexport interface ProgressRefreshSchedule {\n cancel(): void;\n}\n\nexport interface ProgressRefreshScheduler {\n schedule(refresh: () => void, intervalMs: number): ProgressRefreshSchedule;\n}\n\nexport interface ProgressRenderingDependencies {\n readonly clock?: ProgressClock;\n /** Caller-owned exact progress transcript target for this invocation; `null` keeps terminal-only output. */\n readonly file?: string | null;\n readonly refreshScheduler?: ProgressRefreshScheduler;\n readonly writerFactory?: ProgressWriterFactory;\n}\n\nconst PROGRESS_REFRESH_INTERVAL_MS = 5_000;\n\nconst defaultProgressRefreshScheduler: ProgressRefreshScheduler = Object.freeze({\n schedule: (refresh: () => void, intervalMs: number) => {\n const interval = setInterval(refresh, intervalMs);\n interval.unref();\n return Object.freeze({\n cancel: () => {\n clearInterval(interval);\n }\n });\n }\n});\n\n/** Owns terminal progress and its optional file tee; terminal output survives a file-only failure. */\nexport function createProgressRendering(\n configuration: ResolvedProgressRenderingOutput,\n statuses: OutputStatuses,\n dependencies: ProgressRenderingDependencies = {}\n): ProgressRendering {\n if (!configuration.enabled) return inertProgressRendering();\n let terminalFailed = false;\n let closed = false;\n const runningCheckIds = new Set<string>();\n let renderer: ReturnType<typeof createProgressRenderer> | undefined;\n let writer: ProgressWriter | undefined;\n let refreshSchedule: ProgressRefreshSchedule | undefined;\n\n const failTerminalRendering = (): void => {\n if (terminalFailed) return;\n terminalFailed = true;\n const activeSchedule = refreshSchedule;\n refreshSchedule = undefined;\n try {\n activeSchedule?.cancel();\n } catch {\n // The output is already failed; a scheduler cleanup fault must not reach Check execution.\n }\n statuses.failed(\"progressRendering\");\n };\n\n const stopRefresh = (): void => {\n const activeSchedule = refreshSchedule;\n refreshSchedule = undefined;\n try {\n activeSchedule?.cancel();\n } catch {\n failTerminalRendering();\n }\n };\n\n const createRenderer = (): ReturnType<typeof createProgressRenderer> => {\n if (renderer !== undefined) return renderer;\n writer = createProgressTee({\n file: dependencies.file ?? null,\n onFileFailure: () => {\n statuses.failed(\"progressRendering\");\n },\n terminal: (dependencies.writerFactory ?? defaultProgressWriter)()\n });\n renderer = createProgressRenderer(writer, dependencies.clock, configuration);\n return renderer;\n };\n\n const render = (feedback: ProgressFeedback): void => {\n if (terminalFailed) return;\n try {\n createRenderer().render(feedback);\n if (feedback.kind === \"final\") statuses.succeeded(\"progressRendering\");\n } catch {\n failTerminalRendering();\n }\n };\n\n const refresh = (): void => {\n if (terminalFailed) return;\n try {\n renderer?.refresh();\n } catch {\n failTerminalRendering();\n }\n };\n\n const startRefresh = (): void => {\n if (\n terminalFailed ||\n refreshSchedule !== undefined ||\n runningCheckIds.size === 0 ||\n renderer?.refreshesRunningRegion !== true\n ) {\n return;\n }\n try {\n refreshSchedule = (dependencies.refreshScheduler ?? defaultProgressRefreshScheduler).schedule(\n refresh,\n PROGRESS_REFRESH_INTERVAL_MS\n );\n } catch {\n failTerminalRendering();\n }\n };\n\n const close = (): void => {\n if (closed) return;\n closed = true;\n stopRefresh();\n if (writer === undefined) return;\n try {\n writer.close?.();\n } catch {\n // A terminal writer close is an output failure; a tee contains file-only failures itself.\n statuses.failed(\"progressRendering\");\n }\n };\n\n return Object.freeze({\n close,\n prepared: (totalChecks: number, quietPassOmissionConfiguredCount: number) => {\n render(Object.freeze({ kind: \"prepared\", quietPassOmissionConfiguredCount, totalChecks }));\n },\n invocationLifecycle: Object.freeze({\n selectionSettled: () => {\n render(Object.freeze({ kind: \"flag-control-completed\" }));\n }\n }),\n checkLifecycle: Object.freeze({\n settled: (fact: CheckSettledFact) => {\n render(\n Object.freeze({\n kind: \"settled\",\n checkId: fact.checkId,\n displayName: fact.displayName,\n durationMs: fact.durationMs,\n messages: fact.messages,\n outcome: fact.outcome,\n records: fact.records,\n omitQuietPassedRow: fact.omitQuietPassedRow\n })\n );\n runningCheckIds.delete(fact.checkId);\n if (runningCheckIds.size === 0) stopRefresh();\n },\n started: (fact: CheckStartedFact) => {\n runningCheckIds.add(fact.checkId);\n render(\n Object.freeze({\n kind: \"started\",\n checkId: fact.checkId,\n displayName: fact.displayName,\n omitQuietPassedRow: fact.omitQuietPassedRow\n })\n );\n startRefresh();\n }\n }),\n final: (input: ProgressFinalFeedback) => {\n stopRefresh();\n render(\n Object.freeze({\n counts: input.counts,\n elapsedMs: input.elapsedMs,\n execution: input.execution,\n kind: \"final\"\n })\n );\n close();\n }\n });\n}\nfunction inertProgressRendering(): ProgressRendering {\n const invocationLifecycle = Object.freeze({\n selectionSettled: (): void => undefined\n });\n const checkLifecycle = Object.freeze({\n settled: (_fact: CheckSettledFact): void => undefined,\n started: (_fact: CheckStartedFact): void => undefined\n });\n return Object.freeze({\n close: (): void => undefined,\n prepared: (_totalChecks: number, _quietPassOmissionConfiguredCount: number): void => undefined,\n checkLifecycle,\n invocationLifecycle,\n final: (_input: ProgressFinalFeedback): void => undefined\n });\n}\nfunction defaultProgressWriter(): ProgressWriter {\n return Object.freeze({\n color: process.stdout.isTTY === true && process.env.NO_COLOR === undefined,\n isTTY: process.stdout.isTTY === true,\n term: process.env.TERM,\n write: (content: string) => {\n process.stdout.write(content);\n }\n });\n}\n\nfunction createProgressTee(\n input: Readonly<{\n readonly file: string | null;\n readonly onFileFailure: () => void;\n readonly terminal: ProgressWriter;\n }>\n): ProgressWriter {\n if (input.file === null) return input.terminal;\n let descriptor: number | undefined;\n let fileFailed = false;\n let closed = false;\n const failFile = (): void => {\n if (fileFailed) return;\n fileFailed = true;\n input.onFileFailure();\n };\n try {\n mkdirSync(dirname(input.file), { recursive: true });\n descriptor = openSync(input.file, \"wx\");\n } catch {\n failFile();\n }\n return Object.freeze({\n close: (): void => {\n if (closed) return;\n closed = true;\n if (descriptor === undefined) return;\n try {\n closeSync(descriptor);\n } catch {\n failFile();\n }\n descriptor = undefined;\n },\n color: input.terminal.color,\n isTTY: input.terminal.isTTY,\n term: input.terminal.term,\n write: (content: string): void => {\n input.terminal.write(content);\n if (fileFailed || descriptor === undefined) return;\n try {\n writeFileBuffer(descriptor, content);\n } catch {\n failFile();\n }\n }\n });\n}\n\nfunction writeFileBuffer(descriptor: number, content: string): void {\n const bytes = Buffer.from(content, \"utf8\");\n let offset = 0;\n while (offset < bytes.length) {\n const written = writeSync(descriptor, bytes, offset, bytes.length - offset, null);\n if (written <= 0) throw new Error(\"Progress log append made no progress\");\n offset += written;\n }\n}\n"]}
@@ -15,10 +15,11 @@ const NAMED_CONTROL_ESCAPES = Object.freeze({
15
15
  });
16
16
  export function formatRunningRow(input) {
17
17
  const elapsed = input.elapsedMs === null ? "" : ` | ${formatDuration(input.elapsedMs)}`;
18
- return ` [${input.displayIndex}/${input.totalChecks}] ${escapeTerminalText(input.displayName)} | running${elapsed}\n`;
18
+ const ordinal = input.displayIndex === undefined ? "·" : `[${input.displayIndex}/${input.totalChecks}]`;
19
+ return ` ${ordinal} ${escapeTerminalText(input.displayName)} | running${elapsed}\n`;
19
20
  }
20
21
  export function shouldPresentSettledFeedback(feedback) {
21
- return (feedback.visibility !== "attention" ||
22
+ return (!feedback.omitQuietPassedRow ||
22
23
  feedback.outcome.status !== "passed" ||
23
24
  feedback.messages.length > 0 ||
24
25
  feedback.records.length > 0);
@@ -43,7 +44,10 @@ export function formatSettledBlock(input) {
43
44
  const reason = reasonForOutcome(input.outcome);
44
45
  const duration = input.durationMs === null ? "not run" : formatDuration(input.durationMs);
45
46
  const reasonSuffix = reason === undefined ? "" : ` | ${escapeTerminalText(reason)}`;
46
- const row = ` [${input.completionOrdinal}/${input.totalChecks}] ${escapeTerminalText(input.displayName)} | ${status} | ${duration}${reasonSuffix}\n`;
47
+ const ordinal = input.completionOrdinal === undefined
48
+ ? "·"
49
+ : `[${input.completionOrdinal}/${input.totalChecks}]`;
50
+ const row = ` ${ordinal} ${escapeTerminalText(input.displayName)} | ${status} | ${duration}${reasonSuffix}\n`;
47
51
  const recordPreview = formatRecords(input.records, input.progressRendering);
48
52
  const messagePreview = formatMessages(input.messages, input.usesColor, input.progressRendering);
49
53
  return `${row}${recordPreview}${messagePreview}`;
@@ -58,6 +62,9 @@ export function formatFinalSummary(input) {
58
62
  ` failed: ${input.counts.failed}`,
59
63
  ` not applicable: ${input.counts.notApplicable}`,
60
64
  ` unavailable: ${input.counts.unavailable}`,
65
+ ...(input.quietPassOmissionConfiguredCount === 0
66
+ ? []
67
+ : [` quiet-pass rows omitted: ${input.quietPassOmittedCount}`]),
61
68
  ` elapsed: ${formatDuration(input.elapsedMs)}`,
62
69
  ""
63
70
  ].join("\n");
@@ -104,7 +111,7 @@ function formattedPreviewText(kind, text, progressRendering) {
104
111
  function observeRejectedPromise(value) {
105
112
  if (types.isPromise(value)) {
106
113
  // The intrinsic call observes a real Promise without reading a caller-controlled `.then`.
107
- // eslint-disable-next-line typescript/no-floating-promises -- rendering must not await formatter misuse.
114
+ // oxlint-disable-next-line typescript/no-floating-promises -- rendering must not await formatter misuse.
108
115
  void Promise.prototype.then.call(value, undefined, () => undefined);
109
116
  }
110
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-formatting.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/renderer-formatting.ts"],"names":[],"mappings":"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","sourcesContent":["import { types } from \"node:util\";\n\nimport type { CheckMessage, CheckOutcome } from \"../../check/check.ts\";\nimport type { CoreRecord } from \"../../check-settlement/facts.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport { canonicalJsonText } from \"../../data-boundary/canonical-data.ts\";\nimport { FLAG_CONDITION_NOT_MATCHED_CODE } from \"../check-execution/flag-controls.ts\";\nimport type { ProgressFeedback, ProgressOutcomeCounts } from \"./renderer.ts\";\n\nconst COLOR = Object.freeze({\n error: \"\\u001B[31m\",\n info: \"\\u001B[36m\",\n reset: \"\\u001B[0m\",\n warning: \"\\u001B[33m\"\n});\n\nconst TRUNCATION_MARKER = \"… [truncated]\";\n\nconst NAMED_CONTROL_ESCAPES: Readonly<Partial<Record<string, string>>> = Object.freeze({\n \"\\n\": \"\\\\n\",\n \"\\r\": \"\\\\r\",\n \"\\t\": \"\\\\t\"\n});\n\nexport function formatRunningRow(\n input: Readonly<{\n readonly displayIndex: number;\n readonly displayName: string;\n readonly elapsedMs: number | null;\n readonly totalChecks: number;\n }>\n): string {\n const elapsed = input.elapsedMs === null ? \"\" : ` | ${formatDuration(input.elapsedMs)}`;\n return ` [${input.displayIndex}/${input.totalChecks}] ${escapeTerminalText(input.displayName)} | running${elapsed}\\n`;\n}\n\nexport function shouldPresentSettledFeedback(\n feedback: Extract<ProgressFeedback, { readonly kind: \"settled\" }>\n): boolean {\n return (\n feedback.visibility !== \"attention\" ||\n feedback.outcome.status !== \"passed\" ||\n feedback.messages.length > 0 ||\n feedback.records.length > 0\n );\n}\n\nexport function isFlagConditionNotMatchedFeedback(\n feedback: Extract<ProgressFeedback, { readonly kind: \"settled\" }>\n): boolean {\n return (\n feedback.durationMs === null &&\n feedback.messages.length === 0 &&\n feedback.records.length === 0 &&\n feedback.outcome.status === \"not-applicable\" &&\n feedback.outcome.reason?.code === FLAG_CONDITION_NOT_MATCHED_CODE\n );\n}\n\nexport function formatFlagConditionNotMatchedBlock(\n displayNames: readonly [string, ...string[]]\n): string {\n const subject =\n displayNames.length === 1\n ? \"The following check did not run because the run flags did not match its condition:\"\n : `The following ${displayNames.length} checks did not run because the run flags did not match their conditions:`;\n return ` ${subject}\\n${displayNames\n .map((displayName) => ` - ${escapeTerminalText(displayName)}\\n`)\n .join(\"\")}`;\n}\n\nexport function formatSettledBlock(\n input: Readonly<{\n readonly completionOrdinal: number;\n readonly displayName: string;\n readonly durationMs: number | null;\n readonly messages: readonly CheckMessage[];\n readonly outcome: CheckOutcome;\n readonly records: readonly CoreRecord[];\n readonly totalChecks: number;\n readonly usesColor: boolean;\n readonly progressRendering: ResolvedProgressRenderingOutput;\n }>\n): string {\n const status = statusForOutcome(input.outcome);\n const reason = reasonForOutcome(input.outcome);\n const duration = input.durationMs === null ? \"not run\" : formatDuration(input.durationMs);\n const reasonSuffix = reason === undefined ? \"\" : ` | ${escapeTerminalText(reason)}`;\n const row = ` [${input.completionOrdinal}/${input.totalChecks}] ${escapeTerminalText(input.displayName)} | ${status} | ${duration}${reasonSuffix}\\n`;\n const recordPreview = formatRecords(input.records, input.progressRendering);\n const messagePreview = formatMessages(input.messages, input.usesColor, input.progressRendering);\n return `${row}${recordPreview}${messagePreview}`;\n}\n\nexport function formatFinalSummary(\n input: Extract<ProgressFeedback, { readonly kind: \"final\" }>\n): string {\n return [\n \"\",\n \"Execution summary:\",\n ` execution: ${input.execution}`,\n ` total checks: ${totalChecks(input.counts)}`,\n ` passed: ${input.counts.passed}`,\n ` failed: ${input.counts.failed}`,\n ` not applicable: ${input.counts.notApplicable}`,\n ` unavailable: ${input.counts.unavailable}`,\n ` elapsed: ${formatDuration(input.elapsedMs)}`,\n \"\"\n ].join(\"\\n\");\n}\n\nfunction formatRecords(\n records: readonly CoreRecord[],\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n return formatPreview(\n records,\n (record) => formatRecord(record, progressRendering),\n \"record\",\n progressRendering.recordPreviewLimit\n );\n}\n\nfunction formatMessages(\n messages: readonly CheckMessage[],\n usesColor: boolean,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n return formatPreview(\n messages,\n (message) => formatMessage(message, usesColor, progressRendering),\n \"message\",\n progressRendering.messagePreviewLimit\n );\n}\n\nfunction formatPreview<Item>(\n items: readonly Item[],\n formatItem: (item: Item) => string,\n previewKind: \"message\" | \"record\",\n limit: number\n): string {\n const preview = items.slice(0, limit);\n const omittedCount = items.length - preview.length;\n let renderedPreview = \"\";\n // Caller formatters run once in selection order; a throw stops the current block.\n for (const item of preview) renderedPreview += formatItem(item);\n if (omittedCount === 0) return renderedPreview;\n return `${renderedPreview} [${previewKind}s] ${omittedCount} additional ${previewKind}(s) were omitted from terminal preview.\\n`;\n}\n\nfunction formatRecord(\n record: CoreRecord,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n const defaultText = `${record.id} | ${canonicalJsonText(record.data)}`;\n const formattedText = formattedPreviewText(\"record\", defaultText, progressRendering);\n const previewText = boundedTerminalText(\n formattedText,\n progressRendering.textPreviewCodePointLimit\n );\n return ` [record] ${previewText}\\n`;\n}\n\nfunction formatMessage(\n message: CheckMessage,\n usesColor: boolean,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n const label = colorMessageLevel(message.level, usesColor);\n const formattedText = formattedPreviewText(\"message\", message.message, progressRendering);\n const previewText = boundedTerminalText(\n formattedText,\n progressRendering.textPreviewCodePointLimit\n );\n return ` [${label}] ${previewText}\\n`;\n}\n\nfunction formattedPreviewText(\n kind: \"record\" | \"message\",\n text: string,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n const formatter = progressRendering.formatter;\n if (formatter === null) return text;\n const formatted: unknown = formatter(\n Object.freeze({ kind, maxCodePoints: progressRendering.textPreviewCodePointLimit, text })\n );\n if (typeof formatted === \"string\") return formatted;\n observeRejectedPromise(formatted);\n throw new TypeError(\"Progress preview formatter must synchronously return a string\");\n}\n\nfunction observeRejectedPromise(value: unknown): void {\n if (types.isPromise(value)) {\n // The intrinsic call observes a real Promise without reading a caller-controlled `.then`.\n // eslint-disable-next-line typescript/no-floating-promises -- rendering must not await formatter misuse.\n void Promise.prototype.then.call(value, undefined, () => undefined);\n }\n}\n\nfunction boundedTerminalText(value: string, maximumCodePoints: number): string {\n const escaped = escapeTerminalText(value);\n if (codePointLength(escaped) <= maximumCodePoints) return escaped;\n const marker = prefixByCodePoints(TRUNCATION_MARKER, maximumCodePoints);\n const textBudget = maximumCodePoints - codePointLength(marker);\n return `${prefixByCodePoints(escaped, textBudget)}${marker}`;\n}\n\n/** Human-only fields must not control the terminal that presents them. */\nfunction escapeTerminalText(value: string): string {\n let escaped = \"\";\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n const namedEscape = NAMED_CONTROL_ESCAPES[character];\n if (namedEscape !== undefined) {\n escaped += namedEscape;\n continue;\n }\n escaped += isTerminalControl(codePoint)\n ? `\\\\u${codePoint.toString(16).padStart(4, \"0\").toUpperCase()}`\n : character;\n }\n return escaped;\n}\n\nfunction codePointLength(value: string): number {\n let length = 0;\n for (const _character of value) length += 1;\n return length;\n}\n\nfunction prefixByCodePoints(value: string, limit: number): string {\n let prefix = \"\";\n let length = 0;\n for (const character of value) {\n if (length === limit) break;\n prefix += character;\n length += 1;\n }\n return prefix;\n}\n\nfunction isTerminalControl(codePoint: number): boolean {\n return (\n codePoint <= 0x1f ||\n (codePoint >= 0x7f && codePoint <= 0x9f) ||\n codePoint === 0x2028 ||\n codePoint === 0x2029\n );\n}\n\nfunction colorMessageLevel(level: CheckMessage[\"level\"], usesColor: boolean): string {\n if (!usesColor) return level;\n return `${COLOR[level]}${level}${COLOR.reset}`;\n}\n\ntype ProgressStatus = CheckOutcome[\"status\"];\n\nfunction statusForOutcome(outcome: CheckOutcome): ProgressStatus {\n switch (outcome.status) {\n case \"passed\":\n case \"failed\":\n return outcome.status;\n case \"not-applicable\":\n return \"not-applicable\";\n case \"unavailable\":\n return \"unavailable\";\n }\n}\n\nfunction reasonForOutcome(outcome: CheckOutcome): string | undefined {\n return outcome.status === \"passed\" || outcome.status === \"failed\"\n ? undefined\n : outcome.reason?.code;\n}\n\nfunction totalChecks(counts: ProgressOutcomeCounts): number {\n return counts.passed + counts.failed + counts.notApplicable + counts.unavailable;\n}\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1_000) {\n return `${Number.isInteger(durationMs) ? durationMs : Number(durationMs.toFixed(1))}ms`;\n }\n const seconds = durationMs / 1_000;\n return `${Number.isInteger(seconds) ? seconds : Number(seconds.toFixed(1))}s`;\n}\n"]}
1
+ {"version":3,"file":"renderer-formatting.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/renderer-formatting.ts"],"names":[],"mappings":"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","sourcesContent":["import { types } from \"node:util\";\n\nimport type { CheckMessage, CheckOutcome } from \"../../check/check.ts\";\nimport type { CoreRecord } from \"../../check-settlement/facts.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport { canonicalJsonText } from \"../../data-boundary/canonical-data.ts\";\nimport { FLAG_CONDITION_NOT_MATCHED_CODE } from \"../check-execution/flag-controls.ts\";\nimport type { ProgressFeedback, ProgressOutcomeCounts } from \"./renderer.ts\";\n\nconst COLOR = Object.freeze({\n error: \"\\u001B[31m\",\n info: \"\\u001B[36m\",\n reset: \"\\u001B[0m\",\n warning: \"\\u001B[33m\"\n});\n\nconst TRUNCATION_MARKER = \"… [truncated]\";\n\nconst NAMED_CONTROL_ESCAPES: Readonly<Partial<Record<string, string>>> = Object.freeze({\n \"\\n\": \"\\\\n\",\n \"\\r\": \"\\\\r\",\n \"\\t\": \"\\\\t\"\n});\n\nexport function formatRunningRow(\n input: Readonly<{\n readonly displayIndex: number | undefined;\n readonly displayName: string;\n readonly elapsedMs: number | null;\n readonly totalChecks: number;\n }>\n): string {\n const elapsed = input.elapsedMs === null ? \"\" : ` | ${formatDuration(input.elapsedMs)}`;\n const ordinal =\n input.displayIndex === undefined ? \"·\" : `[${input.displayIndex}/${input.totalChecks}]`;\n return ` ${ordinal} ${escapeTerminalText(input.displayName)} | running${elapsed}\\n`;\n}\n\nexport function shouldPresentSettledFeedback(\n feedback: Extract<ProgressFeedback, { readonly kind: \"settled\" }>\n): boolean {\n return (\n !feedback.omitQuietPassedRow ||\n feedback.outcome.status !== \"passed\" ||\n feedback.messages.length > 0 ||\n feedback.records.length > 0\n );\n}\n\nexport function isFlagConditionNotMatchedFeedback(\n feedback: Extract<ProgressFeedback, { readonly kind: \"settled\" }>\n): boolean {\n return (\n feedback.durationMs === null &&\n feedback.messages.length === 0 &&\n feedback.records.length === 0 &&\n feedback.outcome.status === \"not-applicable\" &&\n feedback.outcome.reason?.code === FLAG_CONDITION_NOT_MATCHED_CODE\n );\n}\n\nexport function formatFlagConditionNotMatchedBlock(\n displayNames: readonly [string, ...string[]]\n): string {\n const subject =\n displayNames.length === 1\n ? \"The following check did not run because the run flags did not match its condition:\"\n : `The following ${displayNames.length} checks did not run because the run flags did not match their conditions:`;\n return ` ${subject}\\n${displayNames\n .map((displayName) => ` - ${escapeTerminalText(displayName)}\\n`)\n .join(\"\")}`;\n}\n\nexport function formatSettledBlock(\n input: Readonly<{\n readonly completionOrdinal: number | undefined;\n readonly displayName: string;\n readonly durationMs: number | null;\n readonly messages: readonly CheckMessage[];\n readonly outcome: CheckOutcome;\n readonly records: readonly CoreRecord[];\n readonly totalChecks: number;\n readonly usesColor: boolean;\n readonly progressRendering: ResolvedProgressRenderingOutput;\n }>\n): string {\n const status = statusForOutcome(input.outcome);\n const reason = reasonForOutcome(input.outcome);\n const duration = input.durationMs === null ? \"not run\" : formatDuration(input.durationMs);\n const reasonSuffix = reason === undefined ? \"\" : ` | ${escapeTerminalText(reason)}`;\n const ordinal =\n input.completionOrdinal === undefined\n ? \"·\"\n : `[${input.completionOrdinal}/${input.totalChecks}]`;\n const row = ` ${ordinal} ${escapeTerminalText(input.displayName)} | ${status} | ${duration}${reasonSuffix}\\n`;\n const recordPreview = formatRecords(input.records, input.progressRendering);\n const messagePreview = formatMessages(input.messages, input.usesColor, input.progressRendering);\n return `${row}${recordPreview}${messagePreview}`;\n}\n\nexport function formatFinalSummary(\n input: Extract<ProgressFeedback, { readonly kind: \"final\" }> &\n Readonly<{\n readonly quietPassOmissionConfiguredCount: number;\n readonly quietPassOmittedCount: number;\n }>\n): string {\n return [\n \"\",\n \"Execution summary:\",\n ` execution: ${input.execution}`,\n ` total checks: ${totalChecks(input.counts)}`,\n ` passed: ${input.counts.passed}`,\n ` failed: ${input.counts.failed}`,\n ` not applicable: ${input.counts.notApplicable}`,\n ` unavailable: ${input.counts.unavailable}`,\n ...(input.quietPassOmissionConfiguredCount === 0\n ? []\n : [` quiet-pass rows omitted: ${input.quietPassOmittedCount}`]),\n ` elapsed: ${formatDuration(input.elapsedMs)}`,\n \"\"\n ].join(\"\\n\");\n}\n\nfunction formatRecords(\n records: readonly CoreRecord[],\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n return formatPreview(\n records,\n (record) => formatRecord(record, progressRendering),\n \"record\",\n progressRendering.recordPreviewLimit\n );\n}\n\nfunction formatMessages(\n messages: readonly CheckMessage[],\n usesColor: boolean,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n return formatPreview(\n messages,\n (message) => formatMessage(message, usesColor, progressRendering),\n \"message\",\n progressRendering.messagePreviewLimit\n );\n}\n\nfunction formatPreview<Item>(\n items: readonly Item[],\n formatItem: (item: Item) => string,\n previewKind: \"message\" | \"record\",\n limit: number\n): string {\n const preview = items.slice(0, limit);\n const omittedCount = items.length - preview.length;\n let renderedPreview = \"\";\n // Caller formatters run once in selection order; a throw stops the current block.\n for (const item of preview) renderedPreview += formatItem(item);\n if (omittedCount === 0) return renderedPreview;\n return `${renderedPreview} [${previewKind}s] ${omittedCount} additional ${previewKind}(s) were omitted from terminal preview.\\n`;\n}\n\nfunction formatRecord(\n record: CoreRecord,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n const defaultText = `${record.id} | ${canonicalJsonText(record.data)}`;\n const formattedText = formattedPreviewText(\"record\", defaultText, progressRendering);\n const previewText = boundedTerminalText(\n formattedText,\n progressRendering.textPreviewCodePointLimit\n );\n return ` [record] ${previewText}\\n`;\n}\n\nfunction formatMessage(\n message: CheckMessage,\n usesColor: boolean,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n const label = colorMessageLevel(message.level, usesColor);\n const formattedText = formattedPreviewText(\"message\", message.message, progressRendering);\n const previewText = boundedTerminalText(\n formattedText,\n progressRendering.textPreviewCodePointLimit\n );\n return ` [${label}] ${previewText}\\n`;\n}\n\nfunction formattedPreviewText(\n kind: \"record\" | \"message\",\n text: string,\n progressRendering: ResolvedProgressRenderingOutput\n): string {\n const formatter = progressRendering.formatter;\n if (formatter === null) return text;\n const formatted: unknown = formatter(\n Object.freeze({ kind, maxCodePoints: progressRendering.textPreviewCodePointLimit, text })\n );\n if (typeof formatted === \"string\") return formatted;\n observeRejectedPromise(formatted);\n throw new TypeError(\"Progress preview formatter must synchronously return a string\");\n}\n\nfunction observeRejectedPromise(value: unknown): void {\n if (types.isPromise(value)) {\n // The intrinsic call observes a real Promise without reading a caller-controlled `.then`.\n // oxlint-disable-next-line typescript/no-floating-promises -- rendering must not await formatter misuse.\n void Promise.prototype.then.call(value, undefined, () => undefined);\n }\n}\n\nfunction boundedTerminalText(value: string, maximumCodePoints: number): string {\n const escaped = escapeTerminalText(value);\n if (codePointLength(escaped) <= maximumCodePoints) return escaped;\n const marker = prefixByCodePoints(TRUNCATION_MARKER, maximumCodePoints);\n const textBudget = maximumCodePoints - codePointLength(marker);\n return `${prefixByCodePoints(escaped, textBudget)}${marker}`;\n}\n\n/** Human-only fields must not control the terminal that presents them. */\nfunction escapeTerminalText(value: string): string {\n let escaped = \"\";\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n const namedEscape = NAMED_CONTROL_ESCAPES[character];\n if (namedEscape !== undefined) {\n escaped += namedEscape;\n continue;\n }\n escaped += isTerminalControl(codePoint)\n ? `\\\\u${codePoint.toString(16).padStart(4, \"0\").toUpperCase()}`\n : character;\n }\n return escaped;\n}\n\nfunction codePointLength(value: string): number {\n let length = 0;\n for (const _character of value) length += 1;\n return length;\n}\n\nfunction prefixByCodePoints(value: string, limit: number): string {\n let prefix = \"\";\n let length = 0;\n for (const character of value) {\n if (length === limit) break;\n prefix += character;\n length += 1;\n }\n return prefix;\n}\n\nfunction isTerminalControl(codePoint: number): boolean {\n return (\n codePoint <= 0x1f ||\n (codePoint >= 0x7f && codePoint <= 0x9f) ||\n codePoint === 0x2028 ||\n codePoint === 0x2029\n );\n}\n\nfunction colorMessageLevel(level: CheckMessage[\"level\"], usesColor: boolean): string {\n if (!usesColor) return level;\n return `${COLOR[level]}${level}${COLOR.reset}`;\n}\n\ntype ProgressStatus = CheckOutcome[\"status\"];\n\nfunction statusForOutcome(outcome: CheckOutcome): ProgressStatus {\n switch (outcome.status) {\n case \"passed\":\n case \"failed\":\n return outcome.status;\n case \"not-applicable\":\n return \"not-applicable\";\n case \"unavailable\":\n return \"unavailable\";\n }\n}\n\nfunction reasonForOutcome(outcome: CheckOutcome): string | undefined {\n return outcome.status === \"passed\" || outcome.status === \"failed\"\n ? undefined\n : outcome.reason?.code;\n}\n\nfunction totalChecks(counts: ProgressOutcomeCounts): number {\n return counts.passed + counts.failed + counts.notApplicable + counts.unavailable;\n}\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1_000) {\n return `${Number.isInteger(durationMs) ? durationMs : Number(durationMs.toFixed(1))}ms`;\n }\n const seconds = durationMs / 1_000;\n return `${Number.isInteger(seconds) ? seconds : Number(seconds.toFixed(1))}s`;\n}\n"]}
@@ -6,6 +6,8 @@ export class ProgressRendererController {
6
6
  writer;
7
7
  completedCount = 0;
8
8
  flagConditionNotMatchedDisplayNames = [];
9
+ quietPassOmissionConfiguredCount = 0;
10
+ quietPassOmittedCount = 0;
9
11
  preparedTotal;
10
12
  renderedRunningRows = 0;
11
13
  running = [];
@@ -29,7 +31,7 @@ export class ProgressRendererController {
29
31
  render(feedback) {
30
32
  switch (feedback.kind) {
31
33
  case "prepared":
32
- this.prepare(feedback.totalChecks);
34
+ this.prepare(feedback.totalChecks, feedback.quietPassOmissionConfiguredCount);
33
35
  return;
34
36
  case "flag-control-completed":
35
37
  this.completeFlagControl();
@@ -44,11 +46,15 @@ export class ProgressRendererController {
44
46
  this.finish(feedback);
45
47
  }
46
48
  }
47
- prepare(totalChecks) {
49
+ prepare(totalChecks, quietPassOmissionConfiguredCount) {
48
50
  if (this.preparedTotal !== undefined)
49
51
  throw new Error("Progress feedback was prepared twice");
50
52
  this.preparedTotal = totalChecks;
51
- this.writer.write(`Vibe Check\ntotal ${totalChecks} checks\n\nChecks:\n`);
53
+ this.quietPassOmissionConfiguredCount = quietPassOmissionConfiguredCount;
54
+ const configuredSuffix = quietPassOmissionConfiguredCount === 0
55
+ ? ""
56
+ : ` · ${quietPassOmissionConfiguredCount} configured for quiet-pass omission`;
57
+ this.writer.write(`Vibe Check\ntotal ${totalChecks} checks${configuredSuffix}\n\nChecks:\n`);
52
58
  }
53
59
  start(feedback) {
54
60
  if (!this.refreshesRunningRegion)
@@ -58,6 +64,7 @@ export class ProgressRendererController {
58
64
  this.running.push({
59
65
  checkId: feedback.checkId,
60
66
  displayName: feedback.displayName,
67
+ omitQuietPassedRow: feedback.omitQuietPassedRow,
61
68
  elapsedMs: null,
62
69
  startedAtMs: this.clock.now()
63
70
  });
@@ -74,7 +81,7 @@ export class ProgressRendererController {
74
81
  }
75
82
  else if (shouldPresentSettledFeedback(feedback)) {
76
83
  this.writer.write(formatSettledBlock({
77
- completionOrdinal: this.completedCount,
84
+ completionOrdinal: feedback.omitQuietPassedRow ? undefined : this.completedCount,
78
85
  displayName: feedback.displayName,
79
86
  durationMs: feedback.durationMs,
80
87
  messages: feedback.messages,
@@ -85,6 +92,9 @@ export class ProgressRendererController {
85
92
  progressRendering: this.progressRendering
86
93
  }));
87
94
  }
95
+ else {
96
+ this.quietPassOmittedCount += 1;
97
+ }
88
98
  if (this.refreshesRunningRegion)
89
99
  this.redrawRunningRegion();
90
100
  }
@@ -94,7 +104,11 @@ export class ProgressRendererController {
94
104
  throw new Error("Progress feedback finalized while Checks are still running");
95
105
  }
96
106
  this.flushFlagConditionNotMatchedChecks();
97
- this.writer.write(formatFinalSummary(feedback));
107
+ this.writer.write(formatFinalSummary({
108
+ ...feedback,
109
+ quietPassOmissionConfiguredCount: this.quietPassOmissionConfiguredCount,
110
+ quietPassOmittedCount: this.quietPassOmittedCount
111
+ }));
98
112
  }
99
113
  completeFlagControl() {
100
114
  this.requirePrepared();
@@ -120,9 +134,9 @@ export class ProgressRendererController {
120
134
  const totalChecks = this.requirePrepared();
121
135
  for (const [index, check] of this.running.entries()) {
122
136
  this.writer.write(formatRunningRow({
123
- displayIndex: this.completedCount + index + 1,
124
137
  displayName: check.displayName,
125
138
  elapsedMs: check.elapsedMs,
139
+ displayIndex: check.omitQuietPassedRow ? undefined : this.completedCount + index + 1,
126
140
  totalChecks
127
141
  }));
128
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-lifecycle.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/renderer-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ProgressClock,\n ProgressFeedback,\n ProgressRenderer,\n ProgressWriter\n} from \"./renderer.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport {\n formatFlagConditionNotMatchedBlock,\n formatFinalSummary,\n formatRunningRow,\n formatSettledBlock,\n isFlagConditionNotMatchedFeedback,\n shouldPresentSettledFeedback\n} from \"./renderer-formatting.ts\";\n\ninterface RunningCheck {\n readonly checkId: string;\n readonly displayName: string;\n readonly startedAtMs: number;\n elapsedMs: number | null;\n}\n\n/** Maintains the mutable lifecycle state and the TTY-only running terminal region. */\nexport class ProgressRendererController implements ProgressRenderer {\n readonly refreshesRunningRegion: boolean;\n\n private readonly clock: ProgressClock;\n private readonly writer: ProgressWriter;\n private completedCount = 0;\n private readonly flagConditionNotMatchedDisplayNames: string[] = [];\n private preparedTotal: number | undefined;\n private renderedRunningRows = 0;\n private readonly running: RunningCheck[] = [];\n private readonly usesColor: boolean;\n private readonly progressRendering: ResolvedProgressRenderingOutput;\n\n constructor(\n writer: ProgressWriter,\n clock: ProgressClock,\n progressRendering: ResolvedProgressRenderingOutput\n ) {\n this.writer = writer;\n this.clock = clock;\n this.progressRendering = progressRendering;\n this.refreshesRunningRegion = writer.isTTY && writer.term?.toLowerCase() !== \"dumb\";\n this.usesColor = this.refreshesRunningRegion && writer.color;\n }\n\n refresh(): void {\n if (!this.refreshesRunningRegion || this.running.length === 0) return;\n this.requirePrepared();\n this.eraseRunningRegion();\n this.updateRunningDurations(this.clock.now());\n this.redrawRunningRegion();\n }\n\n render(feedback: ProgressFeedback): void {\n switch (feedback.kind) {\n case \"prepared\":\n this.prepare(feedback.totalChecks);\n return;\n case \"flag-control-completed\":\n this.completeFlagControl();\n return;\n case \"started\":\n this.start(feedback);\n return;\n case \"settled\":\n this.settle(feedback);\n return;\n case \"final\":\n this.finish(feedback);\n }\n }\n\n private prepare(totalChecks: number): void {\n if (this.preparedTotal !== undefined) throw new Error(\"Progress feedback was prepared twice\");\n this.preparedTotal = totalChecks;\n this.writer.write(`Vibe Check\\ntotal ${totalChecks} checks\\n\\nChecks:\\n`);\n }\n\n private start(feedback: Extract<ProgressFeedback, { readonly kind: \"started\" }>): void {\n if (!this.refreshesRunningRegion) return;\n this.requirePrepared();\n this.eraseRunningRegion();\n this.running.push({\n checkId: feedback.checkId,\n displayName: feedback.displayName,\n elapsedMs: null,\n startedAtMs: this.clock.now()\n });\n this.redrawRunningRegion();\n }\n\n private settle(feedback: Extract<ProgressFeedback, { readonly kind: \"settled\" }>): void {\n const totalChecks = this.requirePrepared();\n if (this.refreshesRunningRegion) this.eraseRunningRegion();\n this.completedCount += 1;\n this.removeRunningCheck(feedback.checkId);\n if (isFlagConditionNotMatchedFeedback(feedback)) {\n this.flagConditionNotMatchedDisplayNames.push(feedback.displayName);\n } else if (shouldPresentSettledFeedback(feedback)) {\n this.writer.write(\n formatSettledBlock({\n completionOrdinal: this.completedCount,\n displayName: feedback.displayName,\n durationMs: feedback.durationMs,\n messages: feedback.messages,\n outcome: feedback.outcome,\n records: feedback.records,\n totalChecks,\n usesColor: this.usesColor,\n progressRendering: this.progressRendering\n })\n );\n }\n if (this.refreshesRunningRegion) this.redrawRunningRegion();\n }\n\n private finish(feedback: Extract<ProgressFeedback, { readonly kind: \"final\" }>): void {\n this.requirePrepared();\n if (this.running.length > 0) {\n throw new Error(\"Progress feedback finalized while Checks are still running\");\n }\n this.flushFlagConditionNotMatchedChecks();\n this.writer.write(formatFinalSummary(feedback));\n }\n\n private completeFlagControl(): void {\n this.requirePrepared();\n this.flushFlagConditionNotMatchedChecks();\n }\n\n private flushFlagConditionNotMatchedChecks(): void {\n const firstDisplayName = this.flagConditionNotMatchedDisplayNames[0];\n if (firstDisplayName === undefined) return;\n this.writer.write(\n formatFlagConditionNotMatchedBlock([\n firstDisplayName,\n ...this.flagConditionNotMatchedDisplayNames.slice(1)\n ])\n );\n this.flagConditionNotMatchedDisplayNames.length = 0;\n }\n\n private eraseRunningRegion(): void {\n for (let index = 0; index < this.renderedRunningRows; index += 1) {\n this.writer.write(\"\\u001B[1A\\u001B[2K\");\n }\n this.renderedRunningRows = 0;\n }\n\n private redrawRunningRegion(): void {\n const totalChecks = this.requirePrepared();\n for (const [index, check] of this.running.entries()) {\n this.writer.write(\n formatRunningRow({\n displayIndex: this.completedCount + index + 1,\n displayName: check.displayName,\n elapsedMs: check.elapsedMs,\n totalChecks\n })\n );\n }\n this.renderedRunningRows = this.running.length;\n }\n\n private removeRunningCheck(checkId: string): void {\n const index = this.running.findIndex((check) => check.checkId === checkId);\n if (index >= 0) this.running.splice(index, 1);\n }\n\n private updateRunningDurations(refreshedAtMs: number): void {\n for (const check of this.running) {\n const elapsedMs = refreshedAtMs - check.startedAtMs;\n check.elapsedMs = Number.isFinite(elapsedMs) && elapsedMs >= 0 ? elapsedMs : 0;\n }\n }\n\n private requirePrepared(): number {\n if (this.preparedTotal === undefined) {\n throw new Error(\"Progress feedback arrived before preparation\");\n }\n return this.preparedTotal;\n }\n}\n"]}
1
+ {"version":3,"file":"renderer-lifecycle.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/renderer-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ProgressClock,\n ProgressFeedback,\n ProgressRenderer,\n ProgressWriter\n} from \"./renderer.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport {\n formatFlagConditionNotMatchedBlock,\n formatFinalSummary,\n formatRunningRow,\n formatSettledBlock,\n isFlagConditionNotMatchedFeedback,\n shouldPresentSettledFeedback\n} from \"./renderer-formatting.ts\";\n\ninterface RunningCheck {\n readonly checkId: string;\n readonly displayName: string;\n readonly omitQuietPassedRow: boolean;\n readonly startedAtMs: number;\n elapsedMs: number | null;\n}\n\n/** Maintains the mutable lifecycle state and the TTY-only running terminal region. */\nexport class ProgressRendererController implements ProgressRenderer {\n readonly refreshesRunningRegion: boolean;\n\n private readonly clock: ProgressClock;\n private readonly writer: ProgressWriter;\n private completedCount = 0;\n private readonly flagConditionNotMatchedDisplayNames: string[] = [];\n private quietPassOmissionConfiguredCount = 0;\n private quietPassOmittedCount = 0;\n private preparedTotal: number | undefined;\n private renderedRunningRows = 0;\n private readonly running: RunningCheck[] = [];\n private readonly usesColor: boolean;\n private readonly progressRendering: ResolvedProgressRenderingOutput;\n\n constructor(\n writer: ProgressWriter,\n clock: ProgressClock,\n progressRendering: ResolvedProgressRenderingOutput\n ) {\n this.writer = writer;\n this.clock = clock;\n this.progressRendering = progressRendering;\n this.refreshesRunningRegion = writer.isTTY && writer.term?.toLowerCase() !== \"dumb\";\n this.usesColor = this.refreshesRunningRegion && writer.color;\n }\n\n refresh(): void {\n if (!this.refreshesRunningRegion || this.running.length === 0) return;\n this.requirePrepared();\n this.eraseRunningRegion();\n this.updateRunningDurations(this.clock.now());\n this.redrawRunningRegion();\n }\n\n render(feedback: ProgressFeedback): void {\n switch (feedback.kind) {\n case \"prepared\":\n this.prepare(feedback.totalChecks, feedback.quietPassOmissionConfiguredCount);\n return;\n case \"flag-control-completed\":\n this.completeFlagControl();\n return;\n case \"started\":\n this.start(feedback);\n return;\n case \"settled\":\n this.settle(feedback);\n return;\n case \"final\":\n this.finish(feedback);\n }\n }\n\n private prepare(totalChecks: number, quietPassOmissionConfiguredCount: number): void {\n if (this.preparedTotal !== undefined) throw new Error(\"Progress feedback was prepared twice\");\n this.preparedTotal = totalChecks;\n this.quietPassOmissionConfiguredCount = quietPassOmissionConfiguredCount;\n const configuredSuffix =\n quietPassOmissionConfiguredCount === 0\n ? \"\"\n : ` · ${quietPassOmissionConfiguredCount} configured for quiet-pass omission`;\n this.writer.write(`Vibe Check\\ntotal ${totalChecks} checks${configuredSuffix}\\n\\nChecks:\\n`);\n }\n\n private start(feedback: Extract<ProgressFeedback, { readonly kind: \"started\" }>): void {\n if (!this.refreshesRunningRegion) return;\n this.requirePrepared();\n this.eraseRunningRegion();\n this.running.push({\n checkId: feedback.checkId,\n displayName: feedback.displayName,\n omitQuietPassedRow: feedback.omitQuietPassedRow,\n elapsedMs: null,\n startedAtMs: this.clock.now()\n });\n this.redrawRunningRegion();\n }\n\n private settle(feedback: Extract<ProgressFeedback, { readonly kind: \"settled\" }>): void {\n const totalChecks = this.requirePrepared();\n if (this.refreshesRunningRegion) this.eraseRunningRegion();\n this.completedCount += 1;\n this.removeRunningCheck(feedback.checkId);\n if (isFlagConditionNotMatchedFeedback(feedback)) {\n this.flagConditionNotMatchedDisplayNames.push(feedback.displayName);\n } else if (shouldPresentSettledFeedback(feedback)) {\n this.writer.write(\n formatSettledBlock({\n completionOrdinal: feedback.omitQuietPassedRow ? undefined : this.completedCount,\n displayName: feedback.displayName,\n durationMs: feedback.durationMs,\n messages: feedback.messages,\n outcome: feedback.outcome,\n records: feedback.records,\n totalChecks,\n usesColor: this.usesColor,\n progressRendering: this.progressRendering\n })\n );\n } else {\n this.quietPassOmittedCount += 1;\n }\n if (this.refreshesRunningRegion) this.redrawRunningRegion();\n }\n\n private finish(feedback: Extract<ProgressFeedback, { readonly kind: \"final\" }>): void {\n this.requirePrepared();\n if (this.running.length > 0) {\n throw new Error(\"Progress feedback finalized while Checks are still running\");\n }\n this.flushFlagConditionNotMatchedChecks();\n this.writer.write(\n formatFinalSummary({\n ...feedback,\n quietPassOmissionConfiguredCount: this.quietPassOmissionConfiguredCount,\n quietPassOmittedCount: this.quietPassOmittedCount\n })\n );\n }\n\n private completeFlagControl(): void {\n this.requirePrepared();\n this.flushFlagConditionNotMatchedChecks();\n }\n\n private flushFlagConditionNotMatchedChecks(): void {\n const firstDisplayName = this.flagConditionNotMatchedDisplayNames[0];\n if (firstDisplayName === undefined) return;\n this.writer.write(\n formatFlagConditionNotMatchedBlock([\n firstDisplayName,\n ...this.flagConditionNotMatchedDisplayNames.slice(1)\n ])\n );\n this.flagConditionNotMatchedDisplayNames.length = 0;\n }\n\n private eraseRunningRegion(): void {\n for (let index = 0; index < this.renderedRunningRows; index += 1) {\n this.writer.write(\"\\u001B[1A\\u001B[2K\");\n }\n this.renderedRunningRows = 0;\n }\n\n private redrawRunningRegion(): void {\n const totalChecks = this.requirePrepared();\n for (const [index, check] of this.running.entries()) {\n this.writer.write(\n formatRunningRow({\n displayName: check.displayName,\n elapsedMs: check.elapsedMs,\n displayIndex: check.omitQuietPassedRow ? undefined : this.completedCount + index + 1,\n totalChecks\n })\n );\n }\n this.renderedRunningRows = this.running.length;\n }\n\n private removeRunningCheck(checkId: string): void {\n const index = this.running.findIndex((check) => check.checkId === checkId);\n if (index >= 0) this.running.splice(index, 1);\n }\n\n private updateRunningDurations(refreshedAtMs: number): void {\n for (const check of this.running) {\n const elapsedMs = refreshedAtMs - check.startedAtMs;\n check.elapsedMs = Number.isFinite(elapsedMs) && elapsedMs >= 0 ? elapsedMs : 0;\n }\n }\n\n private requirePrepared(): number {\n if (this.preparedTotal === undefined) {\n throw new Error(\"Progress feedback arrived before preparation\");\n }\n return this.preparedTotal;\n }\n}\n"]}
@@ -8,8 +8,12 @@ export function createProgressRenderer(writer, clock = SYSTEM_PROGRESS_CLOCK, pr
8
8
  const controller = new ProgressRendererController(writer, clock, progressRendering);
9
9
  return Object.freeze({
10
10
  refreshesRunningRegion: controller.refreshesRunningRegion,
11
- refresh: () => controller.refresh(),
12
- render: (feedback) => controller.render(feedback)
11
+ refresh: () => {
12
+ controller.refresh();
13
+ },
14
+ render: (feedback) => {
15
+ controller.render(feedback);
16
+ }
13
17
  });
14
18
  }
15
19
  //# sourceMappingURL=renderer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AA0DrE,MAAM,qBAAqB,GAAkB,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAE7F,yFAAyF;AACzF,MAAM,UAAU,sBAAsB,CACpC,MAAsB,EACtB,KAAK,GAAkB,qBAAqB,EAC5C,iBAAiB,GAAoC,8BAA8B,CAAC;IAClF,OAAO,EAAE,IAAI;CACd,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;QACzD,OAAO,EAAE,GAAS,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE;QACzC,MAAM,EAAE,CAAC,QAA0B,EAAQ,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;KAC1E,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage, CheckOutcome, CheckVisibility } from \"../../check/check.ts\";\nimport type { CoreRecord } from \"../../check-settlement/facts.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport { resolveProgressRenderingOutput } from \"../../project-definition/output-defaults.ts\";\nimport { ProgressRendererController } from \"./renderer-lifecycle.ts\";\n\nexport interface ProgressWriter {\n readonly color: boolean;\n readonly isTTY: boolean;\n readonly term: string | undefined;\n close?(): void;\n write(content: string): void;\n}\n\nexport type ProgressFeedback = Readonly<\n | {\n readonly kind: \"prepared\";\n readonly totalChecks: number;\n }\n | {\n readonly kind: \"flag-control-completed\";\n }\n | {\n readonly kind: \"started\";\n readonly checkId: string;\n readonly displayName: string;\n }\n | {\n readonly kind: \"settled\";\n readonly checkId: string;\n readonly displayName: string;\n readonly outcome: CheckOutcome;\n readonly durationMs: number | null;\n readonly visibility: CheckVisibility;\n readonly messages: readonly CheckMessage[];\n readonly records: readonly CoreRecord[];\n }\n | {\n readonly kind: \"final\";\n readonly execution: \"cancelled\" | \"completed\";\n readonly counts: ProgressOutcomeCounts;\n readonly elapsedMs: number;\n }\n>;\n\nexport interface ProgressOutcomeCounts {\n readonly failed: number;\n readonly notApplicable: number;\n readonly passed: number;\n readonly unavailable: number;\n}\n\nexport interface ProgressRenderer {\n refresh(): void;\n readonly refreshesRunningRegion: boolean;\n render(feedback: ProgressFeedback): void;\n}\n\nexport interface ProgressClock {\n now(): number;\n}\n\nconst SYSTEM_PROGRESS_CLOCK: ProgressClock = Object.freeze({ now: () => performance.now() });\n\n/** Product-private lifecycle presentation with one owner for feedback and its writer. */\nexport function createProgressRenderer(\n writer: ProgressWriter,\n clock: ProgressClock = SYSTEM_PROGRESS_CLOCK,\n progressRendering: ResolvedProgressRenderingOutput = resolveProgressRenderingOutput({\n enabled: true\n })\n): ProgressRenderer {\n const controller = new ProgressRendererController(writer, clock, progressRendering);\n return Object.freeze({\n refreshesRunningRegion: controller.refreshesRunningRegion,\n refresh: (): void => controller.refresh(),\n render: (feedback: ProgressFeedback): void => controller.render(feedback)\n });\n}\n"]}
1
+ {"version":3,"file":"renderer.mjs","sourceRoot":"","sources":["../../../../src/project-run/progress-rendering/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AA4DrE,MAAM,qBAAqB,GAAkB,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAE7F,yFAAyF;AACzF,MAAM,UAAU,sBAAsB,CACpC,MAAsB,EACtB,KAAK,GAAkB,qBAAqB,EAC5C,iBAAiB,GAAoC,8BAA8B,CAAC;IAClF,OAAO,EAAE,IAAI;CACd,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;QACzD,OAAO,EAAE,GAAS,EAAE;YAClB,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,QAA0B,EAAQ,EAAE;YAC3C,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage, CheckOutcome } from \"../../check/check.ts\";\nimport type { CoreRecord } from \"../../check-settlement/facts.ts\";\nimport type { ResolvedProgressRenderingOutput } from \"../../project-definition/project-definition.ts\";\nimport { resolveProgressRenderingOutput } from \"../../project-definition/output-defaults.ts\";\nimport { ProgressRendererController } from \"./renderer-lifecycle.ts\";\n\nexport interface ProgressWriter {\n readonly color: boolean;\n readonly isTTY: boolean;\n readonly term: string | undefined;\n close?(): void;\n write(content: string): void;\n}\n\nexport type ProgressFeedback = Readonly<\n | {\n readonly kind: \"prepared\";\n readonly quietPassOmissionConfiguredCount: number;\n readonly totalChecks: number;\n }\n | {\n readonly kind: \"flag-control-completed\";\n }\n | {\n readonly kind: \"started\";\n readonly checkId: string;\n readonly displayName: string;\n readonly omitQuietPassedRow: boolean;\n }\n | {\n readonly kind: \"settled\";\n readonly checkId: string;\n readonly displayName: string;\n readonly outcome: CheckOutcome;\n readonly durationMs: number | null;\n readonly omitQuietPassedRow: boolean;\n readonly messages: readonly CheckMessage[];\n readonly records: readonly CoreRecord[];\n }\n | {\n readonly kind: \"final\";\n readonly execution: \"cancelled\" | \"completed\";\n readonly counts: ProgressOutcomeCounts;\n readonly elapsedMs: number;\n }\n>;\n\nexport interface ProgressOutcomeCounts {\n readonly failed: number;\n readonly notApplicable: number;\n readonly passed: number;\n readonly unavailable: number;\n}\n\nexport interface ProgressRenderer {\n refresh(): void;\n readonly refreshesRunningRegion: boolean;\n render(feedback: ProgressFeedback): void;\n}\n\nexport interface ProgressClock {\n now(): number;\n}\n\nconst SYSTEM_PROGRESS_CLOCK: ProgressClock = Object.freeze({ now: () => performance.now() });\n\n/** Product-private lifecycle presentation with one owner for feedback and its writer. */\nexport function createProgressRenderer(\n writer: ProgressWriter,\n clock: ProgressClock = SYSTEM_PROGRESS_CLOCK,\n progressRendering: ResolvedProgressRenderingOutput = resolveProgressRenderingOutput({\n enabled: true\n })\n): ProgressRenderer {\n const controller = new ProgressRendererController(writer, clock, progressRendering);\n return Object.freeze({\n refreshesRunningRegion: controller.refreshesRunningRegion,\n refresh: (): void => {\n controller.refresh();\n },\n render: (feedback: ProgressFeedback): void => {\n controller.render(feedback);\n }\n });\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  /** Materializes only invocation-wide callback input; Check-local options own domain configuration. */
2
2
  export function createProjectContext(input) {
3
3
  return Object.freeze({
4
- flags: Object.freeze([...(input.controls.flags ?? [])]),
4
+ ...(input.changes === undefined ? {} : { changes: input.changes }),
5
+ flags: input.flags,
5
6
  root: input.paths.projectRoot
6
7
  });
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project-context.mjs","sourceRoot":"","sources":["../../../src/project-run/project-context.ts"],"names":[],"mappings":"AAGA,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAClC,KAA4F;IAE5F,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW;KAC9B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckProjectContext } from \"../check/check.ts\";\nimport type { RunControls } from \"./controls/contract.ts\";\nimport type { ResolvedInvocationPaths } from \"./invocation/paths.ts\";\n/** Materializes only invocation-wide callback input; Check-local options own domain configuration. */\nexport function createProjectContext(\n input: Readonly<{ readonly controls: RunControls; readonly paths: ResolvedInvocationPaths }>\n): CheckProjectContext {\n return Object.freeze({\n flags: Object.freeze([...(input.controls.flags ?? [])]),\n root: input.paths.projectRoot\n });\n}\n"]}
1
+ {"version":3,"file":"project-context.mjs","sourceRoot":"","sources":["../../../src/project-run/project-context.ts"],"names":[],"mappings":"AAEA,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAClC,KAIE;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW;KAC9B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckProjectContext, ProjectChanges } from \"../check/check.ts\";\nimport type { ResolvedInvocationPaths } from \"./invocation/paths.ts\";\n/** Materializes only invocation-wide callback input; Check-local options own domain configuration. */\nexport function createProjectContext(\n input: Readonly<{\n readonly changes?: ProjectChanges;\n readonly flags: readonly string[];\n readonly paths: ResolvedInvocationPaths;\n }>\n): CheckProjectContext {\n return Object.freeze({\n ...(input.changes === undefined ? {} : { changes: input.changes }),\n flags: input.flags,\n root: input.paths.projectRoot\n });\n}\n"]}
@@ -16,8 +16,8 @@ function outputDiagnosticCode(output) {
16
16
  return "progress-rendering-failed";
17
17
  case "diagnosticLogging":
18
18
  return "diagnostic-logging-failed";
19
- case "measurementHooks":
20
- return "scheduler-measurement-hooks-failed";
19
+ case "terminalEffects":
20
+ return "scheduler-terminal-effects-failed";
21
21
  }
22
22
  }
23
23
  export function isCancelled(controls) {
@@ -1 +1 @@
1
- {"version":3,"file":"result.mjs","sourceRoot":"","sources":["../../../src/project-run/result.ts"],"names":[],"mappings":"AAuIA,MAAM,UAAU,aAAa,CAC3B,sBAA8B,EAC9B,kBAAgD,EAChD,OAA0B,EAC1B,MAA+B,EAC/B,KAAqB;IAErB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,sBAAsB;QACtB,kBAAkB;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,OAAO;QACP,GAAG,KAAK;KACT,CAAC,CAAC;AACL,CAAC;AACD,SAAS,oBAAoB,CAC3B,MAA+B;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,oBAAoB;YACvB,OAAO,4BAA4B,CAAC;QACtC,KAAK,mBAAmB;YACtB,OAAO,2BAA2B,CAAC;QACrC,KAAK,mBAAmB;YACtB,OAAO,2BAA2B,CAAC;QACrC,KAAK,kBAAkB;YACrB,OAAO,oCAAoC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAqB;IAC/C,OAAO,QAAQ,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAC3C,CAAC;AACD,MAAM,UAAU,QAAQ,CACtB,sBAA8B,EAC9B,kBAAgD,EAChD,OAA0B,EAC1B,IAA0D;IAE1D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,UAAU;QAChB,sBAAsB;QACtB,kBAAkB;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;QACnC,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AACD,MAAM,UAAU,wBAAwB,CACtC,sBAA8B,EAC9B,kBAAgD,EAChD,OAA0B,EAC1B,KAA8B;IAK9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW;QACjB,sBAAsB;QACtB,kBAAkB;QAClB,OAAO;QACP,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AACD,MAAM,UAAU,qBAAqB,CACnC,KAOE;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW;QACjB,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,WAAW;QAClB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {\n DefinitionWarning,\n ProjectDefinitionDiagnostic\n} from \"../project-definition/project-definition.ts\";\nimport type { RunControlDiagnostic } from \"./controls/validation-result.ts\";\nimport type { CheckAggregate, RunControls } from \"./controls/contract.ts\";\nimport type { CheckMessageLevel } from \"../check/check.ts\";\nimport type { CoreSnapshot } from \"../check-settlement/facts.ts\";\nimport type { RunOutputStatuses } from \"./outputs/status.ts\";\n\n/** Product 不能形成正常 Run 结果时的稳定 invocation diagnostic。 */\nexport type RunDiagnostic = Readonly<{\n /** 失败的 Run-owned execution 或 planning boundary;它不是任何 Check 的 terminal status。 */\n readonly code:\n | \"admission-policy-failed\"\n | \"admission-strategy-preparation-failed\"\n | \"task-graph-invalid\"\n | \"task-engine-failed\"\n | \"publication-model-failed\";\n}>;\n\n/** 一项 executable Check 的最终 duration readback。 */\nexport type CheckDuration = Readonly<{\n /** 与 snapshot 中 Check facts 相同的 stable Check identity。 */\n readonly checkId: string;\n /** 已测量的 execution duration;未进入 execution 的 Check 为 `null`,不是零时长。 */\n readonly durationMs: number | null;\n}>;\n\n/** Run 在 Check terminal lifecycle 中接受的人读 message。 */\nexport interface CheckRunMessage {\n /** 产生 message 的 stable Check identity。 */\n readonly checkId: string;\n /** author message 或已捕获 console output 的 presentation severity。 */\n readonly level: CheckMessageLevel;\n /** owning Check 或 Product capture 使用的稳定 message code。 */\n readonly code: string;\n /** 人读正文;不能代替 snapshot 中的 terminal outcome。 */\n readonly message: string;\n}\n\n/** 只有已形成 terminal Check facts 的 Run branch 才具备的完整结果 readback。 */\nexport interface RunResultFacts {\n /** 调用方未配置 aggregation 时为 `null`;否则是选中 Check statuses 的 invocation-level conclusion。 */\n readonly aggregate: CheckAggregate | null;\n /** 按 canonical Check order 的 duration facts;未执行 Check 仍以 `null` 保留。 */\n readonly checkDurations: readonly CheckDuration[];\n /** 已接受的 author 与 console-capture messages,不决定 Check outcome。 */\n readonly checkMessages: readonly CheckRunMessage[];\n /** 已结算的完整 Check 与 supplemental Record facts。 */\n readonly snapshot: CoreSnapshot;\n}\n/** 一次 Project Run 的可判别结果;output failure 保留已结算 facts。 */\nexport type RunResult = Readonly<\n | {\n /** Definition、RunControls 或 aggregation selection 无效;没有执行任何 Check author callback。 */\n readonly kind: \"configuration\";\n /** Definition normalization 时仍可报告、但不单独阻止本 branch 的 warning。 */\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 指向被拒绝 Definition 或 RunControls value 的 closed diagnostic。 */\n readonly diagnostic: ProjectDefinitionDiagnostic | RunControlDiagnostic;\n }\n | {\n /** 配置有效,但 static Check graph 不能进入 execution planning。 */\n readonly kind: \"planning\";\n /** normalized declarative Definition 的 matching signal;不包含 RunControls 或 outcome。 */\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 这次 planning 失败的 Product diagnostic。 */\n readonly diagnostic: RunDiagnostic;\n /** 配置有效后各 terminal output participant 的独立状态。 */\n readonly outputs: RunOutputStatuses;\n }\n | {\n /** invocation 在 Check work 开始前或 planning 中响应 caller cancellation。 */\n readonly kind: \"cancelled\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n /** 取消发生在尚未形成 terminal Check facts 的阶段。 */\n readonly phase: \"pre-work\" | \"planning\";\n }\n | {\n /** invocation 在至少可能已开始 Check work 的 execution 阶段响应 caller cancellation。 */\n readonly kind: \"cancelled\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n /** 此 branch 总在 terminal Check facts 形成后的 execution cancellation 返回。 */\n readonly phase: \"execution\";\n /** 按 canonical Check order 的 duration facts;未执行 Check 为 `null`。 */\n readonly checkDurations: readonly CheckDuration[];\n /** cancellation 前已接受的 author 与 console-capture messages。 */\n readonly checkMessages: readonly CheckRunMessage[];\n /** cancellation 时已结算的完整 Check 与 supplemental Record facts。 */\n readonly snapshot: CoreSnapshot;\n }\n | ({\n /** 所有 Check 已完成 terminal settlement;不表示每项 Check 都 `passed`。 */\n readonly kind: \"completed\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n } & RunResultFacts)\n | {\n /** Product execution/settlement infrastructure 失败;不把它误表示为 Check `failed`。 */\n readonly kind: \"execution\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 停止正常 execution 的 Product diagnostic;本 branch 不提供 partial snapshot。 */\n readonly diagnostic: RunDiagnostic;\n readonly outputs: RunOutputStatuses;\n }\n | ({\n /** Check facts 已完整结算,但至少一个 terminal output participant 失败。 */\n readonly kind: \"output\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 失败的 machine、progress、diagnostic 或 scheduler-measurement output 类别。 */\n readonly diagnostic: Readonly<{\n readonly code:\n | \"machine-publication-failed\"\n | \"progress-rendering-failed\"\n | \"diagnostic-logging-failed\"\n | \"scheduler-measurement-hooks-failed\";\n }>;\n readonly outputs: RunOutputStatuses;\n } & RunResultFacts)\n>;\n\n/** Any Run result produced after controls and Definition validation have completed. */\nexport type NonConfigurationRunResult = Exclude<RunResult, { readonly kind: \"configuration\" }>;\n\ntype OutputRunResult = Extract<RunResult, { readonly kind: \"output\" }>;\n\nexport function outputFailure(\n declarativeFingerprint: string,\n definitionWarnings: readonly DefinitionWarning[],\n outputs: RunOutputStatuses,\n output: keyof RunOutputStatuses,\n facts: RunResultFacts\n): OutputRunResult {\n return Object.freeze({\n kind: \"output\",\n declarativeFingerprint,\n definitionWarnings,\n diagnostic: Object.freeze({ code: outputDiagnosticCode(output) }),\n outputs,\n ...facts\n });\n}\nfunction outputDiagnosticCode(\n output: keyof RunOutputStatuses\n): Extract<RunResult, { readonly kind: \"output\" }>[\"diagnostic\"][\"code\"] {\n switch (output) {\n case \"machinePublication\":\n return \"machine-publication-failed\";\n case \"progressRendering\":\n return \"progress-rendering-failed\";\n case \"diagnosticLogging\":\n return \"diagnostic-logging-failed\";\n case \"measurementHooks\":\n return \"scheduler-measurement-hooks-failed\";\n }\n}\n\nexport function isCancelled(controls: RunControls): boolean {\n return controls.signal?.aborted === true;\n}\nexport function planning(\n declarativeFingerprint: string,\n definitionWarnings: readonly DefinitionWarning[],\n outputs: RunOutputStatuses,\n code: Extract<RunDiagnostic[\"code\"], \"task-graph-invalid\">\n): Extract<NonConfigurationRunResult, { readonly kind: \"planning\" }> {\n return Object.freeze({\n kind: \"planning\",\n declarativeFingerprint,\n definitionWarnings,\n diagnostic: Object.freeze({ code }),\n outputs\n });\n}\nexport function preExecutionCancellation(\n declarativeFingerprint: string,\n definitionWarnings: readonly DefinitionWarning[],\n outputs: RunOutputStatuses,\n phase: \"pre-work\" | \"planning\"\n): Extract<\n NonConfigurationRunResult,\n { readonly kind: \"cancelled\"; readonly phase: \"pre-work\" | \"planning\" }\n> {\n return Object.freeze({\n kind: \"cancelled\",\n declarativeFingerprint,\n definitionWarnings,\n outputs,\n phase\n });\n}\nexport function executionCancellation(\n input: Readonly<{\n readonly checkDurations: readonly CheckDuration[];\n readonly checkMessages: readonly CheckRunMessage[];\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n readonly snapshot: CoreSnapshot;\n }>\n): Extract<NonConfigurationRunResult, { readonly kind: \"cancelled\"; readonly phase: \"execution\" }> {\n return Object.freeze({\n kind: \"cancelled\",\n declarativeFingerprint: input.declarativeFingerprint,\n definitionWarnings: input.definitionWarnings,\n outputs: input.outputs,\n phase: \"execution\",\n checkDurations: input.checkDurations,\n checkMessages: input.checkMessages,\n snapshot: input.snapshot\n });\n}\n"]}
1
+ {"version":3,"file":"result.mjs","sourceRoot":"","sources":["../../../src/project-run/result.ts"],"names":[],"mappings":"AAuIA,MAAM,UAAU,aAAa,CAC3B,sBAA8B,EAC9B,kBAAgD,EAChD,OAA0B,EAC1B,MAA+B,EAC/B,KAAqB;IAErB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,sBAAsB;QACtB,kBAAkB;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,OAAO;QACP,GAAG,KAAK;KACT,CAAC,CAAC;AACL,CAAC;AACD,SAAS,oBAAoB,CAC3B,MAA+B;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,oBAAoB;YACvB,OAAO,4BAA4B,CAAC;QACtC,KAAK,mBAAmB;YACtB,OAAO,2BAA2B,CAAC;QACrC,KAAK,mBAAmB;YACtB,OAAO,2BAA2B,CAAC;QACrC,KAAK,iBAAiB;YACpB,OAAO,mCAAmC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAqB;IAC/C,OAAO,QAAQ,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAC3C,CAAC;AACD,MAAM,UAAU,QAAQ,CACtB,sBAA8B,EAC9B,kBAAgD,EAChD,OAA0B,EAC1B,IAA0D;IAE1D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,UAAU;QAChB,sBAAsB;QACtB,kBAAkB;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;QACnC,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AACD,MAAM,UAAU,wBAAwB,CACtC,sBAA8B,EAC9B,kBAAgD,EAChD,OAA0B,EAC1B,KAA8B;IAK9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW;QACjB,sBAAsB;QACtB,kBAAkB;QAClB,OAAO;QACP,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AACD,MAAM,UAAU,qBAAqB,CACnC,KAOE;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW;QACjB,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,WAAW;QAClB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {\n DefinitionWarning,\n ProjectDefinitionDiagnostic\n} from \"../project-definition/project-definition.ts\";\nimport type { RunControlDiagnostic } from \"./controls/validation-result.ts\";\nimport type { CheckAggregate, RunControls } from \"./controls/contract.ts\";\nimport type { CheckMessageLevel } from \"../check/check.ts\";\nimport type { CoreSnapshot } from \"../check-settlement/facts.ts\";\nimport type { RunOutputStatuses } from \"./outputs/status.ts\";\n\n/** Product 不能形成正常 Run 结果时的稳定 invocation diagnostic。 */\nexport type RunDiagnostic = Readonly<{\n /** 失败的 Run-owned execution 或 planning boundary;它不是任何 Check 的 terminal status。 */\n readonly code:\n | \"admission-policy-failed\"\n | \"admission-strategy-preparation-failed\"\n | \"task-graph-invalid\"\n | \"task-engine-failed\"\n | \"publication-model-failed\";\n}>;\n\n/** 一项 executable Check 的最终 duration readback。 */\nexport type CheckDuration = Readonly<{\n /** 与 snapshot 中 Check facts 相同的 stable Check identity。 */\n readonly checkId: string;\n /** 已测量的 execution duration;未进入 execution 的 Check 为 `null`,不是零时长。 */\n readonly durationMs: number | null;\n}>;\n\n/** Run 在 Check terminal lifecycle 中接受的人读 message。 */\nexport interface CheckRunMessage {\n /** 产生 message 的 stable Check identity。 */\n readonly checkId: string;\n /** author message 或已捕获 console output 的 presentation severity。 */\n readonly level: CheckMessageLevel;\n /** owning Check 或 Product capture 使用的稳定 message code。 */\n readonly code: string;\n /** 人读正文;不能代替 snapshot 中的 terminal outcome。 */\n readonly message: string;\n}\n\n/** 只有已形成 terminal Check facts 的 Run branch 才具备的完整结果 readback。 */\nexport interface RunResultFacts {\n /** 有完整 terminal Check facts 时,由有效 Check 列表形成的 invocation-level conclusion。 */\n readonly aggregate: CheckAggregate;\n /** 按 canonical Check order 的 duration facts;未执行 Check 仍以 `null` 保留。 */\n readonly checkDurations: readonly CheckDuration[];\n /** 已接受的 author 与 console-capture messages,不决定 Check outcome。 */\n readonly checkMessages: readonly CheckRunMessage[];\n /** 已结算的完整 Check 与 supplemental Record facts。 */\n readonly snapshot: CoreSnapshot;\n}\n/** 一次 Project Run 的可判别结果;output failure 保留已结算 facts。 */\nexport type RunResult = Readonly<\n | {\n /** Definition、RunControls 或 aggregation selection 无效;没有执行任何 Check author callback。 */\n readonly kind: \"configuration\";\n /** Definition normalization 时仍可报告、但不单独阻止本 branch 的 warning。 */\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 指向被拒绝 Definition 或 RunControls value 的 closed diagnostic。 */\n readonly diagnostic: ProjectDefinitionDiagnostic | RunControlDiagnostic;\n }\n | {\n /** 配置有效,但 static Check graph 不能进入 execution planning。 */\n readonly kind: \"planning\";\n /** normalized declarative Definition 的 matching signal;不包含 RunControls 或 outcome。 */\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 这次 planning 失败的 Product diagnostic。 */\n readonly diagnostic: RunDiagnostic;\n /** 配置有效后各 terminal output participant 的独立状态。 */\n readonly outputs: RunOutputStatuses;\n }\n | {\n /** invocation 在 Check work 开始前或 planning 中响应 caller cancellation。 */\n readonly kind: \"cancelled\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n /** 取消发生在尚未形成 terminal Check facts 的阶段。 */\n readonly phase: \"pre-work\" | \"planning\";\n }\n | {\n /** invocation 在至少可能已开始 Check work 的 execution 阶段响应 caller cancellation。 */\n readonly kind: \"cancelled\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n /** 此 branch 总在 terminal Check facts 形成后的 execution cancellation 返回。 */\n readonly phase: \"execution\";\n /** 按 canonical Check order 的 duration facts;未执行 Check 为 `null`。 */\n readonly checkDurations: readonly CheckDuration[];\n /** cancellation 前已接受的 author 与 console-capture messages。 */\n readonly checkMessages: readonly CheckRunMessage[];\n /** cancellation 时已结算的完整 Check 与 supplemental Record facts。 */\n readonly snapshot: CoreSnapshot;\n }\n | ({\n /** 所有 Check 已完成 terminal settlement;不表示每项 Check 都 `passed`。 */\n readonly kind: \"completed\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n } & RunResultFacts)\n | {\n /** Product execution/settlement infrastructure 失败;不把它误表示为 Check `failed`。 */\n readonly kind: \"execution\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 停止正常 execution 的 Product diagnostic;本 branch 不提供 partial snapshot。 */\n readonly diagnostic: RunDiagnostic;\n readonly outputs: RunOutputStatuses;\n }\n | ({\n /** Check facts 已完整结算,但至少一个 terminal output participant 失败。 */\n readonly kind: \"output\";\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n /** 失败的 machine、progress、diagnostic 或 scheduler-measurement output 类别。 */\n readonly diagnostic: Readonly<{\n readonly code:\n | \"machine-publication-failed\"\n | \"progress-rendering-failed\"\n | \"diagnostic-logging-failed\"\n | \"scheduler-terminal-effects-failed\";\n }>;\n readonly outputs: RunOutputStatuses;\n } & RunResultFacts)\n>;\n\n/** Any Run result produced after controls and Definition validation have completed. */\nexport type NonConfigurationRunResult = Exclude<RunResult, { readonly kind: \"configuration\" }>;\n\ntype OutputRunResult = Extract<RunResult, { readonly kind: \"output\" }>;\n\nexport function outputFailure(\n declarativeFingerprint: string,\n definitionWarnings: readonly DefinitionWarning[],\n outputs: RunOutputStatuses,\n output: keyof RunOutputStatuses,\n facts: RunResultFacts\n): OutputRunResult {\n return Object.freeze({\n kind: \"output\",\n declarativeFingerprint,\n definitionWarnings,\n diagnostic: Object.freeze({ code: outputDiagnosticCode(output) }),\n outputs,\n ...facts\n });\n}\nfunction outputDiagnosticCode(\n output: keyof RunOutputStatuses\n): Extract<RunResult, { readonly kind: \"output\" }>[\"diagnostic\"][\"code\"] {\n switch (output) {\n case \"machinePublication\":\n return \"machine-publication-failed\";\n case \"progressRendering\":\n return \"progress-rendering-failed\";\n case \"diagnosticLogging\":\n return \"diagnostic-logging-failed\";\n case \"terminalEffects\":\n return \"scheduler-terminal-effects-failed\";\n }\n}\n\nexport function isCancelled(controls: RunControls): boolean {\n return controls.signal?.aborted === true;\n}\nexport function planning(\n declarativeFingerprint: string,\n definitionWarnings: readonly DefinitionWarning[],\n outputs: RunOutputStatuses,\n code: Extract<RunDiagnostic[\"code\"], \"task-graph-invalid\">\n): Extract<NonConfigurationRunResult, { readonly kind: \"planning\" }> {\n return Object.freeze({\n kind: \"planning\",\n declarativeFingerprint,\n definitionWarnings,\n diagnostic: Object.freeze({ code }),\n outputs\n });\n}\nexport function preExecutionCancellation(\n declarativeFingerprint: string,\n definitionWarnings: readonly DefinitionWarning[],\n outputs: RunOutputStatuses,\n phase: \"pre-work\" | \"planning\"\n): Extract<\n NonConfigurationRunResult,\n { readonly kind: \"cancelled\"; readonly phase: \"pre-work\" | \"planning\" }\n> {\n return Object.freeze({\n kind: \"cancelled\",\n declarativeFingerprint,\n definitionWarnings,\n outputs,\n phase\n });\n}\nexport function executionCancellation(\n input: Readonly<{\n readonly checkDurations: readonly CheckDuration[];\n readonly checkMessages: readonly CheckRunMessage[];\n readonly declarativeFingerprint: string;\n readonly definitionWarnings: readonly DefinitionWarning[];\n readonly outputs: RunOutputStatuses;\n readonly snapshot: CoreSnapshot;\n }>\n): Extract<NonConfigurationRunResult, { readonly kind: \"cancelled\"; readonly phase: \"execution\" }> {\n return Object.freeze({\n kind: \"cancelled\",\n declarativeFingerprint: input.declarativeFingerprint,\n definitionWarnings: input.definitionWarnings,\n outputs: input.outputs,\n phase: \"execution\",\n checkDurations: input.checkDurations,\n checkMessages: input.checkMessages,\n snapshot: input.snapshot\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"run.mjs","sourceRoot":"","sources":["../../../src/project-run/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wDAAwD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAuB1D,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,UAAmB,EAAE,QAAQ,GAAY,EAAE;IACnE,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,eAAe;YACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,UAAU,EAAE,mBAAmB,CAAC,KAAK;SACtC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,eAAe;YACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,UAAU,EAAE,iBAAiB,CAAC,KAAK;SACpC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,mBAAmB,CACxB,mBAAmB,CAAC,KAAK,EACzB,iBAAiB,CAAC,KAAK,EACvB,mBAAmB,CAAC,QAAQ,CAC7B,CAAC;AACJ,CAAC","sourcesContent":["import type { ProjectDefinition } from \"../project-definition/project-definition.ts\";\nimport type { RunControls } from \"./controls/contract.ts\";\nimport { validateProjectDefinition } from \"../project-definition/project-definition-validation.ts\";\nimport { validateRunControls } from \"./controls/validation.ts\";\nimport { executeValidatedRun } from \"./invocation/run.ts\";\nimport type { RunResult } from \"./result.ts\";\n\nexport type { RunOutputStatus, RunOutputStatuses } from \"./outputs/status.ts\";\nexport type { RunDiagnostic, RunResult } from \"./result.ts\";\n\n/**\n * 在调用方的 Node runtime 中执行一个由项目拥有的 Project Definition。\n *\n * @param definition - Project Definition input;{@link defineConfig} 补齐 defaults,run 在 invocation 前验证。\n * @param controls - 本次 invocation context 与 outputs 使用的闭合控制值。\n * @returns ordinary configuration、planning、execution、cancellation 与 output failures 通过 `RunResult`\n * 返回;调用方先按 `kind` narrow。\n * @remarks Definition validation 关闭 authoring grammar;可选 Check preflight 在其 Task 通过直接 relation\n * readiness 后被 Scheduler admission 时运行,并先于该 Check 自己的 execution callback。它受该 Task 的\n * mutex、capacity、priority 与 cancellation 约束,而不是 invocation-wide barrier。`output` branch 同时提供\n * 完整 final snapshot 与 output failure diagnostic。\n */\nexport async function run(\n definition: ProjectDefinition,\n controls?: RunControls\n): Promise<RunResult>;\nexport async function run(definition: unknown, controls?: unknown): Promise<RunResult>;\nexport async function run(definition: unknown, controls: unknown = {}): Promise<RunResult> {\n const validatedDefinition = validateProjectDefinition(definition);\n if (!validatedDefinition.ok) {\n return Object.freeze({\n kind: \"configuration\",\n definitionWarnings: Object.freeze([]),\n diagnostic: validatedDefinition.error\n });\n }\n const validatedControls = validateRunControls(controls);\n if (!validatedControls.ok) {\n return Object.freeze({\n kind: \"configuration\",\n definitionWarnings: Object.freeze([]),\n diagnostic: validatedControls.error\n });\n }\n\n return executeValidatedRun(\n validatedDefinition.value,\n validatedControls.value,\n validatedDefinition.warnings\n );\n}\n"]}
1
+ {"version":3,"file":"run.mjs","sourceRoot":"","sources":["../../../src/project-run/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wDAAwD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAuB1D,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,UAAmB,EAAE,QAAQ,GAAY,EAAE;IACnE,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,eAAe;YACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,UAAU,EAAE,mBAAmB,CAAC,KAAK;SACtC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,eAAe;YACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,UAAU,EAAE,iBAAiB,CAAC,KAAK;SACpC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,mBAAmB,CACxB,mBAAmB,CAAC,KAAK,EACzB,iBAAiB,CAAC,KAAK,EACvB,mBAAmB,CAAC,QAAQ,CAC7B,CAAC;AACJ,CAAC","sourcesContent":["import type { ProjectDefinition } from \"../project-definition/project-definition.ts\";\nimport type { RunControls } from \"./controls/contract.ts\";\nimport { validateProjectDefinition } from \"../project-definition/project-definition-validation.ts\";\nimport { validateRunControls } from \"./controls/validation.ts\";\nimport { executeValidatedRun } from \"./invocation/run.ts\";\nimport type { RunResult } from \"./result.ts\";\n\nexport type { RunOutputStatus, RunOutputStatuses } from \"./outputs/status.ts\";\nexport type { RunDiagnostic, RunResult } from \"./result.ts\";\n\n/**\n * 在调用方的 Node runtime 中执行一个由项目拥有的 Project Definition。\n *\n * @param definition - Project Definition input;{@link defineConfig} 补齐 defaults,run 在 invocation 前验证。\n * @param controls - 本次 invocation context 与 outputs 使用的闭合控制值。\n * @returns ordinary configuration、planning、execution、cancellation 与 output failures 通过 `RunResult`\n * 返回;调用方先按 `kind` narrow。\n * @remarks Definition validation 关闭 authoring grammar;可选 Check preparation 在其 Task 通过直接 relation\n * readiness 后被 Scheduler admission 时运行,并先于该 Check 自己的 execution callback。它受该 Task 的\n * mutex、capacity、priority 与 cancellation 约束,而不是 invocation-wide barrier。`output` branch 同时提供\n * 完整 final snapshot 与 output failure diagnostic。\n */\nexport async function run(\n definition: ProjectDefinition,\n controls?: RunControls\n): Promise<RunResult>;\nexport async function run(definition: unknown, controls?: unknown): Promise<RunResult>;\nexport async function run(definition: unknown, controls: unknown = {}): Promise<RunResult> {\n const validatedDefinition = validateProjectDefinition(definition);\n if (!validatedDefinition.ok) {\n return Object.freeze({\n kind: \"configuration\",\n definitionWarnings: Object.freeze([]),\n diagnostic: validatedDefinition.error\n });\n }\n const validatedControls = validateRunControls(controls);\n if (!validatedControls.ok) {\n return Object.freeze({\n kind: \"configuration\",\n definitionWarnings: Object.freeze([]),\n diagnostic: validatedControls.error\n });\n }\n\n return executeValidatedRun(\n validatedDefinition.value,\n validatedControls.value,\n validatedDefinition.warnings\n );\n}\n"]}