@unbrained/pm-cli 2026.10.14 → 2026.10.15

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 (692) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +54 -2
  3. package/dist/cli/after-command-context-usage.d.ts +7 -7
  4. package/dist/cli/argv-utils.d.ts +4 -4
  5. package/dist/cli/bundle-integrity.d.ts +16 -16
  6. package/dist/cli/command-namespaces.d.ts +1 -1
  7. package/dist/cli/commander-usage.d.ts +34 -34
  8. package/dist/cli/commands/governance/validate.d.ts +1 -1
  9. package/dist/cli/commands/history/history-compact.d.ts +1 -1
  10. package/dist/cli/commands/history/history-redact.d.ts +1 -1
  11. package/dist/cli/commands/history/history-repair.d.ts +1 -1
  12. package/dist/cli/commands/history/restore.d.ts +1 -1
  13. package/dist/cli/commands/lifecycle/close.d.ts +1 -1
  14. package/dist/cli/commands/lifecycle/copy.d.ts +1 -1
  15. package/dist/cli/commands/lifecycle/delete.d.ts +1 -1
  16. package/dist/cli/commands/lifecycle/focus.d.ts +1 -1
  17. package/dist/cli/commands/query/get.d.ts +1 -1
  18. package/dist/cli/commands/workspace/merge.d.ts +1 -1
  19. package/dist/cli/commands/workspace/schema.d.ts +1 -1
  20. package/dist/cli/context-intent-invocation.d.ts +1 -1
  21. package/dist/cli/description-stdin.d.ts +1 -1
  22. package/dist/cli/error-guidance.d.ts +119 -119
  23. package/dist/cli/extension-command-help.d.ts +64 -64
  24. package/dist/cli/extension-command-help.js +2 -2
  25. package/dist/cli/extension-command-options.d.ts +16 -16
  26. package/dist/cli/extension-recovery.d.ts +13 -13
  27. package/dist/cli/help-content.d.ts +22 -22
  28. package/dist/cli/help-content.js +2 -2
  29. package/dist/cli/help-json-payload.d.ts +45 -45
  30. package/dist/cli/invocation-profile.d.ts +5 -5
  31. package/dist/cli/main.d.ts +217 -217
  32. package/dist/cli/migration-gates.d.ts +24 -24
  33. package/dist/cli/option-values.d.ts +1 -1
  34. package/dist/cli/public.d.ts +1 -1
  35. package/dist/cli/register-annotations.d.ts +2 -2
  36. package/dist/cli/register-assurance.d.ts +1 -1
  37. package/dist/cli/register-files-lookup.d.ts +1 -1
  38. package/dist/cli/register-history-activity.d.ts +1 -1
  39. package/dist/cli/register-history-author.d.ts +1 -1
  40. package/dist/cli/register-history-maintenance.d.ts +1 -1
  41. package/dist/cli/register-list-query.d.ts +7 -7
  42. package/dist/cli/register-list-query.js +3 -3
  43. package/dist/cli/register-mutation-options.d.ts +1 -1
  44. package/dist/cli/register-mutation.d.ts +4 -4
  45. package/dist/cli/register-operations.d.ts +75 -75
  46. package/dist/cli/register-setup.d.ts +4 -4
  47. package/dist/cli/register-structured-mutation.d.ts +8 -8
  48. package/dist/cli/runtime/activation.d.ts +23 -23
  49. package/dist/cli/runtime/invocation-options.d.ts +12 -12
  50. package/dist/cli/runtime/projection-retry.d.ts +1 -1
  51. package/dist/cli/runtime/selection.d.ts +16 -16
  52. package/dist/cli/runtime/telemetry-outcome.d.ts +11 -11
  53. package/dist/cli/runtime-compatibility-boundary.d.ts +7 -7
  54. package/dist/cli/schema/registration.d.ts +1 -1
  55. package/dist/cli/schema-registration-helpers.d.ts +2 -2
  56. package/dist/cli/stats-analytics-json.d.ts +1 -1
  57. package/dist/cli-bundle/bundle-manifest.json +1 -1
  58. package/dist/cli-bundle/chunks/{chunk-5LU6PWA4.js → chunk-52EZH2QQ.js} +2 -2
  59. package/dist/cli-bundle/chunks/chunk-7OEGNA4X.js +20 -0
  60. package/dist/cli-bundle/chunks/{chunk-LKESCZEN.js → chunk-7VHINXZP.js} +2 -2
  61. package/dist/cli-bundle/chunks/chunk-EMEEHV2Y.js +2 -0
  62. package/dist/cli-bundle/chunks/chunk-JGKTOBVB.js +6 -0
  63. package/dist/cli-bundle/chunks/{chunk-PP3BVMFL.js → chunk-JSUJWIHQ.js} +30 -30
  64. package/dist/cli-bundle/chunks/{chunk-MAT4AP7P.js → chunk-LNKLQYBG.js} +2 -2
  65. package/dist/cli-bundle/chunks/{chunk-LE4IEHDG.js → chunk-N56CAQBU.js} +63 -64
  66. package/dist/cli-bundle/chunks/{chunk-3S5SEMEB.js → chunk-NC3QVGDD.js} +2 -2
  67. package/dist/cli-bundle/chunks/{chunk-2UKKO45F.js → chunk-RJ5N44WY.js} +2 -2
  68. package/dist/cli-bundle/chunks/{chunk-LOSRTNNP.js → chunk-VIMQCFCK.js} +2 -2
  69. package/dist/cli-bundle/chunks/{chunk-JTF6VMXH.js → chunk-WBBW3WQX.js} +4 -4
  70. package/dist/cli-bundle/chunks/chunk-X2H6UR26.js +236 -0
  71. package/dist/cli-bundle/chunks/{register-list-query-GBLTOQQL.js → register-list-query-FKKFQ66D.js} +7 -7
  72. package/dist/cli-bundle/chunks/{register-mutation-TNRHNK4N.js → register-mutation-EWMMVZJB.js} +2 -2
  73. package/dist/cli-bundle/chunks/{register-operations-J3WXP3MA.js → register-operations-GEQ2H7PS.js} +2 -2
  74. package/dist/cli-bundle/chunks/{register-setup-HLSKKU4V.js → register-setup-PSJTQBBO.js} +2 -2
  75. package/dist/cli-bundle/focused-chunks/{chunk-4UA7KY4V.js → chunk-3RNUMVK4.js} +2 -2
  76. package/dist/cli-bundle/focused-chunks/{chunk-BUAGNTLG.js → chunk-4KQFMOM7.js} +6 -6
  77. package/dist/cli-bundle/focused-chunks/{chunk-QIU4Y3AB.js → chunk-52I2SNKJ.js} +2 -2
  78. package/dist/cli-bundle/focused-chunks/{chunk-Y5A4XOSK.js → chunk-5KRACGBK.js} +2 -2
  79. package/dist/cli-bundle/focused-chunks/{chunk-HNRI2KBT.js → chunk-5OO54BIV.js} +2 -2
  80. package/dist/cli-bundle/focused-chunks/{chunk-LKWDWER4.js → chunk-5TBAVZDR.js} +14 -14
  81. package/dist/cli-bundle/focused-chunks/{chunk-RHQCQTZA.js → chunk-FQKPOZKS.js} +2 -2
  82. package/dist/cli-bundle/focused-chunks/{chunk-IGBSAHCA.js → chunk-H3P77KVU.js} +2 -2
  83. package/dist/cli-bundle/focused-chunks/chunk-HTA3TNC3.js +26 -0
  84. package/dist/cli-bundle/focused-chunks/{chunk-23ACMPGB.js → chunk-JKBH7YGX.js} +2 -2
  85. package/dist/cli-bundle/focused-chunks/{chunk-AULVKHYX.js → chunk-KIIFVULU.js} +2 -2
  86. package/dist/cli-bundle/focused-chunks/{chunk-ESOW6PH4.js → chunk-N6FUKTZS.js} +2 -2
  87. package/dist/cli-bundle/focused-chunks/chunk-PDYE7QDX.js +166 -0
  88. package/dist/cli-bundle/focused-chunks/{chunk-KSMQEB3V.js → chunk-Q4VNCTR2.js} +2 -2
  89. package/dist/cli-bundle/focused-chunks/{chunk-YJNKISEI.js → chunk-THYQR3ON.js} +61 -62
  90. package/dist/cli-bundle/focused-chunks/{chunk-ELQNEJDA.js → chunk-TYLG5VEB.js} +2 -2
  91. package/dist/cli-bundle/main.js +26 -26
  92. package/dist/cli-bundle/sdk-authoring.js +1 -1
  93. package/dist/cli-bundle/sdk-contracts.js +2 -2
  94. package/dist/cli-bundle/sdk-core.js +22 -22
  95. package/dist/cli-bundle/sdk-governance.js +1 -1
  96. package/dist/cli-bundle/sdk-graph.js +1 -1
  97. package/dist/cli-bundle/sdk-merge.js +51 -51
  98. package/dist/cli-bundle/sdk-query.js +1 -1
  99. package/dist/cli-bundle/sdk-runtime.js +1 -1
  100. package/dist/cli-bundle/sdk-testing.js +1 -1
  101. package/dist/cli-bundle/sdk.js +7 -7
  102. package/dist/cli.d.ts +9 -9
  103. package/dist/core/checkpoint/checkpoint-gc.d.ts +17 -17
  104. package/dist/core/checkpoint/mutation-checkpoint.d.ts +26 -26
  105. package/dist/core/config/nested-settings.d.ts +20 -20
  106. package/dist/core/config/positional-value.d.ts +9 -9
  107. package/dist/core/diagnostics/remediation.d.ts +7 -7
  108. package/dist/core/extensions/activation-summary-markdown.d.ts +4 -4
  109. package/dist/core/extensions/activation-summary.d.ts +30 -30
  110. package/dist/core/extensions/activation-transaction.d.ts +9 -9
  111. package/dist/core/extensions/capability-usage.d.ts +25 -25
  112. package/dist/core/extensions/command-hook-context.d.ts +15 -15
  113. package/dist/core/extensions/command-metadata-contract.d.ts +1 -1
  114. package/dist/core/extensions/command-visibility-tier.d.ts +1 -1
  115. package/dist/core/extensions/contribution-inventory.d.ts +24 -24
  116. package/dist/core/extensions/exporter-output-contract.d.ts +4 -4
  117. package/dist/core/extensions/extension-candidate.d.ts +14 -14
  118. package/dist/core/extensions/extension-capability-aliases.d.ts +14 -14
  119. package/dist/core/extensions/extension-hook-runtime.d.ts +14 -14
  120. package/dist/core/extensions/extension-policy.d.ts +62 -62
  121. package/dist/core/extensions/extension-registries.d.ts +8 -8
  122. package/dist/core/extensions/extension-runtime-helpers.d.ts +5 -5
  123. package/dist/core/extensions/extension-types.d.ts +702 -702
  124. package/dist/core/extensions/flag-definition-validation.d.ts +11 -11
  125. package/dist/core/extensions/flag-value-types.d.ts +16 -4
  126. package/dist/core/extensions/flag-value-types.js +1 -1
  127. package/dist/core/extensions/index.d.ts +34 -34
  128. package/dist/core/extensions/item-field-types.d.ts +3 -3
  129. package/dist/core/extensions/item-fields.d.ts +6 -6
  130. package/dist/core/extensions/loader.d.ts +66 -66
  131. package/dist/core/extensions/manifest-parser.d.ts +1 -1
  132. package/dist/core/extensions/manifest-schema.d.ts +13 -13
  133. package/dist/core/extensions/module-graph-snapshot.d.ts +5 -5
  134. package/dist/core/extensions/preflight-ownership.d.ts +3 -3
  135. package/dist/core/extensions/read-output-contract.d.ts +2 -2
  136. package/dist/core/extensions/registration-contracts.d.ts +12 -12
  137. package/dist/core/extensions/registration-validation.d.ts +6 -6
  138. package/dist/core/extensions/registration-values.d.ts +19 -19
  139. package/dist/core/extensions/reserved-host-flags.d.ts +5 -5
  140. package/dist/core/extensions/runtime-registrations.d.ts +6 -6
  141. package/dist/core/extensions/service-ownership.d.ts +1 -1
  142. package/dist/core/extensions/version-compat.d.ts +9 -9
  143. package/dist/core/fs/atomic-create.d.ts +1 -1
  144. package/dist/core/fs/fs-utils.d.ts +12 -12
  145. package/dist/core/fs/host-environment-errors.d.ts +10 -10
  146. package/dist/core/fs/path-utils.d.ts +1 -1
  147. package/dist/core/governance/content-fields.d.ts +25 -25
  148. package/dist/core/governance/issue-codes.d.ts +16 -16
  149. package/dist/core/governance/metadata-coverage.d.ts +64 -64
  150. package/dist/core/history/digest.d.ts +5 -5
  151. package/dist/core/history/drift-cache.d.ts +2 -2
  152. package/dist/core/history/drift-scan.d.ts +18 -18
  153. package/dist/core/history/event-classification.d.ts +4 -4
  154. package/dist/core/history/event-index.d.ts +33 -33
  155. package/dist/core/history/history-compact-bulk.d.ts +12 -12
  156. package/dist/core/history/history-diff.d.ts +15 -15
  157. package/dist/core/history/history-rewrite.d.ts +43 -43
  158. package/dist/core/history/history-storage-stats.d.ts +20 -20
  159. package/dist/core/history/history-stream-policy.d.ts +12 -12
  160. package/dist/core/history/history.d.ts +45 -45
  161. package/dist/core/history/identity.d.ts +4 -4
  162. package/dist/core/history/operation-contract.d.ts +17 -17
  163. package/dist/core/history/projection.d.ts +16 -16
  164. package/dist/core/history/read.d.ts +4 -4
  165. package/dist/core/history/replay.d.ts +47 -47
  166. package/dist/core/history/tombstone.d.ts +1 -1
  167. package/dist/core/history/version-address.d.ts +2 -2
  168. package/dist/core/history/workspace-history.d.ts +72 -72
  169. package/dist/core/io/body-file.d.ts +2 -2
  170. package/dist/core/io/bulk-ids-input.d.ts +7 -7
  171. package/dist/core/item/actionability.d.ts +30 -30
  172. package/dist/core/item/dependency-reference.d.ts +2 -2
  173. package/dist/core/item/id.d.ts +9 -9
  174. package/dist/core/item/item-format-version.d.ts +17 -15
  175. package/dist/core/item/item-format-version.js +1 -1
  176. package/dist/core/item/item-format.d.ts +54 -54
  177. package/dist/core/item/item-record.d.ts +1 -1
  178. package/dist/core/item/item-type-definition.d.ts +11 -11
  179. package/dist/core/item/parent-reference-policy.d.ts +6 -6
  180. package/dist/core/item/parse.d.ts +37 -37
  181. package/dist/core/item/plan-lifecycle.d.ts +4 -4
  182. package/dist/core/item/priority.d.ts +3 -3
  183. package/dist/core/item/sprint-release-format.d.ts +4 -4
  184. package/dist/core/item/status-filter.d.ts +5 -5
  185. package/dist/core/item/status.d.ts +3 -3
  186. package/dist/core/item/toon-decode.d.ts +10 -10
  187. package/dist/core/item/type-registry.d.ts +35 -35
  188. package/dist/core/item/type-synonyms.d.ts +2 -2
  189. package/dist/core/lock/lock-gc.d.ts +28 -28
  190. package/dist/core/lock/lock.d.ts +53 -53
  191. package/dist/core/output/mutation-projection.d.ts +4 -4
  192. package/dist/core/output/output-control.d.ts +4 -4
  193. package/dist/core/output/output.d.ts +30 -30
  194. package/dist/core/output/query-summary.d.ts +5 -5
  195. package/dist/core/output/tabular.d.ts +3 -3
  196. package/dist/core/packages/manifest.d.ts +30 -30
  197. package/dist/core/packages/root.d.ts +4 -4
  198. package/dist/core/policy/workflow-policy-schema.d.ts +291 -291
  199. package/dist/core/policy/workflow-policy-store.d.ts +15 -15
  200. package/dist/core/policy/workflow-policy.d.ts +56 -56
  201. package/dist/core/profile/profile-describe.d.ts +22 -22
  202. package/dist/core/profile/profile-lint.d.ts +13 -13
  203. package/dist/core/profile/profile-plan.d.ts +45 -45
  204. package/dist/core/profile/profile-presets.d.ts +36 -36
  205. package/dist/core/reproducibility/context.d.ts +9 -9
  206. package/dist/core/schema/fields-file.d.ts +35 -35
  207. package/dist/core/schema/item-types-file.d.ts +29 -29
  208. package/dist/core/schema/runtime-field-filters.d.ts +3 -3
  209. package/dist/core/schema/runtime-field-values.d.ts +7 -7
  210. package/dist/core/schema/runtime-schema.d.ts +59 -59
  211. package/dist/core/schema/status-defs-file.d.ts +29 -29
  212. package/dist/core/schema/status-token.d.ts +1 -1
  213. package/dist/core/schema/type-inference.d.ts +10 -10
  214. package/dist/core/schema/type-presets.d.ts +5 -5
  215. package/dist/core/schema/type-workflows.d.ts +14 -14
  216. package/dist/core/search/background-refresh.d.ts +12 -12
  217. package/dist/core/search/bm25.d.ts +16 -16
  218. package/dist/core/search/cache.d.ts +34 -34
  219. package/dist/core/search/corpus.d.ts +17 -17
  220. package/dist/core/search/embedding-batches.d.ts +25 -25
  221. package/dist/core/search/eval-thresholds.d.ts +4 -4
  222. package/dist/core/search/eval.d.ts +40 -40
  223. package/dist/core/search/http-client.d.ts +24 -24
  224. package/dist/core/search/providers.d.ts +30 -30
  225. package/dist/core/search/relevance.d.ts +17 -17
  226. package/dist/core/search/semantic-defaults.d.ts +5 -5
  227. package/dist/core/search/staleness.d.ts +3 -3
  228. package/dist/core/search/vector-stores.d.ts +51 -51
  229. package/dist/core/search/vectorization-metadata.d.ts +9 -9
  230. package/dist/core/sentry/helpers.d.ts +27 -27
  231. package/dist/core/sentry/instrument.d.ts +51 -51
  232. package/dist/core/sentry/instrument.js +1 -1
  233. package/dist/core/sentry/sensitive-assignments.d.ts +9 -0
  234. package/dist/core/sentry/sensitive-assignments.js +2 -0
  235. package/dist/core/session/session-state.d.ts +37 -37
  236. package/dist/core/shared/agent-session-context.d.ts +14 -14
  237. package/dist/core/shared/author.d.ts +89 -89
  238. package/dist/core/shared/command-line.d.ts +3 -3
  239. package/dist/core/shared/command-types.d.ts +20 -20
  240. package/dist/core/shared/conflict-markers.d.ts +5 -5
  241. package/dist/core/shared/constants.d.ts +30 -30
  242. package/dist/core/shared/errors.d.ts +100 -100
  243. package/dist/core/shared/html-entity-decode.d.ts +2 -2
  244. package/dist/core/shared/item-metadata-contract.d.ts +2 -2
  245. package/dist/core/shared/lazy-module.d.ts +1 -1
  246. package/dist/core/shared/levenshtein.d.ts +1 -1
  247. package/dist/core/shared/memo.d.ts +1 -1
  248. package/dist/core/shared/numeric-parsers.d.ts +1 -1
  249. package/dist/core/shared/option-alias-visibility.d.ts +3 -3
  250. package/dist/core/shared/primitives.d.ts +13 -13
  251. package/dist/core/shared/secret-rules.d.ts +92 -92
  252. package/dist/core/shared/serial-queue.d.ts +6 -6
  253. package/dist/core/shared/serialization.d.ts +4 -4
  254. package/dist/core/shared/split-comma-list.d.ts +4 -4
  255. package/dist/core/shared/text-normalization.d.ts +3 -3
  256. package/dist/core/shared/time.d.ts +27 -27
  257. package/dist/core/store/item-format-migration.d.ts +7 -7
  258. package/dist/core/store/item-metadata-cache.d.ts +30 -30
  259. package/dist/core/store/item-metadata-query-index.d.ts +66 -66
  260. package/dist/core/store/item-metadata-read-work.d.ts +6 -6
  261. package/dist/core/store/item-store.d.ts +123 -123
  262. package/dist/core/store/item-store.js +1 -1
  263. package/dist/core/store/paths.d.ts +27 -27
  264. package/dist/core/store/settings-concurrency.d.ts +1 -1
  265. package/dist/core/store/settings-read-cache.d.ts +11 -11
  266. package/dist/core/store/settings-validator.d.ts +117 -117
  267. package/dist/core/store/settings.d.ts +84 -84
  268. package/dist/core/store/sqlite-runtime.d.ts +2 -2
  269. package/dist/core/store/tracker-preflight.d.ts +3 -3
  270. package/dist/core/telemetry/consent.d.ts +1 -1
  271. package/dist/core/telemetry/observability.d.ts +16 -16
  272. package/dist/core/telemetry/policy.d.ts +7 -7
  273. package/dist/core/telemetry/read-sampling.d.ts +1 -1
  274. package/dist/core/telemetry/runtime.d.ts +275 -275
  275. package/dist/core/test/background-runs.d.ts +123 -123
  276. package/dist/core/test/item-test-run-tracking.d.ts +10 -10
  277. package/dist/core/test/run-selectors.d.ts +12 -12
  278. package/dist/core/validate/estimate-defaults.d.ts +3 -3
  279. package/dist/core/validate/fix-planning.d.ts +36 -36
  280. package/dist/core/validate/linked-artifact-reference.d.ts +1 -1
  281. package/dist/core/validate/missing-by-type.d.ts +3 -3
  282. package/dist/core/validate/missing-link-owners.d.ts +17 -17
  283. package/dist/core/validate/stale-file-classification.d.ts +6 -6
  284. package/dist/mcp/http-server.d.ts +26 -26
  285. package/dist/mcp/legacy-adapter.d.ts +18 -18
  286. package/dist/mcp/runtime-capabilities.d.ts +18 -18
  287. package/dist/mcp/server.d.ts +73 -73
  288. package/dist/mcp/tool-definitions.d.ts +27 -27
  289. package/dist/sdk/actionability.d.ts +1 -1
  290. package/dist/sdk/agent/closed-domain-contracts.d.ts +11 -11
  291. package/dist/sdk/agent/command-recovery.d.ts +5 -5
  292. package/dist/sdk/agent/command-suggestions.d.ts +4 -4
  293. package/dist/sdk/agent/create-option-policy.d.ts +2 -2
  294. package/dist/sdk/agent/identity-config.d.ts +18 -18
  295. package/dist/sdk/agent/item-addressing.d.ts +6 -6
  296. package/dist/sdk/agent/refusal-closure-census.d.ts +26 -26
  297. package/dist/sdk/agent/refusal-closure.d.ts +22 -22
  298. package/dist/sdk/agent/refusal-corpus-contracts.d.ts +26 -26
  299. package/dist/sdk/agent/refusal-reachability.d.ts +65 -65
  300. package/dist/sdk/agent/subcommand-recovery.d.ts +20 -20
  301. package/dist/sdk/agent/task-transcript-contracts.d.ts +18 -18
  302. package/dist/sdk/agent/tracker-preflight-contracts.d.ts +21 -21
  303. package/dist/sdk/agent-capability-contracts.d.ts +41 -41
  304. package/dist/sdk/agent-session-context.d.ts +1 -1
  305. package/dist/sdk/annotations.d.ts +74 -74
  306. package/dist/sdk/author-attribution.d.ts +47 -47
  307. package/dist/sdk/authoring.d.ts +9 -9
  308. package/dist/sdk/cli-bootstrap.d.ts +65 -65
  309. package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +56 -56
  310. package/dist/sdk/cli-contracts/bootstrap-command-scanner.d.ts +6 -6
  311. package/dist/sdk/cli-contracts/command-aliases.d.ts +19 -19
  312. package/dist/sdk/cli-contracts/command-exit-contracts.d.ts +66 -66
  313. package/dist/sdk/cli-contracts/commander-mutation-options.d.ts +7 -7
  314. package/dist/sdk/cli-contracts/commander-types.d.ts +18 -18
  315. package/dist/sdk/cli-contracts/completeness.d.ts +14 -14
  316. package/dist/sdk/cli-contracts/enum-contracts.d.ts +28 -28
  317. package/dist/sdk/cli-contracts/flag-contracts.d.ts +114 -112
  318. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  319. package/dist/sdk/cli-contracts/flag-lexicon-contracts.d.ts +27 -27
  320. package/dist/sdk/cli-contracts/grammar-contracts.d.ts +61 -61
  321. package/dist/sdk/cli-contracts/registration-helpers.d.ts +56 -56
  322. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +250 -250
  323. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  324. package/dist/sdk/cli-contracts/schemas/assurance-definition.d.ts +678 -678
  325. package/dist/sdk/cli-contracts/string-lists.d.ts +1 -1
  326. package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +564 -564
  327. package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +13 -13
  328. package/dist/sdk/cli-contracts/tool-schema.d.ts +54 -54
  329. package/dist/sdk/cli-contracts/typed-action-inputs.d.ts +20 -20
  330. package/dist/sdk/cli-contracts.d.ts +15 -15
  331. package/dist/sdk/cli-program.d.ts +1 -1
  332. package/dist/sdk/cli-program.js +1 -1
  333. package/dist/sdk/command-line.d.ts +3 -3
  334. package/dist/sdk/comments.d.ts +24 -24
  335. package/dist/sdk/compile-cache.d.ts +4 -4
  336. package/dist/sdk/completion/bash.d.ts +1 -1
  337. package/dist/sdk/completion/fish.d.ts +1 -1
  338. package/dist/sdk/completion/shared.d.ts +74 -74
  339. package/dist/sdk/completion/zsh.d.ts +1 -1
  340. package/dist/sdk/completion.d.ts +3 -3
  341. package/dist/sdk/compose.d.ts +94 -94
  342. package/dist/sdk/config.d.ts +105 -105
  343. package/dist/sdk/context/recency.d.ts +1 -1
  344. package/dist/sdk/context/semantic-session-attribution.d.ts +23 -23
  345. package/dist/sdk/context/usage-egress.d.ts +1 -1
  346. package/dist/sdk/context/usage-ledger.d.ts +18 -18
  347. package/dist/sdk/context-intent-contracts.d.ts +37 -37
  348. package/dist/sdk/context-intent-runtime.d.ts +10 -10
  349. package/dist/sdk/context-packing.d.ts +44 -44
  350. package/dist/sdk/context-relevance.d.ts +110 -110
  351. package/dist/sdk/context-signal-store.d.ts +52 -52
  352. package/dist/sdk/context-usage.d.ts +78 -78
  353. package/dist/sdk/contracts.d.ts +2 -1
  354. package/dist/sdk/contracts.js +1 -1
  355. package/dist/sdk/core-governance.d.ts +5 -5
  356. package/dist/sdk/core.d.ts +8 -8
  357. package/dist/sdk/corpus-shape.d.ts +60 -60
  358. package/dist/sdk/define.d.ts +36 -36
  359. package/dist/sdk/dependencies.d.ts +70 -70
  360. package/dist/sdk/dependency-flag-validation.d.ts +17 -17
  361. package/dist/sdk/dependency-provenance.d.ts +22 -22
  362. package/dist/sdk/docs.d.ts +17 -17
  363. package/dist/sdk/duplicates.d.ts +14 -14
  364. package/dist/sdk/environment/agent-environment.d.ts +118 -118
  365. package/dist/sdk/environment/host-environment-errors.d.ts +1 -1
  366. package/dist/sdk/environment/project-runtime-compatibility.d.ts +42 -40
  367. package/dist/sdk/environment/project-runtime-compatibility.js +2 -2
  368. package/dist/sdk/environment/source-context.d.ts +4 -4
  369. package/dist/sdk/environment/tracker-preflight.d.ts +1 -1
  370. package/dist/sdk/error-code-catalog.d.ts +33 -33
  371. package/dist/sdk/error-runtime.d.ts +5 -5
  372. package/dist/sdk/errors.d.ts +17 -17
  373. package/dist/sdk/eval.d.ts +27 -27
  374. package/dist/sdk/extension/author-manifest.d.ts +9 -9
  375. package/dist/sdk/extension/bundled-catalog.d.ts +18 -18
  376. package/dist/sdk/extension/concurrency.d.ts +1 -1
  377. package/dist/sdk/extension/copy-scope.d.ts +1 -1
  378. package/dist/sdk/extension/custom-field-collisions.d.ts +1 -1
  379. package/dist/sdk/extension/describe.d.ts +21 -21
  380. package/dist/sdk/extension/doctor.d.ts +46 -46
  381. package/dist/sdk/extension/install-plan.d.ts +32 -32
  382. package/dist/sdk/extension/install-receipts.d.ts +4 -4
  383. package/dist/sdk/extension/install-runtime.d.ts +12 -12
  384. package/dist/sdk/extension/install-snapshot.d.ts +10 -10
  385. package/dist/sdk/extension/install-sources.d.ts +106 -106
  386. package/dist/sdk/extension/managed-state.d.ts +42 -42
  387. package/dist/sdk/extension/managed-update-status.d.ts +1 -1
  388. package/dist/sdk/extension/migrations.d.ts +48 -48
  389. package/dist/sdk/extension/output-ownership.d.ts +19 -19
  390. package/dist/sdk/extension/runtime-summary.d.ts +7 -7
  391. package/dist/sdk/extension/scaffold.d.ts +15 -15
  392. package/dist/sdk/extension/shared.d.ts +16 -16
  393. package/dist/sdk/extension/source-resolution.d.ts +16 -16
  394. package/dist/sdk/extension/static-inventory.d.ts +23 -23
  395. package/dist/sdk/extension/update-check.d.ts +9 -9
  396. package/dist/sdk/extension-command-context.d.ts +1 -1
  397. package/dist/sdk/extension-contracts.d.ts +10 -10
  398. package/dist/sdk/extension.d.ts +221 -221
  399. package/dist/sdk/files.d.ts +101 -101
  400. package/dist/sdk/flag-invocation-contracts.d.ts +25 -25
  401. package/dist/sdk/flag-invocation-contracts.js +1 -1
  402. package/dist/sdk/generated/generated-error-code-catalog-part-1.d.ts +1 -1
  403. package/dist/sdk/generated/generated-error-code-catalog-part-2.d.ts +1 -1
  404. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  405. package/dist/sdk/generated-error-code-catalog.d.ts +1 -1
  406. package/dist/sdk/governance/artifact-ledgers.d.ts +19 -19
  407. package/dist/sdk/governance/assurance-action-contracts.d.ts +1 -1
  408. package/dist/sdk/governance/assurance-action.d.ts +46 -46
  409. package/dist/sdk/governance/assurance-mutation-error.d.ts +20 -20
  410. package/dist/sdk/governance/assurance-presets.d.ts +25 -25
  411. package/dist/sdk/governance/assurance-runtime.d.ts +10 -10
  412. package/dist/sdk/governance/assurance.d.ts +204 -204
  413. package/dist/sdk/governance/boundary-fixtures.d.ts +32 -32
  414. package/dist/sdk/governance/closure-timestamps.d.ts +10 -10
  415. package/dist/sdk/governance/coverage-assurance.d.ts +7 -7
  416. package/dist/sdk/governance/defect-recurrence-coverage.d.ts +40 -40
  417. package/dist/sdk/governance/defect-recurrence-graph.d.ts +11 -11
  418. package/dist/sdk/governance/defect-recurrence-signals.d.ts +1 -1
  419. package/dist/sdk/governance/defect-recurrence.d.ts +97 -97
  420. package/dist/sdk/governance/extension-host-version.d.ts +9 -9
  421. package/dist/sdk/governance/gc.d.ts +26 -26
  422. package/dist/sdk/governance/health-merge-evidence.d.ts +8 -8
  423. package/dist/sdk/governance/health.d.ts +172 -172
  424. package/dist/sdk/governance/health.js +1 -1
  425. package/dist/sdk/governance/hierarchy-validation.d.ts +16 -16
  426. package/dist/sdk/governance/linked-file-report.d.ts +15 -15
  427. package/dist/sdk/governance/merge-receipt-history.d.ts +24 -24
  428. package/dist/sdk/governance/provenance-health.d.ts +35 -35
  429. package/dist/sdk/governance/reindex.d.ts +102 -102
  430. package/dist/sdk/governance/reliability.d.ts +29 -29
  431. package/dist/sdk/governance/stale-work.d.ts +13 -13
  432. package/dist/sdk/governance/status-role-diagnostics.d.ts +8 -8
  433. package/dist/sdk/governance/storage-integrity.d.ts +28 -28
  434. package/dist/sdk/governance/tracked-runtime-cache.d.ts +7 -7
  435. package/dist/sdk/governance/upgrade.d.ts +77 -77
  436. package/dist/sdk/governance/validate-history-drift.d.ts +3 -3
  437. package/dist/sdk/governance/validate-item-reader.d.ts +9 -9
  438. package/dist/sdk/governance/validate-normalization.d.ts +4 -4
  439. package/dist/sdk/governance/validate.d.ts +176 -176
  440. package/dist/sdk/governance/validate.js +1 -1
  441. package/dist/sdk/governance/workflow-completeness.d.ts +15 -15
  442. package/dist/sdk/governance/workflow-policy.d.ts +18 -18
  443. package/dist/sdk/governance/workspace-position.d.ts +40 -40
  444. package/dist/sdk/governance.d.ts +2 -2
  445. package/dist/sdk/graph/adapter.d.ts +45 -45
  446. package/dist/sdk/graph/analytics.d.ts +36 -36
  447. package/dist/sdk/graph/assembly.d.ts +51 -51
  448. package/dist/sdk/graph/cache.d.ts +19 -19
  449. package/dist/sdk/graph/cardinality-integrity.d.ts +4 -4
  450. package/dist/sdk/graph/centrality.d.ts +20 -20
  451. package/dist/sdk/graph/conformance.d.ts +21 -21
  452. package/dist/sdk/graph/deadline-scheduling.d.ts +30 -30
  453. package/dist/sdk/graph/durable-cache.d.ts +22 -22
  454. package/dist/sdk/graph/governance-contracts.d.ts +1 -1
  455. package/dist/sdk/graph/governance.d.ts +92 -92
  456. package/dist/sdk/graph/hierarchy-integrity.d.ts +32 -32
  457. package/dist/sdk/graph/index.d.ts +15 -15
  458. package/dist/sdk/graph/lifecycle-coverage.d.ts +12 -12
  459. package/dist/sdk/graph/mutation-advisory.d.ts +15 -15
  460. package/dist/sdk/graph/query-contracts.d.ts +6 -6
  461. package/dist/sdk/graph/remediation.d.ts +15 -15
  462. package/dist/sdk/graph/run.d.ts +203 -203
  463. package/dist/sdk/graph/scheduling.d.ts +21 -21
  464. package/dist/sdk/graph/traversal.d.ts +18 -18
  465. package/dist/sdk/graph/workspace-relationship-kind-registry.d.ts +1 -1
  466. package/dist/sdk/guide-topics.d.ts +19 -19
  467. package/dist/sdk/guide.d.ts +43 -43
  468. package/dist/sdk/history/attestation-command.d.ts +8 -8
  469. package/dist/sdk/history/attestation-contract.d.ts +43 -43
  470. package/dist/sdk/history/attestation-scan.d.ts +4 -4
  471. package/dist/sdk/history/attestation.d.ts +4 -4
  472. package/dist/sdk/history/maintenance.d.ts +25 -25
  473. package/dist/sdk/history/salvage.d.ts +19 -19
  474. package/dist/sdk/history/subject.d.ts +8 -8
  475. package/dist/sdk/history-analytics.d.ts +64 -64
  476. package/dist/sdk/history-compact.d.ts +67 -67
  477. package/dist/sdk/history-mcp.d.ts +7 -7
  478. package/dist/sdk/history-provenance.d.ts +40 -40
  479. package/dist/sdk/history-read.d.ts +24 -24
  480. package/dist/sdk/history-redact.d.ts +68 -68
  481. package/dist/sdk/history-repair.d.ts +92 -92
  482. package/dist/sdk/improvement-ledger-validation.d.ts +1 -1
  483. package/dist/sdk/improvement-ledger.d.ts +62 -62
  484. package/dist/sdk/index.d.ts +69 -69
  485. package/dist/sdk/init-agent-guidance.d.ts +68 -68
  486. package/dist/sdk/init.d.ts +117 -117
  487. package/dist/sdk/invocation-author.d.ts +1 -1
  488. package/dist/sdk/item-children.d.ts +15 -15
  489. package/dist/sdk/item-metadata-index.d.ts +2 -2
  490. package/dist/sdk/item-schedule.d.ts +9 -9
  491. package/dist/sdk/item-transaction.d.ts +73 -73
  492. package/dist/sdk/learnings.d.ts +23 -23
  493. package/dist/sdk/lifecycle/append.d.ts +8 -8
  494. package/dist/sdk/lifecycle/claim.d.ts +38 -38
  495. package/dist/sdk/lifecycle/close-many.d.ts +71 -71
  496. package/dist/sdk/lifecycle/close.d.ts +18 -18
  497. package/dist/sdk/lifecycle/copy.d.ts +10 -10
  498. package/dist/sdk/lifecycle/core-field-recovery.d.ts +1 -1
  499. package/dist/sdk/lifecycle/create.d.ts +88 -88
  500. package/dist/sdk/lifecycle/delete.d.ts +15 -15
  501. package/dist/sdk/lifecycle/event-validation-messages.d.ts +1 -1
  502. package/dist/sdk/lifecycle/focus.d.ts +6 -6
  503. package/dist/sdk/lifecycle/hierarchy-mutation-lock.d.ts +6 -6
  504. package/dist/sdk/lifecycle/legacy-none-tokens.d.ts +35 -35
  505. package/dist/sdk/lifecycle/lifecycle-transitions.d.ts +3 -3
  506. package/dist/sdk/lifecycle/mcp-actions.d.ts +10 -10
  507. package/dist/sdk/lifecycle/metadata-normalizers.d.ts +4 -4
  508. package/dist/sdk/lifecycle/mutation-command-options.d.ts +58 -58
  509. package/dist/sdk/lifecycle/mutation-facet-contracts.d.ts +1 -1
  510. package/dist/sdk/lifecycle/plan-mutation-receipt.d.ts +24 -24
  511. package/dist/sdk/lifecycle/plan.d.ts +127 -127
  512. package/dist/sdk/lifecycle/recurrence-parsers.d.ts +5 -5
  513. package/dist/sdk/lifecycle/reopen.d.ts +15 -15
  514. package/dist/sdk/lifecycle/repeatable-metadata-parsers.d.ts +7 -7
  515. package/dist/sdk/lifecycle/restore.d.ts +34 -34
  516. package/dist/sdk/lifecycle/restore.js +1 -1
  517. package/dist/sdk/lifecycle/shared-unset-fields.d.ts +20 -20
  518. package/dist/sdk/lifecycle/task-composition.d.ts +7 -7
  519. package/dist/sdk/lifecycle/update-many.d.ts +61 -61
  520. package/dist/sdk/lifecycle/update.d.ts +120 -120
  521. package/dist/sdk/lifecycle-completion.d.ts +14 -14
  522. package/dist/sdk/lifecycle-policy.d.ts +31 -31
  523. package/dist/sdk/linked-artifacts.d.ts +58 -58
  524. package/dist/sdk/mcp/apps.d.ts +28 -28
  525. package/dist/sdk/mcp/authorization.d.ts +66 -66
  526. package/dist/sdk/mcp/discovery.d.ts +67 -67
  527. package/dist/sdk/mcp/interactions.d.ts +49 -49
  528. package/dist/sdk/mcp/protocol.d.ts +63 -63
  529. package/dist/sdk/mcp/skills.d.ts +62 -62
  530. package/dist/sdk/mcp/subscriptions.d.ts +26 -26
  531. package/dist/sdk/mcp/tasks.d.ts +51 -51
  532. package/dist/sdk/mcp/transport.d.ts +17 -17
  533. package/dist/sdk/merge/abandoned-receipts.d.ts +8 -8
  534. package/dist/sdk/merge/driver.d.ts +38 -38
  535. package/dist/sdk/merge/index.d.ts +5 -5
  536. package/dist/sdk/merge/install.d.ts +48 -48
  537. package/dist/sdk/merge/receipt-file-boundary.d.ts +6 -6
  538. package/dist/sdk/merge/receipt-operation.d.ts +6 -6
  539. package/dist/sdk/merge/receipt-schema.d.ts +11 -11
  540. package/dist/sdk/merge/receipts.d.ts +111 -111
  541. package/dist/sdk/merge/reconcile.d.ts +20 -20
  542. package/dist/sdk/merge/three-way.d.ts +50 -50
  543. package/dist/sdk/merge/three-way.js +2 -2
  544. package/dist/sdk/merge/worktree-config.d.ts +3 -3
  545. package/dist/sdk/mutation-events.d.ts +62 -62
  546. package/dist/sdk/mutation-guard.d.ts +134 -134
  547. package/dist/sdk/notes.d.ts +28 -28
  548. package/dist/sdk/output/table-rows.d.ts +6 -6
  549. package/dist/sdk/output-contracts.d.ts +26 -26
  550. package/dist/sdk/output-projection.d.ts +108 -108
  551. package/dist/sdk/output-token-accounting.d.ts +18 -18
  552. package/dist/sdk/output.d.ts +18 -18
  553. package/dist/sdk/ownership-source.d.ts +1 -1
  554. package/dist/sdk/package-import-adapters.d.ts +51 -51
  555. package/dist/sdk/package-migrations.d.ts +3 -3
  556. package/dist/sdk/package-runtime-options.d.ts +3 -3
  557. package/dist/sdk/pagination.d.ts +28 -28
  558. package/dist/sdk/pagination.js +1 -1
  559. package/dist/sdk/profile.d.ts +72 -72
  560. package/dist/sdk/provenance.d.ts +37 -37
  561. package/dist/sdk/public-surface.json +1 -1
  562. package/dist/sdk/query/activity.d.ts +84 -84
  563. package/dist/sdk/query/aggregate.d.ts +109 -109
  564. package/dist/sdk/query/calendar.d.ts +95 -95
  565. package/dist/sdk/query/complete-list.d.ts +35 -35
  566. package/dist/sdk/query/context.d.ts +300 -300
  567. package/dist/sdk/query/duplicate-candidates.d.ts +3 -3
  568. package/dist/sdk/query/get.d.ts +54 -54
  569. package/dist/sdk/query/history.d.ts +38 -38
  570. package/dist/sdk/query/item-filter-options.d.ts +41 -41
  571. package/dist/sdk/query/light-metadata.d.ts +1 -1
  572. package/dist/sdk/query/list-filter-shared.d.ts +4 -4
  573. package/dist/sdk/query/list.d.ts +167 -167
  574. package/dist/sdk/query/list.js +1 -1
  575. package/dist/sdk/query/multi-value-filters.d.ts +6 -6
  576. package/dist/sdk/query/next-ready-budget.d.ts +8 -8
  577. package/dist/sdk/query/next.d.ts +94 -94
  578. package/dist/sdk/query/parsers.d.ts +3 -3
  579. package/dist/sdk/query/projection-contracts.d.ts +18 -18
  580. package/dist/sdk/query/search/corpus.d.ts +15 -15
  581. package/dist/sdk/query/search/filters.d.ts +15 -15
  582. package/dist/sdk/query/search/input.d.ts +8 -8
  583. package/dist/sdk/query/search/lexical.d.ts +10 -10
  584. package/dist/sdk/query/search/response.d.ts +22 -22
  585. package/dist/sdk/query/search/semantic.d.ts +133 -133
  586. package/dist/sdk/query/search/types.d.ts +65 -65
  587. package/dist/sdk/query/search-contracts.d.ts +53 -53
  588. package/dist/sdk/query/search-pagination.d.ts +21 -21
  589. package/dist/sdk/query/search-rendering.d.ts +30 -30
  590. package/dist/sdk/query/search.d.ts +60 -60
  591. package/dist/sdk/query/workspace-contracts.d.ts +2 -2
  592. package/dist/sdk/query.d.ts +6 -6
  593. package/dist/sdk/read-output/continuation.d.ts +11 -11
  594. package/dist/sdk/read-output/extension.d.ts +3 -3
  595. package/dist/sdk/read-output/options.d.ts +7 -7
  596. package/dist/sdk/read-output/provenance.d.ts +6 -6
  597. package/dist/sdk/read-output-budget.d.ts +11 -11
  598. package/dist/sdk/read-output-contracts.d.ts +112 -112
  599. package/dist/sdk/read-output-contracts.js +1 -1
  600. package/dist/sdk/read-output-rows.d.ts +15 -15
  601. package/dist/sdk/read-output-session.d.ts +29 -29
  602. package/dist/sdk/relationship-analytics.d.ts +46 -46
  603. package/dist/sdk/relationship-context.d.ts +48 -48
  604. package/dist/sdk/relationship-history.d.ts +59 -59
  605. package/dist/sdk/relationship-kinds/contract.d.ts +18 -18
  606. package/dist/sdk/relationship-migration.d.ts +14 -14
  607. package/dist/sdk/relationships.d.ts +46 -46
  608. package/dist/sdk/reproducibility/process.d.ts +9 -9
  609. package/dist/sdk/runtime/actions.d.ts +1 -1
  610. package/dist/sdk/runtime/context.d.ts +15 -15
  611. package/dist/sdk/runtime/schema-preview.d.ts +1 -1
  612. package/dist/sdk/runtime/schema.d.ts +1 -1
  613. package/dist/sdk/runtime-action-aliases.d.ts +3 -3
  614. package/dist/sdk/runtime-extended-actions.d.ts +9 -9
  615. package/dist/sdk/runtime-input.d.ts +29 -29
  616. package/dist/sdk/runtime-primitives.d.ts +53 -53
  617. package/dist/sdk/runtime-primitives.js +1 -1
  618. package/dist/sdk/runtime-public-contracts.d.ts +46 -46
  619. package/dist/sdk/runtime-stats-options.d.ts +1 -1
  620. package/dist/sdk/runtime.d.ts +374 -374
  621. package/dist/sdk/scheduling-shortcuts.d.ts +19 -19
  622. package/dist/sdk/schema-migration.d.ts +79 -79
  623. package/dist/sdk/schema.d.ts +224 -224
  624. package/dist/sdk/search-refresh-worker.d.ts +1 -1
  625. package/dist/sdk/similarity-scoring.d.ts +10 -10
  626. package/dist/sdk/similarity.d.ts +73 -73
  627. package/dist/sdk/start-task-status.d.ts +1 -1
  628. package/dist/sdk/stats.d.ts +72 -72
  629. package/dist/sdk/structured-mutations.d.ts +13 -13
  630. package/dist/sdk/telemetry-flush.d.ts +1 -1
  631. package/dist/sdk/telemetry.d.ts +32 -32
  632. package/dist/sdk/templates.d.ts +35 -35
  633. package/dist/sdk/test/batch.d.ts +50 -50
  634. package/dist/sdk/test/command-args.d.ts +2 -2
  635. package/dist/sdk/test/entry.d.ts +4 -4
  636. package/dist/sdk/test/execution-receipts.d.ts +5 -5
  637. package/dist/sdk/test/execution.d.ts +247 -247
  638. package/dist/sdk/test/json-path.d.ts +4 -4
  639. package/dist/sdk/test/linked-command-detection.d.ts +36 -36
  640. package/dist/sdk/test/measurements.d.ts +10 -10
  641. package/dist/sdk/test/parsers.d.ts +18 -18
  642. package/dist/sdk/test/prerequisites.d.ts +3 -3
  643. package/dist/sdk/test/runs.d.ts +43 -43
  644. package/dist/sdk/test/trust.d.ts +15 -15
  645. package/dist/sdk/test/update.d.ts +23 -23
  646. package/dist/sdk/test/workspace-snapshot.d.ts +1 -1
  647. package/dist/sdk/testing.d.ts +248 -248
  648. package/dist/sdk/traceability/runtime-files-lookup.d.ts +1 -1
  649. package/dist/sdk/traceability/source-traceability.d.ts +50 -50
  650. package/dist/sdk/workspace-contracts-cache.d.ts +2 -2
  651. package/dist/sdk/workspace-contracts.d.ts +20 -20
  652. package/dist/sdk/workspace-memory.d.ts +42 -42
  653. package/dist/sdk/workspace-recipe.d.ts +9 -9
  654. package/dist/sdk/workspace-snapshot.d.ts +60 -60
  655. package/dist/sdk/workspace-transaction-gc.d.ts +17 -17
  656. package/dist/sdk/workspace-transaction.d.ts +26 -26
  657. package/dist/sdk/workspace.d.ts +9 -9
  658. package/dist/types.d.ts +540 -540
  659. package/docs/COMMANDS.md +11 -2
  660. package/docs/EXTENSION_AUTHOR_CONTRACTS.md +18 -4
  661. package/docs/LINKED_TEST_EDITS.md +15 -0
  662. package/docs/RELEASING.md +2 -0
  663. package/docs/TESTING.md +21 -1
  664. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
  665. package/marketplace.json +1 -1
  666. package/package.json +3 -1
  667. package/packages/pm-beads/package.json +1 -1
  668. package/packages/pm-calendar/package.json +1 -1
  669. package/packages/pm-command-kit/package.json +1 -1
  670. package/packages/pm-digital-twin/package.json +1 -1
  671. package/packages/pm-governance-audit/package.json +1 -1
  672. package/packages/pm-guide-shell/package.json +1 -1
  673. package/packages/pm-kanban/package.json +1 -1
  674. package/packages/pm-lifecycle-hooks/package.json +1 -1
  675. package/packages/pm-linked-test-adapters/package.json +1 -1
  676. package/packages/pm-search-advanced/package.json +1 -1
  677. package/packages/pm-templates/package.json +1 -1
  678. package/packages/pm-todos/package.json +1 -1
  679. package/packages/pm-vcs/package.json +1 -1
  680. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  681. package/plugins/pm-claude/package.json +1 -1
  682. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  683. package/plugins/pm-codex/package.json +1 -1
  684. package/plugins/pm-codex/plugin.json +1 -1
  685. package/runtime-dependencies.json +1 -1
  686. package/scripts/finalize-build.mjs +9 -3
  687. package/dist/cli-bundle/chunks/chunk-66BZVFIK.js +0 -6
  688. package/dist/cli-bundle/chunks/chunk-IDEHMKYZ.js +0 -235
  689. package/dist/cli-bundle/chunks/chunk-UNQZGMJL.js +0 -20
  690. package/dist/cli-bundle/chunks/chunk-YXRAYL7H.js +0 -2
  691. package/dist/cli-bundle/focused-chunks/chunk-JDVZF75H.js +0 -165
  692. package/dist/cli-bundle/focused-chunks/chunk-WIXZF5SS.js +0 -26
