@zxyycom/vibe-check 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolve } from \"node:path\";\n\nimport type { CheckExecutionContext, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { fingerprintProjectFiles } from \"../project-files/file-fingerprint.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../check/finding-presentation.ts\";\nimport { duplicateFindingMessages, duplicateWaiverMessages } from \"./finding-messages.ts\";\nimport { getGitSha } from \"./project-revision.ts\";\nimport { measureDuplicateDetection, type DuplicateMeasurementResult } from \"./measurement.ts\";\nimport type {\n DuplicateDetectionAreaInput,\n DuplicateDetectionExactInputSet\n} from \"./measurement-model.ts\";\nimport type {\n DuplicateDetectionFindingWaiver,\n ResolvedDuplicateDetectionOptions\n} from \"./options.ts\";\nimport { validResolvedDuplicateDetectionOptions } from \"./options-validation.ts\";\nimport {\n buildDuplicateRecordCandidates,\n duplicateDetectionFindingIdentity,\n duplicateDetectionWaiverAuditRecord,\n type DuplicateRecordCandidate\n} from \"./records.ts\";\nimport type { DuplicateDetectionFinalData } from \"./final-data.ts\";\n\nexport const DUPLICATE_DETECTION_CHECK_DEFINITION = {\n checkId: \"duplicate-detection\",\n displayName: \"Duplicate detection\"\n} as const;\n\n/** `duplicate-detection` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type DuplicateDetectionUnavailableReasonCode =\n | \"cache-write-failed\"\n | \"external-dependency-unavailable\"\n | \"external-execution-failed\"\n | \"external-result-invalid\"\n | \"invalid-options\"\n | \"source-unavailable\";\n\n/** Default Check callback;scanner configuration 由其完整 options 拥有。 */\nexport async function executeDuplicateDetection(\n context: CheckExecutionContext<ResolvedDuplicateDetectionOptions>\n): Promise<CheckResult<DuplicateDetectionFinalData>> {\n if (!validResolvedDuplicateDetectionOptions(context.options))\n return unavailable(\"invalid-options\");\n\n let exactInput: DuplicateDetectionExactInputSet;\n try {\n exactInput = prepareExactInputSet(context.project.root, context.options);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (exactInput.approvedExactPaths.length < 2) {\n return noEligibleDuplicateInputResult(context);\n }\n const measurement = await measureDuplicateDetection({\n cache: context.options.cache,\n dependency: context.options.scanner,\n exactInput\n });\n if (measurement.kind !== \"complete\") return directMeasurementFailure(measurement);\n const candidates = buildDuplicateRecordCandidates(\n measurement.fragments,\n context.options.codeAreas\n );\n if (candidates === undefined) return unavailable(\"external-result-invalid\");\n const reconciliation = reconcileDuplicateFindingWaivers(\n candidates,\n context.options.findingWaivers\n );\n reportReconciledCodeQualityFindingRecords(context, reconciliation);\n reportFindingWaiverAudits(context, reconciliation, duplicateDetectionWaiverAuditRecord);\n return settleDuplicateFindings(reconciliation);\n}\n\nfunction noEligibleDuplicateInputResult(\n context: CheckExecutionContext<ResolvedDuplicateDetectionOptions>\n): CheckResult<DuplicateDetectionFinalData> {\n const reconciliation = reconcileDuplicateFindingWaivers([], context.options.findingWaivers);\n reportFindingWaiverAudits(context, reconciliation, duplicateDetectionWaiverAuditRecord);\n return appendCheckMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n duplicateWaiverMessages(reconciliation)\n );\n}\n\nfunction reconcileDuplicateFindingWaivers(\n candidates: readonly DuplicateRecordCandidate[],\n waivers: readonly DuplicateDetectionFindingWaiver[]\n): FindingWaiverReconciliation<DuplicateRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: duplicateDetectionFindingIdentity,\n waivers\n });\n}\n\nfunction settleDuplicateFindings(\n reconciliation: FindingWaiverReconciliation<DuplicateRecordCandidate>\n): CheckResult<DuplicateDetectionFinalData> {\n const settlement = settleFindings(\n reconciliation.findings.map((finding) => ({\n actionable: finding.disposition !== \"waived\",\n blocking: finding.finding.data.blocking\n }))\n );\n const actionableCandidates = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendCheckMessages(\n appendCheckMessages(settlement, duplicateFindingMessages(actionableCandidates)),\n duplicateWaiverMessages(reconciliation)\n );\n}\n\nfunction prepareExactInputSet(\n rootDir: string,\n options: ResolvedDuplicateDetectionOptions\n): DuplicateDetectionExactInputSet {\n const areas = collectAreaInputs(rootDir, options.codeAreas);\n const approvedExactPaths = uniqueSorted(areas.flatMap((area) => area.approvedExactPaths));\n const inputFingerprint = fingerprintProjectFiles(rootDir, approvedExactPaths);\n return Object.freeze({\n approvedExactPaths: Object.freeze(approvedExactPaths),\n areas,\n cacheRootDir: resolve(rootDir, options.cache.directory),\n commitSha: getGitSha(rootDir),\n inputFingerprint: Object.freeze({\n ...inputFingerprint,\n fileList: Object.freeze([...inputFingerprint.fileList])\n }),\n rootDir\n });\n}\n\nfunction collectAreaInputs(\n rootDir: string,\n codeAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): readonly DuplicateDetectionAreaInput[] {\n const orderedPolicies = Object.entries(codeAreas).sort(([left], [right]) =>\n compareText(left, right)\n );\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(orderedPolicies.map(([areaId, policy]) => [areaId, policy.files]))\n );\n return Object.freeze(\n orderedPolicies.flatMap(([codeArea, policy]) => {\n const approvedExactPaths = requireProjectFileSet(filesByArea, codeArea);\n return approvedExactPaths.length === 0\n ? []\n : [\n Object.freeze({\n approvedExactPaths: Object.freeze(approvedExactPaths),\n codeArea,\n minimumLines: policy.minimumLines,\n minimumTokens: policy.minimumTokens\n })\n ];\n })\n );\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction directMeasurementFailure(\n measurement: Exclude<DuplicateMeasurementResult, { kind: \"complete\" }>\n): CheckResult<DuplicateDetectionFinalData> {\n switch (measurement.kind) {\n case \"cache-write-failed\":\n return unavailable(\"cache-write-failed\");\n case \"execution-failed\":\n return unavailable(\"external-execution-failed\");\n case \"invalid-result\":\n return unavailable(\"external-result-invalid\");\n case \"unavailable\":\n return unavailable(\"external-dependency-unavailable\");\n }\n const exhaustiveMeasurement: never = measurement;\n return exhaustiveMeasurement;\n}\n\nfunction unavailable(\n code: DuplicateDetectionUnavailableReasonCode\n): CheckResult<DuplicateDetectionFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: DuplicateDetectionUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"duplicateDetection options are invalid; recreate the Check with duplicateDetection(options) or restore its complete resolved options.\";\n case \"source-unavailable\":\n return \"Duplicate detection could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"external-dependency-unavailable\":\n return \"The configured jscpd command is unavailable or incompatible; restore the package dependency or configure a compatible executable.\";\n case \"external-execution-failed\":\n return \"jscpd did not complete successfully; run the configured command directly and inspect its environment.\";\n case \"external-result-invalid\":\n return \"jscpd output could not form a trusted complete result; check command and report compatibility.\";\n case \"cache-write-failed\":\n return \"Duplicate detection completed scanning but could not write its cache; check the configured cache directory permissions.\";\n }\n}\n"]}
1
+ {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolve } from \"node:path\";\n\nimport type { CheckExecutionContext, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { fingerprintProjectFiles } from \"../project-files/file-fingerprint.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport { duplicateFindingMessages, duplicateWaiverMessages } from \"./finding-messages.ts\";\nimport { getGitSha } from \"./project-revision.ts\";\nimport { measureDuplicateDetection, type DuplicateMeasurementResult } from \"./measurement.ts\";\nimport type {\n DuplicateDetectionAreaInput,\n DuplicateDetectionExactInputSet\n} from \"./measurement-model.ts\";\nimport type {\n DuplicateDetectionFindingWaiver,\n ResolvedDuplicateDetectionOptions\n} from \"./options.ts\";\nimport { validResolvedDuplicateDetectionOptions } from \"./options-validation.ts\";\nimport {\n buildDuplicateRecordCandidates,\n duplicateDetectionFindingIdentity,\n duplicateDetectionWaiverAuditRecord,\n type DuplicateRecordCandidate\n} from \"./records.ts\";\nimport type { DuplicateDetectionFinalData } from \"./final-data.ts\";\n\nexport const DUPLICATE_DETECTION_CHECK_DEFINITION = {\n checkId: \"duplicate-detection\",\n displayName: \"Duplicate detection\"\n} as const;\n\n/** `duplicate-detection` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type DuplicateDetectionUnavailableReasonCode =\n | \"cache-write-failed\"\n | \"external-dependency-unavailable\"\n | \"external-execution-failed\"\n | \"external-result-invalid\"\n | \"invalid-options\"\n | \"source-unavailable\";\n\n/** Default Check callback;scanner configuration 由其完整 options 拥有。 */\nexport async function executeDuplicateDetection(\n context: CheckExecutionContext<ResolvedDuplicateDetectionOptions>\n): Promise<CheckResult<DuplicateDetectionFinalData>> {\n if (!validResolvedDuplicateDetectionOptions(context.options))\n return unavailable(\"invalid-options\");\n\n let exactInput: DuplicateDetectionExactInputSet;\n try {\n exactInput = prepareExactInputSet(context.project.root, context.options);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (exactInput.approvedExactPaths.length < 2) {\n return noEligibleDuplicateInputResult(context);\n }\n const measurement = await measureDuplicateDetection({\n cache: context.options.cache,\n dependency: context.options.scanner,\n exactInput\n });\n if (measurement.kind !== \"complete\") return directMeasurementFailure(measurement);\n const candidates = buildDuplicateRecordCandidates(\n measurement.fragments,\n context.options.codeAreas\n );\n if (candidates === undefined) return unavailable(\"external-result-invalid\");\n const reconciliation = reconcileDuplicateFindingWaivers(\n candidates,\n context.options.findingWaivers\n );\n reportReconciledCodeQualityFindingRecords(context, reconciliation);\n reportFindingWaiverAudits(context, reconciliation, duplicateDetectionWaiverAuditRecord);\n return settleDuplicateFindings(reconciliation);\n}\n\nfunction noEligibleDuplicateInputResult(\n context: CheckExecutionContext<ResolvedDuplicateDetectionOptions>\n): CheckResult<DuplicateDetectionFinalData> {\n const reconciliation = reconcileDuplicateFindingWaivers([], context.options.findingWaivers);\n reportFindingWaiverAudits(context, reconciliation, duplicateDetectionWaiverAuditRecord);\n return appendCheckMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n duplicateWaiverMessages(reconciliation)\n );\n}\n\nfunction reconcileDuplicateFindingWaivers(\n candidates: readonly DuplicateRecordCandidate[],\n waivers: readonly DuplicateDetectionFindingWaiver[]\n): FindingWaiverReconciliation<DuplicateRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: duplicateDetectionFindingIdentity,\n waivers\n });\n}\n\nfunction settleDuplicateFindings(\n reconciliation: FindingWaiverReconciliation<DuplicateRecordCandidate>\n): CheckResult<DuplicateDetectionFinalData> {\n const settlement = settleFindings(\n reconciliation.findings.map((finding) => ({\n actionable: finding.disposition !== \"waived\",\n blocking: finding.finding.data.blocking\n }))\n );\n const actionableCandidates = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendCheckMessages(\n appendCheckMessages(settlement, duplicateFindingMessages(actionableCandidates)),\n duplicateWaiverMessages(reconciliation)\n );\n}\n\nfunction prepareExactInputSet(\n rootDir: string,\n options: ResolvedDuplicateDetectionOptions\n): DuplicateDetectionExactInputSet {\n const areas = collectAreaInputs(rootDir, options.codeAreas);\n const approvedExactPaths = uniqueSorted(areas.flatMap((area) => area.approvedExactPaths));\n const inputFingerprint = fingerprintProjectFiles(rootDir, approvedExactPaths);\n return Object.freeze({\n approvedExactPaths: Object.freeze(approvedExactPaths),\n areas,\n cacheRootDir: resolve(rootDir, options.cache.directory),\n commitSha: getGitSha(rootDir),\n inputFingerprint: Object.freeze({\n ...inputFingerprint,\n fileList: Object.freeze([...inputFingerprint.fileList])\n }),\n rootDir\n });\n}\n\nfunction collectAreaInputs(\n rootDir: string,\n codeAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): readonly DuplicateDetectionAreaInput[] {\n const orderedPolicies = Object.entries(codeAreas).sort(([left], [right]) =>\n compareText(left, right)\n );\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(orderedPolicies.map(([areaId, policy]) => [areaId, policy.files]))\n );\n return Object.freeze(\n orderedPolicies.flatMap(([codeArea, policy]) => {\n const approvedExactPaths = requireProjectFileSet(filesByArea, codeArea);\n return approvedExactPaths.length === 0\n ? []\n : [\n Object.freeze({\n approvedExactPaths: Object.freeze(approvedExactPaths),\n codeArea,\n minimumLines: policy.minimumLines,\n minimumTokens: policy.minimumTokens\n })\n ];\n })\n );\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction directMeasurementFailure(\n measurement: Exclude<DuplicateMeasurementResult, { kind: \"complete\" }>\n): CheckResult<DuplicateDetectionFinalData> {\n switch (measurement.kind) {\n case \"cache-write-failed\":\n return unavailable(\"cache-write-failed\");\n case \"execution-failed\":\n return unavailable(\"external-execution-failed\");\n case \"invalid-result\":\n return unavailable(\"external-result-invalid\");\n case \"unavailable\":\n return unavailable(\"external-dependency-unavailable\");\n }\n}\n\nfunction unavailable(\n code: DuplicateDetectionUnavailableReasonCode\n): CheckResult<DuplicateDetectionFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: DuplicateDetectionUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"duplicateDetection options are invalid; recreate the Check with duplicateDetection(options) or restore its complete resolved options.\";\n case \"source-unavailable\":\n return \"Duplicate detection could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"external-dependency-unavailable\":\n return \"The configured jscpd command is unavailable or incompatible; restore the package dependency or configure a compatible executable.\";\n case \"external-execution-failed\":\n return \"jscpd did not complete successfully; run the configured command directly and inspect its environment.\";\n case \"external-result-invalid\":\n return \"jscpd output could not form a trusted complete result; check command and report compatibility.\";\n case \"cache-write-failed\":\n return \"Duplicate detection completed scanning but could not write its cache; check the configured cache directory permissions.\";\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { presentCheckFindings } from "../../check/finding-presentation.mjs";
1
+ import { presentCheckFindings } from "../../package-tools/finding-presentation/finding-presentation.mjs";
2
2
  import { duplicateDetectionWaiverIdentity } from "./records.mjs";
3
3
  const PRESENTED_FINDING_LIMIT = 10;
4
4
  /** Projects duplicate Records into bounded, project-relative terminal summaries. */
@@ -1 +1 @@
1
- {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/finding-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../check/finding-presentation.ts\";\nimport type {\n FindingWaiverAudit,\n FindingWaiverReconciliation\n} from \"../../finding-waivers/reconciliation.ts\";\nimport type { DuplicateDetectionFindingLocation } from \"./options.ts\";\nimport { duplicateDetectionWaiverIdentity, type DuplicateRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\n/** Projects duplicate Records into bounded, project-relative terminal summaries. */\nexport function duplicateFindingMessages(\n candidates: readonly DuplicateRecordCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings: candidates,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) =>\n Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `Duplicate fragment contains ${data.tokenCount} tokens across ${data.lineCount} lines at ${duplicateLocationSummary(data.locations)}.`\n }),\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional duplicate finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n\n/** 将每项 duplicate-detection waiver audit 投影为可行动的 terminal message。 */\nexport function duplicateWaiverMessages(\n reconciliation: FindingWaiverReconciliation<DuplicateRecordCandidate>\n): readonly CheckMessage[] {\n return Object.freeze(reconciliation.waiverAudits.map(duplicateWaiverMessage));\n}\n\nfunction duplicateWaiverMessage(audit: FindingWaiverAudit): CheckMessage {\n const identity = duplicateDetectionWaiverIdentity(audit.waiver);\n const subject = duplicateLocationSummary(identity.locations);\n switch (audit.status) {\n case \"applied\":\n return Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `Duplicate finding at ${subject} was waived: ${audit.waiver.reason}`\n });\n case \"unused\":\n return Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured duplicate-detection finding waiver at ${subject} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n });\n case \"overmatched\":\n return Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured duplicate-detection finding waiver at ${subject} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n });\n }\n}\n\nfunction duplicateLocationSummary(locations: readonly DuplicateDetectionFindingLocation[]): string {\n const presented = locations\n .slice(0, 2)\n .map(({ endLine, path, startLine }) => `${path}:${startLine}-${endLine}`)\n .join(\", \");\n const omitted = locations.length - 2;\n return omitted > 0 ? `${presented}, and ${omitted} more location(s)` : presented;\n}\n"]}
1
+ {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/finding-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport type {\n FindingWaiverAudit,\n FindingWaiverReconciliation\n} from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport type { DuplicateDetectionFindingLocation } from \"./options.ts\";\nimport { duplicateDetectionWaiverIdentity, type DuplicateRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\n/** Projects duplicate Records into bounded, project-relative terminal summaries. */\nexport function duplicateFindingMessages(\n candidates: readonly DuplicateRecordCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings: candidates,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) =>\n Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `Duplicate fragment contains ${data.tokenCount} tokens across ${data.lineCount} lines at ${duplicateLocationSummary(data.locations)}.`\n }),\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional duplicate finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n\n/** 将每项 duplicate-detection waiver audit 投影为可行动的 terminal message。 */\nexport function duplicateWaiverMessages(\n reconciliation: FindingWaiverReconciliation<DuplicateRecordCandidate>\n): readonly CheckMessage[] {\n return Object.freeze(reconciliation.waiverAudits.map(duplicateWaiverMessage));\n}\n\nfunction duplicateWaiverMessage(audit: FindingWaiverAudit): CheckMessage {\n const identity = duplicateDetectionWaiverIdentity(audit.waiver);\n const subject = duplicateLocationSummary(identity.locations);\n switch (audit.status) {\n case \"applied\":\n return Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `Duplicate finding at ${subject} was waived: ${audit.waiver.reason}`\n });\n case \"unused\":\n return Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured duplicate-detection finding waiver at ${subject} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n });\n case \"overmatched\":\n return Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured duplicate-detection finding waiver at ${subject} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n });\n }\n}\n\nfunction duplicateLocationSummary(locations: readonly DuplicateDetectionFindingLocation[]): string {\n const presented = locations\n .slice(0, 2)\n .map(({ endLine, path, startLine }) => `${path}:${startLine}-${endLine}`)\n .join(\", \");\n const omitted = locations.length - 2;\n return omitted > 0 ? `${presented}, and ${omitted} more location(s)` : presented;\n}\n"]}
@@ -72,6 +72,6 @@ function commandOutput(result) {
72
72
  function processTermination(result) {
73
73
  return typeof result.status === "number"
74
74
  ? `exit ${result.status}`
75
- : `signal ${result.signal || "unknown"}`;
75
+ : `signal ${result.signal ?? "unknown"}`;
76
76
  }
77
77
  //# sourceMappingURL=availability.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"availability.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/duplicate-detection/jscpd/availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAyBvD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,UAAoD;IAEpD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,wBAAwB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,gBAAgB,CAAC,qCAAqC,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC5C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;YACpC,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;QACH,OAAO,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,KAAK,YAAY,KAAK;YAC3B,CAAC,CAAC,wBAAwB,CAAC,KAAK,EAAE,UAAU,CAAC;YAC7C,CAAC,CAAC,gBAAgB,CAAC,eAAe,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,MAAyB,EACzB,UAAoD;IAEpD,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,wBAAwB,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,+BAA+B,CAAC,UAAU,CAAC,CAAC;IACzE,OAAO;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI;QACf,OAAO;QACP,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC;QAC/B,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,MAAyB,EACzB,MAAc,EACd,UAAoD;IAEpD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,OAAO,gBAAgB,CACrB,2BAA2B,kBAAkB,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,EAChE,iBAAiB,EACjB,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CACtC,UAAoD;IAEpD,OAAO,gBAAgB,CACrB,8CAA8C,EAC9C,iBAAiB,EACjB,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAAY,EACZ,UAAoD;IAEpD,MAAM,aAAa,GAAI,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC;IACzE,OAAO,gBAAgB,CACrB,aAAa,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,EAC/F,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,EACtD,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAa,EACb,MAAkD,EAClD,UAAoD;IAEpD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;QACb,KAAK;QACL,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC;QAC/B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,UAAoD;IACvE,OAAO,qBAAqB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC7F,CAAC;AAED,SAAS,aAAa,CAAC,MAAyB;IAC9C,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAyB;IACnD,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACtC,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE;QACzB,CAAC,CAAC,UAAU,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;AAC7C,CAAC","sourcesContent":["import { runProcess } from \"../../host-environment/process.ts\";\nimport type { ResolvedDuplicateDetectionScannerOptions } from \"../options.ts\";\nimport { isMissingExplicitCommand } from \"./command-path.ts\";\nimport { isPackageJscpdCommand, resolveJscpdCommand } from \"./command-resolution.ts\";\nimport { parseJscpdVersionOutput } from \"./scanner.ts\";\n\ntype JscpdAvailability = Readonly<\n | {\n available: true;\n error: null;\n name: \"jscpd\";\n reason: null;\n source: JscpdSource;\n version: string;\n }\n | {\n available: false;\n error: string;\n name: \"jscpd\";\n reason: \"execution-error\" | \"tool-unavailable\";\n source: JscpdSource;\n version: null;\n }\n>;\n\ntype JscpdSource = \"custom command\" | \"package dependency\";\n\ntype ToolCommandResult = Awaited<ReturnType<typeof runProcess>>;\n\nexport async function checkJscpd(\n rootDir: string,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): Promise<JscpdAvailability> {\n const resolved = resolveJscpdCommand(dependency.command);\n if (resolved.kind === \"unavailable\") {\n return unavailableJscpd(resolved.error, \"tool-unavailable\", dependency);\n }\n if (isMissingExplicitCommand(resolved.command.executable)) {\n return unavailableJscpd(\"jscpd dependency binary unavailable\", \"tool-unavailable\", dependency);\n }\n\n try {\n const result = await runProcess({\n args: [...resolved.command.versionArguments],\n command: resolved.command.executable,\n cwd: rootDir\n });\n return availabilityFromVersionResult(result, dependency);\n } catch (error: unknown) {\n return error instanceof Error\n ? processErrorAvailability(error, dependency)\n : unavailableJscpd(\"unknown error\", \"execution-error\", dependency);\n }\n}\n\nfunction availabilityFromVersionResult(\n result: ToolCommandResult,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n if (result.error) return processErrorAvailability(result.error, dependency);\n const output = commandOutput(result);\n if (result.status !== 0) return failedVersionAvailability(result, output, dependency);\n const version = parseJscpdVersionOutput(output);\n if (version === null) return unrecognizedVersionAvailability(dependency);\n return {\n name: \"jscpd\",\n available: true,\n version,\n error: null,\n source: jscpdSource(dependency),\n reason: null\n };\n}\n\nfunction failedVersionAvailability(\n result: ToolCommandResult,\n output: string,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n const detail = output ? `: ${output}` : \"\";\n return unavailableJscpd(\n `jscpd --version failed, ${processTermination(result)}${detail}`,\n \"execution-error\",\n dependency\n );\n}\n\nfunction unrecognizedVersionAvailability(\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n return unavailableJscpd(\n \"jscpd --version returned unrecognized output\",\n \"execution-error\",\n dependency\n );\n}\n\nfunction processErrorAvailability(\n error: Error,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n const isMissingTool = (error as NodeJS.ErrnoException).code === \"ENOENT\";\n return unavailableJscpd(\n isMissingTool ? \"jscpd dependency binary unavailable\" : `jscpd version error: ${error.message}`,\n isMissingTool ? \"tool-unavailable\" : \"execution-error\",\n dependency\n );\n}\n\nfunction unavailableJscpd(\n error: string,\n reason: Exclude<JscpdAvailability[\"reason\"], null>,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n return {\n name: \"jscpd\",\n available: false,\n version: null,\n error,\n source: jscpdSource(dependency),\n reason\n };\n}\n\nfunction jscpdSource(dependency: ResolvedDuplicateDetectionScannerOptions): JscpdSource {\n return isPackageJscpdCommand(dependency.command) ? \"package dependency\" : \"custom command\";\n}\n\nfunction commandOutput(result: ToolCommandResult): string {\n return (result.stdout || \"\").trim() || (result.stderr || \"\").trim();\n}\n\nfunction processTermination(result: ToolCommandResult): string {\n return typeof result.status === \"number\"\n ? `exit ${result.status}`\n : `signal ${result.signal || \"unknown\"}`;\n}\n"]}
1
+ {"version":3,"file":"availability.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/duplicate-detection/jscpd/availability.ts"],"names":[],"mappings":"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","sourcesContent":["import { runProcess } from \"../../host-environment/process.ts\";\nimport type { ResolvedDuplicateDetectionScannerOptions } from \"../options.ts\";\nimport { isMissingExplicitCommand } from \"./command-path.ts\";\nimport { isPackageJscpdCommand, resolveJscpdCommand } from \"./command-resolution.ts\";\nimport { parseJscpdVersionOutput } from \"./scanner.ts\";\n\ntype JscpdAvailability = Readonly<\n | {\n available: true;\n error: null;\n name: \"jscpd\";\n reason: null;\n source: JscpdSource;\n version: string;\n }\n | {\n available: false;\n error: string;\n name: \"jscpd\";\n reason: \"execution-error\" | \"tool-unavailable\";\n source: JscpdSource;\n version: null;\n }\n>;\n\ntype JscpdSource = \"custom command\" | \"package dependency\";\n\ntype ToolCommandResult = Awaited<ReturnType<typeof runProcess>>;\n\nexport async function checkJscpd(\n rootDir: string,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): Promise<JscpdAvailability> {\n const resolved = resolveJscpdCommand(dependency.command);\n if (resolved.kind === \"unavailable\") {\n return unavailableJscpd(resolved.error, \"tool-unavailable\", dependency);\n }\n if (isMissingExplicitCommand(resolved.command.executable)) {\n return unavailableJscpd(\"jscpd dependency binary unavailable\", \"tool-unavailable\", dependency);\n }\n\n try {\n const result = await runProcess({\n args: [...resolved.command.versionArguments],\n command: resolved.command.executable,\n cwd: rootDir\n });\n return availabilityFromVersionResult(result, dependency);\n } catch (error: unknown) {\n return error instanceof Error\n ? processErrorAvailability(error, dependency)\n : unavailableJscpd(\"unknown error\", \"execution-error\", dependency);\n }\n}\n\nfunction availabilityFromVersionResult(\n result: ToolCommandResult,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n if (result.error) return processErrorAvailability(result.error, dependency);\n const output = commandOutput(result);\n if (result.status !== 0) return failedVersionAvailability(result, output, dependency);\n const version = parseJscpdVersionOutput(output);\n if (version === null) return unrecognizedVersionAvailability(dependency);\n return {\n name: \"jscpd\",\n available: true,\n version,\n error: null,\n source: jscpdSource(dependency),\n reason: null\n };\n}\n\nfunction failedVersionAvailability(\n result: ToolCommandResult,\n output: string,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n const detail = output ? `: ${output}` : \"\";\n return unavailableJscpd(\n `jscpd --version failed, ${processTermination(result)}${detail}`,\n \"execution-error\",\n dependency\n );\n}\n\nfunction unrecognizedVersionAvailability(\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n return unavailableJscpd(\n \"jscpd --version returned unrecognized output\",\n \"execution-error\",\n dependency\n );\n}\n\nfunction processErrorAvailability(\n error: Error,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n const isMissingTool = (error as NodeJS.ErrnoException).code === \"ENOENT\";\n return unavailableJscpd(\n isMissingTool ? \"jscpd dependency binary unavailable\" : `jscpd version error: ${error.message}`,\n isMissingTool ? \"tool-unavailable\" : \"execution-error\",\n dependency\n );\n}\n\nfunction unavailableJscpd(\n error: string,\n reason: Exclude<JscpdAvailability[\"reason\"], null>,\n dependency: ResolvedDuplicateDetectionScannerOptions\n): JscpdAvailability {\n return {\n name: \"jscpd\",\n available: false,\n version: null,\n error,\n source: jscpdSource(dependency),\n reason\n };\n}\n\nfunction jscpdSource(dependency: ResolvedDuplicateDetectionScannerOptions): JscpdSource {\n return isPackageJscpdCommand(dependency.command) ? \"package dependency\" : \"custom command\";\n}\n\nfunction commandOutput(result: ToolCommandResult): string {\n return (result.stdout || \"\").trim() || (result.stderr || \"\").trim();\n}\n\nfunction processTermination(result: ToolCommandResult): string {\n return typeof result.status === \"number\"\n ? `exit ${result.status}`\n : `signal ${result.signal ?? \"unknown\"}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\n\nexport type DuplicateDetectionScannerCommand =\n /** 使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n | Readonly<{ readonly kind: \"package\" }>\n /** 显式授权另一个 jscpd 命令。 */\n | Readonly<{\n /** 项目已授权且直接接受 jscpd CLI 参数的非空命令。 */\n readonly executable: string;\n readonly kind: \"custom\";\n }>;\n\n/** `duplicateDetection` 构造函数可省略的缓存策略。 */\nexport interface DuplicateDetectionCacheOptions {\n /** 省略时为 `.cache/vibe-check`;相对路径以项目根目录解析。 */\n readonly directory?: string;\n /** 省略时启用。 */\n readonly enabled?: boolean;\n}\n\n/** `duplicateDetection` 构造函数可省略的 scanner 策略。 */\nexport interface DuplicateDetectionScannerOptions {\n /** 省略时使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n readonly command?: DuplicateDetectionScannerCommand;\n}\n\n/** duplicate-detection identity 的 locations 数组中的一段 project-relative range。 */\nexport interface DuplicateDetectionFindingLocation {\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n}\n\n/** duplicate-detection 用于精确识别一条可豁免 finding 的稳定字段。 */\nexport interface DuplicateDetectionFindingIdentity {\n readonly locations: readonly DuplicateDetectionFindingLocation[];\n readonly metric: \"duplicate-tokens\";\n}\n\n/** 一项 duplicate-detection finding 的声明式豁免。 */\nexport type DuplicateDetectionFindingWaiver = FindingWaiver<DuplicateDetectionFindingIdentity>;\n\n/** 重复代码区域可省略并由构造函数补齐的文件策略。 */\nexport type DuplicateDetectionFileOptions = ProjectFileSelectionOptions;\n\n/** 同时拥有文件选择、比较边界、阈值和 finding policy 的重复代码区域。 */\nexport interface DuplicateDetectionCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: DuplicateDetectionFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时为 `4`。 */\n readonly minimumLines?: number;\n /** 省略时为 `100`。 */\n readonly minimumTokens?: number;\n}\n\n/** `duplicateDetection(options?)` 接受并补齐默认值的公开策略。 */\nexport interface DuplicateDetectionOptions {\n /** 省略时建立默认 `project` 区域;显式映射必须非空。 */\n readonly codeAreas?: Readonly<Record<string, DuplicateDetectionCodeAreaOptions>>;\n readonly cache?: DuplicateDetectionCacheOptions;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;identity 使用 Finding 发布的完整排序 location ranges。 */\n readonly findingWaivers?: readonly DuplicateDetectionFindingWaiver[];\n readonly scanner?: DuplicateDetectionScannerOptions;\n}\n\n/** 构造函数生成并由 Check preflight/execution 消费的完整 options。 */\nexport interface ResolvedDuplicateDetectionOptions {\n readonly cache: Readonly<{ readonly directory: string; readonly enabled: boolean }>;\n readonly codeAreas: Readonly<Record<string, ResolvedDuplicateDetectionCodeAreaOptions>>;\n readonly findingWaivers: readonly DuplicateDetectionFindingWaiver[];\n readonly scanner: ResolvedDuplicateDetectionScannerOptions;\n}\n\nexport interface ResolvedDuplicateDetectionCodeAreaOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly minimumLines: number;\n readonly minimumTokens: number;\n}\n\nexport interface ResolvedDuplicateDetectionScannerOptions {\n readonly command: DuplicateDetectionScannerCommand;\n}\n"]}
1
+ {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/options.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\n\nexport type DuplicateDetectionScannerCommand =\n /** 使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n | Readonly<{ readonly kind: \"package\" }>\n /** 显式授权另一个 jscpd 命令。 */\n | Readonly<{\n /** 项目已授权且直接接受 jscpd CLI 参数的非空命令。 */\n readonly executable: string;\n readonly kind: \"custom\";\n }>;\n\n/** `duplicateDetection` 构造函数可省略的缓存策略。 */\nexport interface DuplicateDetectionCacheOptions {\n /** 省略时为 `.cache/vibe-check`;相对路径以项目根目录解析。 */\n readonly directory?: string;\n /** 省略时启用。 */\n readonly enabled?: boolean;\n}\n\n/** `duplicateDetection` 构造函数可省略的 scanner 策略。 */\nexport interface DuplicateDetectionScannerOptions {\n /** 省略时使用随 `@zxyycom/vibe-check` 安装的 jscpd。 */\n readonly command?: DuplicateDetectionScannerCommand;\n}\n\n/** duplicate-detection identity 的 locations 数组中的一段 project-relative range。 */\nexport interface DuplicateDetectionFindingLocation {\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n}\n\n/** duplicate-detection 用于精确识别一条可豁免 finding 的稳定字段。 */\nexport interface DuplicateDetectionFindingIdentity {\n readonly locations: readonly DuplicateDetectionFindingLocation[];\n readonly metric: \"duplicate-tokens\";\n}\n\n/** 一项 duplicate-detection finding 的声明式豁免。 */\nexport type DuplicateDetectionFindingWaiver = FindingWaiver<DuplicateDetectionFindingIdentity>;\n\n/** 重复代码区域可省略并由构造函数补齐的文件策略。 */\nexport type DuplicateDetectionFileOptions = ProjectFileSelectionOptions;\n\n/** 同时拥有文件选择、比较边界、阈值和 finding policy 的重复代码区域。 */\nexport interface DuplicateDetectionCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: DuplicateDetectionFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时为 `4`。 */\n readonly minimumLines?: number;\n /** 省略时为 `100`。 */\n readonly minimumTokens?: number;\n}\n\n/** `duplicateDetection(options?)` 接受并补齐默认值的公开策略。 */\nexport interface DuplicateDetectionOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 省略时建立默认 `project` 区域;显式映射必须非空。 */\n readonly codeAreas?: Readonly<Record<string, DuplicateDetectionCodeAreaOptions>>;\n readonly cache?: DuplicateDetectionCacheOptions;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;identity 使用 Finding 发布的完整排序 location ranges。 */\n readonly findingWaivers?: readonly DuplicateDetectionFindingWaiver[];\n readonly scanner?: DuplicateDetectionScannerOptions;\n}\n\n/** 构造函数生成并由 Check preparation/execution 消费的完整 options。 */\nexport interface ResolvedDuplicateDetectionOptions {\n readonly cache: Readonly<{ readonly directory: string; readonly enabled: boolean }>;\n readonly codeAreas: Readonly<Record<string, ResolvedDuplicateDetectionCodeAreaOptions>>;\n readonly findingWaivers: readonly DuplicateDetectionFindingWaiver[];\n readonly scanner: ResolvedDuplicateDetectionScannerOptions;\n}\n\nexport interface ResolvedDuplicateDetectionCodeAreaOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly minimumLines: number;\n readonly minimumTokens: number;\n}\n\nexport interface ResolvedDuplicateDetectionScannerOptions {\n readonly command: DuplicateDetectionScannerCommand;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/records.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { canonicalJsonBytes } from \"../../data-boundary/canonical-data.ts\";\nimport type { MaterializedFindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\nimport {\n buildHashedFindingWaiverAuditRecord,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { isBlockingFinding, type FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport {\n compareDuplicateFindingLocations,\n resolveDuplicateDetectionFindingIdentity\n} from \"./finding-waiver-identity.ts\";\nimport type { DuplicateCodeFragment, DuplicateCodeLocation } from \"./measurement-model.ts\";\nimport type {\n DuplicateDetectionFindingIdentity,\n ResolvedDuplicateDetectionOptions\n} from \"./options.ts\";\n\n/** 一条可信重复片段 supplemental Record 的 data。 */\nexport type DuplicateDetectionFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly lineCount: number;\n readonly locations: readonly Readonly<{\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n }>[];\n readonly metric: \"duplicate-tokens\";\n readonly tokenCount: number;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 duplicate-detection waiver 的 supplemental audit Record data。 */\nexport type DuplicateDetectionFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<DuplicateDetectionFindingIdentity>;\n\n/** duplicateDetection 发布的 normal finding 或 waiver-audit Record data。 */\nexport type DuplicateDetectionRecordData =\n | DuplicateDetectionFindingRecordData\n | DuplicateDetectionFindingWaiverAuditRecordData;\n\nexport interface DuplicateRecordCandidate {\n readonly data: DuplicateDetectionFindingRecordData;\n readonly id: string;\n}\n\nexport function duplicateDetectionFindingIdentity(\n candidate: DuplicateRecordCandidate\n): DuplicateDetectionFindingIdentity {\n return Object.freeze({\n locations: candidate.data.locations,\n metric: candidate.data.metric\n });\n}\n\nexport function duplicateDetectionWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): DuplicateDetectionFindingIdentity {\n const identity = resolveDuplicateDetectionFindingIdentity(waiver.identity);\n if (identity === undefined) {\n throw new TypeError(\"duplicateDetection waiver identity must retain sorted valid locations\");\n }\n return identity;\n}\n\n/** 为一项未使用或过宽 waiver 构造 Check-owned audit Record。 */\nexport function duplicateDetectionWaiverAuditRecord(audit: FindingWaiverRecordAudit): Readonly<{\n readonly data: DuplicateDetectionFindingWaiverAuditRecordData;\n readonly id: string;\n}> {\n const identity = duplicateDetectionWaiverIdentity(audit.waiver);\n return buildHashedFindingWaiverAuditRecord(identity, audit);\n}\n\n/** Builds Check-owned supplemental facts without adding a Product record catalog. */\nexport function buildDuplicateRecordCandidates(\n fragments: readonly DuplicateCodeFragment[],\n codeAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): readonly DuplicateRecordCandidate[] | undefined {\n const ids = duplicateIdsInOrder(fragments);\n if (ids === undefined) return undefined;\n\n const candidates: DuplicateRecordCandidate[] = [];\n for (const [index, fragment] of fragments.entries()) {\n const candidate = createDuplicateRecordCandidate(fragment, ids[index], codeAreas);\n if (candidate === undefined) return undefined;\n candidates.push(candidate);\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction createDuplicateRecordCandidate(\n fragment: DuplicateCodeFragment,\n id: string | undefined,\n configuredAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): DuplicateRecordCandidate | undefined {\n if (!isValidDuplicateFragment(fragment) || id === undefined) return undefined;\n\n const locations = sortedLocations(fragment.locations);\n const codeAreas = uniqueSorted(fragment.codeAreas);\n if (codeAreas.length === 0 || !sameStrings(codeAreas, fragment.codeAreas)) return undefined;\n const findingPolicies: FindingPolicy[] = [];\n for (const areaId of codeAreas) {\n const area = configuredAreas[areaId];\n if (area === undefined) return undefined;\n findingPolicies.push(area.findingPolicy);\n }\n\n return Object.freeze({\n id,\n data: Object.freeze({\n blocking: isBlockingFinding(findingPolicies),\n codeAreas: Object.freeze(codeAreas),\n lineCount: fragment.lineCount,\n locations: Object.freeze(\n locations.map((location) =>\n Object.freeze({\n endLine: location.endLine,\n path: location.path,\n startLine: location.startLine\n })\n )\n ),\n metric: \"duplicate-tokens\",\n tokenCount: fragment.tokenCount\n })\n });\n}\n\nexport function isValidDuplicateFragment(fragment: DuplicateCodeFragment): boolean {\n return (\n hasValidFragmentMeasurements(fragment) &&\n Array.isArray(fragment.locations) &&\n fragment.locations.length >= 2 &&\n fragment.locations.every(isValidLocation) &&\n locationsAreDistinct(fragment.locations) &&\n Array.isArray(fragment.codeAreas) &&\n fragment.codeAreas.every(nonEmptyString)\n );\n}\n\nfunction locationsAreDistinct(locations: readonly DuplicateCodeLocation[]): boolean {\n return locations.every((location, index) =>\n locations\n .slice(index + 1)\n .every((other) => compareDuplicateFindingLocations(location, other) !== 0)\n );\n}\n\nfunction hasValidFragmentMeasurements(fragment: DuplicateCodeFragment): boolean {\n return (\n nonNegativeSafeInteger(fragment.id) &&\n nonNegativeSafeInteger(fragment.lineCount) &&\n nonNegativeSafeInteger(fragment.tokenCount)\n );\n}\n\nfunction nonNegativeSafeInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isValidLocation(location: DuplicateCodeLocation): boolean {\n const validPath = typeof location.path === \"string\" && location.path.length > 0;\n const validLines =\n Number.isSafeInteger(location.startLine) &&\n location.startLine >= 1 &&\n Number.isSafeInteger(location.endLine) &&\n location.endLine >= location.startLine;\n return validPath && validLines;\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction sameStrings(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction duplicateIdsInOrder(\n fragments: readonly DuplicateCodeFragment[]\n): readonly string[] | undefined {\n const occurrences = new Map<string, number>();\n const ids: string[] = [];\n for (const fragment of fragments) {\n if (!isValidDuplicateFragment(fragment)) return undefined;\n const fingerprint = duplicateFingerprint(fragment);\n const occurrence = (occurrences.get(fingerprint) ?? 0) + 1;\n occurrences.set(fingerprint, occurrence);\n ids.push(`duplicate-fragment/v1/sha256:${fingerprint}/occurrence:${occurrence}`);\n }\n return Object.freeze(ids);\n}\n\nfunction duplicateFingerprint(fragment: DuplicateCodeFragment): string {\n return createHash(\"sha256\")\n .update(\n canonicalJsonBytes({\n lineCount: fragment.lineCount,\n paths: uniqueSorted(fragment.locations.map((location) => location.path)),\n tokenCount: fragment.tokenCount\n })\n )\n .digest(\"hex\");\n}\n\nfunction sortedLocations(locations: readonly DuplicateCodeLocation[]): DuplicateCodeLocation[] {\n return [...locations].sort(compareDuplicateFindingLocations);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/duplicate-detection/records.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { canonicalJsonBytes } from \"../../data-boundary/canonical-data.ts\";\nimport type { MaterializedFindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport {\n buildHashedFindingWaiverAuditRecord,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { isBlockingFinding, type FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport {\n compareDuplicateFindingLocations,\n resolveDuplicateDetectionFindingIdentity\n} from \"./finding-waiver-identity.ts\";\nimport type { DuplicateCodeFragment, DuplicateCodeLocation } from \"./measurement-model.ts\";\nimport type {\n DuplicateDetectionFindingIdentity,\n ResolvedDuplicateDetectionOptions\n} from \"./options.ts\";\n\n/** 一条可信重复片段 supplemental Record 的 data。 */\nexport type DuplicateDetectionFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly lineCount: number;\n readonly locations: readonly Readonly<{\n readonly endLine: number;\n readonly path: string;\n readonly startLine: number;\n }>[];\n readonly metric: \"duplicate-tokens\";\n readonly tokenCount: number;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 duplicate-detection waiver 的 supplemental audit Record data。 */\nexport type DuplicateDetectionFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<DuplicateDetectionFindingIdentity>;\n\n/** duplicateDetection 发布的 normal finding 或 waiver-audit Record data。 */\nexport type DuplicateDetectionRecordData =\n | DuplicateDetectionFindingRecordData\n | DuplicateDetectionFindingWaiverAuditRecordData;\n\nexport interface DuplicateRecordCandidate {\n readonly data: DuplicateDetectionFindingRecordData;\n readonly id: string;\n}\n\nexport function duplicateDetectionFindingIdentity(\n candidate: DuplicateRecordCandidate\n): DuplicateDetectionFindingIdentity {\n return Object.freeze({\n locations: candidate.data.locations,\n metric: candidate.data.metric\n });\n}\n\nexport function duplicateDetectionWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): DuplicateDetectionFindingIdentity {\n const identity = resolveDuplicateDetectionFindingIdentity(waiver.identity);\n if (identity === undefined) {\n throw new TypeError(\"duplicateDetection waiver identity must retain sorted valid locations\");\n }\n return identity;\n}\n\n/** 为一项未使用或过宽 waiver 构造 Check-owned audit Record。 */\nexport function duplicateDetectionWaiverAuditRecord(audit: FindingWaiverRecordAudit): Readonly<{\n readonly data: DuplicateDetectionFindingWaiverAuditRecordData;\n readonly id: string;\n}> {\n const identity = duplicateDetectionWaiverIdentity(audit.waiver);\n return buildHashedFindingWaiverAuditRecord(identity, audit);\n}\n\n/** Builds Check-owned supplemental facts without adding a Product record catalog. */\nexport function buildDuplicateRecordCandidates(\n fragments: readonly DuplicateCodeFragment[],\n codeAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): readonly DuplicateRecordCandidate[] | undefined {\n const ids = duplicateIdsInOrder(fragments);\n if (ids === undefined) return undefined;\n\n const candidates: DuplicateRecordCandidate[] = [];\n for (const [index, fragment] of fragments.entries()) {\n const candidate = createDuplicateRecordCandidate(fragment, ids[index], codeAreas);\n if (candidate === undefined) return undefined;\n candidates.push(candidate);\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction createDuplicateRecordCandidate(\n fragment: DuplicateCodeFragment,\n id: string | undefined,\n configuredAreas: ResolvedDuplicateDetectionOptions[\"codeAreas\"]\n): DuplicateRecordCandidate | undefined {\n if (!isValidDuplicateFragment(fragment) || id === undefined) return undefined;\n\n const locations = sortedLocations(fragment.locations);\n const codeAreas = uniqueSorted(fragment.codeAreas);\n if (codeAreas.length === 0 || !sameStrings(codeAreas, fragment.codeAreas)) return undefined;\n const findingPolicies: FindingPolicy[] = [];\n for (const areaId of codeAreas) {\n const area = configuredAreas[areaId];\n if (area === undefined) return undefined;\n findingPolicies.push(area.findingPolicy);\n }\n\n return Object.freeze({\n id,\n data: Object.freeze({\n blocking: isBlockingFinding(findingPolicies),\n codeAreas: Object.freeze(codeAreas),\n lineCount: fragment.lineCount,\n locations: Object.freeze(\n locations.map((location) =>\n Object.freeze({\n endLine: location.endLine,\n path: location.path,\n startLine: location.startLine\n })\n )\n ),\n metric: \"duplicate-tokens\",\n tokenCount: fragment.tokenCount\n })\n });\n}\n\nexport function isValidDuplicateFragment(fragment: DuplicateCodeFragment): boolean {\n return (\n hasValidFragmentMeasurements(fragment) &&\n Array.isArray(fragment.locations) &&\n fragment.locations.length >= 2 &&\n fragment.locations.every(isValidLocation) &&\n locationsAreDistinct(fragment.locations) &&\n Array.isArray(fragment.codeAreas) &&\n fragment.codeAreas.every(nonEmptyString)\n );\n}\n\nfunction locationsAreDistinct(locations: readonly DuplicateCodeLocation[]): boolean {\n return locations.every((location, index) =>\n locations\n .slice(index + 1)\n .every((other) => compareDuplicateFindingLocations(location, other) !== 0)\n );\n}\n\nfunction hasValidFragmentMeasurements(fragment: DuplicateCodeFragment): boolean {\n return (\n nonNegativeSafeInteger(fragment.id) &&\n nonNegativeSafeInteger(fragment.lineCount) &&\n nonNegativeSafeInteger(fragment.tokenCount)\n );\n}\n\nfunction nonNegativeSafeInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isValidLocation(location: DuplicateCodeLocation): boolean {\n const validPath = typeof location.path === \"string\" && location.path.length > 0;\n const validLines =\n Number.isSafeInteger(location.startLine) &&\n location.startLine >= 1 &&\n Number.isSafeInteger(location.endLine) &&\n location.endLine >= location.startLine;\n return validPath && validLines;\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction sameStrings(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction duplicateIdsInOrder(\n fragments: readonly DuplicateCodeFragment[]\n): readonly string[] | undefined {\n const occurrences = new Map<string, number>();\n const ids: string[] = [];\n for (const fragment of fragments) {\n if (!isValidDuplicateFragment(fragment)) return undefined;\n const fingerprint = duplicateFingerprint(fragment);\n const occurrence = (occurrences.get(fingerprint) ?? 0) + 1;\n occurrences.set(fingerprint, occurrence);\n ids.push(`duplicate-fragment/v1/sha256:${fingerprint}/occurrence:${occurrence}`);\n }\n return Object.freeze(ids);\n}\n\nfunction duplicateFingerprint(fragment: DuplicateCodeFragment): string {\n return createHash(\"sha256\")\n .update(\n canonicalJsonBytes({\n lineCount: fragment.lineCount,\n paths: uniqueSorted(fragment.locations.map((location) => location.path)),\n tokenCount: fragment.tokenCount\n })\n )\n .digest(\"hex\");\n}\n\nfunction sortedLocations(locations: readonly DuplicateCodeLocation[]): DuplicateCodeLocation[] {\n return [...locations].sort(compareDuplicateFindingLocations);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -1,25 +1,23 @@
1
1
  import { defineCheck } from "../../check/check.mjs";
2
+ import { resolvePackageCheckAuthoringInput } from "../check-authoring.mjs";
2
3
  import { FILE_METRICS_CHECK_DEFINITION, executeFileMetrics } from "./execution.mjs";
3
4
  import { parseFileMetricsData } from "./final-data.mjs";
4
5
  import { resolveFileMetricsOptions } from "./options-resolution.mjs";
5
6
  import { isValidResolvedFileMetricsOptions } from "./options-validation.mjs";
6
- /**
7
- * 使用可省略的区域、代码行与 scanner policy 构造一个完整 file-metrics Check。
8
- *
9
- * @param options - 省略字段由 package 补齐;显式 files 数组作为对应字段的完整替换值。
10
- * @returns 固定 `file-metrics` identity、完整冻结 options、preflight 与 execution。
11
- * @throws {TypeError} input 含未知字段、空 area、非法代码行 policy、非法 waiver 或空 executable 时抛出。
12
- */
13
7
  export function fileMetrics(options = {}) {
14
- const resolvedOptions = resolveFileMetricsOptions(options);
8
+ const input = resolvePackageCheckAuthoringInput(options, ["codeAreas", "findingPolicy", "findingWaivers", "scanner"], FILE_METRICS_CHECK_DEFINITION);
9
+ if (input === undefined) {
10
+ throw new TypeError("fileMetrics options must match the documented closed { codeAreas?, findingPolicy?, findingWaivers?, scanner? } constructor policy");
11
+ }
12
+ const resolvedOptions = resolveFileMetricsOptions(input.domainOptions);
15
13
  if (resolvedOptions === undefined) {
16
14
  throw new TypeError("fileMetrics options must match the documented closed { codeAreas?, findingPolicy?, findingWaivers?, scanner? } constructor policy");
17
15
  }
18
16
  return defineCheck({
19
- ...FILE_METRICS_CHECK_DEFINITION,
20
- execution: executeFileMetrics,
17
+ ...input.definition,
18
+ execute: executeFileMetrics,
21
19
  parseData: parseFileMetricsData,
22
- preflight: (preparedOptions) => isValidResolvedFileMetricsOptions(preparedOptions)
20
+ prepare: (preparedOptions) => isValidResolvedFileMetricsOptions(preparedOptions)
23
21
  ? { status: "success", preparedOptions }
24
22
  : {
25
23
  status: "failure",
@@ -1 +1 @@
1
- {"version":3,"file":"constructor.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAO,GAAuB,EAAE;IAEhC,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,mIAAmI,CACpI,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,6BAA6B;QAChC,SAAS,EAAE,kBAAkB;QAC7B,SAAS,EAAE,oBAAoB;QAC/B,SAAS,EAAE,CAAC,eAAe,EAAE,EAAE,CAC7B,iCAAiC,CAAC,eAAe,CAAC;YAChD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,yHAAyH;qBAC5H;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport { FILE_METRICS_CHECK_DEFINITION, executeFileMetrics } from \"./execution.ts\";\nimport { parseFileMetricsData } from \"./final-data.ts\";\nimport type { FileMetricsOptions, ResolvedFileMetricsOptions } from \"./options.ts\";\nimport { resolveFileMetricsOptions } from \"./options-resolution.ts\";\nimport { isValidResolvedFileMetricsOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的区域、代码行与 scanner policy 构造一个完整 file-metrics Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组作为对应字段的完整替换值。\n * @returns 固定 `file-metrics` identity、完整冻结 options、preflight 与 execution。\n * @throws {TypeError} input 含未知字段、空 area、非法代码行 policy、非法 waiver 或空 executable 时抛出。\n */\nexport function fileMetrics(\n options: FileMetricsOptions = {}\n): TypedCheckWithOptions<\"file-metrics\", ResolvedFileMetricsOptions, typeof parseFileMetricsData> {\n const resolvedOptions = resolveFileMetricsOptions(options);\n if (resolvedOptions === undefined) {\n throw new TypeError(\n \"fileMetrics options must match the documented closed { codeAreas?, findingPolicy?, findingWaivers?, scanner? } constructor policy\"\n );\n }\n return defineCheck({\n ...FILE_METRICS_CHECK_DEFINITION,\n execution: executeFileMetrics,\n parseData: parseFileMetricsData,\n preflight: (preparedOptions) =>\n isValidResolvedFileMetricsOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"fileMetrics options are invalid; recreate the Check with fileMetrics(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
1
+ {"version":3,"file":"constructor.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,iCAAiC,EAElC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAkB5E,MAAM,UAAU,WAAW,CACzB,OAAO,GAAuB,EAAE;IAEhC,MAAM,KAAK,GAAG,iCAAiC,CAC7C,OAAO,EACP,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAC3D,6BAA6B,CAC9B,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CACjB,mIAAmI,CACpI,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,yBAAyB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACvE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,mIAAmI,CACpI,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,OAAO,EAAE,kBAAkB;QAC3B,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,CAAC,eAAe,EAAE,EAAE,CAC3B,iCAAiC,CAAC,eAAe,CAAC;YAChD,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;YACxC,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBACnC,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,OAAO;wBACd,OAAO,EACL,yHAAyH;qBAC5H;iBACF;aACF;QACP,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { defineCheck, type TypedCheckWithOptions } from \"../../check/check.ts\";\nimport {\n resolvePackageCheckAuthoringInput,\n type PackageCheckIdentityInput\n} from \"../check-authoring.ts\";\nimport { FILE_METRICS_CHECK_DEFINITION, executeFileMetrics } from \"./execution.ts\";\nimport { parseFileMetricsData } from \"./final-data.ts\";\nimport type { FileMetricsOptions, ResolvedFileMetricsOptions } from \"./options.ts\";\nimport { resolveFileMetricsOptions } from \"./options-resolution.ts\";\nimport { isValidResolvedFileMetricsOptions } from \"./options-validation.ts\";\n\n/**\n * 使用可省略的区域、代码行与 scanner policy 构造一个完整 file-metrics Check。\n *\n * @param options - 省略字段由 package 补齐;显式 files 数组作为对应字段的完整替换值。\n * @returns 固定 `file-metrics` identity、完整冻结 options、preparation 与 execution。\n * @throws {TypeError} input 含未知字段、空 area、非法代码行 policy、非法 waiver 或空 executable 时抛出。\n */\nexport function fileMetrics(\n options?: FileMetricsOptions<\"file-metrics\">\n): TypedCheckWithOptions<\"file-metrics\", ResolvedFileMetricsOptions, typeof parseFileMetricsData>;\nexport function fileMetrics<const Id extends string>(\n options: FileMetricsOptions<Id> & PackageCheckIdentityInput<Id>\n): TypedCheckWithOptions<Id, ResolvedFileMetricsOptions, typeof parseFileMetricsData>;\nexport function fileMetrics(\n options: FileMetricsOptions\n): TypedCheckWithOptions<string, ResolvedFileMetricsOptions, typeof parseFileMetricsData>;\nexport function fileMetrics(\n options: FileMetricsOptions = {}\n): TypedCheckWithOptions<string, ResolvedFileMetricsOptions, typeof parseFileMetricsData> {\n const input = resolvePackageCheckAuthoringInput(\n options,\n [\"codeAreas\", \"findingPolicy\", \"findingWaivers\", \"scanner\"],\n FILE_METRICS_CHECK_DEFINITION\n );\n if (input === undefined) {\n throw new TypeError(\n \"fileMetrics options must match the documented closed { codeAreas?, findingPolicy?, findingWaivers?, scanner? } constructor policy\"\n );\n }\n const resolvedOptions = resolveFileMetricsOptions(input.domainOptions);\n if (resolvedOptions === undefined) {\n throw new TypeError(\n \"fileMetrics options must match the documented closed { codeAreas?, findingPolicy?, findingWaivers?, scanner? } constructor policy\"\n );\n }\n return defineCheck({\n ...input.definition,\n execute: executeFileMetrics,\n parseData: parseFileMetricsData,\n prepare: (preparedOptions) =>\n isValidResolvedFileMetricsOptions(preparedOptions)\n ? { status: \"success\", preparedOptions }\n : {\n status: \"failure\",\n action: \"block\",\n reason: { code: \"invalid-options\" },\n messages: [\n {\n code: \"invalid-options\",\n level: \"error\",\n message:\n \"fileMetrics options are invalid; recreate the Check with fileMetrics(options) or restore its complete resolved options.\"\n }\n ]\n },\n options: resolvedOptions\n });\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { reconcileFindingWaivers } from "../../finding-waivers/reconciliation.mjs";
1
+ import { reconcileFindingWaivers } from "../../package-tools/finding-waivers/reconciliation.mjs";
2
2
  import { collectProjectFileSets, requireProjectFileSet } from "../project-files/collection.mjs";
3
3
  import { settleFindings } from "../code-quality-findings/policy.mjs";
4
4
  import { reportFindingWaiverAudits, reportReconciledCodeQualityFindingRecords } from "../code-quality-findings/finding-waiver-evidence.mjs";
5
- import { appendCheckMessages } from "../../check/finding-presentation.mjs";
5
+ import { appendCheckMessages } from "../../package-tools/finding-presentation/finding-presentation.mjs";
6
6
  import { fileMetricFindingMessages } from "./finding-messages.mjs";
7
7
  import { measureFileMetrics } from "./measurement.mjs";
8
8
  import { isValidResolvedFileMetricsOptions } from "./options-validation.mjs";
@@ -127,8 +127,6 @@ function measurementFailureResult(measurement) {
127
127
  case "unavailable":
128
128
  return unavailable("external-dependency-unavailable");
129
129
  }
130
- const exhaustiveMeasurement = measurement;
131
- return exhaustiveMeasurement;
132
130
  }
133
131
  function unavailable(code) {
134
132
  return Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckExecutionContext, CheckMessage, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../check/finding-presentation.ts\";\nimport { fileMetricFindingMessages } from \"./finding-messages.ts\";\nimport { measureFileMetrics, type FileMeasurementResult } from \"./measurement.ts\";\nimport type { FileMetricsExactInputSet } from \"./measurement-model.ts\";\nimport type {\n FileMetricsFindingWaiver,\n ResolvedFileMetricsCodeAreaOptions,\n ResolvedFileMetricsOptions\n} from \"./options.ts\";\nimport { isValidResolvedFileMetricsOptions } from \"./options-validation.ts\";\nimport {\n buildFileRecordCandidates,\n fileMetricsWaiverAuditRecord,\n fileMetricsWaiverIdentity,\n type FileRecordCandidate\n} from \"./records.ts\";\nimport type { FileMetricsFinalData } from \"./final-data.ts\";\n\nexport const FILE_METRICS_CHECK_DEFINITION = {\n checkId: \"file-metrics\",\n displayName: \"File metrics\"\n} as const;\n\n/** `file-metrics` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type FileMetricsUnavailableReasonCode =\n | \"external-dependency-unavailable\"\n | \"external-execution-failed\"\n | \"external-result-invalid\"\n | \"invalid-options\"\n | \"source-unavailable\";\n\ninterface CollectedFileMetricsScope extends FileMetricsExactInputSet {\n readonly areaIdsByPath: ReadonlyMap<string, readonly string[]>;\n}\n\n/** 使用 resolved area policy 和 scanner selection 执行一次完整的 file-metrics measurement。 */\nexport async function executeFileMetrics(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>\n): Promise<CheckResult<FileMetricsFinalData>> {\n if (!isValidResolvedFileMetricsOptions(context.options)) return unavailable(\"invalid-options\");\n\n let collectedScope: CollectedFileMetricsScope;\n try {\n collectedScope = collectAreaScope(context.project.root, context.options.codeAreas);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (collectedScope.approvedExactPaths.length === 0) {\n return noEligibleInputResult(context);\n }\n const measurement = await measureFileMetrics(collectedScope, context.options.scanner);\n if (measurement.kind !== \"complete\") return measurementFailureResult(measurement);\n const candidates = buildFileRecordCandidates(measurement.metrics, {\n areaIdsByPath: collectedScope.areaIdsByPath,\n codeAreas: context.options.codeAreas\n });\n if (candidates === undefined) return unavailable(\"external-result-invalid\");\n const reconciliation = reconcileFileMetricWaivers(candidates, context.options.findingWaivers);\n reportReconciledCodeQualityFindingRecords(context, reconciliation);\n reportWaiverAuditRecords(context, reconciliation);\n const settlement = settleFindings(\n reconciliation.findings.map(({ disposition, finding }) => ({\n actionable: disposition !== \"waived\",\n blocking: finding.data.blocking\n }))\n );\n const actionableFindings = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendWaiverMessages(\n appendCheckMessages(settlement, fileMetricFindingMessages(actionableFindings)),\n reconciliation\n );\n}\n\nfunction noEligibleInputResult(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>\n): CheckResult<FileMetricsFinalData> {\n const reconciliation = reconcileFileMetricWaivers([], context.options.findingWaivers);\n reportWaiverAuditRecords(context, reconciliation);\n return appendWaiverMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n reconciliation\n );\n}\n\nfunction reconcileFileMetricWaivers(\n candidates: readonly FileRecordCandidate[],\n waivers: readonly FileMetricsFindingWaiver[]\n): FindingWaiverReconciliation<FileRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: ({ data }) => ({ metric: data.metric, path: data.path }),\n waivers\n });\n}\n\nfunction reportWaiverAuditRecords(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>,\n reconciliation: FindingWaiverReconciliation<FileRecordCandidate>\n): void {\n reportFindingWaiverAudits(context, reconciliation, fileMetricsWaiverAuditRecord);\n}\n\nfunction appendWaiverMessages(\n settlement: CheckResult<FileMetricsFinalData>,\n reconciliation: FindingWaiverReconciliation<FileRecordCandidate>\n): CheckResult<FileMetricsFinalData> {\n const waiverMessages: CheckMessage[] = [];\n for (const audit of reconciliation.waiverAudits) {\n const identity = fileMetricsWaiverIdentity(audit.waiver);\n switch (audit.status) {\n case \"applied\":\n waiverMessages.push(\n Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `File metric finding for ${identity.path} was waived: ${audit.waiver.reason}`\n })\n );\n break;\n case \"unused\":\n waiverMessages.push(\n Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured file-metrics finding waiver for ${identity.path} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n })\n );\n break;\n case \"overmatched\":\n waiverMessages.push(\n Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured file-metrics finding waiver for ${identity.path} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n })\n );\n break;\n }\n }\n if (waiverMessages.length === 0) return settlement;\n return Object.freeze({\n ...settlement,\n messages: Object.freeze([...(settlement.messages ?? []), ...waiverMessages])\n });\n}\n\nfunction collectAreaScope(\n rootDir: string,\n codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>\n): CollectedFileMetricsScope {\n const areaIdsByPath = new Map<string, string[]>();\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(Object.entries(codeAreas).map(([areaId, area]) => [areaId, area.files]))\n );\n for (const [areaId] of Object.entries(codeAreas)) {\n for (const path of requireProjectFileSet(filesByArea, areaId)) {\n const areaIds = areaIdsByPath.get(path);\n if (areaIds === undefined) areaIdsByPath.set(path, [areaId]);\n else areaIds.push(areaId);\n }\n }\n\n const normalizedMembership = new Map<string, readonly string[]>();\n for (const [path, areaIds] of areaIdsByPath) {\n normalizedMembership.set(path, Object.freeze(areaIds.sort(compareText)));\n }\n return Object.freeze({\n approvedExactPaths: Object.freeze([...normalizedMembership.keys()].sort(compareText)),\n areaIdsByPath: normalizedMembership,\n rootDir\n });\n}\n\nfunction measurementFailureResult(\n measurement: Exclude<FileMeasurementResult, { kind: \"complete\" }>\n): CheckResult<FileMetricsFinalData> {\n switch (measurement.kind) {\n case \"execution-failed\":\n return unavailable(\"external-execution-failed\");\n case \"invalid-result\":\n return unavailable(\"external-result-invalid\");\n case \"unavailable\":\n return unavailable(\"external-dependency-unavailable\");\n }\n const exhaustiveMeasurement: never = measurement;\n return exhaustiveMeasurement;\n}\n\nfunction unavailable(code: FileMetricsUnavailableReasonCode): CheckResult<FileMetricsFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: FileMetricsUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"fileMetrics options are invalid; recreate the Check with fileMetrics(options) or restore its complete resolved options.\";\n case \"source-unavailable\":\n return \"File metrics could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"external-dependency-unavailable\":\n return \"The configured SCC command is unavailable or incompatible; install SCC 4.0.0 or configure a compatible executable.\";\n case \"external-execution-failed\":\n return \"SCC did not complete successfully; run the configured command directly and inspect its environment.\";\n case \"external-result-invalid\":\n return \"SCC output could not form a trusted complete result; check the executable version and CSV compatibility.\";\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"execution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckExecutionContext, CheckMessage, CheckResult } from \"../../check/check.ts\";\nimport {\n reconcileFindingWaivers,\n type FindingWaiverReconciliation\n} from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport { collectProjectFileSets, requireProjectFileSet } from \"../project-files/collection.ts\";\nimport { settleFindings } from \"../code-quality-findings/policy.ts\";\nimport {\n reportFindingWaiverAudits,\n reportReconciledCodeQualityFindingRecords\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport { appendCheckMessages } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport { fileMetricFindingMessages } from \"./finding-messages.ts\";\nimport { measureFileMetrics, type FileMeasurementResult } from \"./measurement.ts\";\nimport type { FileMetricsExactInputSet } from \"./measurement-model.ts\";\nimport type {\n FileMetricsFindingWaiver,\n ResolvedFileMetricsCodeAreaOptions,\n ResolvedFileMetricsOptions\n} from \"./options.ts\";\nimport { isValidResolvedFileMetricsOptions } from \"./options-validation.ts\";\nimport {\n buildFileRecordCandidates,\n fileMetricsWaiverAuditRecord,\n fileMetricsWaiverIdentity,\n type FileRecordCandidate\n} from \"./records.ts\";\nimport type { FileMetricsFinalData } from \"./final-data.ts\";\n\nexport const FILE_METRICS_CHECK_DEFINITION = {\n checkId: \"file-metrics\",\n displayName: \"File metrics\"\n} as const;\n\n/** `file-metrics` whole-Check unavailable outcome 的稳定 reason code。 */\nexport type FileMetricsUnavailableReasonCode =\n | \"external-dependency-unavailable\"\n | \"external-execution-failed\"\n | \"external-result-invalid\"\n | \"invalid-options\"\n | \"source-unavailable\";\n\ninterface CollectedFileMetricsScope extends FileMetricsExactInputSet {\n readonly areaIdsByPath: ReadonlyMap<string, readonly string[]>;\n}\n\n/** 使用 resolved area policy 和 scanner selection 执行一次完整的 file-metrics measurement。 */\nexport async function executeFileMetrics(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>\n): Promise<CheckResult<FileMetricsFinalData>> {\n if (!isValidResolvedFileMetricsOptions(context.options)) return unavailable(\"invalid-options\");\n\n let collectedScope: CollectedFileMetricsScope;\n try {\n collectedScope = collectAreaScope(context.project.root, context.options.codeAreas);\n } catch {\n return unavailable(\"source-unavailable\");\n }\n if (collectedScope.approvedExactPaths.length === 0) {\n return noEligibleInputResult(context);\n }\n const measurement = await measureFileMetrics(collectedScope, context.options.scanner);\n if (measurement.kind !== \"complete\") return measurementFailureResult(measurement);\n const candidates = buildFileRecordCandidates(measurement.metrics, {\n areaIdsByPath: collectedScope.areaIdsByPath,\n codeAreas: context.options.codeAreas\n });\n if (candidates === undefined) return unavailable(\"external-result-invalid\");\n const reconciliation = reconcileFileMetricWaivers(candidates, context.options.findingWaivers);\n reportReconciledCodeQualityFindingRecords(context, reconciliation);\n reportWaiverAuditRecords(context, reconciliation);\n const settlement = settleFindings(\n reconciliation.findings.map(({ disposition, finding }) => ({\n actionable: disposition !== \"waived\",\n blocking: finding.data.blocking\n }))\n );\n const actionableFindings = reconciliation.findings\n .filter(({ disposition }) => disposition !== \"waived\")\n .map(({ finding }) => finding);\n return appendWaiverMessages(\n appendCheckMessages(settlement, fileMetricFindingMessages(actionableFindings)),\n reconciliation\n );\n}\n\nfunction noEligibleInputResult(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>\n): CheckResult<FileMetricsFinalData> {\n const reconciliation = reconcileFileMetricWaivers([], context.options.findingWaivers);\n reportWaiverAuditRecords(context, reconciliation);\n return appendWaiverMessages(\n Object.freeze({ status: \"not-applicable\", reason: { code: \"no-eligible-input\" } }),\n reconciliation\n );\n}\n\nfunction reconcileFileMetricWaivers(\n candidates: readonly FileRecordCandidate[],\n waivers: readonly FileMetricsFindingWaiver[]\n): FindingWaiverReconciliation<FileRecordCandidate> {\n return reconcileFindingWaivers({\n findings: candidates,\n identify: ({ data }) => ({ metric: data.metric, path: data.path }),\n waivers\n });\n}\n\nfunction reportWaiverAuditRecords(\n context: CheckExecutionContext<ResolvedFileMetricsOptions>,\n reconciliation: FindingWaiverReconciliation<FileRecordCandidate>\n): void {\n reportFindingWaiverAudits(context, reconciliation, fileMetricsWaiverAuditRecord);\n}\n\nfunction appendWaiverMessages(\n settlement: CheckResult<FileMetricsFinalData>,\n reconciliation: FindingWaiverReconciliation<FileRecordCandidate>\n): CheckResult<FileMetricsFinalData> {\n const waiverMessages: CheckMessage[] = [];\n for (const audit of reconciliation.waiverAudits) {\n const identity = fileMetricsWaiverIdentity(audit.waiver);\n switch (audit.status) {\n case \"applied\":\n waiverMessages.push(\n Object.freeze({\n code: \"finding-waived\",\n level: \"info\",\n message: `File metric finding for ${identity.path} was waived: ${audit.waiver.reason}`\n })\n );\n break;\n case \"unused\":\n waiverMessages.push(\n Object.freeze({\n code: \"unused-finding-waiver\",\n level: \"warning\",\n message: `Configured file-metrics finding waiver for ${identity.path} matched no finding; remove it or update its identity. Reason: ${audit.waiver.reason}`\n })\n );\n break;\n case \"overmatched\":\n waiverMessages.push(\n Object.freeze({\n code: \"overmatched-finding-waiver\",\n level: \"warning\",\n message: `Configured file-metrics finding waiver for ${identity.path} matched ${audit.matchCount} findings and was not applied; narrow its identity. Reason: ${audit.waiver.reason}`\n })\n );\n break;\n }\n }\n if (waiverMessages.length === 0) return settlement;\n return Object.freeze({\n ...settlement,\n messages: Object.freeze([...(settlement.messages ?? []), ...waiverMessages])\n });\n}\n\nfunction collectAreaScope(\n rootDir: string,\n codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>\n): CollectedFileMetricsScope {\n const areaIdsByPath = new Map<string, string[]>();\n const filesByArea = collectProjectFileSets(\n rootDir,\n Object.fromEntries(Object.entries(codeAreas).map(([areaId, area]) => [areaId, area.files]))\n );\n for (const [areaId] of Object.entries(codeAreas)) {\n for (const path of requireProjectFileSet(filesByArea, areaId)) {\n const areaIds = areaIdsByPath.get(path);\n if (areaIds === undefined) areaIdsByPath.set(path, [areaId]);\n else areaIds.push(areaId);\n }\n }\n\n const normalizedMembership = new Map<string, readonly string[]>();\n for (const [path, areaIds] of areaIdsByPath) {\n normalizedMembership.set(path, Object.freeze(areaIds.sort(compareText)));\n }\n return Object.freeze({\n approvedExactPaths: Object.freeze([...normalizedMembership.keys()].sort(compareText)),\n areaIdsByPath: normalizedMembership,\n rootDir\n });\n}\n\nfunction measurementFailureResult(\n measurement: Exclude<FileMeasurementResult, { kind: \"complete\" }>\n): CheckResult<FileMetricsFinalData> {\n switch (measurement.kind) {\n case \"execution-failed\":\n return unavailable(\"external-execution-failed\");\n case \"invalid-result\":\n return unavailable(\"external-result-invalid\");\n case \"unavailable\":\n return unavailable(\"external-dependency-unavailable\");\n }\n}\n\nfunction unavailable(code: FileMetricsUnavailableReasonCode): CheckResult<FileMetricsFinalData> {\n return Object.freeze({\n status: \"unavailable\",\n reason: { code },\n messages: Object.freeze([\n Object.freeze({ code, level: \"error\" as const, message: unavailableMessage(code) })\n ])\n });\n}\n\nfunction unavailableMessage(code: FileMetricsUnavailableReasonCode): string {\n switch (code) {\n case \"invalid-options\":\n return \"fileMetrics options are invalid; recreate the Check with fileMetrics(options) or restore its complete resolved options.\";\n case \"source-unavailable\":\n return \"File metrics could not collect its configured project files; check the project root, file permissions, and selected file source.\";\n case \"external-dependency-unavailable\":\n return \"The configured SCC command is unavailable or incompatible; install SCC 4.0.0 or configure a compatible executable.\";\n case \"external-execution-failed\":\n return \"SCC did not complete successfully; run the configured command directly and inspect its environment.\";\n case \"external-result-invalid\":\n return \"SCC output could not form a trusted complete result; check the executable version and CSV compatibility.\";\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { presentCheckFindings } from "../../check/finding-presentation.mjs";
1
+ import { presentCheckFindings } from "../../package-tools/finding-presentation/finding-presentation.mjs";
2
2
  const PRESENTED_FINDING_LIMIT = 10;
3
3
  /** Projects actionable file-metric Records into bounded terminal summaries. */
4
4
  export function fileMetricFindingMessages(findings) {
@@ -1 +1 @@
1
- {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,QAAwC;IAExC,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACpB,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;YAChE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,KAAK,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;SAClI,CAAC;QACJ,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CACpD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACtD,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,uGAAuG;SAChI,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../check/finding-presentation.ts\";\nimport type { FileRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\n/** Projects actionable file-metric Records into bounded terminal summaries. */\nexport function fileMetricFindingMessages(\n findings: readonly FileRecordCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) =>\n Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${data.path}: ${data.codeLines} code lines exceeds the ${data.limit} line limit (areas: ${data.codeAreas.join(\", \")}).`\n }),\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional file metric finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n"]}
1
+ {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kEAAkE,CAAC;AAGxG,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,QAAwC;IAExC,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACpB,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;YAChE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,KAAK,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;SAClI,CAAC;QACJ,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CACpD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACtD,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,uGAAuG;SAChI,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../package-tools/finding-presentation/finding-presentation.ts\";\nimport type { FileRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\n/** Projects actionable file-metric Records into bounded terminal summaries. */\nexport function fileMetricFindingMessages(\n findings: readonly FileRecordCandidate[]\n): readonly CheckMessage[] {\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: ({ data }) =>\n Object.freeze({\n code: \"finding-detail\",\n level: data.blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${data.path}: ${data.codeLines} code lines exceeds the ${data.limit} line limit (areas: ${data.codeAreas.join(\", \")}).`\n }),\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some(({ data }) => data.blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional file metric finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\n\n/** `fileMetrics` 构造函数可省略的 SCC 可执行文件策略。 */\nexport interface FileMetricsScannerOptions {\n /** 省略时直接执行 `scc`;显式命令必须直接接受 adapter 拥有的 SCC 参数。 */\n readonly executable?: string;\n}\n\n/** file-metrics 区域可省略并由构造函数补齐的文件策略。 */\nexport type FileMetricsFileOptions = ProjectFileSelectionOptions;\n\n/** SCC decision-token 数较低的文件可使用的代码行宽限策略。 */\nexport interface FileMetricsLowDecisionTokenAllowanceOptions {\n /** 省略时为 `600`;必须严格大于同一区域的普通代码行上限。 */\n readonly maximumCodeLines?: number;\n /** 省略时为 `12`;decision-token measurement 不大于此值时应用宽限上限。 */\n readonly maximumDecisionTokens?: number;\n}\n\n/** 一个区域可省略的文件代码行策略。 */\nexport interface FileMetricsCodeLineOptions {\n /** 省略时为 `360`;只有严格超过此值才产生 finding。 */\n readonly maximum?: number;\n /** 省略时使用完整默认宽限策略。 */\n readonly lowDecisionTokenAllowance?: FileMetricsLowDecisionTokenAllowanceOptions;\n}\n\n/** 可独立选择文件并定义代码行与 finding policy 的 file-metrics 区域。 */\nexport interface FileMetricsCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: FileMetricsFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时使用 package 默认代码行策略。 */\n readonly codeLines?: FileMetricsCodeLineOptions;\n}\n\n/** file-metrics 用于识别可豁免 finding 的稳定语义字段。 */\nexport interface FileMetricsFindingIdentity {\n /** file-metrics 当前只产生文件代码行 finding。 */\n readonly metric: \"code-lines\";\n /** 已 normalized 的 project-root-relative slash path;不得为绝对、含反斜杠或含 `.`/`..` 的路径。 */\n readonly path: string;\n}\n\n/** 一项 file-metrics finding 的声明式豁免;执行时仍会扫描并发布该 finding。 */\nexport type FileMetricsFindingWaiver = FindingWaiver<FileMetricsFindingIdentity>;\n\n/** `fileMetrics(options?)` 接受并补齐默认值的公开策略。 */\nexport interface FileMetricsOptions {\n /** 省略时建立默认 `project` 区域;显式映射必须非空。 */\n readonly codeAreas?: Readonly<Record<string, FileMetricsCodeAreaOptions>>;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;每项以 `{ metric, path }` 精确匹配,并必须提供非空理由。 */\n readonly findingWaivers?: readonly FileMetricsFindingWaiver[];\n /** 省略时直接执行 `scc`;CLI 协议由 owning adapter 固定。 */\n readonly scanner?: FileMetricsScannerOptions;\n}\n\n/** 构造函数生成并由 Check preflight/execution 消费的完整 options。 */\nexport interface ResolvedFileMetricsOptions {\n readonly codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>;\n readonly findingWaivers: readonly FileMetricsFindingWaiver[];\n readonly scanner: ResolvedFileMetricsScannerOptions;\n}\n\nexport interface ResolvedFileMetricsCodeAreaOptions {\n readonly codeLines: ResolvedFileMetricsCodeLineOptions;\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n}\n\nexport interface ResolvedFileMetricsCodeLineOptions {\n readonly lowDecisionTokenAllowance: ResolvedFileMetricsLowDecisionTokenAllowanceOptions;\n readonly maximum: number;\n}\n\nexport interface ResolvedFileMetricsLowDecisionTokenAllowanceOptions {\n readonly maximumCodeLines: number;\n readonly maximumDecisionTokens: number;\n}\n\nexport interface ResolvedFileMetricsScannerOptions {\n readonly executable: string;\n}\n"]}
1
+ {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/options.ts"],"names":[],"mappings":"","sourcesContent":["import type { PackageCheckAuthoringOptions } from \"../check-authoring.ts\";\nimport type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { FindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\n\n/** `fileMetrics` 构造函数可省略的 SCC 可执行文件策略。 */\nexport interface FileMetricsScannerOptions {\n /** 省略时直接执行 `scc`;显式命令必须直接接受 adapter 拥有的 SCC 参数。 */\n readonly executable?: string;\n}\n\n/** file-metrics 区域可省略并由构造函数补齐的文件策略。 */\nexport type FileMetricsFileOptions = ProjectFileSelectionOptions;\n\n/** SCC decision-token 数较低的文件可使用的代码行宽限策略。 */\nexport interface FileMetricsLowDecisionTokenAllowanceOptions {\n /** 省略时为 `600`;必须严格大于同一区域的普通代码行上限。 */\n readonly maximumCodeLines?: number;\n /** 省略时为 `12`;decision-token measurement 不大于此值时应用宽限上限。 */\n readonly maximumDecisionTokens?: number;\n}\n\n/** 一个区域可省略的文件代码行策略。 */\nexport interface FileMetricsCodeLineOptions {\n /** 省略时为 `360`;只有严格超过此值才产生 finding。 */\n readonly maximum?: number;\n /** 省略时使用完整默认宽限策略。 */\n readonly lowDecisionTokenAllowance?: FileMetricsLowDecisionTokenAllowanceOptions;\n}\n\n/** 可独立选择文件并定义代码行与 finding policy 的 file-metrics 区域。 */\nexport interface FileMetricsCodeAreaOptions {\n /** 显式区域必须声明本字段;其中各子字段可省略并使用 package 默认值。 */\n readonly files: FileMetricsFileOptions;\n /** 省略时继承顶层 `findingPolicy`。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时使用 package 默认代码行策略。 */\n readonly codeLines?: FileMetricsCodeLineOptions;\n}\n\n/** file-metrics 用于识别可豁免 finding 的稳定语义字段。 */\nexport interface FileMetricsFindingIdentity {\n /** file-metrics 当前只产生文件代码行 finding。 */\n readonly metric: \"code-lines\";\n /** 已 normalized 的 project-root-relative slash path;不得为绝对、含反斜杠或含 `.`/`..` 的路径。 */\n readonly path: string;\n}\n\n/** 一项 file-metrics finding 的声明式豁免;执行时仍会扫描并发布该 finding。 */\nexport type FileMetricsFindingWaiver = FindingWaiver<FileMetricsFindingIdentity>;\n\n/** `fileMetrics(options?)` 接受并补齐默认值的公开策略。 */\nexport interface FileMetricsOptions<\n Id extends string = string\n> extends PackageCheckAuthoringOptions<Id> {\n /** 省略时建立默认 `project` 区域;显式映射必须非空。 */\n readonly codeAreas?: Readonly<Record<string, FileMetricsCodeAreaOptions>>;\n /** 省略时为 `non-blocking`;区域可局部覆盖。 */\n readonly findingPolicy?: FindingPolicy;\n /** 省略时没有豁免;每项以 `{ metric, path }` 精确匹配,并必须提供非空理由。 */\n readonly findingWaivers?: readonly FileMetricsFindingWaiver[];\n /** 省略时直接执行 `scc`;CLI 协议由 owning adapter 固定。 */\n readonly scanner?: FileMetricsScannerOptions;\n}\n\n/** 构造函数生成并由 Check preparation/execution 消费的完整 options。 */\nexport interface ResolvedFileMetricsOptions {\n readonly codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>;\n readonly findingWaivers: readonly FileMetricsFindingWaiver[];\n readonly scanner: ResolvedFileMetricsScannerOptions;\n}\n\nexport interface ResolvedFileMetricsCodeAreaOptions {\n readonly codeLines: ResolvedFileMetricsCodeLineOptions;\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n}\n\nexport interface ResolvedFileMetricsCodeLineOptions {\n readonly lowDecisionTokenAllowance: ResolvedFileMetricsLowDecisionTokenAllowanceOptions;\n readonly maximum: number;\n}\n\nexport interface ResolvedFileMetricsLowDecisionTokenAllowanceOptions {\n readonly maximumCodeLines: number;\n readonly maximumDecisionTokens: number;\n}\n\nexport interface ResolvedFileMetricsScannerOptions {\n readonly executable: string;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/records.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileMetric } from \"./measurement-model.ts\";\nimport type { FileMetricsFindingIdentity, ResolvedFileMetricsCodeAreaOptions } from \"./options.ts\";\nimport { isBlockingFinding } from \"../code-quality-findings/policy.ts\";\nimport { isNormalizedProjectRelativePath } from \"../host-environment/path.ts\";\nimport type { MaterializedFindingWaiver } from \"../../finding-waivers/reconciliation.ts\";\nimport {\n buildFindingWaiverAuditRecordData,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport type {\n CanonicalJsonObject,\n CanonicalJsonValue\n} from \"../../data-boundary/canonical-data.ts\";\n\nconst FILE_CODE_LINES_METRIC = \"code-lines\" as const;\nconst FINDING_WAIVER_AUDIT_RECORD_ID_PREFIX = \"/finding-waiver-audit/\";\n\ninterface FileMetricsAreaPolicyContext {\n readonly areaIdsByPath: ReadonlyMap<string, readonly string[]>;\n readonly codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>;\n}\n\ninterface EffectiveFileRecordPolicy {\n readonly areaIds: readonly string[];\n readonly blocking: boolean;\n readonly limit: number;\n}\n\n/** 一条超出文件代码行上限的 supplemental Record data。 */\nexport type FileMetricsFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly codeLines: number;\n readonly limit: number;\n readonly metric: \"code-lines\";\n readonly path: string;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 file-metrics waiver 的 supplemental audit Record data。 */\nexport type FileMetricsFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<FileMetricsFindingIdentity>;\n\n/** file-metrics 发布的 finding 或 waiver-audit supplemental Record data。 */\nexport type FileMetricsRecordData =\n | FileMetricsFindingRecordData\n | FileMetricsFindingWaiverAuditRecordData;\n\nexport interface FileRecordCandidate {\n readonly data: FileMetricsFindingRecordData;\n readonly id: string;\n}\n\n/** 仅为未使用和过宽 waiver 构造补充 audit Record;正常 applied waiver 由 finding Record 自己保留。 */\nexport function fileMetricsWaiverAuditRecord(\n audit: FindingWaiverRecordAudit\n): Readonly<{ readonly data: FileMetricsFindingWaiverAuditRecordData; readonly id: string }> {\n const identity = fileMetricsWaiverIdentity(audit.waiver);\n return Object.freeze({\n data: buildFindingWaiverAuditRecordData(identity, audit),\n id: `${FINDING_WAIVER_AUDIT_RECORD_ID_PREFIX}${identity.path}`\n });\n}\n\nexport function fileMetricsWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): FileMetricsFindingIdentity {\n const identity = waiver.identity;\n if (\n !isCanonicalObject(identity) ||\n identity.metric !== \"code-lines\" ||\n typeof identity.path !== \"string\" ||\n !isNormalizedProjectRelativePath(identity.path)\n ) {\n throw new TypeError(\"fileMetrics waiver identity must retain a normalized code-lines path\");\n }\n return Object.freeze({ metric: \"code-lines\", path: identity.path });\n}\n\nfunction isCanonicalObject(value: CanonicalJsonValue): value is CanonicalJsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Converts trusted scanner metrics into area-policy-owned supplemental facts. */\nexport function buildFileRecordCandidates(\n metrics: readonly FileMetric[],\n areaPolicy: FileMetricsAreaPolicyContext\n): readonly FileRecordCandidate[] | undefined {\n const seenPaths = new Set<string>();\n const candidates: FileRecordCandidate[] = [];\n for (const metric of metrics) {\n if (!isValidUniqueFileMetric(metric, seenPaths)) return undefined;\n seenPaths.add(metric.path);\n\n const recordPolicy = effectiveFileRecordPolicy(metric, areaPolicy);\n if (recordPolicy === undefined) return undefined;\n if (metric.codeLines <= recordPolicy.limit) continue;\n candidates.push(createFileRecordCandidate(metric, recordPolicy));\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction isValidUniqueFileMetric(metric: FileMetric, seenPaths: ReadonlySet<string>): boolean {\n return (\n typeof metric.path === \"string\" &&\n metric.path.length > 0 &&\n Number.isSafeInteger(metric.codeLines) &&\n metric.codeLines >= 0 &&\n !seenPaths.has(metric.path)\n );\n}\n\nfunction effectiveFileRecordPolicy(\n metric: FileMetric,\n areaPolicy: FileMetricsAreaPolicyContext\n): EffectiveFileRecordPolicy | undefined {\n const areaIds = areaPolicy.areaIdsByPath.get(metric.path);\n if (areaIds === undefined || areaIds.length === 0) return undefined;\n const matchingAreas: ResolvedFileMetricsCodeAreaOptions[] = [];\n let strictestMaximum: number | undefined;\n for (const areaId of areaIds) {\n const codeArea = areaPolicy.codeAreas[areaId];\n if (codeArea === undefined) return undefined;\n matchingAreas.push(codeArea);\n const maximum = fileCodeLineMaximum(metric, codeArea);\n strictestMaximum =\n strictestMaximum === undefined ? maximum : Math.min(strictestMaximum, maximum);\n }\n return strictestMaximum === undefined\n ? undefined\n : Object.freeze({\n areaIds,\n blocking: isBlockingFinding(matchingAreas.map((area) => area.findingPolicy)),\n limit: strictestMaximum\n });\n}\n\nfunction createFileRecordCandidate(\n metric: FileMetric,\n recordPolicy: EffectiveFileRecordPolicy\n): FileRecordCandidate {\n return Object.freeze({\n id: metric.path,\n data: Object.freeze({\n blocking: recordPolicy.blocking,\n codeAreas: Object.freeze([...recordPolicy.areaIds]),\n codeLines: metric.codeLines,\n limit: recordPolicy.limit,\n metric: FILE_CODE_LINES_METRIC,\n path: metric.path\n })\n });\n}\n\nfunction fileCodeLineMaximum(metric: FileMetric, area: ResolvedFileMetricsCodeAreaOptions): number {\n const allowance = area.codeLines.lowDecisionTokenAllowance;\n const decisionTokens = metric.decisionTokens.value;\n return decisionTokens !== null && decisionTokens <= allowance.maximumDecisionTokens\n ? allowance.maximumCodeLines\n : area.codeLines.maximum;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"records.mjs","sourceRoot":"","sources":["../../../../src/package-checks/file-metrics/records.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileMetric } from \"./measurement-model.ts\";\nimport type { FileMetricsFindingIdentity, ResolvedFileMetricsCodeAreaOptions } from \"./options.ts\";\nimport { isBlockingFinding } from \"../code-quality-findings/policy.ts\";\nimport { isNormalizedProjectRelativePath } from \"../host-environment/path.ts\";\nimport type { MaterializedFindingWaiver } from \"../../package-tools/finding-waivers/reconciliation.ts\";\nimport {\n buildFindingWaiverAuditRecordData,\n type FindingWaiverAuditRecordData,\n type FindingWaiverRecordAudit\n} from \"../code-quality-findings/finding-waiver-evidence.ts\";\nimport type {\n CanonicalJsonObject,\n CanonicalJsonValue\n} from \"../../data-boundary/canonical-data.ts\";\n\nconst FILE_CODE_LINES_METRIC = \"code-lines\" as const;\nconst FINDING_WAIVER_AUDIT_RECORD_ID_PREFIX = \"/finding-waiver-audit/\";\n\ninterface FileMetricsAreaPolicyContext {\n readonly areaIdsByPath: ReadonlyMap<string, readonly string[]>;\n readonly codeAreas: Readonly<Record<string, ResolvedFileMetricsCodeAreaOptions>>;\n}\n\ninterface EffectiveFileRecordPolicy {\n readonly areaIds: readonly string[];\n readonly blocking: boolean;\n readonly limit: number;\n}\n\n/** 一条超出文件代码行上限的 supplemental Record data。 */\nexport type FileMetricsFindingRecordData = Readonly<{\n readonly blocking: boolean;\n readonly codeAreas: readonly string[];\n readonly codeLines: number;\n readonly limit: number;\n readonly metric: \"code-lines\";\n readonly path: string;\n /** 精确匹配 waiver 时保留理由,并令该 finding 不再参与 actionable settlement。 */\n readonly waiver?: Readonly<{ readonly reason: string }>;\n}>;\n\n/** 未使用或过宽 file-metrics waiver 的 supplemental audit Record data。 */\nexport type FileMetricsFindingWaiverAuditRecordData =\n FindingWaiverAuditRecordData<FileMetricsFindingIdentity>;\n\n/** file-metrics 发布的 finding 或 waiver-audit supplemental Record data。 */\nexport type FileMetricsRecordData =\n | FileMetricsFindingRecordData\n | FileMetricsFindingWaiverAuditRecordData;\n\nexport interface FileRecordCandidate {\n readonly data: FileMetricsFindingRecordData;\n readonly id: string;\n}\n\n/** 仅为未使用和过宽 waiver 构造补充 audit Record;正常 applied waiver 由 finding Record 自己保留。 */\nexport function fileMetricsWaiverAuditRecord(\n audit: FindingWaiverRecordAudit\n): Readonly<{ readonly data: FileMetricsFindingWaiverAuditRecordData; readonly id: string }> {\n const identity = fileMetricsWaiverIdentity(audit.waiver);\n return Object.freeze({\n data: buildFindingWaiverAuditRecordData(identity, audit),\n id: `${FINDING_WAIVER_AUDIT_RECORD_ID_PREFIX}${identity.path}`\n });\n}\n\nexport function fileMetricsWaiverIdentity(\n waiver: MaterializedFindingWaiver\n): FileMetricsFindingIdentity {\n const identity = waiver.identity;\n if (\n !isCanonicalObject(identity) ||\n identity.metric !== \"code-lines\" ||\n typeof identity.path !== \"string\" ||\n !isNormalizedProjectRelativePath(identity.path)\n ) {\n throw new TypeError(\"fileMetrics waiver identity must retain a normalized code-lines path\");\n }\n return Object.freeze({ metric: \"code-lines\", path: identity.path });\n}\n\nfunction isCanonicalObject(value: CanonicalJsonValue): value is CanonicalJsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Converts trusted scanner metrics into area-policy-owned supplemental facts. */\nexport function buildFileRecordCandidates(\n metrics: readonly FileMetric[],\n areaPolicy: FileMetricsAreaPolicyContext\n): readonly FileRecordCandidate[] | undefined {\n const seenPaths = new Set<string>();\n const candidates: FileRecordCandidate[] = [];\n for (const metric of metrics) {\n if (!isValidUniqueFileMetric(metric, seenPaths)) return undefined;\n seenPaths.add(metric.path);\n\n const recordPolicy = effectiveFileRecordPolicy(metric, areaPolicy);\n if (recordPolicy === undefined) return undefined;\n if (metric.codeLines <= recordPolicy.limit) continue;\n candidates.push(createFileRecordCandidate(metric, recordPolicy));\n }\n candidates.sort((left, right) => compareText(left.id, right.id));\n return Object.freeze(candidates);\n}\n\nfunction isValidUniqueFileMetric(metric: FileMetric, seenPaths: ReadonlySet<string>): boolean {\n return (\n typeof metric.path === \"string\" &&\n metric.path.length > 0 &&\n Number.isSafeInteger(metric.codeLines) &&\n metric.codeLines >= 0 &&\n !seenPaths.has(metric.path)\n );\n}\n\nfunction effectiveFileRecordPolicy(\n metric: FileMetric,\n areaPolicy: FileMetricsAreaPolicyContext\n): EffectiveFileRecordPolicy | undefined {\n const areaIds = areaPolicy.areaIdsByPath.get(metric.path);\n if (areaIds === undefined || areaIds.length === 0) return undefined;\n const matchingAreas: ResolvedFileMetricsCodeAreaOptions[] = [];\n let strictestMaximum: number | undefined;\n for (const areaId of areaIds) {\n const codeArea = areaPolicy.codeAreas[areaId];\n if (codeArea === undefined) return undefined;\n matchingAreas.push(codeArea);\n const maximum = fileCodeLineMaximum(metric, codeArea);\n strictestMaximum =\n strictestMaximum === undefined ? maximum : Math.min(strictestMaximum, maximum);\n }\n return strictestMaximum === undefined\n ? undefined\n : Object.freeze({\n areaIds,\n blocking: isBlockingFinding(matchingAreas.map((area) => area.findingPolicy)),\n limit: strictestMaximum\n });\n}\n\nfunction createFileRecordCandidate(\n metric: FileMetric,\n recordPolicy: EffectiveFileRecordPolicy\n): FileRecordCandidate {\n return Object.freeze({\n id: metric.path,\n data: Object.freeze({\n blocking: recordPolicy.blocking,\n codeAreas: Object.freeze([...recordPolicy.areaIds]),\n codeLines: metric.codeLines,\n limit: recordPolicy.limit,\n metric: FILE_CODE_LINES_METRIC,\n path: metric.path\n })\n });\n}\n\nfunction fileCodeLineMaximum(metric: FileMetric, area: ResolvedFileMetricsCodeAreaOptions): number {\n const allowance = area.codeLines.lowDecisionTokenAllowance;\n const decisionTokens = metric.decisionTokens.value;\n return decisionTokens !== null && decisionTokens <= allowance.maximumDecisionTokens\n ? allowance.maximumCodeLines\n : area.codeLines.maximum;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -54,6 +54,6 @@ function commandOutput(commandResult) {
54
54
  function processTermination(commandResult) {
55
55
  return typeof commandResult.status === "number"
56
56
  ? `exit ${commandResult.status}`
57
- : `signal ${commandResult.signal || "unknown"}`;
57
+ : `signal ${commandResult.signal ?? "unknown"}`;
58
58
  }
59
59
  //# sourceMappingURL=availability.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"availability.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/file-metrics/scc/availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAuB3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAe,EACf,OAA0C;IAE1C,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC;YACrC,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,OAAO,CAAC,UAAU;YAC3B,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;QACH,OAAO,6BAA6B,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC,sBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,aAAsC;IAC3E,IAAI,aAAa,CAAC,KAAK;QAAE,OAAO,wBAAwB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,cAAc,CACnB,yBAAyB,kBAAkB,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5F,iBAAiB,CAClB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,OAAO,cAAc,CACnB,YAAY,kBAAkB,UAAU,OAAO,IAAI,SAAS,GAAG,EAC/D,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,IAAI;QACf,OAAO;QACP,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAY;IAC5C,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;IAC9D,OAAO,cAAc,CACnB,aAAa,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,EAC7F,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CACvD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,MAAgD;IAEhD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;QACb,KAAK;QACL,MAAM,EAAE,oBAAoB;QAC5B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,aAAsC;IAC3D,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,kBAAkB,CAAC,aAAsC;IAChE,OAAO,OAAO,aAAa,CAAC,MAAM,KAAK,QAAQ;QAC7C,CAAC,CAAC,QAAQ,aAAa,CAAC,MAAM,EAAE;QAChC,CAAC,CAAC,UAAU,aAAa,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;AACpD,CAAC","sourcesContent":["import { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { processFailure, runProcess } from \"../../host-environment/process.ts\";\nimport type { ResolvedFileMetricsScannerOptions } from \"../options.ts\";\nimport { SCC_VERSION_OUTPUT } from \"./parser.ts\";\n\nconst SCC_VERSION_ARGUMENTS = Object.freeze([\"--version\"]);\n\ntype SccAvailability = Readonly<\n | {\n readonly available: true;\n readonly error: null;\n readonly name: \"scc\";\n readonly reason: null;\n readonly source: \"configured command\";\n readonly version: string;\n }\n | {\n readonly available: false;\n readonly error: string;\n readonly name: \"scc\";\n readonly reason: \"contract-error\" | \"execution-error\" | \"tool-unavailable\";\n readonly source: \"configured command\";\n readonly version: null;\n }\n>;\n\ntype SccVersionCommandResult = Awaited<ReturnType<typeof runProcess>>;\n\nexport async function checkScc(\n rootDir: string,\n scanner: ResolvedFileMetricsScannerOptions\n): Promise<SccAvailability> {\n try {\n const commandResult = await runProcess({\n args: SCC_VERSION_ARGUMENTS,\n command: scanner.executable,\n cwd: rootDir\n });\n return availabilityFromVersionResult(commandResult);\n } catch (error: unknown) {\n return unavailableScc(`scc version error: ${errorMessage(error)}`, \"execution-error\");\n }\n}\n\nfunction availabilityFromVersionResult(commandResult: SccVersionCommandResult): SccAvailability {\n if (commandResult.error) return processErrorAvailability(commandResult.error);\n const version = commandOutput(commandResult);\n if (commandResult.status !== 0) {\n return unavailableScc(\n `scc --version failed, ${processTermination(commandResult)}${version ? `: ${version}` : \"\"}`,\n \"execution-error\"\n );\n }\n if (version !== SCC_VERSION_OUTPUT) {\n return unavailableScc(\n `expected ${SCC_VERSION_OUTPUT}, got \"${version || \"unknown\"}\"`,\n \"contract-error\"\n );\n }\n return {\n name: \"scc\",\n available: true,\n version,\n error: null,\n source: \"configured command\",\n reason: null\n };\n}\n\nfunction processErrorAvailability(error: Error): SccAvailability {\n const isMissingTool = processFailure(error).code === \"ENOENT\";\n return unavailableScc(\n isMissingTool ? `scc not installed: ${error.message}` : `scc version error: ${error.message}`,\n isMissingTool ? \"tool-unavailable\" : \"execution-error\"\n );\n}\n\nfunction unavailableScc(\n error: string,\n reason: Exclude<SccAvailability[\"reason\"], null>\n): SccAvailability {\n return {\n name: \"scc\",\n available: false,\n version: null,\n error,\n source: \"configured command\",\n reason\n };\n}\n\nfunction commandOutput(commandResult: SccVersionCommandResult): string {\n return (commandResult.stdout || \"\").trim() || (commandResult.stderr || \"\").trim();\n}\n\nfunction processTermination(commandResult: SccVersionCommandResult): string {\n return typeof commandResult.status === \"number\"\n ? `exit ${commandResult.status}`\n : `signal ${commandResult.signal || \"unknown\"}`;\n}\n"]}
1
+ {"version":3,"file":"availability.mjs","sourceRoot":"","sources":["../../../../../src/package-checks/file-metrics/scc/availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAuB3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAe,EACf,OAA0C;IAE1C,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC;YACrC,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,OAAO,CAAC,UAAU;YAC3B,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;QACH,OAAO,6BAA6B,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,cAAc,CAAC,sBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,aAAsC;IAC3E,IAAI,aAAa,CAAC,KAAK;QAAE,OAAO,wBAAwB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,cAAc,CACnB,yBAAyB,kBAAkB,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5F,iBAAiB,CAClB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,OAAO,cAAc,CACnB,YAAY,kBAAkB,UAAU,OAAO,IAAI,SAAS,GAAG,EAC/D,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,IAAI;QACf,OAAO;QACP,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAY;IAC5C,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;IAC9D,OAAO,cAAc,CACnB,aAAa,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,EAC7F,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CACvD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,MAAgD;IAEhD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;QACb,KAAK;QACL,MAAM,EAAE,oBAAoB;QAC5B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,aAAsC;IAC3D,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,kBAAkB,CAAC,aAAsC;IAChE,OAAO,OAAO,aAAa,CAAC,MAAM,KAAK,QAAQ;QAC7C,CAAC,CAAC,QAAQ,aAAa,CAAC,MAAM,EAAE;QAChC,CAAC,CAAC,UAAU,aAAa,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;AACpD,CAAC","sourcesContent":["import { errorMessage } from \"../../host-environment/error-message.ts\";\nimport { processFailure, runProcess } from \"../../host-environment/process.ts\";\nimport type { ResolvedFileMetricsScannerOptions } from \"../options.ts\";\nimport { SCC_VERSION_OUTPUT } from \"./parser.ts\";\n\nconst SCC_VERSION_ARGUMENTS = Object.freeze([\"--version\"]);\n\ntype SccAvailability = Readonly<\n | {\n readonly available: true;\n readonly error: null;\n readonly name: \"scc\";\n readonly reason: null;\n readonly source: \"configured command\";\n readonly version: string;\n }\n | {\n readonly available: false;\n readonly error: string;\n readonly name: \"scc\";\n readonly reason: \"contract-error\" | \"execution-error\" | \"tool-unavailable\";\n readonly source: \"configured command\";\n readonly version: null;\n }\n>;\n\ntype SccVersionCommandResult = Awaited<ReturnType<typeof runProcess>>;\n\nexport async function checkScc(\n rootDir: string,\n scanner: ResolvedFileMetricsScannerOptions\n): Promise<SccAvailability> {\n try {\n const commandResult = await runProcess({\n args: SCC_VERSION_ARGUMENTS,\n command: scanner.executable,\n cwd: rootDir\n });\n return availabilityFromVersionResult(commandResult);\n } catch (error: unknown) {\n return unavailableScc(`scc version error: ${errorMessage(error)}`, \"execution-error\");\n }\n}\n\nfunction availabilityFromVersionResult(commandResult: SccVersionCommandResult): SccAvailability {\n if (commandResult.error) return processErrorAvailability(commandResult.error);\n const version = commandOutput(commandResult);\n if (commandResult.status !== 0) {\n return unavailableScc(\n `scc --version failed, ${processTermination(commandResult)}${version ? `: ${version}` : \"\"}`,\n \"execution-error\"\n );\n }\n if (version !== SCC_VERSION_OUTPUT) {\n return unavailableScc(\n `expected ${SCC_VERSION_OUTPUT}, got \"${version || \"unknown\"}\"`,\n \"contract-error\"\n );\n }\n return {\n name: \"scc\",\n available: true,\n version,\n error: null,\n source: \"configured command\",\n reason: null\n };\n}\n\nfunction processErrorAvailability(error: Error): SccAvailability {\n const isMissingTool = processFailure(error).code === \"ENOENT\";\n return unavailableScc(\n isMissingTool ? `scc not installed: ${error.message}` : `scc version error: ${error.message}`,\n isMissingTool ? \"tool-unavailable\" : \"execution-error\"\n );\n}\n\nfunction unavailableScc(\n error: string,\n reason: Exclude<SccAvailability[\"reason\"], null>\n): SccAvailability {\n return {\n name: \"scc\",\n available: false,\n version: null,\n error,\n source: \"configured command\",\n reason\n };\n}\n\nfunction commandOutput(commandResult: SccVersionCommandResult): string {\n return (commandResult.stdout || \"\").trim() || (commandResult.stderr || \"\").trim();\n}\n\nfunction processTermination(commandResult: SccVersionCommandResult): string {\n return typeof commandResult.status === \"number\"\n ? `exit ${commandResult.status}`\n : `signal ${commandResult.signal ?? \"unknown\"}`;\n}\n"]}