@@ -1,2 +1,2 @@
1
- (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9b5e620c-ce82-5e2d-9866-2de6882bbb0c")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{applyClosureTimestampFix,scanClosureTimestamps}from"./closure-timestamps.js";import{readWorkflowCompletenessCheck}from"./workflow-completeness.js";import fs from"node:fs/promises";import{realpathSync}from"node:fs";import{execFile}from"node:child_process";import path from"node:path";import{promisify}from"node:util";import{buildRemediationCommands}from"../../core/diagnostics/remediation.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{collectRegisteredItemFieldNames}from"../../core/extensions/item-fields.js";import{isFileMissingError}from"../../core/fs/fs-utils.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS,DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS,EXIT_CODE,PM_DIRNAME,SETTINGS_DEFAULTS}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{toNonEmptyStringOrUndefined}from"../../core/shared/primitives.js";import{nowIso}from"../../core/shared/time.js";import{CURRENT_ITEM_FORMAT_VERSION,effectiveItemFormatVersion,scanItemFormatVersions}from"../../core/item/item-format-version.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{partitionFixesByGrant,planCloseReasonBackfillFixes,planEstimateBackfillFixes,planResolutionBackfillFixes,planStaleLinkPruneFixes,planTerminalParentFixes,resolveGrantedFixScopes,toFixOutputRow}from"../../core/validate/fix-planning.js";import{findDuplicateIssueCodes}from"../../core/governance/issue-codes.js";import{buildMissingByTypeCounts}from"../../core/validate/missing-by-type.js";import{classifyStaleLinkedPaths,summarizeStaleLinkedPathClassifications}from"../../core/validate/stale-file-classification.js";import{isRemoteLinkedArtifactReference}from"../../core/validate/linked-artifact-reference.js";import{assertProjectionModeChoice}from"../output-projection.js";import{collectDanglingDependencyReferences}from"../graph/assembly.js";import{auditMergeAttributeFence,auditMergeDriverConfiguration,findGitWorkspaceRoot,resolveProjectMergeTypeFolders}from"../merge/install.js";import{inspectMergeReceiptEvidence,partitionMergeReceipts}from"../merge/receipts.js";import{buildLinkedFileRepairReport}from"./linked-file-report.js";import{scanStorageIntegrity}from"./storage-integrity.js";import{scanTrackedRuntimeCache}from"./tracked-runtime-cache.js";import{scanHistoryAuthorAttribution}from"../author-attribution.js";import{createRelationshipKindRegistry}from"../relationships.js";import{runDocs}from"../docs.js";import{runFiles}from"../files.js";import{extractReferencedPmItemIdsFromCommand}from"../test/linked-command-detection.js";import{resolveLinkedTestSourceRef,resolveLinkedTestSourceWorkspaceRoot,resolveLinkedTestTrustBatch}from"../test/trust.js";import{readValidateItems}from"./validate-item-reader.js";import{buildValidateHistoryDriftCheck}from"./validate-history-drift.js";import{buildLifecycleParentGraph,detectLifecycleParentCycles,resolveLifecycleDependencyCycleSamplePath}from"./hierarchy-validation.js";import{buildStatusRoleWarnings,inspectStatusRoleAssignments}from"./status-role-diagnostics.js";import{summarizeCommandPreview,normalizeRelativeDirectoryPath,normalizeRelativePath,toMeaningfulString}from"./validate-normalization.js";const FILE_SCAN_DIRECTORIES=["src","tests","docs"],FILE_SCAN_ROOT_FILES=["README.md","PRD.md","CHANGELOG.md","AGENTS.md","CONTRIBUTING.md","SECURITY.md","CODE_OF_CONDUCT.md","LICENSE"],DIRECTORY_IGNORE_SET=new Set(["node_modules",".git",".cursor",".agents","dist","coverage"]),RESOLUTION_FIELD_KEYS=["resolution","expected_result","actual_result"],VALIDATE_FILE_SCAN_MODES=["default","tracked-all","tracked-all-strict"],VALIDATE_METADATA_PROFILE_VALUES=["core","strict","custom"],VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES=["off","warn","error"],CORE_METADATA_REQUIRED_FIELDS=["author","acceptance_criteria","estimated_minutes","close_reason"],STRICT_METADATA_REQUIRED_FIELDS=[...CORE_METADATA_REQUIRED_FIELDS,"reviewer","risk","confidence","sprint","release"],SUPPORTED_METADATA_REQUIRED_FIELDS=Array.from(new Set(STRICT_METADATA_REQUIRED_FIELDS)),METADATA_REQUIRED_FIELD_ALIASES={author:"author",acceptance_criteria:"acceptance_criteria","acceptance-criteria":"acceptance_criteria",estimated_minutes:"estimated_minutes","estimated-minutes":"estimated_minutes",estimate:"estimated_minutes",close_reason:"close_reason","close-reason":"close_reason",reviewer:"reviewer",risk:"risk",confidence:"confidence",sprint:"sprint",release:"release"},METADATA_WARNING_TOKEN_BY_FIELD={author:"validate_metadata_missing_author",acceptance_criteria:"validate_metadata_missing_acceptance_criteria",estimated_minutes:"validate_metadata_missing_estimate",close_reason:"validate_metadata_missing_close_reason",reviewer:"validate_metadata_missing_reviewer",risk:"validate_metadata_missing_risk",confidence:"validate_metadata_missing_confidence",sprint:"validate_metadata_missing_sprint",release:"validate_metadata_missing_release"},METADATA_COUNT_KEY_BY_FIELD={author:"missing_author",acceptance_criteria:"missing_acceptance_criteria",estimated_minutes:"missing_estimated_minutes",close_reason:"closed_missing_close_reason",reviewer:"missing_reviewer",risk:"missing_risk",confidence:"missing_confidence",sprint:"missing_sprint",release:"missing_release"},METADATA_ITEM_IDS_KEY_BY_FIELD={author:"missing_author_item_ids",acceptance_criteria:"missing_acceptance_criteria_item_ids",estimated_minutes:"missing_estimated_minutes_item_ids",close_reason:"closed_missing_close_reason_item_ids",reviewer:"missing_reviewer_item_ids",risk:"missing_risk_item_ids",confidence:"missing_confidence_item_ids",sprint:"missing_sprint_item_ids",release:"missing_release_item_ids"},METADATA_TRUNCATED_KEY_BY_FIELD={author:"missing_author_truncated",acceptance_criteria:"missing_acceptance_criteria_truncated",estimated_minutes:"missing_estimated_minutes_truncated",close_reason:"closed_missing_close_reason_truncated",reviewer:"missing_reviewer_truncated",risk:"missing_risk_truncated",confidence:"missing_confidence_truncated",sprint:"missing_sprint_truncated",release:"missing_release_truncated"},GIT_LS_FILES_MAX_BUFFER=32*1024*1024,GIT_LS_FILES_TIMEOUT_MS=1e4,FILE_LIST_SUMMARY_LIMIT=40,DIAGNOSTIC_LIST_SUMMARY_LIMIT=5,LINKED_ARTIFACT_MAX_PATH_LENGTH=4096,LINKED_ARTIFACT_MAX_SEGMENT_LENGTH=255,execFileAsync=promisify(execFile);function projectValidateCountsRecord(record){const projected={};for(const[key,value]of Object.entries(record))Array.isArray(value)||value===!1&&key.endsWith("_truncated")||(projected[key]=typeof value=="object"&&value!==null?projectValidateCountsRecord(value):value);return projected}function projectValidateCounts(result){return{...result,checks:result.checks.map(check=>({...check,details:projectValidateCountsRecord(check.details)})),...result.fixes?{fixes:{mode:result.fixes.mode,auto_fix:result.fixes.auto_fix,prune_missing:result.fixes.prune_missing,planned_count:result.fixes.planned_count,applied_count:result.fixes.applied_count,gated_count:result.fixes.gated_count,failed_count:result.fixes.failed_count}}:{}}}function normalizeStatusForRegistry(status,statusRegistry){return normalizeStatusInput(status,statusRegistry)??status}function isTerminalStatus(status,statusRegistry){return statusRegistry.terminal_statuses.has(normalizeStatusForRegistry(status,statusRegistry))}function normalizeLifecyclePatternList(values){return[...new Set((values??[]).map(value=>value.trim().toLowerCase()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right))}function areSortedStringListsEqual(left,right){return left.length!==right.length?!1:left.every((value,index)=>value===right[index])}function resolveLifecyclePatternPolicy(settings){const defaultStalePatterns=normalizeLifecyclePatternList(DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS),defaultClosureLikePatterns={blocked_reason:normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.blocked_reason),resolution:normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.resolution),actual_result:normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.actual_result)},staleBlockerReasonPatterns=normalizeLifecyclePatternList(settings.validation.lifecycle_stale_blocker_reason_patterns),closureLikePatterns={blocked_reason:normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_blocked_reason_patterns),resolution:normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_resolution_patterns),actual_result:normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_actual_result_patterns)};return{stale_blocker_reason_patterns:staleBlockerReasonPatterns,stale_blocker_reason_pattern_source:areSortedStringListsEqual(staleBlockerReasonPatterns,defaultStalePatterns)?"default":"settings",closure_like_metadata_field_patterns:closureLikePatterns,closure_like_metadata_field_pattern_sources:{blocked_reason:areSortedStringListsEqual(closureLikePatterns.blocked_reason,defaultClosureLikePatterns.blocked_reason)?"default":"settings",resolution:areSortedStringListsEqual(closureLikePatterns.resolution,defaultClosureLikePatterns.resolution)?"default":"settings",actual_result:areSortedStringListsEqual(closureLikePatterns.actual_result,defaultClosureLikePatterns.actual_result)?"default":"settings"}}}function resolveValidateMetadataProfile(value){const normalized=value?.trim().toLowerCase();if(!normalized||normalized.length===0)return"core";if(VALIDATE_METADATA_PROFILE_VALUES.includes(normalized))return normalized;throw new PmCliError(`Unknown --metadata-profile value "${value}". Supported values: ${VALIDATE_METADATA_PROFILE_VALUES.join(", ")}.`,EXIT_CODE.USAGE)}function resolveDependencyCycleSeverity(value){const normalized=value?.trim().toLowerCase();if(!normalized||normalized.length===0)return"warn";if(VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.includes(normalized))return normalized;throw new PmCliError(`Unknown --dependency-cycle-severity value "${value}". Supported values: ${VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.join(", ")}.`,EXIT_CODE.USAGE)}function resolveParentCycleSeverity(value){const normalized=value?.trim().toLowerCase();if(!normalized||normalized.length===0)return"warn";if(VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.includes(normalized))return normalized;throw new PmCliError(`Unknown --parent-cycle-severity value "${value}". Supported values: ${VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.join(", ")}.`,EXIT_CODE.USAGE)}function normalizeMetadataRequiredFieldsFromSettings(values){return[...new Set((values??[]).map(value=>value.trim().toLowerCase().replaceAll("-","_")))].map(value=>METADATA_REQUIRED_FIELD_ALIASES[value]).filter(value=>value!==void 0).sort((left,right)=>left.localeCompare(right))}function resolveValidateMetadataPolicy(profile,profileSource,configuredCustomFields){const normalizedCustomFields=normalizeMetadataRequiredFieldsFromSettings(configuredCustomFields);return profile==="core"?{profile,profile_source:profileSource,required_fields:[...CORE_METADATA_REQUIRED_FIELDS],configured_custom_fields:normalizedCustomFields,fallback_to_core:!1,warnings:[]}:profile==="strict"?{profile,profile_source:profileSource,required_fields:[...STRICT_METADATA_REQUIRED_FIELDS],configured_custom_fields:normalizedCustomFields,fallback_to_core:!1,warnings:[]}:normalizedCustomFields.length>0?{profile,profile_source:profileSource,required_fields:normalizedCustomFields,configured_custom_fields:normalizedCustomFields,fallback_to_core:!1,warnings:[]}:{profile,profile_source:profileSource,required_fields:[...CORE_METADATA_REQUIRED_FIELDS],configured_custom_fields:normalizedCustomFields,fallback_to_core:!0,warnings:["validate_metadata_custom_profile_missing_required_fields:0"]}}const TERMINAL_EXEMPT_PLANNING_FIELDS=new Set(["acceptance_criteria","estimated_minutes"]);function isMetadataFieldMissing(item,field,statusRegistry,enforcePlanningFieldsOnTerminal){return!enforcePlanningFieldsOnTerminal&&TERMINAL_EXEMPT_PLANNING_FIELDS.has(field)&&isTerminalStatus(item.status,statusRegistry)?!1:field==="author"?!toNonEmptyStringOrUndefined(item.author):field==="acceptance_criteria"?!toNonEmptyStringOrUndefined(item.acceptance_criteria):field==="estimated_minutes"?!Number.isFinite(item.estimated_minutes):field==="close_reason"?normalizeStatusForRegistry(item.status,statusRegistry)===statusRegistry.close_status&&!toNonEmptyStringOrUndefined(item.close_reason):field==="reviewer"?!toNonEmptyStringOrUndefined(item.reviewer):field==="risk"?!toNonEmptyStringOrUndefined(item.risk):field==="confidence"?typeof item.confidence=="number"?!Number.isFinite(item.confidence):!toNonEmptyStringOrUndefined(item.confidence):field==="sprint"?!toNonEmptyStringOrUndefined(item.sprint):!toNonEmptyStringOrUndefined(item.release)}function resolveFileScanMode(scanMode){if(scanMode===void 0)return"default";const normalized=scanMode.trim().toLowerCase();if(normalized.length===0||normalized==="default")return"default";if(normalized==="tracked-all"||normalized==="tracked_all")return"tracked-all";if(normalized==="tracked-all-strict"||normalized==="tracked_all_strict")return"tracked-all-strict";throw new PmCliError(`Unknown --scan-mode value "${scanMode}". Supported values: ${VALIDATE_FILE_SCAN_MODES.join(", ")}.`,EXIT_CODE.USAGE)}function resolveWorkspaceRoot(pmRoot){const sourceWorkspaceRoot=process.env.PM_SOURCE_WORKSPACE_ROOT?.trim();if(sourceWorkspaceRoot)return path.resolve(sourceWorkspaceRoot);const resolvedPmRoot=path.resolve(pmRoot);if(resolvedPmRoot.replaceAll("\\","/").endsWith("/.agents/pm"))return path.dirname(path.dirname(resolvedPmRoot));const resolvedCwd=path.resolve(process.cwd()),canonicalPmRoot=realpathForWorkspaceRoot(resolvedPmRoot),canonicalCwd=realpathForWorkspaceRoot(resolvedCwd),relativeFromPmRoot=path.relative(canonicalPmRoot,canonicalCwd);return relativeFromPmRoot.length===0||!relativeFromPmRoot.startsWith("..")&&!path.isAbsolute(relativeFromPmRoot)?resolvedPmRoot:resolvedCwd}function realpathForWorkspaceRoot(inputPath){try{return realpathSync.native(inputPath)}catch{return path.resolve(inputPath)}}function hasFilesystemErrorCode(error,acceptedCodes){return typeof error=="object"&&error!==null&&"code"in error&&typeof error.code=="string"&&acceptedCodes.includes(error.code)}async function listFilesRecursive(basePath,relativePath,output){const targetDirectory=relativePath.length>0?path.join(basePath,relativePath):basePath;let entries;try{entries=await fs.readdir(targetDirectory,{withFileTypes:!0})}catch(error){if(isFileMissingError(error))return;throw error}for(const entry of entries){if(entry.name.startsWith("."))continue;const childRelative=relativePath.length>0?path.join(relativePath,entry.name):entry.name;if(entry.isDirectory()){if(DIRECTORY_IGNORE_SET.has(entry.name))continue;await listFilesRecursive(basePath,childRelative,output);continue}entry.isFile()&&output.push(normalizeRelativePath(childRelative))}}async function collectDefaultProjectFileCandidates(workspaceRoot){const discovered=[];for(const directory of FILE_SCAN_DIRECTORIES)await listFilesRecursive(workspaceRoot,directory,discovered);for(const candidate of FILE_SCAN_ROOT_FILES){const absolute=path.join(workspaceRoot,candidate);try{(await fs.stat(absolute)).isFile()&&discovered.push(normalizeRelativePath(candidate))}catch{}}return[...new Set(discovered)].sort((left,right)=>left.localeCompare(right))}async function collectTrackedGitFileCandidates(workspaceRoot){try{const{stdout}=await execFileAsync("git",["ls-files","-z"],{cwd:workspaceRoot,encoding:"utf8",maxBuffer:GIT_LS_FILES_MAX_BUFFER,windowsHide:!0,timeout:GIT_LS_FILES_TIMEOUT_MS}),discovered=stdout.split("\0").map(value=>normalizeRelativePath(value)).filter(value=>value.length>0);return[...new Set(discovered)].sort((left,right)=>left.localeCompare(right))}catch{return null}}function resolvePmInternalCandidatePrefixes(pmRoot,workspaceRoot){const prefixes=new Set,configuredDefault=normalizeRelativeDirectoryPath(PM_DIRNAME);configuredDefault.length>0&&prefixes.add(configuredDefault);const relativePmRoot=normalizeRelativeDirectoryPath(path.relative(workspaceRoot,pmRoot));return relativePmRoot.length>0&&!relativePmRoot.startsWith("..")&&prefixes.add(relativePmRoot),[...prefixes].sort((left,right)=>left.localeCompare(right))}function hasPathPrefix(candidate,prefixes){for(const prefix of prefixes)if(candidate===prefix||candidate.startsWith(`${prefix}/`))return!0;return!1}async function collectProjectFileCandidates(workspaceRoot,scanMode){if(scanMode==="tracked-all"||scanMode==="tracked-all-strict"){const trackedCandidates=await collectTrackedGitFileCandidates(workspaceRoot);if(trackedCandidates)return{requestedMode:scanMode,appliedMode:scanMode,source:"tracked-git",candidateFiles:trackedCandidates,candidateTotal:trackedCandidates.length,candidateScanned:trackedCandidates.length};const fallbackCandidates=await collectDefaultProjectFileCandidates(workspaceRoot);return{requestedMode:scanMode,appliedMode:"default",source:"tracked-all-fallback-default",candidateFiles:fallbackCandidates,candidateTotal:fallbackCandidates.length,candidateScanned:fallbackCandidates.length}}const defaultCandidates=await collectDefaultProjectFileCandidates(workspaceRoot);return{requestedMode:scanMode,appliedMode:"default",source:"default-curated",candidateFiles:defaultCandidates,candidateTotal:defaultCandidates.length,candidateScanned:defaultCandidates.length}}function summarizeList(values,limit=DIAGNOSTIC_LIST_SUMMARY_LIMIT){return values.length<=limit?{values,truncated:!1}:{values:values.slice(0,limit),truncated:!0}}function summarizeFileList(values,verboseFileLists){if(verboseFileLists)return{values,truncated:!1,total:values.length};const summary=summarizeList(values,FILE_LIST_SUMMARY_LIMIT);return{values:summary.values,truncated:summary.truncated,total:values.length}}const RESOLUTION_REMEDIATION_FLAG_BY_FIELD={resolution:"--resolution",expected_result:"--expected-result",actual_result:"--actual-result"},RESOLUTION_REMEDIATION_PLACEHOLDER_BY_FIELD={resolution:"Describe how this item was resolved",expected_result:"Describe the expected result",actual_result:"Describe the actual result"};function buildResolutionRemediationCommand(row){const fieldArguments=row.missing_fields.map(field=>`${RESOLUTION_REMEDIATION_FLAG_BY_FIELD[field]} "${RESOLUTION_REMEDIATION_PLACEHOLDER_BY_FIELD[field]}"`).join(" ");return`pm update ${row.id} ${fieldArguments} --message "Backfill resolution metadata"`}function attachValidateFixHints(check,checkWarnings){const existingResolutionHints=check.details?.missing_resolution_remediation_hints,aliasedResolution=Array.isArray(existingResolutionHints)&&existingResolutionHints.length>0,fixHints=aliasedResolution?existingResolutionHints.filter(hint=>typeof hint=="string"):buildRemediationCommands(checkWarnings);if(fixHints.length===0)return;const truncated=aliasedResolution&&check.details?.missing_resolution_remediation_hints_truncated===!0;check.details={...check.details,fix_hints:fixHints,...truncated?{fix_hints_truncated:!0}:{}}}function resolveRequestedChecks(options){const requested=new Set;return options.checkCompleteness&&requested.add("completeness"),options.checkMetadata&&requested.add("metadata"),options.checkResolution&&requested.add("resolution"),(options.checkLifecycle||options.checkStaleBlockers)&&requested.add("lifecycle"),options.checkFiles&&requested.add("files"),options.checkHistoryDrift&&requested.add("history_drift"),options.checkCommandReferences&&requested.add("command_references"),options.checkStorageIntegrity&&requested.add("storage_integrity"),requested.size===0?(options.autoFix&&(requested.add("metadata"),requested.add("resolution"),requested.add("lifecycle")),options.pruneMissing&&requested.add("files"),requested.size===0&&(requested.add("metadata"),requested.add("resolution"),requested.add("lifecycle"),requested.add("files"),requested.add("command_references"),requested.add("history_drift"),requested.add("format_version"),requested.add("completeness"),requested.add("storage_integrity")),requested):(options.pruneMissing&&requested.add("files"),requested)}const DUPLICATE_ISSUE_CODE_WARNING_TOKEN="validate_metadata_duplicate_issue_codes";function summarizeDuplicateIssueCodes(duplicates,verboseDiagnostics){if(duplicates.length===0)return{rows:[],truncated:!1,warnings:[]};const limit=verboseDiagnostics?duplicates.length:DIAGNOSTIC_LIST_SUMMARY_LIMIT,shown=duplicates.slice(0,limit);return{rows:shown.map(duplicate=>({code:duplicate.code,count:duplicate.count,ids:duplicate.ids,titles:duplicate.titles,remediation_hint:`Items ${duplicate.ids.join(", ")} share issue code "${duplicate.code}"; rename or merge so each logical code maps to one item.`})),truncated:shown.length<duplicates.length,warnings:[`${DUPLICATE_ISSUE_CODE_WARNING_TOKEN}:${duplicates.length}`]}}function collectMissingMetadataByField(items,statusRegistry,enforcePlanningFieldsOnTerminal){const missingByField=Object.fromEntries(SUPPORTED_METADATA_REQUIRED_FIELDS.map(field=>[field,[]]));for(const item of items)for(const field of SUPPORTED_METADATA_REQUIRED_FIELDS)isMetadataFieldMissing(item,field,statusRegistry,enforcePlanningFieldsOnTerminal)&&missingByField[field].push(item.id);return missingByField}function buildMetadataWarningTokens(metadataPolicy,missingByField,duplicateWarnings){const warningTokens=[...metadataPolicy.warnings];for(const field of metadataPolicy.required_fields){const missingItems=missingByField[field];missingItems.length>0&&warningTokens.push(`${METADATA_WARNING_TOKEN_BY_FIELD[field]}:${missingItems.length}`)}return warningTokens.push(...duplicateWarnings),warningTokens}function buildMetadataCounts(metadataPolicy,missingByField){const counts={};for(const field of metadataPolicy.required_fields){const missing=missingByField[field],value=missing?missing.length:0,countKey=METADATA_COUNT_KEY_BY_FIELD[field];counts[countKey]=value}return counts}function buildMissingFieldOccurrences(metadataPolicy,missingByField,itemsById){const occurrences=[];for(const field of metadataPolicy.required_fields){const missing=missingByField[field];if(missing)for(const itemId of missing){const itemType=itemsById.get(itemId)?.type,normalizedItemType=typeof itemType=="string"&&itemType.length>0?itemType:"Unknown";occurrences.push({item_type:normalizedItemType,field})}}return occurrences}function attachMissingMetadataItemIds(details,metadataPolicy,missingByField,verboseDiagnostics){for(const field of metadataPolicy.required_fields){const missing=missingByField[field];if(!missing||missing.length===0)continue;const idsKey=METADATA_ITEM_IDS_KEY_BY_FIELD[field],truncatedKey=METADATA_TRUNCATED_KEY_BY_FIELD[field];if(!idsKey||!truncatedKey)continue;const summarized=summarizeList(missing,verboseDiagnostics?missing.length:DIAGNOSTIC_LIST_SUMMARY_LIMIT);details[idsKey]=summarized.values,details[truncatedKey]=summarized.truncated}}function buildCloseReasonBackfillRows(metadataPolicy,missingByField,itemsById){if(!metadataPolicy.required_fields.includes("close_reason"))return[];const missing=missingByField.close_reason;return missing?missing.map(itemId=>({id:itemId,resolution:toNonEmptyStringOrUndefined(itemsById.get(itemId)?.resolution)})):[]}function buildEstimateBackfillRows(metadataPolicy,missingByField,itemsById){if(!metadataPolicy.required_fields.includes("estimated_minutes"))return[];const missing=missingByField.estimated_minutes;return missing?missing.map(itemId=>({id:itemId,type:toNonEmptyStringOrUndefined(itemsById.get(itemId)?.type)})):[]}function buildMetadataCheck(items,metadataPolicy,statusRegistry,verboseDiagnostics,configuredIssueCodePrefixes){const itemsById=new Map(items.map(item=>[item.id,item])),enforcePlanningFieldsOnTerminal=metadataPolicy.profile==="strict",missingByField=collectMissingMetadataByField(items,statusRegistry,enforcePlanningFieldsOnTerminal),duplicateIssueCodes=findDuplicateIssueCodes(items,{configuredPrefixes:configuredIssueCodePrefixes}),duplicateIssueCodeSummary=summarizeDuplicateIssueCodes(duplicateIssueCodes,verboseDiagnostics),warningTokens=buildMetadataWarningTokens(metadataPolicy,missingByField,duplicateIssueCodeSummary.warnings),counts=buildMetadataCounts(metadataPolicy,missingByField),missingFieldOccurrences=buildMissingFieldOccurrences(metadataPolicy,missingByField,itemsById),missingByType=buildMissingByTypeCounts(missingFieldOccurrences),details={checked_items:items.length,metadata_profile:metadataPolicy.profile,metadata_profile_source:metadataPolicy.profile_source,metadata_profile_fallback_to_core:metadataPolicy.fallback_to_core,required_fields:[...metadataPolicy.required_fields],supported_required_fields:[...SUPPORTED_METADATA_REQUIRED_FIELDS],counts,missing_by_type:missingByType,duplicate_issue_codes_count:duplicateIssueCodes.length,duplicate_issue_codes:duplicateIssueCodeSummary.rows,duplicate_issue_codes_truncated:duplicateIssueCodeSummary.truncated};metadataPolicy.configured_custom_fields.length>0&&(details.configured_custom_required_fields=[...metadataPolicy.configured_custom_fields]),attachMissingMetadataItemIds(details,metadataPolicy,missingByField,verboseDiagnostics);const closeReasonBackfillRows=buildCloseReasonBackfillRows(metadataPolicy,missingByField,itemsById),estimateBackfillRows=buildEstimateBackfillRows(metadataPolicy,missingByField,itemsById);return{check:{name:"metadata",status:warningTokens.length===0?"ok":"warn",ok:warningTokens.length===0,details},warnings:warningTokens,closeReasonBackfillRows,estimateBackfillRows}}function buildResolutionCheck(items,statusRegistry,verboseDiagnostics){const terminalDoneStatuses=new Set(statusRegistry.terminal_done_statuses);terminalDoneStatuses.add(statusRegistry.close_status);const closedItems=items.filter(item=>terminalDoneStatuses.has(normalizeStatusForRegistry(item.status,statusRegistry))),missingResolutionRows=[],resolutionBackfillRows=[];for(const item of closedItems){const missingFields=RESOLUTION_FIELD_KEYS.filter(field=>!toNonEmptyStringOrUndefined(item[field]));missingFields.length!==0&&(missingResolutionRows.push({id:item.id,missing_fields:missingFields}),resolutionBackfillRows.push({id:item.id,missing_fields:missingFields,close_reason:toNonEmptyStringOrUndefined(item.close_reason)}))}const warnings=missingResolutionRows.length>0?[`validate_resolution_missing_fields:${missingResolutionRows.length}`]:[],diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedRows=summarizeList(missingResolutionRows.map(row=>`${row.id}:${row.missing_fields.join(",")}`),diagnosticLimit),remediationHints=missingResolutionRows.map(row=>buildResolutionRemediationCommand(row)),summarizedHints=summarizeList(remediationHints,diagnosticLimit);return{check:{name:"resolution",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{checked_closed_items:closedItems.length,missing_resolution_items:missingResolutionRows.length,missing_resolution_rows:summarizedRows.values,missing_resolution_rows_truncated:summarizedRows.truncated,missing_resolution_remediation_hints:summarizedHints.values,missing_resolution_remediation_hints_truncated:summarizedHints.truncated}},warnings,resolutionBackfillRows}}function escapeRegExp(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function buildLifecycleDependencyGraph(activeItems,idPrefix="pm",relationshipRegistry=createRelationshipKindRegistry()){const activeItemIds=new Set(activeItems.map(item=>item.id)),sortedItems=[...activeItems].sort((left,right)=>left.id.localeCompare(right.id));return new Map(sortedItems.map(item=>{const edges=new Set,blockedBy=toMeaningfulString(item.blocked_by);blockedBy&&activeItemIds.has(blockedBy)&&edges.add(blockedBy),(item.dependencies??[]).filter(dependency=>{const dependencyKind=toMeaningfulString(dependency.kind);return dependencyKind!==void 0&&relationshipRegistry.resolve(dependencyKind)?.ordering===!0}).map(dependency=>toMeaningfulString(dependency.id)).filter(dependencyId=>dependencyId!==void 0&&activeItemIds.has(dependencyId)).forEach(dependencyId=>edges.add(dependencyId));const definitionOfReady=toMeaningfulString(item.definition_of_ready);return extractItemIds(definitionOfReady??"",idPrefix).filter(referencedId=>activeItemIds.has(referencedId)).forEach(referencedId=>edges.add(referencedId)),[item.id,[...edges].sort((left,right)=>left.localeCompare(right))]}))}function buildDependencyReferencesCheck(items,verboseDiagnostics,statusRegistry){const classified=collectDanglingDependencyReferences(items,statusRegistry?status=>isTerminalStatus(status,statusRegistry):void 0),activeRows=classified.active.map(row=>`${row.holder_id}:${row.target_id}:${row.kind}`),legacyRows=classified.legacy_terminal.map(row=>`${row.holder_id}:${row.target_id}:${row.kind}:${row.holder_status}`),diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedRows=summarizeList(activeRows,diagnosticLimit),summarizedLegacyRows=summarizeList(legacyRows,diagnosticLimit),hints=summarizeList(classified.active.map(row=>row.source==="parent"?`pm update ${row.holder_id} --unset parent`:row.source==="blocked_by"?`pm update ${row.holder_id} --unset blocked_by`:`pm update ${row.holder_id} --replace-deps '<correct dependency edges>'`),diagnosticLimit);return{check:{name:"dependency_references",status:activeRows.length===0?"ok":"warn",ok:activeRows.length===0,details:{checked_items:items.length,dangling_reference_count:activeRows.length+legacyRows.length,active_dangling_reference_count:activeRows.length,dangling_reference_rows:summarizedRows.values,dangling_reference_rows_truncated:summarizedRows.truncated,legacy_terminal_dangling_reference_count:legacyRows.length,legacy_closed_dangling_reference_count:classified.legacy_terminal.filter(row=>row.holder_status==="closed").length,legacy_terminal_dangling_reference_rows:summarizedLegacyRows.values,legacy_terminal_dangling_reference_rows_truncated:summarizedLegacyRows.truncated,no_active_blocker_sentinel_count:classified.no_active_blocker_sentinels.length,remediation_hints:hints.values,remediation_hints_truncated:hints.truncated}},warnings:activeRows.length>0?[`validate_dangling_dependency_references:${activeRows.length}`]:[]}}function extractItemIds(value,idPrefix="pm"){const normalizedPrefix=(idPrefix.trim().toLowerCase()||"pm").replace(/-+$/g,""),pattern=new RegExp(`(?:^|[^a-z0-9-])(${escapeRegExp(normalizedPrefix)}-[a-z0-9][a-z0-9-]*)`,"gi");return[...new Set([...value.matchAll(pattern)].map(match=>match[1].toLowerCase()))].sort((left,right)=>left.localeCompare(right))}function findLifecycleDependencyCycleComponents(graph){let nextIndex=0;const indexById=new Map,lowLinkById=new Map,stack=[],inStack=new Set,components=[],visit=id=>{indexById.set(id,nextIndex),lowLinkById.set(id,nextIndex),nextIndex+=1,stack.push(id),inStack.add(id);for(const dependencyId of graph.get(id)??[])indexById.has(dependencyId)?inStack.has(dependencyId)&&lowLinkById.set(id,Math.min(lowLinkById.get(id),indexById.get(dependencyId))):(visit(dependencyId),lowLinkById.set(id,Math.min(lowLinkById.get(id),lowLinkById.get(dependencyId))));if(lowLinkById.get(id)!==indexById.get(id))return;const component=[];for(;stack.length>0;){const member=stack.pop();if(inStack.delete(member),component.push(member),member===id)break}component.sort((left,right)=>left.localeCompare(right)),components.push(component)},sortedNodeIds=[...graph.keys()].sort((left,right)=>left.localeCompare(right));for(const id of sortedNodeIds)indexById.has(id)||visit(id);return components.filter(component=>{if(component.length>1)return!0;const selfId=component[0];return(graph.get(selfId)??[]).includes(selfId)}).sort((left,right)=>left[0].localeCompare(right[0])||left.length-right.length||left.join(",").localeCompare(right.join(",")))}function detectLifecycleDependencyCycles(activeItems,idPrefix="pm"){const graph=buildLifecycleDependencyGraph(activeItems,idPrefix),cycleComponents=findLifecycleDependencyCycleComponents(graph),cycleItemIds=[...new Set(cycleComponents.flat())].sort((left,right)=>left.localeCompare(right)),cycleSamplePaths=cycleComponents.map(component=>resolveLifecycleDependencyCycleSamplePath(component,graph).join("->"));return{cycle_count:cycleComponents.length,cycle_item_ids:cycleItemIds,cycle_sample_paths:cycleSamplePaths}}function classifyOrphanedPath(pathValue){return pathValue.startsWith("docs/")?"docs_unowned":pathValue.startsWith("tests/")?"tests_unowned":pathValue.startsWith("src/")?"source_unowned":pathValue.endsWith(".md")?"docs_unowned":"unlinked_existing"}function directoryOf(relativePath){const slash=relativePath.lastIndexOf("/");return slash===-1?"":relativePath.slice(0,slash)}function sharedDirectoryPrefixLength(left,right){const leftParts=directoryOf(left).split("/").filter(Boolean),rightParts=directoryOf(right).split("/").filter(Boolean);let count=0;for(;count<leftParts.length&&count<rightParts.length&&leftParts[count]===rightParts[count];)count+=1;return count}function scoreOrphanOwnerCandidate(pathValue,linkedPath){const linkedDir=directoryOf(linkedPath),orphanDir=directoryOf(pathValue),directoryPrefix=linkedPath.endsWith("/")?linkedPath:`${linkedPath}/`,isDirectoryPrefix=pathValue.startsWith(directoryPrefix),sameDirectory=linkedDir.length>0&&linkedDir===orphanDir,sharedPrefixLength=sharedDirectoryPrefixLength(pathValue,linkedPath);return!isDirectoryPrefix&&!sameDirectory&&sharedPrefixLength===0?null:isDirectoryPrefix?{score:linkedPath.length+1e3,confidence:"path_prefix"}:sameDirectory?{score:sharedPrefixLength+500,confidence:"same_directory"}:{score:sharedPrefixLength,confidence:"shared_directory"}}function shouldReplaceOrphanOwnerCandidate(best,item,score){return best===void 0||score>best.score||score===best.score&&item.id.localeCompare(best.item.id)<0}function findOrphanOwnerCandidate(pathValue,classification,items){const linkKind=classification==="docs_unowned"?"docs":"files";let best;return items.flatMap(item=>(linkKind==="docs"?item.docs??[]:item.files??[]).map(link=>({item,link}))).forEach(({item,link})=>{if(link.scope!=="project")return;const linkedPath=normalizeRelativePath(link.path);if(linkedPath.length===0||linkedPath===pathValue)return;const scored=scoreOrphanOwnerCandidate(pathValue,linkedPath);scored!==null&&shouldReplaceOrphanOwnerCandidate(best,item,scored.score)&&(best={item,score:scored.score,confidence:scored.confidence})}),best?{id:best.item.id,type:best.item.type,title:best.item.title,status:best.item.status,confidence:best.confidence}:null}function buildOrphanedPathRows(orphanedFiles,items){return orphanedFiles.map(pathValue=>{const classification=classifyOrphanedPath(pathValue),linkCommand=classification==="docs_unowned"?"docs":"files",ownerCandidate=findOrphanOwnerCandidate(pathValue,classification,items),target=ownerCandidate?.id??"<id>";return{path:pathValue,classification,owner_candidate:ownerCandidate,remediation_hint:`pm ${linkCommand} ${target} --add path=${pathValue},scope=project,note="<why this artifact belongs to the item>"`}})}function summarizeOrphanedPathRows(rows){return rows.map(row=>`${row.path}:${row.classification} owner_candidate=${row.owner_candidate?.id??"unowned"} hint=${JSON.stringify(row.remediation_hint)}`)}function closureLikeFieldsForItem(item,lifecyclePatternPolicy){return Object.entries(lifecyclePatternPolicy.closure_like_metadata_field_patterns).filter(([field,patterns])=>{const value=toMeaningfulString(item[field]);return value?patterns.some(pattern=>value.toLowerCase().includes(pattern)):!1}).map(([field])=>field).sort((left,right)=>left.localeCompare(right))}function buildTerminalParentFixRow(item,parent,itemsById,canonicalIdByLowercase,statusRegistry){const grandparentId=toMeaningfulString(parent.parent),grandparent=grandparentId?itemsById.get(canonicalIdByLowercase.get(grandparentId.toLowerCase())??grandparentId):void 0;return{id:item.id,parent_id:parent.id,grandparent_id:grandparent?.id,grandparent_active:grandparent!==void 0&&!isTerminalStatus(grandparent.status,statusRegistry)}}function staleBlockerReasonsForItem(item,blockedStatuses,statusRegistry,lifecyclePatternPolicy){const blockedBy=toMeaningfulString(item.blocked_by),blockedReason=toMeaningfulString(item.blocked_reason),blockedReasonNormalized=blockedReason?.toLowerCase(),normalizedStatus=normalizeStatusForRegistry(item.status,statusRegistry),reasons=[];return blockedStatuses.has(normalizedStatus)?(!blockedBy&&!blockedReason&&reasons.push("blocked_status_missing_blocker_context"),blockedReasonNormalized?.includes("no active blocker")&&reasons.push("blocked_status_reason_reports_no_active_blocker"),blockedReasonNormalized&&lifecyclePatternPolicy.stale_blocker_reason_patterns.some(pattern=>blockedReasonNormalized.includes(pattern))&&reasons.push("blocked_status_reason_matches_stale_pattern"),reasons):(blockedBy&&reasons.push("non_blocked_status_has_blocked_by"),blockedReason&&reasons.push("non_blocked_status_has_blocked_reason"),reasons)}function collectLifecycleScanRows(items,includeStaleBlockers,statusRegistry,lifecyclePatternPolicy){const itemsById=new Map(items.map(item=>[item.id,item])),canonicalIdByLowercase=new Map(items.map(item=>[item.id.toLowerCase(),item.id])),blockedStatuses=statusRegistry.blocked_statuses.size>0?statusRegistry.blocked_statuses:new Set(["blocked"]),rows={activeItems:items.filter(item=>!isTerminalStatus(item.status,statusRegistry)),closureLikeRows:[],terminalParentRows:[],terminalParentFixRows:[],staleBlockerRows:[]};for(const item of rows.activeItems){const closureLikeFields=closureLikeFieldsForItem(item,lifecyclePatternPolicy);closureLikeFields.length>0&&rows.closureLikeRows.push({id:item.id,fields:closureLikeFields});const parentId=toMeaningfulString(item.parent),parent=parentId?itemsById.get(canonicalIdByLowercase.get(parentId.toLowerCase())??parentId):void 0;if(parent&&isTerminalStatus(parent.status,statusRegistry)&&(rows.terminalParentRows.push({id:item.id,parent_id:parent.id,parent_status:parent.status}),rows.terminalParentFixRows.push(buildTerminalParentFixRow(item,parent,itemsById,canonicalIdByLowercase,statusRegistry))),includeStaleBlockers){const reasons=staleBlockerReasonsForItem(item,blockedStatuses,statusRegistry,lifecyclePatternPolicy);reasons.length>0&&rows.staleBlockerRows.push({id:item.id,status:item.status,reasons:[...new Set(reasons)].sort((left,right)=>left.localeCompare(right))})}}return rows}function sortLifecycleScanRows(rows){rows.closureLikeRows.sort((left,right)=>left.id.localeCompare(right.id)),rows.terminalParentRows.sort((left,right)=>left.id.localeCompare(right.id)||left.parent_id.localeCompare(right.parent_id)),rows.terminalParentFixRows.sort((left,right)=>left.id.localeCompare(right.id)||left.parent_id.localeCompare(right.parent_id)),rows.staleBlockerRows.sort((left,right)=>left.id.localeCompare(right.id))}function lifecycleCycleWarningToken(prefix,severity,count){return count<=0||severity==="off"?null:`${severity==="error"?`${prefix}_error`:prefix}:${count}`}function lifecycleAdvisoryWarningToken(prefix,severity,count){return count>0&&severity!=="off"?`${prefix}:${count}`:null}function buildLifecycleWarnings(rows,includeStaleBlockers,dependencyCycleSeverity,parentCycleSeverity,counts){const warnings=[];rows.closureLikeRows.length>0&&warnings.push(`validate_lifecycle_active_closure_like_metadata:${rows.closureLikeRows.length}`),rows.terminalParentRows.length>0&&warnings.push(`validate_lifecycle_active_terminal_parent:${rows.terminalParentRows.length}`),includeStaleBlockers&&rows.staleBlockerRows.length>0&&warnings.push(`validate_lifecycle_stale_blockers:${rows.staleBlockerRows.length}`);const dependencyWarning=lifecycleCycleWarningToken("validate_lifecycle_dependency_cycles",dependencyCycleSeverity,counts.dependencyCycles),parentWarning=lifecycleCycleWarningToken("validate_hierarchy_parent_cycle",parentCycleSeverity,counts.activeHierarchyCycles),cardinalityWarning=lifecycleCycleWarningToken("validate_hierarchy_cardinality_violation",parentCycleSeverity,counts.activeHierarchyCardinality),divergenceWarning=lifecycleCycleWarningToken("validate_hierarchy_parent_divergence",parentCycleSeverity,counts.activeHierarchyDivergence),legacyCycleWarning=lifecycleAdvisoryWarningToken("validate_legacy_hierarchy_parent_cycle",parentCycleSeverity,counts.legacyHierarchyCycles),legacyCardinalityWarning=lifecycleAdvisoryWarningToken("validate_legacy_hierarchy_cardinality_violation",parentCycleSeverity,counts.legacyHierarchyCardinality),legacyDivergenceWarning=lifecycleAdvisoryWarningToken("validate_legacy_hierarchy_parent_divergence",parentCycleSeverity,counts.legacyHierarchyDivergence);return[...warnings,...dependencyWarning?[dependencyWarning]:[],...parentWarning?[parentWarning]:[],...cardinalityWarning?[cardinalityWarning]:[],...divergenceWarning?[divergenceWarning]:[],...legacyCycleWarning?[legacyCycleWarning]:[],...legacyCardinalityWarning?[legacyCardinalityWarning]:[],...legacyDivergenceWarning?[legacyDivergenceWarning]:[]]}function linkedArtifactPathExceedsFilesystemLimits(artifactPath){const normalized=normalizeRelativePath(artifactPath);return normalized.length>LINKED_ARTIFACT_MAX_PATH_LENGTH||normalized.split(/[\\/]/).some(segment=>segment.length>LINKED_ARTIFACT_MAX_SEGMENT_LENGTH)}async function linkedArtifactIsMissing(workspaceRoot,artifactPath){const absolutePath=path.isAbsolute(artifactPath)?artifactPath:path.resolve(workspaceRoot,artifactPath);if(linkedArtifactPathExceedsFilesystemLimits(absolutePath))return!1;try{const stats=await fs.stat(absolutePath);return!stats.isFile()&&!stats.isDirectory()}catch(error){return hasFilesystemErrorCode(error,["ENOENT","ENOTDIR"])}}async function collectLinkedPathScanState(items,workspaceRoot){const state={linkedProjectPaths:new Set,remoteLinkedPaths:new Set,missingLinkedPaths:[],staleLinkRows:[]},linkedArtifacts=items.flatMap(item=>[...(item.files??[]).map(artifact=>({item,artifact,link_kind:"files"})),...(item.docs??[]).map(artifact=>({item,artifact,link_kind:"docs"}))]);for(const{item,artifact,link_kind}of linkedArtifacts){if(artifact.scope!=="project")continue;if(isRemoteLinkedArtifactReference(artifact.path)){state.remoteLinkedPaths.add(artifact.path.trim());continue}const normalizedPath=normalizeRelativePath(artifact.path);normalizedPath.length!==0&&(state.linkedProjectPaths.add(normalizedPath),await linkedArtifactIsMissing(workspaceRoot,artifact.path)&&(state.missingLinkedPaths.push(normalizedPath),state.staleLinkRows.push({item_id:item.id,path:normalizedPath,link_kind})))}return state}function partitionFileCandidates(fileCandidates,pmRoot,workspaceRoot,fileScanMode,includePmInternals,verboseFileLists){const strictTrackedAllMode=fileScanMode==="tracked-all-strict",strictModeForcesPmInternals=strictTrackedAllMode&&!includePmInternals,includePmInternalsEffective=includePmInternals||strictTrackedAllMode,pmInternalCandidatePrefixes=includePmInternalsEffective?[]:resolvePmInternalCandidatePrefixes(pmRoot,workspaceRoot),excludedPmInternalPaths=pmInternalCandidatePrefixes.length===0?[]:fileCandidates.candidateFiles.filter(candidate=>hasPathPrefix(candidate,pmInternalCandidatePrefixes)),candidateFiles=pmInternalCandidatePrefixes.length===0?fileCandidates.candidateFiles:fileCandidates.candidateFiles.filter(candidate=>!hasPathPrefix(candidate,pmInternalCandidatePrefixes)),excludedByReason={};if(excludedPmInternalPaths.length>0){const summarizedPmInternalPaths=summarizeFileList(excludedPmInternalPaths,verboseFileLists);excludedByReason.pm_internals={count:excludedPmInternalPaths.length,paths:summarizedPmInternalPaths.values,paths_truncated:summarizedPmInternalPaths.truncated,paths_total:summarizedPmInternalPaths.total}}return{strictTrackedAllMode,strictModeForcesPmInternals,includePmInternalsEffective,pmInternalCandidatePrefixes,excludedPmInternalPaths,candidateFiles,excludedByReason}}function buildLifecycleCheck(items,includeStaleBlockers,dependencyCycleSeverity,parentCycleSeverity,statusRegistry,lifecyclePatternPolicy,verboseDiagnostics,idPrefix="pm"){const rows=collectLifecycleScanRows(items,includeStaleBlockers,statusRegistry,lifecyclePatternPolicy);sortLifecycleScanRows(rows);const dependencyCycleDiagnostics=detectLifecycleDependencyCycles(rows.activeItems,idPrefix),parentCycleDiagnostics=detectLifecycleParentCycles(items,statusRegistry),statusRoleDiagnostics=inspectStatusRoleAssignments(statusRegistry,items,verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT),warnings=[...buildLifecycleWarnings(rows,includeStaleBlockers,dependencyCycleSeverity,parentCycleSeverity,{dependencyCycles:dependencyCycleDiagnostics.cycle_count,activeHierarchyCycles:parentCycleDiagnostics.active_cycle_count,activeHierarchyCardinality:parentCycleDiagnostics.active_cardinality_violation_count,activeHierarchyDivergence:parentCycleDiagnostics.active_parent_divergence_count,legacyHierarchyCycles:parentCycleDiagnostics.legacy_cycle_count,legacyHierarchyCardinality:parentCycleDiagnostics.legacy_cardinality_violation_count,legacyHierarchyDivergence:parentCycleDiagnostics.legacy_parent_divergence_count}),...buildStatusRoleWarnings(statusRoleDiagnostics)],diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedClosureLikeRows=summarizeList(rows.closureLikeRows.map(row=>`${row.id}:${row.fields.join(",")}`),diagnosticLimit),summarizedTerminalParentRows=summarizeList(rows.terminalParentRows.map(row=>`${row.id}:${row.parent_id}:${row.parent_status}`),diagnosticLimit),summarizedStaleBlockerRows=summarizeList(rows.staleBlockerRows.map(row=>`${row.id}:${row.status}:${row.reasons.join(",")}`),diagnosticLimit),summarizedDependencyCycleItemIds=summarizeList(dependencyCycleDiagnostics.cycle_item_ids,diagnosticLimit),summarizedDependencyCycleSamplePaths=summarizeList(dependencyCycleDiagnostics.cycle_sample_paths,diagnosticLimit),summarizedParentCycleItemIds=summarizeList(parentCycleDiagnostics.cycle_item_ids,diagnosticLimit),summarizedParentCycleSamplePaths=summarizeList(parentCycleDiagnostics.cycle_sample_paths,diagnosticLimit),summarizedHierarchyCardinalityRows=summarizeList(parentCycleDiagnostics.cardinality_violation_rows,diagnosticLimit),summarizedHierarchyDivergenceRows=summarizeList(parentCycleDiagnostics.parent_divergence_rows,diagnosticLimit),hasErrorSeverityCycle=dependencyCycleDiagnostics.cycle_count>0&&dependencyCycleSeverity==="error"||(parentCycleDiagnostics.active_cycle_count>0||parentCycleDiagnostics.active_cardinality_violation_count>0||parentCycleDiagnostics.active_parent_divergence_count>0)&&parentCycleSeverity==="error";return{check:{name:"lifecycle",status:hasErrorSeverityCycle?"error":warnings.length===0?"ok":"warn",ok:!hasErrorSeverityCycle&&warnings.length===0,details:{checked_active_items:rows.activeItems.length,lifecycle_status_roles:statusRoleDiagnostics,active_closure_like_metadata_items:rows.closureLikeRows.length,active_closure_like_metadata_rows:summarizedClosureLikeRows.values,active_closure_like_metadata_rows_truncated:summarizedClosureLikeRows.truncated,active_terminal_parent_items:rows.terminalParentRows.length,active_terminal_parent_rows:summarizedTerminalParentRows.values,active_terminal_parent_rows_truncated:summarizedTerminalParentRows.truncated,stale_blocker_checks_enabled:includeStaleBlockers,stale_blocker_items:rows.staleBlockerRows.length,stale_blocker_rows:summarizedStaleBlockerRows.values,stale_blocker_rows_truncated:summarizedStaleBlockerRows.truncated,dependency_cycle_severity_policy:dependencyCycleSeverity,dependency_cycle_count:dependencyCycleDiagnostics.cycle_count,dependency_cycle_item_count:dependencyCycleDiagnostics.cycle_item_ids.length,dependency_cycle_item_ids:summarizedDependencyCycleItemIds.values,dependency_cycle_item_ids_truncated:summarizedDependencyCycleItemIds.truncated,dependency_cycle_sample_paths:summarizedDependencyCycleSamplePaths.values,dependency_cycle_sample_paths_truncated:summarizedDependencyCycleSamplePaths.truncated,parent_cycle_severity_policy:parentCycleSeverity,parent_cycle_count:parentCycleDiagnostics.cycle_count,active_parent_cycle_count:parentCycleDiagnostics.active_cycle_count,legacy_parent_cycle_count:parentCycleDiagnostics.legacy_cycle_count,parent_cycle_item_count:parentCycleDiagnostics.cycle_item_ids.length,parent_cycle_item_ids:summarizedParentCycleItemIds.values,parent_cycle_item_ids_truncated:summarizedParentCycleItemIds.truncated,parent_cycle_sample_paths:summarizedParentCycleSamplePaths.values,parent_cycle_sample_paths_truncated:summarizedParentCycleSamplePaths.truncated,hierarchy_cardinality_violation_count:parentCycleDiagnostics.cardinality_violation_count,active_hierarchy_cardinality_violation_count:parentCycleDiagnostics.active_cardinality_violation_count,legacy_hierarchy_cardinality_violation_count:parentCycleDiagnostics.legacy_cardinality_violation_count,hierarchy_cardinality_violation_rows:summarizedHierarchyCardinalityRows.values,hierarchy_cardinality_violation_rows_truncated:summarizedHierarchyCardinalityRows.truncated,hierarchy_parent_divergence_count:parentCycleDiagnostics.parent_divergence_count,active_hierarchy_parent_divergence_count:parentCycleDiagnostics.active_parent_divergence_count,legacy_hierarchy_parent_divergence_count:parentCycleDiagnostics.legacy_parent_divergence_count,hierarchy_parent_divergence_rows:summarizedHierarchyDivergenceRows.values,hierarchy_parent_divergence_rows_truncated:summarizedHierarchyDivergenceRows.truncated,stale_blocker_reason_patterns:[...lifecyclePatternPolicy.stale_blocker_reason_patterns],stale_blocker_reason_pattern_source:lifecyclePatternPolicy.stale_blocker_reason_pattern_source,closure_like_blocked_reason_patterns:[...lifecyclePatternPolicy.closure_like_metadata_field_patterns.blocked_reason],closure_like_blocked_reason_pattern_source:lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.blocked_reason,closure_like_resolution_patterns:[...lifecyclePatternPolicy.closure_like_metadata_field_patterns.resolution],closure_like_resolution_pattern_source:lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.resolution,closure_like_actual_result_patterns:[...lifecyclePatternPolicy.closure_like_metadata_field_patterns.actual_result],closure_like_actual_result_pattern_source:lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.actual_result}},warnings,terminalParentFixRows:rows.terminalParentFixRows}}async function buildFilesCheck(items,workspaceRoot,pmRoot,fileScanMode,includePmInternals,verboseFileLists,statusRegistry=resolveRuntimeStatusRegistry(SETTINGS_DEFAULTS.schema)){const linkedPathState=await collectLinkedPathScanState(items,workspaceRoot),itemsById=new Map(items.map(item=>[item.id,item])),uniqueMissingLinkedPaths=[...new Set(linkedPathState.missingLinkedPaths)].sort((left,right)=>left.localeCompare(right)),fileCandidates=await collectProjectFileCandidates(workspaceRoot,fileScanMode),partition=partitionFileCandidates(fileCandidates,pmRoot,workspaceRoot,fileScanMode,includePmInternals,verboseFileLists),orphanedFiles=partition.candidateFiles.filter(candidate=>!linkedPathState.linkedProjectPaths.has(candidate)),orphanedPathRows=buildOrphanedPathRows(orphanedFiles,items),classifiedStalePaths=classifyStaleLinkedPaths(uniqueMissingLinkedPaths,partition.candidateFiles),classificationByPath=new Map(classifiedStalePaths.map(entry=>[entry.path,entry.classification])),movedStalePathCount=classifiedStalePaths.filter(entry=>entry.classification==="moved").length,staleLinkPruneRows=linkedPathState.staleLinkRows.map(row=>({...row,classification:classificationByPath.get(row.path)??"deleted"})).sort((left,right)=>left.item_id.localeCompare(right.item_id)||left.path.localeCompare(right.path)||left.link_kind.localeCompare(right.link_kind)),warnings=[];partition.strictModeForcesPmInternals&&warnings.push("validate_files_tracked_all_strict_forces_pm_internals"),orphanedFiles.length>0&&warnings.push(`validate_files_orphaned_paths:${orphanedFiles.length}`);const uniqueRemoteLinkedPaths=[...linkedPathState.remoteLinkedPaths].sort((left,right)=>left.localeCompare(right)),summarizedRemote=summarizeFileList(uniqueRemoteLinkedPaths,verboseFileLists),summarizedMissing=summarizeFileList(uniqueMissingLinkedPaths,verboseFileLists),summarizedOrphaned=summarizeFileList(orphanedFiles,verboseFileLists),summarizedOrphanedClassifications=summarizeFileList(orphanedPathRows.map(row=>`${row.path}:${row.classification}:owner_candidate=${row.owner_candidate?.id??"unowned"}`),verboseFileLists),orphanedPathRowDetail=verboseFileLists?orphanedPathRows:summarizeFileList(summarizeOrphanedPathRows(orphanedPathRows),!1).values,summarizedClassifications=summarizeFileList(summarizeStaleLinkedPathClassifications(classifiedStalePaths),verboseFileLists),repairReport=buildLinkedFileRepairReport(staleLinkPruneRows,classifiedStalePaths,id=>itemsById.get(id),statusRegistry,verboseFileLists?1/0:FILE_LIST_SUMMARY_LIMIT);return repairReport.active_missing_linked_paths_count>0&&warnings.push(`validate_files_missing_linked_paths:${repairReport.active_missing_linked_paths_count}`),{check:{name:"files",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{workspace_root:workspaceRoot,scan_mode_requested:fileCandidates.requestedMode,scan_mode_applied:fileCandidates.appliedMode,strict_tracked_all_mode:partition.strictTrackedAllMode,strict_mode_forces_pm_internals:partition.strictModeForcesPmInternals,strict_mode_forces_pm_internals_notice:partition.strictModeForcesPmInternals?"tracked-all-strict force-enables PM internals; pass --include-pm-internals to make inclusion explicit.":null,file_list_detail_mode:verboseFileLists?"full":"summary",file_list_summary_limit:FILE_LIST_SUMMARY_LIMIT,candidate_scan_source:fileCandidates.source,include_pm_internals:partition.includePmInternalsEffective,include_pm_internals_requested:includePmInternals,pm_internal_candidate_prefixes:partition.pmInternalCandidatePrefixes,pm_internal_excluded_count:partition.excludedPmInternalPaths.length,excluded_total:partition.excludedPmInternalPaths.length,excluded_by_reason:partition.excludedByReason,linked_project_paths:linkedPathState.linkedProjectPaths.size,remote_linked_paths_count:uniqueRemoteLinkedPaths.length,remote_linked_paths_total:summarizedRemote.total,remote_linked_paths:summarizedRemote.values,remote_linked_paths_truncated:summarizedRemote.truncated,candidate_total_raw:fileCandidates.candidateTotal,candidate_scanned_raw:fileCandidates.candidateScanned,candidate_total:partition.candidateFiles.length,candidate_scanned:partition.candidateFiles.length,scanned_candidate_files:partition.candidateFiles.length,missing_linked_paths_count:uniqueMissingLinkedPaths.length,missing_linked_paths_total:summarizedMissing.total,missing_linked_paths:summarizedMissing.values,missing_linked_paths_truncated:summarizedMissing.truncated,missing_linked_paths_moved_count:movedStalePathCount,missing_linked_paths_deleted_count:classifiedStalePaths.filter(entry=>entry.classification==="deleted").length,missing_linked_paths_malformed_count:classifiedStalePaths.filter(entry=>entry.classification==="malformed").length,missing_linked_path_classifications:summarizedClassifications.values,missing_linked_path_classifications_truncated:summarizedClassifications.truncated,...repairReport,orphaned_paths_count:orphanedFiles.length,orphaned_paths_total:summarizedOrphaned.total,orphaned_paths:summarizedOrphaned.values,orphaned_paths_truncated:summarizedOrphaned.truncated,orphaned_path_classifications:summarizedOrphanedClassifications.values,orphaned_path_classifications_truncated:summarizedOrphanedClassifications.truncated,orphaned_path_rows_count:orphanedPathRows.length,orphaned_path_rows:orphanedPathRowDetail}},warnings,staleLinkPruneRows}}function buildUntrustedLinkedTestRows(linkedTests,trustDecisions){const rows=[];return linkedTests.forEach(({item,linkedTest},index)=>{const trust=trustDecisions[index];if(trust.trusted)return;const command=summarizeCommandPreview(linkedTest.command??"");rows.push(`${item.id}:${trust.source_ref??"unknown"}->${trust.current_source_ref??"unknown"}:${command}`)}),rows}async function buildCommandReferencesCheck(items,idPrefix,verboseDiagnostics,pmRoot){const knownIds=new Set(items.map(item=>item.id.toLowerCase()));let linkedCommandsScanned=0,referencedPmIdCount=0;const referencedPmIds=new Set,staleReferenceRows=[],linkedTests=items.flatMap(item=>(item.tests??[]).map(linkedTest=>({item,linkedTest}))),currentSourceRef=await resolveLinkedTestSourceRef(resolveLinkedTestSourceWorkspaceRoot()),trustDecisions=await resolveLinkedTestTrustBatch(pmRoot,linkedTests.map(({linkedTest})=>linkedTest),currentSourceRef),untrustedRows=buildUntrustedLinkedTestRows(linkedTests,trustDecisions);for(const{item,linkedTest}of linkedTests){if(typeof linkedTest.command!="string"||linkedTest.command.trim().length===0)continue;linkedCommandsScanned+=1;const referencedIds=extractReferencedPmItemIdsFromCommand(linkedTest.command,idPrefix);if(referencedIds.length!==0){referencedPmIdCount+=referencedIds.length;for(const referencedId of referencedIds)referencedPmIds.add(referencedId),knownIds.has(referencedId.toLowerCase())||staleReferenceRows.push(`${item.id}:${referencedId}:${summarizeCommandPreview(linkedTest.command)}`)}}const uniqueStaleReferenceRows=[...new Set(staleReferenceRows)].sort((left,right)=>left.localeCompare(right)),stalePmIds=[...new Set(uniqueStaleReferenceRows.map(row=>row.split(":")[1]??""))].filter(value=>value.length>0).sort((left,right)=>left.localeCompare(right)),warnings=[];uniqueStaleReferenceRows.length>0&&warnings.push(`validate_command_references_stale_pm_ids:${uniqueStaleReferenceRows.length}`),untrustedRows.length>0&&warnings.push(`validate_linked_test_trust_unacknowledged:${untrustedRows.length}`);const diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedRows=summarizeList(uniqueStaleReferenceRows,diagnosticLimit),summarizedStalePmIds=summarizeList(stalePmIds,diagnosticLimit),summarizedReferencedPmIds=summarizeList([...referencedPmIds].sort((left,right)=>left.localeCompare(right)),diagnosticLimit),summarizedUntrustedRows=summarizeList(untrustedRows,diagnosticLimit);return{check:{name:"command_references",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{checked_items:items.length,linked_commands_scanned:linkedCommandsScanned,referenced_pm_ids_count:referencedPmIdCount,unique_referenced_pm_ids_count:referencedPmIds.size,unique_referenced_pm_ids:summarizedReferencedPmIds.values,unique_referenced_pm_ids_truncated:summarizedReferencedPmIds.truncated,linked_test_trust_current_source_ref:currentSourceRef??null,untrusted_linked_tests_count:untrustedRows.length,untrusted_linked_tests:summarizedUntrustedRows.values,untrusted_linked_tests_truncated:summarizedUntrustedRows.truncated,stale_pm_id_references_count:uniqueStaleReferenceRows.length,stale_pm_ids_count:stalePmIds.length,stale_pm_ids:summarizedStalePmIds.values,stale_pm_ids_truncated:summarizedStalePmIds.truncated,stale_pm_id_reference_rows:summarizedRows.values,stale_pm_id_reference_rows_truncated:summarizedRows.truncated}},warnings}}function buildFormatVersionCheck(items,verboseDiagnostics){const scan=scanItemFormatVersions(items.map(item=>({ref:item.id,version:effectiveItemFormatVersion(item)}))),warnings=[];scan.outdated.length>0&&warnings.push(`validate_format_version_outdated_items:${scan.outdated.length}`),scan.ahead.length>0&&warnings.push(`validate_format_version_ahead_items:${scan.ahead.length}`);const diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedOutdated=summarizeList(scan.outdated,diagnosticLimit),summarizedAhead=summarizeList(scan.ahead,diagnosticLimit),status=scan.ahead.length>0?"error":scan.outdated.length>0?"warn":"ok";return{check:{name:"format_version",status,ok:status==="ok",details:{checked_items:items.length,current_format_version:CURRENT_ITEM_FORMAT_VERSION,outdated_items_count:scan.outdated.length,outdated_items:summarizedOutdated.values,outdated_items_truncated:summarizedOutdated.truncated,ahead_items_count:scan.ahead.length,ahead_items:summarizedAhead.values,ahead_items_truncated:summarizedAhead.truncated}},warnings}}const VALIDATE_AUTO_FIX_MESSAGE="pm validate auto-fix";async function applyValidateFix(fix,global2,services){switch(fix.kind){case"set_closed_at":await applyClosureTimestampFix(fix,global2);return;case"set_resolution":case"set_close_reason":case"set_estimate":case"reparent":case"unset_parent":{const updateOptions={message:VALIDATE_AUTO_FIX_MESSAGE};if(fix.kind==="set_resolution"?updateOptions.resolution=fix.value:fix.kind==="set_close_reason"?updateOptions.closeReason=fix.value:fix.kind==="set_estimate"?updateOptions.estimatedMinutes=fix.value:fix.kind==="reparent"?updateOptions.parent=fix.parent_id:updateOptions.unset=["parent"],!services.runUpdate)throw new PmCliError("Applying validate metadata/lifecycle fixes requires a runUpdate mutation service.",EXIT_CODE.USAGE);await services.runUpdate(fix.item_id,updateOptions,global2);return}case"prune_file_link":throw new Error(`Unsupported non-batched fix kind: ${fix.kind}`);case"prune_doc_link":throw new Error(`Unsupported non-batched fix kind: ${fix.kind}`)}}function pruneBatchKey(fix){return fix.kind!=="prune_file_link"&&fix.kind!=="prune_doc_link"?null:`${fix.kind}:${fix.item_id}`}async function applyValidateFixes(applicable,global2,services){const applied=[],failed=[],pruneBatches=new Map;for(const fix of applicable.filter(candidate=>pruneBatchKey(candidate)===null))try{await applyValidateFix(fix,global2,services),applied.push(fix)}catch(error){failed.push({fix,error})}for(const fix of applicable.filter(candidate=>pruneBatchKey(candidate)!==null)){const batchKey=pruneBatchKey(fix),existing=pruneBatches.get(batchKey);existing?existing.push(fix):pruneBatches.set(batchKey,[fix])}for(const batch of pruneBatches.values()){const first=batch[0];if(!first)continue;const remove=batch.map(fix=>fix.path).filter(value=>typeof value=="string"&&value.length>0);try{first.kind==="prune_file_link"?await runFiles(first.item_id,{remove,message:VALIDATE_AUTO_FIX_MESSAGE},global2):await runDocs(first.item_id,{remove,message:VALIDATE_AUTO_FIX_MESSAGE},global2),applied.push(...batch)}catch(error){failed.push(...batch.map(fix=>({fix,error})))}}return{applied,failed}}const _testOnlyValidateCommand={applyValidateFix,applyValidateFixes,attachValidateFixHints,buildCommandReferencesCheck,buildDependencyReferencesCheck,buildCloseReasonBackfillRows,buildFilesCheck,buildLifecycleCheck,buildLifecycleDependencyGraph,buildLifecycleParentGraph,buildEstimateBackfillRows,buildMetadataCounts,buildMissingFieldOccurrences,buildOrphanedPathRows,classifyOrphanedPath,collectDefaultProjectFileCandidates,collectTrackedGitFileCandidates,detectLifecycleDependencyCycles,detectLifecycleParentCycles,escapeRegExp,extractItemIds,findLifecycleDependencyCycleComponents,isMetadataFieldMissing,linkedArtifactPathExceedsFilesystemLimits,listFilesRecursive,resolveDependencyCycleSeverity,resolveParentCycleSeverity,resolveFileScanMode,resolveLifecycleDependencyCycleSamplePath,resolveRequestedChecks,resolveValidateMetadataProfile,resolveWorkspaceRoot,sharedDirectoryPrefixLength,summarizeOrphanedPathRows,summarizeDuplicateIssueCodes,toMeaningfulString};function appendInvalidMergeReceiptEvidenceWarning(warnings,invalidEvidenceCount){invalidEvidenceCount>0&&warnings.push(`merge_receipt_evidence_invalid:${invalidEvidenceCount}`)}async function buildStorageIntegrityCheck(pmRoot,items,typeToFolder,settings){const scan=await scanStorageIntegrity(pmRoot,new Set(items.map(item=>item.id)),typeToFolder,{schema:settings.schema,extensionFieldNames:collectRegisteredItemFieldNames(getActiveExtensionRegistrations())}),warnings=[];scan.unreadable_item_files.length>0&&warnings.push(`validate_storage_unreadable_items:${scan.unreadable_item_files.length}`),scan.duplicate_item_ids.length>0&&warnings.push(`validate_storage_duplicate_item_ids:${scan.duplicate_item_ids.length}`),scan.history_conflict_marker_streams.length>0&&warnings.push(`validate_storage_history_conflict_markers:${scan.history_conflict_marker_streams.length}`),scan.history_unparseable_streams.length>0&&warnings.push(`validate_storage_unparseable_history:${scan.history_unparseable_streams.length}`),scan.resurrected_items.length>0&&warnings.push(`validate_storage_resurrected_items:${scan.resurrected_items.length}`),scan.unparseable_config_files.length>0&&warnings.push(`validate_storage_unparseable_config:${scan.unparseable_config_files.length}`);const errorCount=warnings.length,trackedRuntimeCache=await scanTrackedRuntimeCache(pmRoot);trackedRuntimeCache.tracked_path_count>0&&warnings.push(`validate_storage_tracked_runtime_cache_files:${trackedRuntimeCache.tracked_path_count}`);const fenceAudit=await auditMergeAttributeFence(pmRoot,resolveProjectMergeTypeFolders(settings));fenceAudit.status==="drift"&&warnings.push(`validate_merge_fence_drift:${fenceAudit.missing_patterns.length+fenceAudit.stale_patterns.length}`);const gitWorkspaceRoot=await findGitWorkspaceRoot(pmRoot),mergeDriverAudit=gitWorkspaceRoot===null?null:await auditMergeDriverConfiguration(gitWorkspaceRoot);mergeDriverAudit!==null&&mergeDriverAudit.status!=="ok"&&warnings.push(`validate_merge_driver_configuration:${mergeDriverAudit.missing_keys.length+mergeDriverAudit.drifted_keys.length}`);const mergeReceiptEvidence=await inspectMergeReceiptEvidence(gitWorkspaceRoot??pmRoot,{includeLossless:!0,pmRoot}),pendingMergeReceipts=mergeReceiptEvidence.receipts,{pendingDecisions:pendingMergeDecisions,lossless:losslessMergeReceipts}=partitionMergeReceipts(pendingMergeReceipts);pendingMergeDecisions.length>0&&warnings.push(`validate_merge_decisions_unreviewed:${pendingMergeDecisions.length}`),appendInvalidMergeReceiptEvidenceWarning(warnings,mergeReceiptEvidence.invalid_evidence_count);const status=errorCount>0?"error":warnings.length>0?"warn":"ok";return{check:{name:"storage_integrity",status,ok:status==="ok",details:{...scan,merge_fence:fenceAudit,merge_driver_configuration:mergeDriverAudit,pending_merge_decision_count:pendingMergeDecisions.length,pending_merge_decision_items:[...new Set(pendingMergeDecisions.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),lossless_merge_receipt_count:losslessMergeReceipts.length,invalid_merge_receipt_evidence_count:mergeReceiptEvidence.invalid_evidence_count,invalid_merge_receipt_evidence_details:mergeReceiptEvidence.invalid_evidence,invalid_merge_receipt_evidence_details_truncated:mergeReceiptEvidence.invalid_evidence_truncated,lossless_merge_receipt_items:[...new Set(losslessMergeReceipts.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),tracked_runtime_cache:{tracker_relative_root:trackedRuntimeCache.tracker_relative_root,tracked_paths:trackedRuntimeCache.tracked_paths,tracked_path_count:trackedRuntimeCache.tracked_path_count,remediation_command:trackedRuntimeCache.remediation_command}}},warnings}}function recordValidateCheck(state,built,fixHintsEnabled){fixHintsEnabled&&attachValidateFixHints(built.check,built.warnings),state.checks.push(built.check),state.warnings.push(...built.warnings)}async function executeRequestedValidateChecks(params){const state={closureTimestampFixes:[],checks:[],warnings:[...params.initialWarnings],closeReasonBackfillRows:[],estimateBackfillRows:[],resolutionBackfillRows:[],terminalParentFixRows:[],staleLinkPruneRows:[]},fixHintsEnabled=params.options.fixHints===!0,fullDiagnostics=params.options.verboseDiagnostics===!0||params.options.allAffectedIds===!0||params.global.json===!0;if(params.requestedChecks.has("completeness")){const built=await readWorkflowCompletenessCheck(params.pmRoot,params.items,fullDiagnostics?1/0:DIAGNOSTIC_LIST_SUMMARY_LIMIT,params.sourceIncomplete);recordValidateCheck(state,built,fixHintsEnabled)}if(params.requestedChecks.has("metadata")){const built=buildMetadataCheck(params.items,params.metadataPolicy,params.statusRegistry,fullDiagnostics,[params.settings.id_prefix]);state.closeReasonBackfillRows=built.closeReasonBackfillRows,state.estimateBackfillRows=built.estimateBackfillRows;const timestamps=await scanClosureTimestamps(params.pmRoot,params.items,params.statusRegistry,params.options.autoFix===!0||fixHintsEnabled,fullDiagnostics?1/0:DIAGNOSTIC_LIST_SUMMARY_LIMIT);state.closureTimestampFixes=timestamps.fixes,Object.assign(built.check.details,timestamps.details),built.warnings.push(...timestamps.warnings),built.check.ok=built.warnings.length===0,built.check.status=built.check.ok?"ok":"warn",recordValidateCheck(state,built,fixHintsEnabled)}if(params.requestedChecks.has("resolution")){const built=buildResolutionCheck(params.items,params.statusRegistry,fullDiagnostics);state.resolutionBackfillRows=built.resolutionBackfillRows,recordValidateCheck(state,built,fixHintsEnabled)}if(params.requestedChecks.has("lifecycle")){const built=buildLifecycleCheck(params.items,!!params.options.checkStaleBlockers,params.dependencyCycleSeverity,params.parentCycleSeverity,params.statusRegistry,params.lifecyclePatternPolicy,fullDiagnostics,params.settings.id_prefix);state.terminalParentFixRows=built.terminalParentFixRows,recordValidateCheck(state,built,fixHintsEnabled),recordValidateCheck(state,buildDependencyReferencesCheck(params.items,fullDiagnostics,params.statusRegistry),fixHintsEnabled)}if(params.requestedChecks.has("files")){const built=await buildFilesCheck(params.items,params.workspaceRoot,params.pmRoot,params.fileScanMode,!!params.options.includePmInternals,!!params.options.verboseFileLists,params.statusRegistry);state.staleLinkPruneRows=built.staleLinkPruneRows,recordValidateCheck(state,built,fixHintsEnabled)}return params.requestedChecks.has("command_references")&&recordValidateCheck(state,await buildCommandReferencesCheck(params.items,params.settings.id_prefix,fullDiagnostics,params.pmRoot),fixHintsEnabled),params.requestedChecks.has("history_drift")&&recordValidateCheck(state,await buildValidateHistoryDriftCheck(params.pmRoot,params.items,fullDiagnostics),fixHintsEnabled),params.requestedChecks.has("format_version")&&recordValidateCheck(state,buildFormatVersionCheck(params.items,fullDiagnostics),fixHintsEnabled),params.requestedChecks.has("storage_integrity")&&recordValidateCheck(state,await buildStorageIntegrityCheck(params.pmRoot,params.items,resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations()).type_to_folder,params.settings),fixHintsEnabled),state}function planValidateFixes(options,state,settings){const planned=[];return options.autoFix===!0&&(planned.push(...state.closureTimestampFixes),planned.push(...planCloseReasonBackfillFixes(state.closeReasonBackfillRows)),planned.push(...planResolutionBackfillFixes(state.resolutionBackfillRows)),planned.push(...planEstimateBackfillFixes(state.estimateBackfillRows,settings.validation.estimate_defaults_by_type)),planned.push(...planTerminalParentFixes(state.terminalParentFixRows))),options.pruneMissing===!0&&planned.push(...planStaleLinkPruneFixes(state.staleLinkPruneRows)),planned}async function buildValidateFixesSummary(options,state,settings,grantedFixScopes,global2,services){if(options.autoFix!==!0&&options.pruneMissing!==!0)return;const planned=planValidateFixes(options,state,settings),{applicable,gated}=partitionFixesByGrant(planned,grantedFixScopes),dryRun=options.dryRun===!0,appliedFixRows=[],failedFixRows=[];if(!dryRun){const applied=await applyValidateFixes(applicable,global2,services);appliedFixRows.push(...applied.applied.map(toFixOutputRow)),failedFixRows.push(...applied.failed.map(({fix,error})=>({...toFixOutputRow(fix),error:error instanceof Error?error.message:String(error)})))}return{mode:dryRun?"dry_run":"apply",auto_fix:options.autoFix===!0,prune_missing:options.pruneMissing===!0,granted_fix_scopes:[...grantedFixScopes].sort((left,right)=>left.localeCompare(right)),planned_count:planned.length,applied_count:appliedFixRows.length,gated_count:gated.length,failed_count:failedFixRows.length,planned_fixes:planned.map(toFixOutputRow),applied_fixes:appliedFixRows,gated_fixes:gated.map(fix=>({...toFixOutputRow(fix),gate_hint:`Withheld: re-run with --fix-scope ${fix.gate} to apply.`})),failed_fixes:failedFixRows}}async function runValidate(options,global2,services={}){assertProjectionModeChoice(options.counts===!0,options.full===!0,"--counts");const fixesRequested=options.autoFix===!0||options.pruneMissing===!0;if(options.dryRun===!0&&!fixesRequested)throw new PmCliError("--dry-run requires --auto-fix or --prune-missing (there is nothing to preview otherwise).",EXIT_CODE.USAGE);if(options.fixScope!==void 0&&options.fixScope.length>0&&options.autoFix!==!0)throw new PmCliError("--fix-scope requires --auto-fix.",EXIT_CODE.USAGE);const grantedFixScopes=resolveGrantedFixScopes(options.fixScope),pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),requestedChecks=resolveRequestedChecks(options),itemReadWarnings=[],items=await readValidateItems({includeBody:["history_drift","metadata","completeness"].some(check=>requestedChecks.has(check)),pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,warnings:itemReadWarnings}),sourceIncomplete=itemReadWarnings.length>0;if(requestedChecks.has("history_drift")){const authorAttribution=await scanHistoryAuthorAttribution(pmRoot);authorAttribution.actionable_unknown_event_count>0&&itemReadWarnings.push(`validate_history_unknown_author_events:${authorAttribution.actionable_unknown_event_count}`)}const metadataProfileSource=typeof options.metadataProfile=="string"?"option":"settings",metadataProfile=resolveValidateMetadataProfile(typeof options.metadataProfile=="string"?options.metadataProfile:settings.validation.metadata_profile),metadataPolicy=resolveValidateMetadataPolicy(metadataProfile,metadataProfileSource,settings.validation.metadata_required_fields),lifecyclePatternPolicy=resolveLifecyclePatternPolicy(settings),dependencyCycleSeverity=resolveDependencyCycleSeverity(options.dependencyCycleSeverity),parentCycleSeverity=resolveParentCycleSeverity(options.parentCycleSeverity),fileScanMode=resolveFileScanMode(options.scanMode),workspaceRoot=resolveWorkspaceRoot(pmRoot),state=await executeRequestedValidateChecks({requestedChecks,options,global:global2,pmRoot,workspaceRoot,settings,items,statusRegistry,metadataPolicy,lifecyclePatternPolicy,dependencyCycleSeverity,parentCycleSeverity,fileScanMode,initialWarnings:[...new Set(itemReadWarnings)],sourceIncomplete}),fixes=fixesRequested?await buildValidateFixesSummary(options,state,settings,grantedFixScopes,global2,services):void 0,normalizedWarnings=[...new Set(state.warnings)].sort((left,right)=>left.localeCompare(right)),result={ok:!state.checks.some(check=>check.status==="error"),has_warnings:normalizedWarnings.length>0,checks:state.checks,warnings:normalizedWarnings,...fixes!==void 0?{fixes}:{},generated_at:nowIso(),projection:{mode:"full",declared_field_groups:[{name:"diagnostic_rows",restore_with:"--full"}],included_field_groups:["diagnostic_rows"]}};return options.counts!==!0?result:{...projectValidateCounts(result),projection:{mode:"counts",declared_field_groups:[{name:"diagnostic_rows",restore_with:"--full"}],included_field_groups:[]}}}export{_testOnlyValidateCommand,projectValidateCounts,runValidate};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9ef196b2-3eef-5bac-b949-bcb3e947c44d")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{applyClosureTimestampFix,scanClosureTimestamps}from"./closure-timestamps.js";import{readWorkflowCompletenessCheck}from"./workflow-completeness.js";import fs from"node:fs/promises";import{realpathSync}from"node:fs";import{execFile}from"node:child_process";import path from"node:path";import{promisify}from"node:util";import{buildRemediationCommands}from"../../core/diagnostics/remediation.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{collectRegisteredItemFieldNames}from"../../core/extensions/item-fields.js";import{isFileMissingError}from"../../core/fs/fs-utils.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS,DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS,EXIT_CODE,PM_DIRNAME,SETTINGS_DEFAULTS}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{toNonEmptyStringOrUndefined}from"../../core/shared/primitives.js";import{nowIso}from"../../core/shared/time.js";import{CURRENT_ITEM_FORMAT_VERSION,BASELINE_ITEM_FORMAT_VERSION,effectiveItemFormatVersion,scanItemFormatVersions}from"../../core/item/item-format-version.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{partitionFixesByGrant,planCloseReasonBackfillFixes,planEstimateBackfillFixes,planResolutionBackfillFixes,planStaleLinkPruneFixes,planTerminalParentFixes,resolveGrantedFixScopes,toFixOutputRow}from"../../core/validate/fix-planning.js";import{findDuplicateIssueCodes}from"../../core/governance/issue-codes.js";import{buildMissingByTypeCounts}from"../../core/validate/missing-by-type.js";import{classifyStaleLinkedPaths,summarizeStaleLinkedPathClassifications}from"../../core/validate/stale-file-classification.js";import{isRemoteLinkedArtifactReference}from"../../core/validate/linked-artifact-reference.js";import{assertProjectionModeChoice}from"../output-projection.js";import{collectDanglingDependencyReferences}from"../graph/assembly.js";import{auditMergeAttributeFence,auditMergeDriverConfiguration,findGitWorkspaceRoot,resolveProjectMergeTypeFolders}from"../merge/install.js";import{inspectMergeReceiptEvidence,partitionMergeReceipts}from"../merge/receipts.js";import{buildLinkedFileRepairReport}from"./linked-file-report.js";import{scanStorageIntegrity}from"./storage-integrity.js";import{scanTrackedRuntimeCache}from"./tracked-runtime-cache.js";import{scanHistoryAuthorAttribution}from"../author-attribution.js";import{createRelationshipKindRegistry}from"../relationships.js";import{runDocs}from"../docs.js";import{runFiles}from"../files.js";import{extractReferencedPmItemIdsFromCommand}from"../test/linked-command-detection.js";import{resolveLinkedTestSourceRef,resolveLinkedTestSourceWorkspaceRoot,resolveLinkedTestTrustBatch}from"../test/trust.js";import{readValidateItems}from"./validate-item-reader.js";import{buildValidateHistoryDriftCheck}from"./validate-history-drift.js";import{buildLifecycleParentGraph,detectLifecycleParentCycles,resolveLifecycleDependencyCycleSamplePath}from"./hierarchy-validation.js";import{buildStatusRoleWarnings,inspectStatusRoleAssignments}from"./status-role-diagnostics.js";import{summarizeCommandPreview,normalizeRelativeDirectoryPath,normalizeRelativePath,toMeaningfulString}from"./validate-normalization.js";const FILE_SCAN_DIRECTORIES=["src","tests","docs"],FILE_SCAN_ROOT_FILES=["README.md","PRD.md","CHANGELOG.md","AGENTS.md","CONTRIBUTING.md","SECURITY.md","CODE_OF_CONDUCT.md","LICENSE"],DIRECTORY_IGNORE_SET=new Set(["node_modules",".git",".cursor",".agents","dist","coverage"]),RESOLUTION_FIELD_KEYS=["resolution","expected_result","actual_result"],VALIDATE_FILE_SCAN_MODES=["default","tracked-all","tracked-all-strict"],VALIDATE_METADATA_PROFILE_VALUES=["core","strict","custom"],VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES=["off","warn","error"],CORE_METADATA_REQUIRED_FIELDS=["author","acceptance_criteria","estimated_minutes","close_reason"],STRICT_METADATA_REQUIRED_FIELDS=[...CORE_METADATA_REQUIRED_FIELDS,"reviewer","risk","confidence","sprint","release"],SUPPORTED_METADATA_REQUIRED_FIELDS=Array.from(new Set(STRICT_METADATA_REQUIRED_FIELDS)),METADATA_REQUIRED_FIELD_ALIASES={author:"author",acceptance_criteria:"acceptance_criteria","acceptance-criteria":"acceptance_criteria",estimated_minutes:"estimated_minutes","estimated-minutes":"estimated_minutes",estimate:"estimated_minutes",close_reason:"close_reason","close-reason":"close_reason",reviewer:"reviewer",risk:"risk",confidence:"confidence",sprint:"sprint",release:"release"},METADATA_WARNING_TOKEN_BY_FIELD={author:"validate_metadata_missing_author",acceptance_criteria:"validate_metadata_missing_acceptance_criteria",estimated_minutes:"validate_metadata_missing_estimate",close_reason:"validate_metadata_missing_close_reason",reviewer:"validate_metadata_missing_reviewer",risk:"validate_metadata_missing_risk",confidence:"validate_metadata_missing_confidence",sprint:"validate_metadata_missing_sprint",release:"validate_metadata_missing_release"},METADATA_COUNT_KEY_BY_FIELD={author:"missing_author",acceptance_criteria:"missing_acceptance_criteria",estimated_minutes:"missing_estimated_minutes",close_reason:"closed_missing_close_reason",reviewer:"missing_reviewer",risk:"missing_risk",confidence:"missing_confidence",sprint:"missing_sprint",release:"missing_release"},METADATA_ITEM_IDS_KEY_BY_FIELD={author:"missing_author_item_ids",acceptance_criteria:"missing_acceptance_criteria_item_ids",estimated_minutes:"missing_estimated_minutes_item_ids",close_reason:"closed_missing_close_reason_item_ids",reviewer:"missing_reviewer_item_ids",risk:"missing_risk_item_ids",confidence:"missing_confidence_item_ids",sprint:"missing_sprint_item_ids",release:"missing_release_item_ids"},METADATA_TRUNCATED_KEY_BY_FIELD={author:"missing_author_truncated",acceptance_criteria:"missing_acceptance_criteria_truncated",estimated_minutes:"missing_estimated_minutes_truncated",close_reason:"closed_missing_close_reason_truncated",reviewer:"missing_reviewer_truncated",risk:"missing_risk_truncated",confidence:"missing_confidence_truncated",sprint:"missing_sprint_truncated",release:"missing_release_truncated"},GIT_LS_FILES_MAX_BUFFER=32*1024*1024,GIT_LS_FILES_TIMEOUT_MS=1e4,FILE_LIST_SUMMARY_LIMIT=40,DIAGNOSTIC_LIST_SUMMARY_LIMIT=5,LINKED_ARTIFACT_MAX_PATH_LENGTH=4096,LINKED_ARTIFACT_MAX_SEGMENT_LENGTH=255,execFileAsync=promisify(execFile);function projectValidateCountsRecord(record){const projected={};for(const[key,value]of Object.entries(record))Array.isArray(value)||value===!1&&key.endsWith("_truncated")||(projected[key]=typeof value=="object"&&value!==null?projectValidateCountsRecord(value):value);return projected}function projectValidateCounts(result){return{...result,checks:result.checks.map(check=>({...check,details:projectValidateCountsRecord(check.details)})),...result.fixes?{fixes:{mode:result.fixes.mode,auto_fix:result.fixes.auto_fix,prune_missing:result.fixes.prune_missing,planned_count:result.fixes.planned_count,applied_count:result.fixes.applied_count,gated_count:result.fixes.gated_count,failed_count:result.fixes.failed_count}}:{}}}function normalizeStatusForRegistry(status,statusRegistry){return normalizeStatusInput(status,statusRegistry)??status}function isTerminalStatus(status,statusRegistry){return statusRegistry.terminal_statuses.has(normalizeStatusForRegistry(status,statusRegistry))}function normalizeLifecyclePatternList(values){return[...new Set((values??[]).map(value=>value.trim().toLowerCase()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right))}function areSortedStringListsEqual(left,right){return left.length!==right.length?!1:left.every((value,index)=>value===right[index])}function resolveLifecyclePatternPolicy(settings){const defaultStalePatterns=normalizeLifecyclePatternList(DEFAULT_VALIDATE_STALE_BLOCKER_REASON_PATTERNS),defaultClosureLikePatterns={blocked_reason:normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.blocked_reason),resolution:normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.resolution),actual_result:normalizeLifecyclePatternList(DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS.actual_result)},staleBlockerReasonPatterns=normalizeLifecyclePatternList(settings.validation.lifecycle_stale_blocker_reason_patterns),closureLikePatterns={blocked_reason:normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_blocked_reason_patterns),resolution:normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_resolution_patterns),actual_result:normalizeLifecyclePatternList(settings.validation.lifecycle_closure_like_actual_result_patterns)};return{stale_blocker_reason_patterns:staleBlockerReasonPatterns,stale_blocker_reason_pattern_source:areSortedStringListsEqual(staleBlockerReasonPatterns,defaultStalePatterns)?"default":"settings",closure_like_metadata_field_patterns:closureLikePatterns,closure_like_metadata_field_pattern_sources:{blocked_reason:areSortedStringListsEqual(closureLikePatterns.blocked_reason,defaultClosureLikePatterns.blocked_reason)?"default":"settings",resolution:areSortedStringListsEqual(closureLikePatterns.resolution,defaultClosureLikePatterns.resolution)?"default":"settings",actual_result:areSortedStringListsEqual(closureLikePatterns.actual_result,defaultClosureLikePatterns.actual_result)?"default":"settings"}}}function resolveValidateMetadataProfile(value){const normalized=value?.trim().toLowerCase();if(!normalized||normalized.length===0)return"core";if(VALIDATE_METADATA_PROFILE_VALUES.includes(normalized))return normalized;throw new PmCliError(`Unknown --metadata-profile value "${value}". Supported values: ${VALIDATE_METADATA_PROFILE_VALUES.join(", ")}.`,EXIT_CODE.USAGE)}function resolveDependencyCycleSeverity(value){const normalized=value?.trim().toLowerCase();if(!normalized||normalized.length===0)return"warn";if(VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.includes(normalized))return normalized;throw new PmCliError(`Unknown --dependency-cycle-severity value "${value}". Supported values: ${VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.join(", ")}.`,EXIT_CODE.USAGE)}function resolveParentCycleSeverity(value){const normalized=value?.trim().toLowerCase();if(!normalized||normalized.length===0)return"warn";if(VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.includes(normalized))return normalized;throw new PmCliError(`Unknown --parent-cycle-severity value "${value}". Supported values: ${VALIDATE_DEPENDENCY_CYCLE_SEVERITY_VALUES.join(", ")}.`,EXIT_CODE.USAGE)}function normalizeMetadataRequiredFieldsFromSettings(values){return[...new Set((values??[]).map(value=>value.trim().toLowerCase().replaceAll("-","_")))].map(value=>METADATA_REQUIRED_FIELD_ALIASES[value]).filter(value=>value!==void 0).sort((left,right)=>left.localeCompare(right))}function resolveValidateMetadataPolicy(profile,profileSource,configuredCustomFields){const normalizedCustomFields=normalizeMetadataRequiredFieldsFromSettings(configuredCustomFields);return profile==="core"?{profile,profile_source:profileSource,required_fields:[...CORE_METADATA_REQUIRED_FIELDS],configured_custom_fields:normalizedCustomFields,fallback_to_core:!1,warnings:[]}:profile==="strict"?{profile,profile_source:profileSource,required_fields:[...STRICT_METADATA_REQUIRED_FIELDS],configured_custom_fields:normalizedCustomFields,fallback_to_core:!1,warnings:[]}:normalizedCustomFields.length>0?{profile,profile_source:profileSource,required_fields:normalizedCustomFields,configured_custom_fields:normalizedCustomFields,fallback_to_core:!1,warnings:[]}:{profile,profile_source:profileSource,required_fields:[...CORE_METADATA_REQUIRED_FIELDS],configured_custom_fields:normalizedCustomFields,fallback_to_core:!0,warnings:["validate_metadata_custom_profile_missing_required_fields:0"]}}const TERMINAL_EXEMPT_PLANNING_FIELDS=new Set(["acceptance_criteria","estimated_minutes"]);function isMetadataFieldMissing(item,field,statusRegistry,enforcePlanningFieldsOnTerminal){return!enforcePlanningFieldsOnTerminal&&TERMINAL_EXEMPT_PLANNING_FIELDS.has(field)&&isTerminalStatus(item.status,statusRegistry)?!1:field==="author"?!toNonEmptyStringOrUndefined(item.author):field==="acceptance_criteria"?!toNonEmptyStringOrUndefined(item.acceptance_criteria):field==="estimated_minutes"?!Number.isFinite(item.estimated_minutes):field==="close_reason"?normalizeStatusForRegistry(item.status,statusRegistry)===statusRegistry.close_status&&!toNonEmptyStringOrUndefined(item.close_reason):field==="reviewer"?!toNonEmptyStringOrUndefined(item.reviewer):field==="risk"?!toNonEmptyStringOrUndefined(item.risk):field==="confidence"?typeof item.confidence=="number"?!Number.isFinite(item.confidence):!toNonEmptyStringOrUndefined(item.confidence):field==="sprint"?!toNonEmptyStringOrUndefined(item.sprint):!toNonEmptyStringOrUndefined(item.release)}function resolveFileScanMode(scanMode){if(scanMode===void 0)return"default";const normalized=scanMode.trim().toLowerCase();if(normalized.length===0||normalized==="default")return"default";if(normalized==="tracked-all"||normalized==="tracked_all")return"tracked-all";if(normalized==="tracked-all-strict"||normalized==="tracked_all_strict")return"tracked-all-strict";throw new PmCliError(`Unknown --scan-mode value "${scanMode}". Supported values: ${VALIDATE_FILE_SCAN_MODES.join(", ")}.`,EXIT_CODE.USAGE)}function resolveWorkspaceRoot(pmRoot){const sourceWorkspaceRoot=process.env.PM_SOURCE_WORKSPACE_ROOT?.trim();if(sourceWorkspaceRoot)return path.resolve(sourceWorkspaceRoot);const resolvedPmRoot=path.resolve(pmRoot);if(resolvedPmRoot.replaceAll("\\","/").endsWith("/.agents/pm"))return path.dirname(path.dirname(resolvedPmRoot));const resolvedCwd=path.resolve(process.cwd()),canonicalPmRoot=realpathForWorkspaceRoot(resolvedPmRoot),canonicalCwd=realpathForWorkspaceRoot(resolvedCwd),relativeFromPmRoot=path.relative(canonicalPmRoot,canonicalCwd);return relativeFromPmRoot.length===0||!relativeFromPmRoot.startsWith("..")&&!path.isAbsolute(relativeFromPmRoot)?resolvedPmRoot:resolvedCwd}function realpathForWorkspaceRoot(inputPath){try{return realpathSync.native(inputPath)}catch{return path.resolve(inputPath)}}function hasFilesystemErrorCode(error,acceptedCodes){return typeof error=="object"&&error!==null&&"code"in error&&typeof error.code=="string"&&acceptedCodes.includes(error.code)}async function listFilesRecursive(basePath,relativePath,output){const targetDirectory=relativePath.length>0?path.join(basePath,relativePath):basePath;let entries;try{entries=await fs.readdir(targetDirectory,{withFileTypes:!0})}catch(error){if(isFileMissingError(error))return;throw error}for(const entry of entries){if(entry.name.startsWith("."))continue;const childRelative=relativePath.length>0?path.join(relativePath,entry.name):entry.name;if(entry.isDirectory()){if(DIRECTORY_IGNORE_SET.has(entry.name))continue;await listFilesRecursive(basePath,childRelative,output);continue}entry.isFile()&&output.push(normalizeRelativePath(childRelative))}}async function collectDefaultProjectFileCandidates(workspaceRoot){const discovered=[];for(const directory of FILE_SCAN_DIRECTORIES)await listFilesRecursive(workspaceRoot,directory,discovered);for(const candidate of FILE_SCAN_ROOT_FILES){const absolute=path.join(workspaceRoot,candidate);try{(await fs.stat(absolute)).isFile()&&discovered.push(normalizeRelativePath(candidate))}catch{}}return[...new Set(discovered)].sort((left,right)=>left.localeCompare(right))}async function collectTrackedGitFileCandidates(workspaceRoot){try{const{stdout}=await execFileAsync("git",["ls-files","-z"],{cwd:workspaceRoot,encoding:"utf8",maxBuffer:GIT_LS_FILES_MAX_BUFFER,windowsHide:!0,timeout:GIT_LS_FILES_TIMEOUT_MS}),discovered=stdout.split("\0").map(value=>normalizeRelativePath(value)).filter(value=>value.length>0);return[...new Set(discovered)].sort((left,right)=>left.localeCompare(right))}catch{return null}}function resolvePmInternalCandidatePrefixes(pmRoot,workspaceRoot){const prefixes=new Set,configuredDefault=normalizeRelativeDirectoryPath(PM_DIRNAME);configuredDefault.length>0&&prefixes.add(configuredDefault);const relativePmRoot=normalizeRelativeDirectoryPath(path.relative(workspaceRoot,pmRoot));return relativePmRoot.length>0&&!relativePmRoot.startsWith("..")&&prefixes.add(relativePmRoot),[...prefixes].sort((left,right)=>left.localeCompare(right))}function hasPathPrefix(candidate,prefixes){for(const prefix of prefixes)if(candidate===prefix||candidate.startsWith(`${prefix}/`))return!0;return!1}async function collectProjectFileCandidates(workspaceRoot,scanMode){if(scanMode==="tracked-all"||scanMode==="tracked-all-strict"){const trackedCandidates=await collectTrackedGitFileCandidates(workspaceRoot);if(trackedCandidates)return{requestedMode:scanMode,appliedMode:scanMode,source:"tracked-git",candidateFiles:trackedCandidates,candidateTotal:trackedCandidates.length,candidateScanned:trackedCandidates.length};const fallbackCandidates=await collectDefaultProjectFileCandidates(workspaceRoot);return{requestedMode:scanMode,appliedMode:"default",source:"tracked-all-fallback-default",candidateFiles:fallbackCandidates,candidateTotal:fallbackCandidates.length,candidateScanned:fallbackCandidates.length}}const defaultCandidates=await collectDefaultProjectFileCandidates(workspaceRoot);return{requestedMode:scanMode,appliedMode:"default",source:"default-curated",candidateFiles:defaultCandidates,candidateTotal:defaultCandidates.length,candidateScanned:defaultCandidates.length}}function summarizeList(values,limit=DIAGNOSTIC_LIST_SUMMARY_LIMIT){return values.length<=limit?{values,truncated:!1}:{values:values.slice(0,limit),truncated:!0}}function summarizeFileList(values,verboseFileLists){if(verboseFileLists)return{values,truncated:!1,total:values.length};const summary=summarizeList(values,FILE_LIST_SUMMARY_LIMIT);return{values:summary.values,truncated:summary.truncated,total:values.length}}const RESOLUTION_REMEDIATION_FLAG_BY_FIELD={resolution:"--resolution",expected_result:"--expected-result",actual_result:"--actual-result"},RESOLUTION_REMEDIATION_PLACEHOLDER_BY_FIELD={resolution:"Describe how this item was resolved",expected_result:"Describe the expected result",actual_result:"Describe the actual result"};function buildResolutionRemediationCommand(row){const fieldArguments=row.missing_fields.map(field=>`${RESOLUTION_REMEDIATION_FLAG_BY_FIELD[field]} "${RESOLUTION_REMEDIATION_PLACEHOLDER_BY_FIELD[field]}"`).join(" ");return`pm update ${row.id} ${fieldArguments} --message "Backfill resolution metadata"`}function attachValidateFixHints(check,checkWarnings){const existingResolutionHints=check.details?.missing_resolution_remediation_hints,aliasedResolution=Array.isArray(existingResolutionHints)&&existingResolutionHints.length>0,fixHints=aliasedResolution?existingResolutionHints.filter(hint=>typeof hint=="string"):buildRemediationCommands(checkWarnings);if(fixHints.length===0)return;const truncated=aliasedResolution&&check.details?.missing_resolution_remediation_hints_truncated===!0;check.details={...check.details,fix_hints:fixHints,...truncated?{fix_hints_truncated:!0}:{}}}function resolveRequestedChecks(options){const requested=new Set;return options.checkCompleteness&&requested.add("completeness"),options.checkMetadata&&requested.add("metadata"),options.checkResolution&&requested.add("resolution"),(options.checkLifecycle||options.checkStaleBlockers)&&requested.add("lifecycle"),options.checkFiles&&requested.add("files"),options.checkHistoryDrift&&requested.add("history_drift"),options.checkCommandReferences&&requested.add("command_references"),options.checkStorageIntegrity&&requested.add("storage_integrity"),requested.size===0?(options.autoFix&&(requested.add("metadata"),requested.add("resolution"),requested.add("lifecycle")),options.pruneMissing&&requested.add("files"),requested.size===0&&(requested.add("metadata"),requested.add("resolution"),requested.add("lifecycle"),requested.add("files"),requested.add("command_references"),requested.add("history_drift"),requested.add("format_version"),requested.add("completeness"),requested.add("storage_integrity")),requested):(options.pruneMissing&&requested.add("files"),requested)}const DUPLICATE_ISSUE_CODE_WARNING_TOKEN="validate_metadata_duplicate_issue_codes";function summarizeDuplicateIssueCodes(duplicates,verboseDiagnostics){if(duplicates.length===0)return{rows:[],truncated:!1,warnings:[]};const limit=verboseDiagnostics?duplicates.length:DIAGNOSTIC_LIST_SUMMARY_LIMIT,shown=duplicates.slice(0,limit);return{rows:shown.map(duplicate=>({code:duplicate.code,count:duplicate.count,ids:duplicate.ids,titles:duplicate.titles,remediation_hint:`Items ${duplicate.ids.join(", ")} share issue code "${duplicate.code}"; rename or merge so each logical code maps to one item.`})),truncated:shown.length<duplicates.length,warnings:[`${DUPLICATE_ISSUE_CODE_WARNING_TOKEN}:${duplicates.length}`]}}function collectMissingMetadataByField(items,statusRegistry,enforcePlanningFieldsOnTerminal){const missingByField=Object.fromEntries(SUPPORTED_METADATA_REQUIRED_FIELDS.map(field=>[field,[]]));for(const item of items)for(const field of SUPPORTED_METADATA_REQUIRED_FIELDS)isMetadataFieldMissing(item,field,statusRegistry,enforcePlanningFieldsOnTerminal)&&missingByField[field].push(item.id);return missingByField}function buildMetadataWarningTokens(metadataPolicy,missingByField,duplicateWarnings){const warningTokens=[...metadataPolicy.warnings];for(const field of metadataPolicy.required_fields){const missingItems=missingByField[field];missingItems.length>0&&warningTokens.push(`${METADATA_WARNING_TOKEN_BY_FIELD[field]}:${missingItems.length}`)}return warningTokens.push(...duplicateWarnings),warningTokens}function buildMetadataCounts(metadataPolicy,missingByField){const counts={};for(const field of metadataPolicy.required_fields){const missing=missingByField[field],value=missing?missing.length:0,countKey=METADATA_COUNT_KEY_BY_FIELD[field];counts[countKey]=value}return counts}function buildMissingFieldOccurrences(metadataPolicy,missingByField,itemsById){const occurrences=[];for(const field of metadataPolicy.required_fields){const missing=missingByField[field];if(missing)for(const itemId of missing){const itemType=itemsById.get(itemId)?.type,normalizedItemType=typeof itemType=="string"&&itemType.length>0?itemType:"Unknown";occurrences.push({item_type:normalizedItemType,field})}}return occurrences}function attachMissingMetadataItemIds(details,metadataPolicy,missingByField,verboseDiagnostics){for(const field of metadataPolicy.required_fields){const missing=missingByField[field];if(!missing||missing.length===0)continue;const idsKey=METADATA_ITEM_IDS_KEY_BY_FIELD[field],truncatedKey=METADATA_TRUNCATED_KEY_BY_FIELD[field];if(!idsKey||!truncatedKey)continue;const summarized=summarizeList(missing,verboseDiagnostics?missing.length:DIAGNOSTIC_LIST_SUMMARY_LIMIT);details[idsKey]=summarized.values,details[truncatedKey]=summarized.truncated}}function buildCloseReasonBackfillRows(metadataPolicy,missingByField,itemsById){if(!metadataPolicy.required_fields.includes("close_reason"))return[];const missing=missingByField.close_reason;return missing?missing.map(itemId=>({id:itemId,resolution:toNonEmptyStringOrUndefined(itemsById.get(itemId)?.resolution)})):[]}function buildEstimateBackfillRows(metadataPolicy,missingByField,itemsById){if(!metadataPolicy.required_fields.includes("estimated_minutes"))return[];const missing=missingByField.estimated_minutes;return missing?missing.map(itemId=>({id:itemId,type:toNonEmptyStringOrUndefined(itemsById.get(itemId)?.type)})):[]}function buildMetadataCheck(items,metadataPolicy,statusRegistry,verboseDiagnostics,configuredIssueCodePrefixes){const itemsById=new Map(items.map(item=>[item.id,item])),enforcePlanningFieldsOnTerminal=metadataPolicy.profile==="strict",missingByField=collectMissingMetadataByField(items,statusRegistry,enforcePlanningFieldsOnTerminal),duplicateIssueCodes=findDuplicateIssueCodes(items,{configuredPrefixes:configuredIssueCodePrefixes}),duplicateIssueCodeSummary=summarizeDuplicateIssueCodes(duplicateIssueCodes,verboseDiagnostics),warningTokens=buildMetadataWarningTokens(metadataPolicy,missingByField,duplicateIssueCodeSummary.warnings),counts=buildMetadataCounts(metadataPolicy,missingByField),missingFieldOccurrences=buildMissingFieldOccurrences(metadataPolicy,missingByField,itemsById),missingByType=buildMissingByTypeCounts(missingFieldOccurrences),details={checked_items:items.length,metadata_profile:metadataPolicy.profile,metadata_profile_source:metadataPolicy.profile_source,metadata_profile_fallback_to_core:metadataPolicy.fallback_to_core,required_fields:[...metadataPolicy.required_fields],supported_required_fields:[...SUPPORTED_METADATA_REQUIRED_FIELDS],counts,missing_by_type:missingByType,duplicate_issue_codes_count:duplicateIssueCodes.length,duplicate_issue_codes:duplicateIssueCodeSummary.rows,duplicate_issue_codes_truncated:duplicateIssueCodeSummary.truncated};metadataPolicy.configured_custom_fields.length>0&&(details.configured_custom_required_fields=[...metadataPolicy.configured_custom_fields]),attachMissingMetadataItemIds(details,metadataPolicy,missingByField,verboseDiagnostics);const closeReasonBackfillRows=buildCloseReasonBackfillRows(metadataPolicy,missingByField,itemsById),estimateBackfillRows=buildEstimateBackfillRows(metadataPolicy,missingByField,itemsById);return{check:{name:"metadata",status:warningTokens.length===0?"ok":"warn",ok:warningTokens.length===0,details},warnings:warningTokens,closeReasonBackfillRows,estimateBackfillRows}}function buildResolutionCheck(items,statusRegistry,verboseDiagnostics){const terminalDoneStatuses=new Set(statusRegistry.terminal_done_statuses);terminalDoneStatuses.add(statusRegistry.close_status);const closedItems=items.filter(item=>terminalDoneStatuses.has(normalizeStatusForRegistry(item.status,statusRegistry))),missingResolutionRows=[],resolutionBackfillRows=[];for(const item of closedItems){const missingFields=RESOLUTION_FIELD_KEYS.filter(field=>!toNonEmptyStringOrUndefined(item[field]));missingFields.length!==0&&(missingResolutionRows.push({id:item.id,missing_fields:missingFields}),resolutionBackfillRows.push({id:item.id,missing_fields:missingFields,close_reason:toNonEmptyStringOrUndefined(item.close_reason)}))}const warnings=missingResolutionRows.length>0?[`validate_resolution_missing_fields:${missingResolutionRows.length}`]:[],diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedRows=summarizeList(missingResolutionRows.map(row=>`${row.id}:${row.missing_fields.join(",")}`),diagnosticLimit),remediationHints=missingResolutionRows.map(row=>buildResolutionRemediationCommand(row)),summarizedHints=summarizeList(remediationHints,diagnosticLimit);return{check:{name:"resolution",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{checked_closed_items:closedItems.length,missing_resolution_items:missingResolutionRows.length,missing_resolution_rows:summarizedRows.values,missing_resolution_rows_truncated:summarizedRows.truncated,missing_resolution_remediation_hints:summarizedHints.values,missing_resolution_remediation_hints_truncated:summarizedHints.truncated}},warnings,resolutionBackfillRows}}function escapeRegExp(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function buildLifecycleDependencyGraph(activeItems,idPrefix="pm",relationshipRegistry=createRelationshipKindRegistry()){const activeItemIds=new Set(activeItems.map(item=>item.id)),sortedItems=[...activeItems].sort((left,right)=>left.id.localeCompare(right.id));return new Map(sortedItems.map(item=>{const edges=new Set,blockedBy=toMeaningfulString(item.blocked_by);blockedBy&&activeItemIds.has(blockedBy)&&edges.add(blockedBy),(item.dependencies??[]).filter(dependency=>{const dependencyKind=toMeaningfulString(dependency.kind);return dependencyKind!==void 0&&relationshipRegistry.resolve(dependencyKind)?.ordering===!0}).map(dependency=>toMeaningfulString(dependency.id)).filter(dependencyId=>dependencyId!==void 0&&activeItemIds.has(dependencyId)).forEach(dependencyId=>edges.add(dependencyId));const definitionOfReady=toMeaningfulString(item.definition_of_ready);return extractItemIds(definitionOfReady??"",idPrefix).filter(referencedId=>activeItemIds.has(referencedId)).forEach(referencedId=>edges.add(referencedId)),[item.id,[...edges].sort((left,right)=>left.localeCompare(right))]}))}function buildDependencyReferencesCheck(items,verboseDiagnostics,statusRegistry){const classified=collectDanglingDependencyReferences(items,statusRegistry?status=>isTerminalStatus(status,statusRegistry):void 0),activeRows=classified.active.map(row=>`${row.holder_id}:${row.target_id}:${row.kind}`),legacyRows=classified.legacy_terminal.map(row=>`${row.holder_id}:${row.target_id}:${row.kind}:${row.holder_status}`),diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedRows=summarizeList(activeRows,diagnosticLimit),summarizedLegacyRows=summarizeList(legacyRows,diagnosticLimit),hints=summarizeList(classified.active.map(row=>row.source==="parent"?`pm update ${row.holder_id} --unset parent`:row.source==="blocked_by"?`pm update ${row.holder_id} --unset blocked_by`:`pm update ${row.holder_id} --replace-deps '<correct dependency edges>'`),diagnosticLimit);return{check:{name:"dependency_references",status:activeRows.length===0?"ok":"warn",ok:activeRows.length===0,details:{checked_items:items.length,dangling_reference_count:activeRows.length+legacyRows.length,active_dangling_reference_count:activeRows.length,dangling_reference_rows:summarizedRows.values,dangling_reference_rows_truncated:summarizedRows.truncated,legacy_terminal_dangling_reference_count:legacyRows.length,legacy_closed_dangling_reference_count:classified.legacy_terminal.filter(row=>row.holder_status==="closed").length,legacy_terminal_dangling_reference_rows:summarizedLegacyRows.values,legacy_terminal_dangling_reference_rows_truncated:summarizedLegacyRows.truncated,no_active_blocker_sentinel_count:classified.no_active_blocker_sentinels.length,remediation_hints:hints.values,remediation_hints_truncated:hints.truncated}},warnings:activeRows.length>0?[`validate_dangling_dependency_references:${activeRows.length}`]:[]}}function extractItemIds(value,idPrefix="pm"){const normalizedPrefix=(idPrefix.trim().toLowerCase()||"pm").replace(/-+$/g,""),pattern=new RegExp(`(?:^|[^a-z0-9-])(${escapeRegExp(normalizedPrefix)}-[a-z0-9][a-z0-9-]*)`,"gi");return[...new Set([...value.matchAll(pattern)].map(match=>match[1].toLowerCase()))].sort((left,right)=>left.localeCompare(right))}function findLifecycleDependencyCycleComponents(graph){let nextIndex=0;const indexById=new Map,lowLinkById=new Map,stack=[],inStack=new Set,components=[],visit=id=>{indexById.set(id,nextIndex),lowLinkById.set(id,nextIndex),nextIndex+=1,stack.push(id),inStack.add(id);for(const dependencyId of graph.get(id)??[])indexById.has(dependencyId)?inStack.has(dependencyId)&&lowLinkById.set(id,Math.min(lowLinkById.get(id),indexById.get(dependencyId))):(visit(dependencyId),lowLinkById.set(id,Math.min(lowLinkById.get(id),lowLinkById.get(dependencyId))));if(lowLinkById.get(id)!==indexById.get(id))return;const component=[];for(;stack.length>0;){const member=stack.pop();if(inStack.delete(member),component.push(member),member===id)break}component.sort((left,right)=>left.localeCompare(right)),components.push(component)},sortedNodeIds=[...graph.keys()].sort((left,right)=>left.localeCompare(right));for(const id of sortedNodeIds)indexById.has(id)||visit(id);return components.filter(component=>{if(component.length>1)return!0;const selfId=component[0];return(graph.get(selfId)??[]).includes(selfId)}).sort((left,right)=>left[0].localeCompare(right[0])||left.length-right.length||left.join(",").localeCompare(right.join(",")))}function detectLifecycleDependencyCycles(activeItems,idPrefix="pm"){const graph=buildLifecycleDependencyGraph(activeItems,idPrefix),cycleComponents=findLifecycleDependencyCycleComponents(graph),cycleItemIds=[...new Set(cycleComponents.flat())].sort((left,right)=>left.localeCompare(right)),cycleSamplePaths=cycleComponents.map(component=>resolveLifecycleDependencyCycleSamplePath(component,graph).join("->"));return{cycle_count:cycleComponents.length,cycle_item_ids:cycleItemIds,cycle_sample_paths:cycleSamplePaths}}function classifyOrphanedPath(pathValue){return pathValue.startsWith("docs/")?"docs_unowned":pathValue.startsWith("tests/")?"tests_unowned":pathValue.startsWith("src/")?"source_unowned":pathValue.endsWith(".md")?"docs_unowned":"unlinked_existing"}function directoryOf(relativePath){const slash=relativePath.lastIndexOf("/");return slash===-1?"":relativePath.slice(0,slash)}function sharedDirectoryPrefixLength(left,right){const leftParts=directoryOf(left).split("/").filter(Boolean),rightParts=directoryOf(right).split("/").filter(Boolean);let count=0;for(;count<leftParts.length&&count<rightParts.length&&leftParts[count]===rightParts[count];)count+=1;return count}function scoreOrphanOwnerCandidate(pathValue,linkedPath){const linkedDir=directoryOf(linkedPath),orphanDir=directoryOf(pathValue),directoryPrefix=linkedPath.endsWith("/")?linkedPath:`${linkedPath}/`,isDirectoryPrefix=pathValue.startsWith(directoryPrefix),sameDirectory=linkedDir.length>0&&linkedDir===orphanDir,sharedPrefixLength=sharedDirectoryPrefixLength(pathValue,linkedPath);return!isDirectoryPrefix&&!sameDirectory&&sharedPrefixLength===0?null:isDirectoryPrefix?{score:linkedPath.length+1e3,confidence:"path_prefix"}:sameDirectory?{score:sharedPrefixLength+500,confidence:"same_directory"}:{score:sharedPrefixLength,confidence:"shared_directory"}}function shouldReplaceOrphanOwnerCandidate(best,item,score){return best===void 0||score>best.score||score===best.score&&item.id.localeCompare(best.item.id)<0}function findOrphanOwnerCandidate(pathValue,classification,items){const linkKind=classification==="docs_unowned"?"docs":"files";let best;return items.flatMap(item=>(linkKind==="docs"?item.docs??[]:item.files??[]).map(link=>({item,link}))).forEach(({item,link})=>{if(link.scope!=="project")return;const linkedPath=normalizeRelativePath(link.path);if(linkedPath.length===0||linkedPath===pathValue)return;const scored=scoreOrphanOwnerCandidate(pathValue,linkedPath);scored!==null&&shouldReplaceOrphanOwnerCandidate(best,item,scored.score)&&(best={item,score:scored.score,confidence:scored.confidence})}),best?{id:best.item.id,type:best.item.type,title:best.item.title,status:best.item.status,confidence:best.confidence}:null}function buildOrphanedPathRows(orphanedFiles,items){return orphanedFiles.map(pathValue=>{const classification=classifyOrphanedPath(pathValue),linkCommand=classification==="docs_unowned"?"docs":"files",ownerCandidate=findOrphanOwnerCandidate(pathValue,classification,items),target=ownerCandidate?.id??"<id>";return{path:pathValue,classification,owner_candidate:ownerCandidate,remediation_hint:`pm ${linkCommand} ${target} --add path=${pathValue},scope=project,note="<why this artifact belongs to the item>"`}})}function summarizeOrphanedPathRows(rows){return rows.map(row=>`${row.path}:${row.classification} owner_candidate=${row.owner_candidate?.id??"unowned"} hint=${JSON.stringify(row.remediation_hint)}`)}function closureLikeFieldsForItem(item,lifecyclePatternPolicy){return Object.entries(lifecyclePatternPolicy.closure_like_metadata_field_patterns).filter(([field,patterns])=>{const value=toMeaningfulString(item[field]);return value?patterns.some(pattern=>value.toLowerCase().includes(pattern)):!1}).map(([field])=>field).sort((left,right)=>left.localeCompare(right))}function buildTerminalParentFixRow(item,parent,itemsById,canonicalIdByLowercase,statusRegistry){const grandparentId=toMeaningfulString(parent.parent),grandparent=grandparentId?itemsById.get(canonicalIdByLowercase.get(grandparentId.toLowerCase())??grandparentId):void 0;return{id:item.id,parent_id:parent.id,grandparent_id:grandparent?.id,grandparent_active:grandparent!==void 0&&!isTerminalStatus(grandparent.status,statusRegistry)}}function staleBlockerReasonsForItem(item,blockedStatuses,statusRegistry,lifecyclePatternPolicy){const blockedBy=toMeaningfulString(item.blocked_by),blockedReason=toMeaningfulString(item.blocked_reason),blockedReasonNormalized=blockedReason?.toLowerCase(),normalizedStatus=normalizeStatusForRegistry(item.status,statusRegistry),reasons=[];return blockedStatuses.has(normalizedStatus)?(!blockedBy&&!blockedReason&&reasons.push("blocked_status_missing_blocker_context"),blockedReasonNormalized?.includes("no active blocker")&&reasons.push("blocked_status_reason_reports_no_active_blocker"),blockedReasonNormalized&&lifecyclePatternPolicy.stale_blocker_reason_patterns.some(pattern=>blockedReasonNormalized.includes(pattern))&&reasons.push("blocked_status_reason_matches_stale_pattern"),reasons):(blockedBy&&reasons.push("non_blocked_status_has_blocked_by"),blockedReason&&reasons.push("non_blocked_status_has_blocked_reason"),reasons)}function collectLifecycleScanRows(items,includeStaleBlockers,statusRegistry,lifecyclePatternPolicy){const itemsById=new Map(items.map(item=>[item.id,item])),canonicalIdByLowercase=new Map(items.map(item=>[item.id.toLowerCase(),item.id])),blockedStatuses=statusRegistry.blocked_statuses.size>0?statusRegistry.blocked_statuses:new Set(["blocked"]),rows={activeItems:items.filter(item=>!isTerminalStatus(item.status,statusRegistry)),closureLikeRows:[],terminalParentRows:[],terminalParentFixRows:[],staleBlockerRows:[]};for(const item of rows.activeItems){const closureLikeFields=closureLikeFieldsForItem(item,lifecyclePatternPolicy);closureLikeFields.length>0&&rows.closureLikeRows.push({id:item.id,fields:closureLikeFields});const parentId=toMeaningfulString(item.parent),parent=parentId?itemsById.get(canonicalIdByLowercase.get(parentId.toLowerCase())??parentId):void 0;if(parent&&isTerminalStatus(parent.status,statusRegistry)&&(rows.terminalParentRows.push({id:item.id,parent_id:parent.id,parent_status:parent.status}),rows.terminalParentFixRows.push(buildTerminalParentFixRow(item,parent,itemsById,canonicalIdByLowercase,statusRegistry))),includeStaleBlockers){const reasons=staleBlockerReasonsForItem(item,blockedStatuses,statusRegistry,lifecyclePatternPolicy);reasons.length>0&&rows.staleBlockerRows.push({id:item.id,status:item.status,reasons:[...new Set(reasons)].sort((left,right)=>left.localeCompare(right))})}}return rows}function sortLifecycleScanRows(rows){rows.closureLikeRows.sort((left,right)=>left.id.localeCompare(right.id)),rows.terminalParentRows.sort((left,right)=>left.id.localeCompare(right.id)||left.parent_id.localeCompare(right.parent_id)),rows.terminalParentFixRows.sort((left,right)=>left.id.localeCompare(right.id)||left.parent_id.localeCompare(right.parent_id)),rows.staleBlockerRows.sort((left,right)=>left.id.localeCompare(right.id))}function lifecycleCycleWarningToken(prefix,severity,count){return count<=0||severity==="off"?null:`${severity==="error"?`${prefix}_error`:prefix}:${count}`}function lifecycleAdvisoryWarningToken(prefix,severity,count){return count>0&&severity!=="off"?`${prefix}:${count}`:null}function buildLifecycleWarnings(rows,includeStaleBlockers,dependencyCycleSeverity,parentCycleSeverity,counts){const warnings=[];rows.closureLikeRows.length>0&&warnings.push(`validate_lifecycle_active_closure_like_metadata:${rows.closureLikeRows.length}`),rows.terminalParentRows.length>0&&warnings.push(`validate_lifecycle_active_terminal_parent:${rows.terminalParentRows.length}`),includeStaleBlockers&&rows.staleBlockerRows.length>0&&warnings.push(`validate_lifecycle_stale_blockers:${rows.staleBlockerRows.length}`);const dependencyWarning=lifecycleCycleWarningToken("validate_lifecycle_dependency_cycles",dependencyCycleSeverity,counts.dependencyCycles),parentWarning=lifecycleCycleWarningToken("validate_hierarchy_parent_cycle",parentCycleSeverity,counts.activeHierarchyCycles),cardinalityWarning=lifecycleCycleWarningToken("validate_hierarchy_cardinality_violation",parentCycleSeverity,counts.activeHierarchyCardinality),divergenceWarning=lifecycleCycleWarningToken("validate_hierarchy_parent_divergence",parentCycleSeverity,counts.activeHierarchyDivergence),legacyCycleWarning=lifecycleAdvisoryWarningToken("validate_legacy_hierarchy_parent_cycle",parentCycleSeverity,counts.legacyHierarchyCycles),legacyCardinalityWarning=lifecycleAdvisoryWarningToken("validate_legacy_hierarchy_cardinality_violation",parentCycleSeverity,counts.legacyHierarchyCardinality),legacyDivergenceWarning=lifecycleAdvisoryWarningToken("validate_legacy_hierarchy_parent_divergence",parentCycleSeverity,counts.legacyHierarchyDivergence);return[...warnings,...dependencyWarning?[dependencyWarning]:[],...parentWarning?[parentWarning]:[],...cardinalityWarning?[cardinalityWarning]:[],...divergenceWarning?[divergenceWarning]:[],...legacyCycleWarning?[legacyCycleWarning]:[],...legacyCardinalityWarning?[legacyCardinalityWarning]:[],...legacyDivergenceWarning?[legacyDivergenceWarning]:[]]}function linkedArtifactPathExceedsFilesystemLimits(artifactPath){const normalized=normalizeRelativePath(artifactPath);return normalized.length>LINKED_ARTIFACT_MAX_PATH_LENGTH||normalized.split(/[\\/]/).some(segment=>segment.length>LINKED_ARTIFACT_MAX_SEGMENT_LENGTH)}async function linkedArtifactIsMissing(workspaceRoot,artifactPath){const absolutePath=path.isAbsolute(artifactPath)?artifactPath:path.resolve(workspaceRoot,artifactPath);if(linkedArtifactPathExceedsFilesystemLimits(absolutePath))return!1;try{const stats=await fs.stat(absolutePath);return!stats.isFile()&&!stats.isDirectory()}catch(error){return hasFilesystemErrorCode(error,["ENOENT","ENOTDIR"])}}async function collectLinkedPathScanState(items,workspaceRoot){const state={linkedProjectPaths:new Set,remoteLinkedPaths:new Set,missingLinkedPaths:[],staleLinkRows:[]},linkedArtifacts=items.flatMap(item=>[...(item.files??[]).map(artifact=>({item,artifact,link_kind:"files"})),...(item.docs??[]).map(artifact=>({item,artifact,link_kind:"docs"}))]);for(const{item,artifact,link_kind}of linkedArtifacts){if(artifact.scope!=="project")continue;if(isRemoteLinkedArtifactReference(artifact.path)){state.remoteLinkedPaths.add(artifact.path.trim());continue}const normalizedPath=normalizeRelativePath(artifact.path);normalizedPath.length!==0&&(state.linkedProjectPaths.add(normalizedPath),await linkedArtifactIsMissing(workspaceRoot,artifact.path)&&(state.missingLinkedPaths.push(normalizedPath),state.staleLinkRows.push({item_id:item.id,path:normalizedPath,link_kind})))}return state}function partitionFileCandidates(fileCandidates,pmRoot,workspaceRoot,fileScanMode,includePmInternals,verboseFileLists){const strictTrackedAllMode=fileScanMode==="tracked-all-strict",strictModeForcesPmInternals=strictTrackedAllMode&&!includePmInternals,includePmInternalsEffective=includePmInternals||strictTrackedAllMode,pmInternalCandidatePrefixes=includePmInternalsEffective?[]:resolvePmInternalCandidatePrefixes(pmRoot,workspaceRoot),excludedPmInternalPaths=pmInternalCandidatePrefixes.length===0?[]:fileCandidates.candidateFiles.filter(candidate=>hasPathPrefix(candidate,pmInternalCandidatePrefixes)),candidateFiles=pmInternalCandidatePrefixes.length===0?fileCandidates.candidateFiles:fileCandidates.candidateFiles.filter(candidate=>!hasPathPrefix(candidate,pmInternalCandidatePrefixes)),excludedByReason={};if(excludedPmInternalPaths.length>0){const summarizedPmInternalPaths=summarizeFileList(excludedPmInternalPaths,verboseFileLists);excludedByReason.pm_internals={count:excludedPmInternalPaths.length,paths:summarizedPmInternalPaths.values,paths_truncated:summarizedPmInternalPaths.truncated,paths_total:summarizedPmInternalPaths.total}}return{strictTrackedAllMode,strictModeForcesPmInternals,includePmInternalsEffective,pmInternalCandidatePrefixes,excludedPmInternalPaths,candidateFiles,excludedByReason}}function buildLifecycleCheck(items,includeStaleBlockers,dependencyCycleSeverity,parentCycleSeverity,statusRegistry,lifecyclePatternPolicy,verboseDiagnostics,idPrefix="pm"){const rows=collectLifecycleScanRows(items,includeStaleBlockers,statusRegistry,lifecyclePatternPolicy);sortLifecycleScanRows(rows);const dependencyCycleDiagnostics=detectLifecycleDependencyCycles(rows.activeItems,idPrefix),parentCycleDiagnostics=detectLifecycleParentCycles(items,statusRegistry),statusRoleDiagnostics=inspectStatusRoleAssignments(statusRegistry,items,verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT),warnings=[...buildLifecycleWarnings(rows,includeStaleBlockers,dependencyCycleSeverity,parentCycleSeverity,{dependencyCycles:dependencyCycleDiagnostics.cycle_count,activeHierarchyCycles:parentCycleDiagnostics.active_cycle_count,activeHierarchyCardinality:parentCycleDiagnostics.active_cardinality_violation_count,activeHierarchyDivergence:parentCycleDiagnostics.active_parent_divergence_count,legacyHierarchyCycles:parentCycleDiagnostics.legacy_cycle_count,legacyHierarchyCardinality:parentCycleDiagnostics.legacy_cardinality_violation_count,legacyHierarchyDivergence:parentCycleDiagnostics.legacy_parent_divergence_count}),...buildStatusRoleWarnings(statusRoleDiagnostics)],diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedClosureLikeRows=summarizeList(rows.closureLikeRows.map(row=>`${row.id}:${row.fields.join(",")}`),diagnosticLimit),summarizedTerminalParentRows=summarizeList(rows.terminalParentRows.map(row=>`${row.id}:${row.parent_id}:${row.parent_status}`),diagnosticLimit),summarizedStaleBlockerRows=summarizeList(rows.staleBlockerRows.map(row=>`${row.id}:${row.status}:${row.reasons.join(",")}`),diagnosticLimit),summarizedDependencyCycleItemIds=summarizeList(dependencyCycleDiagnostics.cycle_item_ids,diagnosticLimit),summarizedDependencyCycleSamplePaths=summarizeList(dependencyCycleDiagnostics.cycle_sample_paths,diagnosticLimit),summarizedParentCycleItemIds=summarizeList(parentCycleDiagnostics.cycle_item_ids,diagnosticLimit),summarizedParentCycleSamplePaths=summarizeList(parentCycleDiagnostics.cycle_sample_paths,diagnosticLimit),summarizedHierarchyCardinalityRows=summarizeList(parentCycleDiagnostics.cardinality_violation_rows,diagnosticLimit),summarizedHierarchyDivergenceRows=summarizeList(parentCycleDiagnostics.parent_divergence_rows,diagnosticLimit),hasErrorSeverityCycle=dependencyCycleDiagnostics.cycle_count>0&&dependencyCycleSeverity==="error"||(parentCycleDiagnostics.active_cycle_count>0||parentCycleDiagnostics.active_cardinality_violation_count>0||parentCycleDiagnostics.active_parent_divergence_count>0)&&parentCycleSeverity==="error";return{check:{name:"lifecycle",status:hasErrorSeverityCycle?"error":warnings.length===0?"ok":"warn",ok:!hasErrorSeverityCycle&&warnings.length===0,details:{checked_active_items:rows.activeItems.length,lifecycle_status_roles:statusRoleDiagnostics,active_closure_like_metadata_items:rows.closureLikeRows.length,active_closure_like_metadata_rows:summarizedClosureLikeRows.values,active_closure_like_metadata_rows_truncated:summarizedClosureLikeRows.truncated,active_terminal_parent_items:rows.terminalParentRows.length,active_terminal_parent_rows:summarizedTerminalParentRows.values,active_terminal_parent_rows_truncated:summarizedTerminalParentRows.truncated,stale_blocker_checks_enabled:includeStaleBlockers,stale_blocker_items:rows.staleBlockerRows.length,stale_blocker_rows:summarizedStaleBlockerRows.values,stale_blocker_rows_truncated:summarizedStaleBlockerRows.truncated,dependency_cycle_severity_policy:dependencyCycleSeverity,dependency_cycle_count:dependencyCycleDiagnostics.cycle_count,dependency_cycle_item_count:dependencyCycleDiagnostics.cycle_item_ids.length,dependency_cycle_item_ids:summarizedDependencyCycleItemIds.values,dependency_cycle_item_ids_truncated:summarizedDependencyCycleItemIds.truncated,dependency_cycle_sample_paths:summarizedDependencyCycleSamplePaths.values,dependency_cycle_sample_paths_truncated:summarizedDependencyCycleSamplePaths.truncated,parent_cycle_severity_policy:parentCycleSeverity,parent_cycle_count:parentCycleDiagnostics.cycle_count,active_parent_cycle_count:parentCycleDiagnostics.active_cycle_count,legacy_parent_cycle_count:parentCycleDiagnostics.legacy_cycle_count,parent_cycle_item_count:parentCycleDiagnostics.cycle_item_ids.length,parent_cycle_item_ids:summarizedParentCycleItemIds.values,parent_cycle_item_ids_truncated:summarizedParentCycleItemIds.truncated,parent_cycle_sample_paths:summarizedParentCycleSamplePaths.values,parent_cycle_sample_paths_truncated:summarizedParentCycleSamplePaths.truncated,hierarchy_cardinality_violation_count:parentCycleDiagnostics.cardinality_violation_count,active_hierarchy_cardinality_violation_count:parentCycleDiagnostics.active_cardinality_violation_count,legacy_hierarchy_cardinality_violation_count:parentCycleDiagnostics.legacy_cardinality_violation_count,hierarchy_cardinality_violation_rows:summarizedHierarchyCardinalityRows.values,hierarchy_cardinality_violation_rows_truncated:summarizedHierarchyCardinalityRows.truncated,hierarchy_parent_divergence_count:parentCycleDiagnostics.parent_divergence_count,active_hierarchy_parent_divergence_count:parentCycleDiagnostics.active_parent_divergence_count,legacy_hierarchy_parent_divergence_count:parentCycleDiagnostics.legacy_parent_divergence_count,hierarchy_parent_divergence_rows:summarizedHierarchyDivergenceRows.values,hierarchy_parent_divergence_rows_truncated:summarizedHierarchyDivergenceRows.truncated,stale_blocker_reason_patterns:[...lifecyclePatternPolicy.stale_blocker_reason_patterns],stale_blocker_reason_pattern_source:lifecyclePatternPolicy.stale_blocker_reason_pattern_source,closure_like_blocked_reason_patterns:[...lifecyclePatternPolicy.closure_like_metadata_field_patterns.blocked_reason],closure_like_blocked_reason_pattern_source:lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.blocked_reason,closure_like_resolution_patterns:[...lifecyclePatternPolicy.closure_like_metadata_field_patterns.resolution],closure_like_resolution_pattern_source:lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.resolution,closure_like_actual_result_patterns:[...lifecyclePatternPolicy.closure_like_metadata_field_patterns.actual_result],closure_like_actual_result_pattern_source:lifecyclePatternPolicy.closure_like_metadata_field_pattern_sources.actual_result}},warnings,terminalParentFixRows:rows.terminalParentFixRows}}async function buildFilesCheck(items,workspaceRoot,pmRoot,fileScanMode,includePmInternals,verboseFileLists,statusRegistry=resolveRuntimeStatusRegistry(SETTINGS_DEFAULTS.schema)){const linkedPathState=await collectLinkedPathScanState(items,workspaceRoot),itemsById=new Map(items.map(item=>[item.id,item])),uniqueMissingLinkedPaths=[...new Set(linkedPathState.missingLinkedPaths)].sort((left,right)=>left.localeCompare(right)),fileCandidates=await collectProjectFileCandidates(workspaceRoot,fileScanMode),partition=partitionFileCandidates(fileCandidates,pmRoot,workspaceRoot,fileScanMode,includePmInternals,verboseFileLists),orphanedFiles=partition.candidateFiles.filter(candidate=>!linkedPathState.linkedProjectPaths.has(candidate)),orphanedPathRows=buildOrphanedPathRows(orphanedFiles,items),classifiedStalePaths=classifyStaleLinkedPaths(uniqueMissingLinkedPaths,partition.candidateFiles),classificationByPath=new Map(classifiedStalePaths.map(entry=>[entry.path,entry.classification])),movedStalePathCount=classifiedStalePaths.filter(entry=>entry.classification==="moved").length,staleLinkPruneRows=linkedPathState.staleLinkRows.map(row=>({...row,classification:classificationByPath.get(row.path)??"deleted"})).sort((left,right)=>left.item_id.localeCompare(right.item_id)||left.path.localeCompare(right.path)||left.link_kind.localeCompare(right.link_kind)),warnings=[];partition.strictModeForcesPmInternals&&warnings.push("validate_files_tracked_all_strict_forces_pm_internals"),orphanedFiles.length>0&&warnings.push(`validate_files_orphaned_paths:${orphanedFiles.length}`);const uniqueRemoteLinkedPaths=[...linkedPathState.remoteLinkedPaths].sort((left,right)=>left.localeCompare(right)),summarizedRemote=summarizeFileList(uniqueRemoteLinkedPaths,verboseFileLists),summarizedMissing=summarizeFileList(uniqueMissingLinkedPaths,verboseFileLists),summarizedOrphaned=summarizeFileList(orphanedFiles,verboseFileLists),summarizedOrphanedClassifications=summarizeFileList(orphanedPathRows.map(row=>`${row.path}:${row.classification}:owner_candidate=${row.owner_candidate?.id??"unowned"}`),verboseFileLists),orphanedPathRowDetail=verboseFileLists?orphanedPathRows:summarizeFileList(summarizeOrphanedPathRows(orphanedPathRows),!1).values,summarizedClassifications=summarizeFileList(summarizeStaleLinkedPathClassifications(classifiedStalePaths),verboseFileLists),repairReport=buildLinkedFileRepairReport(staleLinkPruneRows,classifiedStalePaths,id=>itemsById.get(id),statusRegistry,verboseFileLists?1/0:FILE_LIST_SUMMARY_LIMIT);return repairReport.active_missing_linked_paths_count>0&&warnings.push(`validate_files_missing_linked_paths:${repairReport.active_missing_linked_paths_count}`),{check:{name:"files",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{workspace_root:workspaceRoot,scan_mode_requested:fileCandidates.requestedMode,scan_mode_applied:fileCandidates.appliedMode,strict_tracked_all_mode:partition.strictTrackedAllMode,strict_mode_forces_pm_internals:partition.strictModeForcesPmInternals,strict_mode_forces_pm_internals_notice:partition.strictModeForcesPmInternals?"tracked-all-strict force-enables PM internals; pass --include-pm-internals to make inclusion explicit.":null,file_list_detail_mode:verboseFileLists?"full":"summary",file_list_summary_limit:FILE_LIST_SUMMARY_LIMIT,candidate_scan_source:fileCandidates.source,include_pm_internals:partition.includePmInternalsEffective,include_pm_internals_requested:includePmInternals,pm_internal_candidate_prefixes:partition.pmInternalCandidatePrefixes,pm_internal_excluded_count:partition.excludedPmInternalPaths.length,excluded_total:partition.excludedPmInternalPaths.length,excluded_by_reason:partition.excludedByReason,linked_project_paths:linkedPathState.linkedProjectPaths.size,remote_linked_paths_count:uniqueRemoteLinkedPaths.length,remote_linked_paths_total:summarizedRemote.total,remote_linked_paths:summarizedRemote.values,remote_linked_paths_truncated:summarizedRemote.truncated,candidate_total_raw:fileCandidates.candidateTotal,candidate_scanned_raw:fileCandidates.candidateScanned,candidate_total:partition.candidateFiles.length,candidate_scanned:partition.candidateFiles.length,scanned_candidate_files:partition.candidateFiles.length,missing_linked_paths_count:uniqueMissingLinkedPaths.length,missing_linked_paths_total:summarizedMissing.total,missing_linked_paths:summarizedMissing.values,missing_linked_paths_truncated:summarizedMissing.truncated,missing_linked_paths_moved_count:movedStalePathCount,missing_linked_paths_deleted_count:classifiedStalePaths.filter(entry=>entry.classification==="deleted").length,missing_linked_paths_malformed_count:classifiedStalePaths.filter(entry=>entry.classification==="malformed").length,missing_linked_path_classifications:summarizedClassifications.values,missing_linked_path_classifications_truncated:summarizedClassifications.truncated,...repairReport,orphaned_paths_count:orphanedFiles.length,orphaned_paths_total:summarizedOrphaned.total,orphaned_paths:summarizedOrphaned.values,orphaned_paths_truncated:summarizedOrphaned.truncated,orphaned_path_classifications:summarizedOrphanedClassifications.values,orphaned_path_classifications_truncated:summarizedOrphanedClassifications.truncated,orphaned_path_rows_count:orphanedPathRows.length,orphaned_path_rows:orphanedPathRowDetail}},warnings,staleLinkPruneRows}}function buildUntrustedLinkedTestRows(linkedTests,trustDecisions){const rows=[];return linkedTests.forEach(({item,linkedTest},index)=>{const trust=trustDecisions[index];if(trust.trusted)return;const command=summarizeCommandPreview(linkedTest.command??"");rows.push(`${item.id}:${trust.source_ref??"unknown"}->${trust.current_source_ref??"unknown"}:${command}`)}),rows}async function buildCommandReferencesCheck(items,idPrefix,verboseDiagnostics,pmRoot){const knownIds=new Set(items.map(item=>item.id.toLowerCase()));let linkedCommandsScanned=0,referencedPmIdCount=0;const referencedPmIds=new Set,staleReferenceRows=[],linkedTests=items.flatMap(item=>(item.tests??[]).map(linkedTest=>({item,linkedTest}))),currentSourceRef=await resolveLinkedTestSourceRef(resolveLinkedTestSourceWorkspaceRoot()),trustDecisions=await resolveLinkedTestTrustBatch(pmRoot,linkedTests.map(({linkedTest})=>linkedTest),currentSourceRef),untrustedRows=buildUntrustedLinkedTestRows(linkedTests,trustDecisions);for(const{item,linkedTest}of linkedTests){if(typeof linkedTest.command!="string"||linkedTest.command.trim().length===0)continue;linkedCommandsScanned+=1;const referencedIds=extractReferencedPmItemIdsFromCommand(linkedTest.command,idPrefix);if(referencedIds.length!==0){referencedPmIdCount+=referencedIds.length;for(const referencedId of referencedIds)referencedPmIds.add(referencedId),knownIds.has(referencedId.toLowerCase())||staleReferenceRows.push(`${item.id}:${referencedId}:${summarizeCommandPreview(linkedTest.command)}`)}}const uniqueStaleReferenceRows=[...new Set(staleReferenceRows)].sort((left,right)=>left.localeCompare(right)),stalePmIds=[...new Set(uniqueStaleReferenceRows.map(row=>row.split(":")[1]??""))].filter(value=>value.length>0).sort((left,right)=>left.localeCompare(right)),warnings=[];uniqueStaleReferenceRows.length>0&&warnings.push(`validate_command_references_stale_pm_ids:${uniqueStaleReferenceRows.length}`),untrustedRows.length>0&&warnings.push(`validate_linked_test_trust_unacknowledged:${untrustedRows.length}`);const diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedRows=summarizeList(uniqueStaleReferenceRows,diagnosticLimit),summarizedStalePmIds=summarizeList(stalePmIds,diagnosticLimit),summarizedReferencedPmIds=summarizeList([...referencedPmIds].sort((left,right)=>left.localeCompare(right)),diagnosticLimit),summarizedUntrustedRows=summarizeList(untrustedRows,diagnosticLimit);return{check:{name:"command_references",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{checked_items:items.length,linked_commands_scanned:linkedCommandsScanned,referenced_pm_ids_count:referencedPmIdCount,unique_referenced_pm_ids_count:referencedPmIds.size,unique_referenced_pm_ids:summarizedReferencedPmIds.values,unique_referenced_pm_ids_truncated:summarizedReferencedPmIds.truncated,linked_test_trust_current_source_ref:currentSourceRef??null,untrusted_linked_tests_count:untrustedRows.length,untrusted_linked_tests:summarizedUntrustedRows.values,untrusted_linked_tests_truncated:summarizedUntrustedRows.truncated,stale_pm_id_references_count:uniqueStaleReferenceRows.length,stale_pm_ids_count:stalePmIds.length,stale_pm_ids:summarizedStalePmIds.values,stale_pm_ids_truncated:summarizedStalePmIds.truncated,stale_pm_id_reference_rows:summarizedRows.values,stale_pm_id_reference_rows_truncated:summarizedRows.truncated}},warnings}}function buildFormatVersionCheck(items,verboseDiagnostics){const scan=scanItemFormatVersions(items.map(item=>({ref:item.id,version:effectiveItemFormatVersion(item)})),CURRENT_ITEM_FORMAT_VERSION,BASELINE_ITEM_FORMAT_VERSION),warnings=[];scan.outdated.length>0&&warnings.push(`validate_format_version_outdated_items:${scan.outdated.length}`),scan.ahead.length>0&&warnings.push(`validate_format_version_ahead_items:${scan.ahead.length}`);const diagnosticLimit=verboseDiagnostics?Number.POSITIVE_INFINITY:DIAGNOSTIC_LIST_SUMMARY_LIMIT,summarizedOutdated=summarizeList(scan.outdated,diagnosticLimit),summarizedAhead=summarizeList(scan.ahead,diagnosticLimit),status=scan.ahead.length>0?"error":scan.outdated.length>0?"warn":"ok";return{check:{name:"format_version",status,ok:status==="ok",details:{checked_items:items.length,current_format_version:CURRENT_ITEM_FORMAT_VERSION,outdated_items_count:scan.outdated.length,outdated_items:summarizedOutdated.values,outdated_items_truncated:summarizedOutdated.truncated,ahead_items_count:scan.ahead.length,ahead_items:summarizedAhead.values,ahead_items_truncated:summarizedAhead.truncated}},warnings}}const VALIDATE_AUTO_FIX_MESSAGE="pm validate auto-fix";async function applyValidateFix(fix,global2,services){switch(fix.kind){case"set_closed_at":await applyClosureTimestampFix(fix,global2);return;case"set_resolution":case"set_close_reason":case"set_estimate":case"reparent":case"unset_parent":{const updateOptions={message:VALIDATE_AUTO_FIX_MESSAGE};if(fix.kind==="set_resolution"?updateOptions.resolution=fix.value:fix.kind==="set_close_reason"?updateOptions.closeReason=fix.value:fix.kind==="set_estimate"?updateOptions.estimatedMinutes=fix.value:fix.kind==="reparent"?updateOptions.parent=fix.parent_id:updateOptions.unset=["parent"],!services.runUpdate)throw new PmCliError("Applying validate metadata/lifecycle fixes requires a runUpdate mutation service.",EXIT_CODE.USAGE);await services.runUpdate(fix.item_id,updateOptions,global2);return}case"prune_file_link":throw new Error(`Unsupported non-batched fix kind: ${fix.kind}`);case"prune_doc_link":throw new Error(`Unsupported non-batched fix kind: ${fix.kind}`)}}function pruneBatchKey(fix){return fix.kind!=="prune_file_link"&&fix.kind!=="prune_doc_link"?null:`${fix.kind}:${fix.item_id}`}async function applyValidateFixes(applicable,global2,services){const applied=[],failed=[],pruneBatches=new Map;for(const fix of applicable.filter(candidate=>pruneBatchKey(candidate)===null))try{await applyValidateFix(fix,global2,services),applied.push(fix)}catch(error){failed.push({fix,error})}for(const fix of applicable.filter(candidate=>pruneBatchKey(candidate)!==null)){const batchKey=pruneBatchKey(fix),existing=pruneBatches.get(batchKey);existing?existing.push(fix):pruneBatches.set(batchKey,[fix])}for(const batch of pruneBatches.values()){const first=batch[0];if(!first)continue;const remove=batch.map(fix=>fix.path).filter(value=>typeof value=="string"&&value.length>0);try{first.kind==="prune_file_link"?await runFiles(first.item_id,{remove,message:VALIDATE_AUTO_FIX_MESSAGE},global2):await runDocs(first.item_id,{remove,message:VALIDATE_AUTO_FIX_MESSAGE},global2),applied.push(...batch)}catch(error){failed.push(...batch.map(fix=>({fix,error})))}}return{applied,failed}}const _testOnlyValidateCommand={applyValidateFix,applyValidateFixes,attachValidateFixHints,buildCommandReferencesCheck,buildDependencyReferencesCheck,buildCloseReasonBackfillRows,buildFilesCheck,buildLifecycleCheck,buildLifecycleDependencyGraph,buildLifecycleParentGraph,buildEstimateBackfillRows,buildMetadataCounts,buildMissingFieldOccurrences,buildOrphanedPathRows,classifyOrphanedPath,collectDefaultProjectFileCandidates,collectTrackedGitFileCandidates,detectLifecycleDependencyCycles,detectLifecycleParentCycles,escapeRegExp,extractItemIds,findLifecycleDependencyCycleComponents,isMetadataFieldMissing,linkedArtifactPathExceedsFilesystemLimits,listFilesRecursive,resolveDependencyCycleSeverity,resolveParentCycleSeverity,resolveFileScanMode,resolveLifecycleDependencyCycleSamplePath,resolveRequestedChecks,resolveValidateMetadataProfile,resolveWorkspaceRoot,sharedDirectoryPrefixLength,summarizeOrphanedPathRows,summarizeDuplicateIssueCodes,toMeaningfulString};function appendInvalidMergeReceiptEvidenceWarning(warnings,invalidEvidenceCount){invalidEvidenceCount>0&&warnings.push(`merge_receipt_evidence_invalid:${invalidEvidenceCount}`)}async function buildStorageIntegrityCheck(pmRoot,items,typeToFolder,settings){const scan=await scanStorageIntegrity(pmRoot,new Set(items.map(item=>item.id)),typeToFolder,{schema:settings.schema,extensionFieldNames:collectRegisteredItemFieldNames(getActiveExtensionRegistrations())}),warnings=[];scan.unreadable_item_files.length>0&&warnings.push(`validate_storage_unreadable_items:${scan.unreadable_item_files.length}`),scan.duplicate_item_ids.length>0&&warnings.push(`validate_storage_duplicate_item_ids:${scan.duplicate_item_ids.length}`),scan.history_conflict_marker_streams.length>0&&warnings.push(`validate_storage_history_conflict_markers:${scan.history_conflict_marker_streams.length}`),scan.history_unparseable_streams.length>0&&warnings.push(`validate_storage_unparseable_history:${scan.history_unparseable_streams.length}`),scan.resurrected_items.length>0&&warnings.push(`validate_storage_resurrected_items:${scan.resurrected_items.length}`),scan.unparseable_config_files.length>0&&warnings.push(`validate_storage_unparseable_config:${scan.unparseable_config_files.length}`);const errorCount=warnings.length,trackedRuntimeCache=await scanTrackedRuntimeCache(pmRoot);trackedRuntimeCache.tracked_path_count>0&&warnings.push(`validate_storage_tracked_runtime_cache_files:${trackedRuntimeCache.tracked_path_count}`);const fenceAudit=await auditMergeAttributeFence(pmRoot,resolveProjectMergeTypeFolders(settings));fenceAudit.status==="drift"&&warnings.push(`validate_merge_fence_drift:${fenceAudit.missing_patterns.length+fenceAudit.stale_patterns.length}`);const gitWorkspaceRoot=await findGitWorkspaceRoot(pmRoot),mergeDriverAudit=gitWorkspaceRoot===null?null:await auditMergeDriverConfiguration(gitWorkspaceRoot);mergeDriverAudit!==null&&mergeDriverAudit.status!=="ok"&&warnings.push(`validate_merge_driver_configuration:${mergeDriverAudit.missing_keys.length+mergeDriverAudit.drifted_keys.length}`);const mergeReceiptEvidence=await inspectMergeReceiptEvidence(gitWorkspaceRoot??pmRoot,{includeLossless:!0,pmRoot}),pendingMergeReceipts=mergeReceiptEvidence.receipts,{pendingDecisions:pendingMergeDecisions,lossless:losslessMergeReceipts}=partitionMergeReceipts(pendingMergeReceipts);pendingMergeDecisions.length>0&&warnings.push(`validate_merge_decisions_unreviewed:${pendingMergeDecisions.length}`),appendInvalidMergeReceiptEvidenceWarning(warnings,mergeReceiptEvidence.invalid_evidence_count);const status=errorCount>0?"error":warnings.length>0?"warn":"ok";return{check:{name:"storage_integrity",status,ok:status==="ok",details:{...scan,merge_fence:fenceAudit,merge_driver_configuration:mergeDriverAudit,pending_merge_decision_count:pendingMergeDecisions.length,pending_merge_decision_items:[...new Set(pendingMergeDecisions.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),lossless_merge_receipt_count:losslessMergeReceipts.length,invalid_merge_receipt_evidence_count:mergeReceiptEvidence.invalid_evidence_count,invalid_merge_receipt_evidence_details:mergeReceiptEvidence.invalid_evidence,invalid_merge_receipt_evidence_details_truncated:mergeReceiptEvidence.invalid_evidence_truncated,lossless_merge_receipt_items:[...new Set(losslessMergeReceipts.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),tracked_runtime_cache:{tracker_relative_root:trackedRuntimeCache.tracker_relative_root,tracked_paths:trackedRuntimeCache.tracked_paths,tracked_path_count:trackedRuntimeCache.tracked_path_count,remediation_command:trackedRuntimeCache.remediation_command}}},warnings}}function recordValidateCheck(state,built,fixHintsEnabled){fixHintsEnabled&&attachValidateFixHints(built.check,built.warnings),state.checks.push(built.check),state.warnings.push(...built.warnings)}async function executeRequestedValidateChecks(params){const state={closureTimestampFixes:[],checks:[],warnings:[...params.initialWarnings],closeReasonBackfillRows:[],estimateBackfillRows:[],resolutionBackfillRows:[],terminalParentFixRows:[],staleLinkPruneRows:[]},fixHintsEnabled=params.options.fixHints===!0,fullDiagnostics=params.options.verboseDiagnostics===!0||params.options.allAffectedIds===!0||params.global.json===!0;if(params.requestedChecks.has("completeness")){const built=await readWorkflowCompletenessCheck(params.pmRoot,params.items,fullDiagnostics?1/0:DIAGNOSTIC_LIST_SUMMARY_LIMIT,params.sourceIncomplete);recordValidateCheck(state,built,fixHintsEnabled)}if(params.requestedChecks.has("metadata")){const built=buildMetadataCheck(params.items,params.metadataPolicy,params.statusRegistry,fullDiagnostics,[params.settings.id_prefix]);state.closeReasonBackfillRows=built.closeReasonBackfillRows,state.estimateBackfillRows=built.estimateBackfillRows;const timestamps=await scanClosureTimestamps(params.pmRoot,params.items,params.statusRegistry,params.options.autoFix===!0||fixHintsEnabled,fullDiagnostics?1/0:DIAGNOSTIC_LIST_SUMMARY_LIMIT);state.closureTimestampFixes=timestamps.fixes,Object.assign(built.check.details,timestamps.details),built.warnings.push(...timestamps.warnings),built.check.ok=built.warnings.length===0,built.check.status=built.check.ok?"ok":"warn",recordValidateCheck(state,built,fixHintsEnabled)}if(params.requestedChecks.has("resolution")){const built=buildResolutionCheck(params.items,params.statusRegistry,fullDiagnostics);state.resolutionBackfillRows=built.resolutionBackfillRows,recordValidateCheck(state,built,fixHintsEnabled)}if(params.requestedChecks.has("lifecycle")){const built=buildLifecycleCheck(params.items,!!params.options.checkStaleBlockers,params.dependencyCycleSeverity,params.parentCycleSeverity,params.statusRegistry,params.lifecyclePatternPolicy,fullDiagnostics,params.settings.id_prefix);state.terminalParentFixRows=built.terminalParentFixRows,recordValidateCheck(state,built,fixHintsEnabled),recordValidateCheck(state,buildDependencyReferencesCheck(params.items,fullDiagnostics,params.statusRegistry),fixHintsEnabled)}if(params.requestedChecks.has("files")){const built=await buildFilesCheck(params.items,params.workspaceRoot,params.pmRoot,params.fileScanMode,!!params.options.includePmInternals,!!params.options.verboseFileLists,params.statusRegistry);state.staleLinkPruneRows=built.staleLinkPruneRows,recordValidateCheck(state,built,fixHintsEnabled)}return params.requestedChecks.has("command_references")&&recordValidateCheck(state,await buildCommandReferencesCheck(params.items,params.settings.id_prefix,fullDiagnostics,params.pmRoot),fixHintsEnabled),params.requestedChecks.has("history_drift")&&recordValidateCheck(state,await buildValidateHistoryDriftCheck(params.pmRoot,params.items,fullDiagnostics),fixHintsEnabled),params.requestedChecks.has("format_version")&&recordValidateCheck(state,buildFormatVersionCheck(params.items,fullDiagnostics),fixHintsEnabled),params.requestedChecks.has("storage_integrity")&&recordValidateCheck(state,await buildStorageIntegrityCheck(params.pmRoot,params.items,resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations()).type_to_folder,params.settings),fixHintsEnabled),state}function planValidateFixes(options,state,settings){const planned=[];return options.autoFix===!0&&(planned.push(...state.closureTimestampFixes),planned.push(...planCloseReasonBackfillFixes(state.closeReasonBackfillRows)),planned.push(...planResolutionBackfillFixes(state.resolutionBackfillRows)),planned.push(...planEstimateBackfillFixes(state.estimateBackfillRows,settings.validation.estimate_defaults_by_type)),planned.push(...planTerminalParentFixes(state.terminalParentFixRows))),options.pruneMissing===!0&&planned.push(...planStaleLinkPruneFixes(state.staleLinkPruneRows)),planned}async function buildValidateFixesSummary(options,state,settings,grantedFixScopes,global2,services){if(options.autoFix!==!0&&options.pruneMissing!==!0)return;const planned=planValidateFixes(options,state,settings),{applicable,gated}=partitionFixesByGrant(planned,grantedFixScopes),dryRun=options.dryRun===!0,appliedFixRows=[],failedFixRows=[];if(!dryRun){const applied=await applyValidateFixes(applicable,global2,services);appliedFixRows.push(...applied.applied.map(toFixOutputRow)),failedFixRows.push(...applied.failed.map(({fix,error})=>({...toFixOutputRow(fix),error:error instanceof Error?error.message:String(error)})))}return{mode:dryRun?"dry_run":"apply",auto_fix:options.autoFix===!0,prune_missing:options.pruneMissing===!0,granted_fix_scopes:[...grantedFixScopes].sort((left,right)=>left.localeCompare(right)),planned_count:planned.length,applied_count:appliedFixRows.length,gated_count:gated.length,failed_count:failedFixRows.length,planned_fixes:planned.map(toFixOutputRow),applied_fixes:appliedFixRows,gated_fixes:gated.map(fix=>({...toFixOutputRow(fix),gate_hint:`Withheld: re-run with --fix-scope ${fix.gate} to apply.`})),failed_fixes:failedFixRows}}async function runValidate(options,global2,services={}){assertProjectionModeChoice(options.counts===!0,options.full===!0,"--counts");const fixesRequested=options.autoFix===!0||options.pruneMissing===!0;if(options.dryRun===!0&&!fixesRequested)throw new PmCliError("--dry-run requires --auto-fix or --prune-missing (there is nothing to preview otherwise).",EXIT_CODE.USAGE);if(options.fixScope!==void 0&&options.fixScope.length>0&&options.autoFix!==!0)throw new PmCliError("--fix-scope requires --auto-fix.",EXIT_CODE.USAGE);const grantedFixScopes=resolveGrantedFixScopes(options.fixScope),pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),requestedChecks=resolveRequestedChecks(options),itemReadWarnings=[],items=await readValidateItems({includeBody:["history_drift","metadata","completeness"].some(check=>requestedChecks.has(check)),pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,warnings:itemReadWarnings}),sourceIncomplete=itemReadWarnings.length>0;if(requestedChecks.has("history_drift")){const authorAttribution=await scanHistoryAuthorAttribution(pmRoot);authorAttribution.actionable_unknown_event_count>0&&itemReadWarnings.push(`validate_history_unknown_author_events:${authorAttribution.actionable_unknown_event_count}`)}const metadataProfileSource=typeof options.metadataProfile=="string"?"option":"settings",metadataProfile=resolveValidateMetadataProfile(typeof options.metadataProfile=="string"?options.metadataProfile:settings.validation.metadata_profile),metadataPolicy=resolveValidateMetadataPolicy(metadataProfile,metadataProfileSource,settings.validation.metadata_required_fields),lifecyclePatternPolicy=resolveLifecyclePatternPolicy(settings),dependencyCycleSeverity=resolveDependencyCycleSeverity(options.dependencyCycleSeverity),parentCycleSeverity=resolveParentCycleSeverity(options.parentCycleSeverity),fileScanMode=resolveFileScanMode(options.scanMode),workspaceRoot=resolveWorkspaceRoot(pmRoot),state=await executeRequestedValidateChecks({requestedChecks,options,global:global2,pmRoot,workspaceRoot,settings,items,statusRegistry,metadataPolicy,lifecyclePatternPolicy,dependencyCycleSeverity,parentCycleSeverity,fileScanMode,initialWarnings:[...new Set(itemReadWarnings)],sourceIncomplete}),fixes=fixesRequested?await buildValidateFixesSummary(options,state,settings,grantedFixScopes,global2,services):void 0,normalizedWarnings=[...new Set(state.warnings)].sort((left,right)=>left.localeCompare(right)),result={ok:!state.checks.some(check=>check.status==="error"),has_warnings:normalizedWarnings.length>0,checks:state.checks,warnings:normalizedWarnings,...fixes!==void 0?{fixes}:{},generated_at:nowIso(),projection:{mode:"full",declared_field_groups:[{name:"diagnostic_rows",restore_with:"--full"}],included_field_groups:["diagnostic_rows"]}};return options.counts!==!0?result:{...projectValidateCounts(result),projection:{mode:"counts",declared_field_groups:[{name:"diagnostic_rows",restore_with:"--full"}],included_field_groups:[]}}}export{_testOnlyValidateCommand,projectValidateCounts,runValidate};
2
2
  //# sourceMappingURL=validate.js.map
@@ -3,30 +3,30 @@
3
3
  *
4
4
  * Reduces declarative field requirements into bounded, content-free diagnostics.
5
5
  */
6
- import { type WorkflowPolicyDocument, type WorkflowPolicyDecision } from "../../core/policy/workflow-policy.js";
6
+ import { type WorkflowPolicyDocument,type WorkflowPolicyDecision } from "../../core/policy/workflow-policy.js";
7
7
  import type { ValidateCheck } from "./validate.js";
8
8
  /** One item-policy violation, retaining field paths but never field values. */
9
9
  export interface WorkflowCompletenessViolation {
10
10
  /** Stable item identifier. */
11
- id: string;
11
+ id:string;
12
12
  /** Runtime item type. */
13
- type: string;
13
+ type:string;
14
14
  /** Lifecycle status evaluated. */
15
- status: string;
15
+ status:string;
16
16
  /** Exact rule and missing-field evidence. */
17
- decision: WorkflowPolicyDecision;
17
+ decision:WorkflowPolicyDecision;
18
18
  }
19
19
  /** Load the policy snapshot while containing storage failures in an error check so other validation can continue. */
20
- export declare function readWorkflowCompletenessCheck(pmRoot: string, items: Parameters<typeof buildWorkflowCompletenessCheck>[1], rowLimit?: number, sourceIncomplete?: boolean): Promise<{
21
- check: ValidateCheck;
22
- warnings: string[];
20
+ export declare function readWorkflowCompletenessCheck(pmRoot:string,items:Parameters<typeof buildWorkflowCompletenessCheck>[1],rowLimit?:number,sourceIncomplete?:boolean):Promise<{
21
+ check:ValidateCheck;
22
+ warnings:string[];
23
23
  }>;
24
24
  /** Evaluate every supplied item while bounding the diagnostic rows independently. */
25
- export declare function buildWorkflowCompletenessCheck(document: WorkflowPolicyDocument, items: readonly (Readonly<Record<string, unknown>> & {
26
- id: string;
27
- type: string;
28
- status: string;
29
- })[], rowLimit?: number, sourceIncomplete?: boolean): {
30
- check: ValidateCheck;
31
- warnings: string[];
25
+ export declare function buildWorkflowCompletenessCheck(document:WorkflowPolicyDocument,items:readonly (Readonly<Record<string,unknown>> & {
26
+ id:string;
27
+ type:string;
28
+ status:string;
29
+ })[],rowLimit?:number,sourceIncomplete?:boolean):{
30
+ check:ValidateCheck;
31
+ warnings:string[];
32
32
  };
@@ -1,47 +1,47 @@
1
1
  import type { GlobalOptions } from "../../core/shared/command-types.js";
2
- import { type WorkflowPolicyAction, type WorkflowPolicyDocument, type WorkflowPolicyEvaluation } from "../../core/policy/workflow-policy.js";
2
+ import { type WorkflowPolicyAction,type WorkflowPolicyDocument,type WorkflowPolicyEvaluation } from "../../core/policy/workflow-policy.js";
3
3
  export * from "../../core/policy/workflow-policy.js";
4
4
  export * from "../../core/policy/workflow-policy-schema.js";
5
- export { buildWorkflowCompletenessCheck, type WorkflowCompletenessViolation } from "./workflow-completeness.js";
5
+ export { buildWorkflowCompletenessCheck,type WorkflowCompletenessViolation } from "./workflow-completeness.js";
6
6
  export { readWorkflowPolicies } from "../../core/policy/workflow-policy-store.js";
7
7
  /** Options shared by SDK, CLI and MCP policy operations. */
8
8
  export interface WorkflowPolicyActionOptions {
9
9
  /** One policy definition for put, or proposed field values for check. */
10
- definition?: unknown;
10
+ definition?:unknown;
11
11
  /** Approval declaration id. */
12
- policy?: string;
12
+ policy?:string;
13
13
  /** Preview without registry, item, or history writes. */
14
- dryRun?: boolean;
14
+ dryRun?:boolean;
15
15
  /** Explicit actor override; normally detected automatically. */
16
- author?: string;
16
+ author?:string;
17
17
  /** Rationale recorded for registry and approval mutations. */
18
- message?: string;
18
+ message?:string;
19
19
  }
20
20
  /** Transport-neutral envelope with a discriminant for schema renderers. */
21
21
  export interface WorkflowPolicyActionResult {
22
22
  /** Identifies this schema result without conflating type or status operations. */
23
- policy_result: true;
23
+ policy_result:true;
24
24
  /** Executed schema verb. */
25
- action: WorkflowPolicyAction;
25
+ action:WorkflowPolicyAction;
26
26
  /** Whether durable state changed. */
27
- changed: boolean;
27
+ changed:boolean;
28
28
  /** Complete bounded result of the selected operation. */
29
- result: WorkflowPolicyDocument | WorkflowPolicyEvaluation | WorkflowApprovalReceipt;
29
+ result:WorkflowPolicyDocument | WorkflowPolicyEvaluation | WorkflowApprovalReceipt;
30
30
  }
31
31
  /** Content-bound approval identity returned after its history event is durable. */
32
32
  export interface WorkflowApprovalReceipt {
33
33
  /** Reviewed item id. */
34
- id: string;
34
+ id:string;
35
35
  /** Approval declaration id. */
36
- policy_id: string;
36
+ policy_id:string;
37
37
  /** Exact policy revision. */
38
- policy_fingerprint: string;
38
+ policy_fingerprint:string;
39
39
  /** Hash of reviewed content. */
40
- content_fingerprint: string;
40
+ content_fingerprint:string;
41
41
  /** Advisory mutation diagnostics. */
42
- warnings: string[];
42
+ warnings:string[];
43
43
  }
44
44
  /** Advisory defaults are opt-in data, never implicitly applied to existing projects. */
45
- export declare function createLifecycleCompletenessPolicies(): WorkflowPolicyDocument;
45
+ export declare function createLifecycleCompletenessPolicies():WorkflowPolicyDocument;
46
46
  /** Execute policy operations on every transport; policy-mode uses name as advise|refuse, validated by the registry parser. */
47
- export declare function runWorkflowPolicyAction(action: WorkflowPolicyAction, name: string | undefined, options?: WorkflowPolicyActionOptions, global?: Pick<GlobalOptions, "path">): Promise<WorkflowPolicyActionResult>;
47
+ export declare function runWorkflowPolicyAction(action:WorkflowPolicyAction,name:string | undefined,options?:WorkflowPolicyActionOptions,global?:Pick<GlobalOptions,"path">):Promise<WorkflowPolicyActionResult>;
@@ -1,69 +1,69 @@
1
1
  import type { GlobalOptions } from "../../core/shared/command-types.js";
2
- import { type MergeDriverConfigurationAuditResult, type MergeFenceAuditResult } from "../merge/install.js";
2
+ import { type MergeDriverConfigurationAuditResult,type MergeFenceAuditResult } from "../merge/install.js";
3
3
  /** Stable readiness classifications returned by the workspace-position read. */
4
4
  export type WorkspacePositionState = "ready" | "merge_evidence_invalid" | "history_evidence_invalid" | "merge_reconciliation_required" | "history_repair_required" | "merge_fence_unprepared";
5
5
  /** One deterministic recovery action selected from aggregate workspace evidence. */
6
6
  export interface WorkspacePositionNextAction {
7
7
  /** Executable pm command, or null when the workspace is ready. */
8
- command: string | null;
8
+ command:string | null;
9
9
  /** Stable reason code explaining why this action takes precedence. */
10
- reason: WorkspacePositionState;
10
+ reason:WorkspacePositionState;
11
11
  }
12
12
  /** Bounded SDK result shared by CLI, MCP, and package consumers. */
13
13
  export interface WorkspacePositionResult {
14
14
  /** Whether all readiness evidence is clean. */
15
- ok: boolean;
15
+ ok:boolean;
16
16
  /** Highest-priority workspace readiness classification. */
17
- state: WorkspacePositionState;
17
+ state:WorkspacePositionState;
18
18
  /** Committed merge-fence and clone-local driver evidence. */
19
- merge_fence: {
20
- committed: MergeFenceAuditResult;
21
- clone_local_drivers: MergeDriverConfigurationAuditResult | null;
19
+ merge_fence:{
20
+ committed:MergeFenceAuditResult;
21
+ clone_local_drivers:MergeDriverConfigurationAuditResult | null;
22
22
  };
23
23
  /** Bounded pending receipt evidence without private merge values. */
24
- merge_receipts: {
25
- pending_decision_count: number;
26
- pending_item_ids: string[];
27
- pending_item_ids_truncated: boolean;
28
- lossless_count: number;
29
- invalid_evidence_count: number;
24
+ merge_receipts:{
25
+ pending_decision_count:number;
26
+ pending_item_ids:string[];
27
+ pending_item_ids_truncated:boolean;
28
+ lossless_count:number;
29
+ invalid_evidence_count:number;
30
30
  };
31
31
  /** Bounded append-only history drift evidence. */
32
- history_drift: {
32
+ history_drift:{
33
33
  /** Whether the required history-drift evidence has its expected shape. */
34
- evidence_valid: boolean;
35
- drifted_item_count: number;
36
- drifted_item_ids: string[];
37
- drifted_item_ids_truncated: boolean;
38
- counts: Record<string, unknown>;
34
+ evidence_valid:boolean;
35
+ drifted_item_count:number;
36
+ drifted_item_ids:string[];
37
+ drifted_item_ids_truncated:boolean;
38
+ counts:Record<string,unknown>;
39
39
  };
40
40
  /** One deterministic next action, avoiding multi-command guesswork. */
41
- next_action: WorkspacePositionNextAction;
41
+ next_action:WorkspacePositionNextAction;
42
42
  /** Non-fatal read warnings retained from the authoritative item scan. */
43
- warnings: string[];
43
+ warnings:string[];
44
44
  /** ISO timestamp for this aggregate read. */
45
- generated_at: string;
45
+ generated_at:string;
46
46
  }
47
- declare function selectWorkspacePositionState(params: {
48
- invalidEvidenceCount: number;
49
- pendingDecisionCount: number;
50
- losslessCount: number;
51
- historyEvidenceValid: boolean;
52
- driftedItemCount: number;
53
- fence: MergeFenceAuditResult;
54
- drivers: MergeDriverConfigurationAuditResult | null;
55
- }): WorkspacePositionState;
56
- declare function commandForWorkspacePositionState(state: WorkspacePositionState, pmRoot: string, platform?: NodeJS.Platform): string | null;
47
+ declare function selectWorkspacePositionState(params:{
48
+ invalidEvidenceCount:number;
49
+ pendingDecisionCount:number;
50
+ losslessCount:number;
51
+ historyEvidenceValid:boolean;
52
+ driftedItemCount:number;
53
+ fence:MergeFenceAuditResult;
54
+ drivers:MergeDriverConfigurationAuditResult | null;
55
+ }):WorkspacePositionState;
56
+ declare function commandForWorkspacePositionState(state:WorkspacePositionState,pmRoot:string,platform?:NodeJS.Platform):string | null;
57
57
  /** Normalize defensive history-check evidence into the bounded position shape. */
58
- declare function normalizeWorkspaceHistoryDrift(details: Record<string, unknown>): WorkspacePositionResult["history_drift"];
58
+ declare function normalizeWorkspaceHistoryDrift(details:Record<string,unknown>):WorkspacePositionResult["history_drift"];
59
59
  /** Read aggregate workspace position without flags, session state, or mutation. */
60
- export declare function readWorkspacePosition(global: GlobalOptions): Promise<WorkspacePositionResult>;
60
+ export declare function readWorkspacePosition(global:GlobalOptions):Promise<WorkspacePositionResult>;
61
61
  /** Render the bounded workspace position for human CLI output. */
62
- export declare function formatWorkspacePositionHuman(result: WorkspacePositionResult): string;
62
+ export declare function formatWorkspacePositionHuman(result:WorkspacePositionResult):string;
63
63
  /** Public contract for focused unit verification. */
64
- export declare const _testOnlyWorkspacePosition: {
65
- commandForWorkspacePositionState: typeof commandForWorkspacePositionState;
66
- normalizeWorkspaceHistoryDrift: typeof normalizeWorkspaceHistoryDrift;
67
- selectWorkspacePositionState: typeof selectWorkspacePositionState;
64
+ export declare const _testOnlyWorkspacePosition:{
65
+ commandForWorkspacePositionState:typeof commandForWorkspacePositionState;
66
+ normalizeWorkspaceHistoryDrift:typeof normalizeWorkspaceHistoryDrift;
67
+ selectWorkspacePositionState:typeof selectWorkspacePositionState;
68
68
  };
69
69
  export {};