@unbrained/pm-cli 2026.10.3 → 2026.10.5

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 (742) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +28 -2
  3. package/dist/cli/after-command-context-usage.js +1 -1
  4. package/dist/cli/argv-utils.js +1 -1
  5. package/dist/cli/bootstrap-args.js +1 -1
  6. package/dist/cli/bundle-integrity.js +2 -2
  7. package/dist/cli/command-namespaces.js +1 -1
  8. package/dist/cli/commander-usage.d.ts +1 -1
  9. package/dist/cli/commander-usage.js +7 -4
  10. package/dist/cli/commands/annotations/comments.js +1 -1
  11. package/dist/cli/commands/annotations/docs.js +1 -1
  12. package/dist/cli/commands/annotations/files.js +1 -1
  13. package/dist/cli/commands/annotations/learnings.js +1 -1
  14. package/dist/cli/commands/annotations/notes.js +1 -1
  15. package/dist/cli/commands/extension/describe.js +1 -1
  16. package/dist/cli/commands/extension/extension.js +1 -1
  17. package/dist/cli/commands/extension/scaffold.js +1 -1
  18. package/dist/cli/commands/extension/shared.js +1 -1
  19. package/dist/cli/commands/governance/gc.js +1 -1
  20. package/dist/cli/commands/governance/health.js +1 -1
  21. package/dist/cli/commands/governance/telemetry.js +1 -1
  22. package/dist/cli/commands/governance/validate.js +1 -1
  23. package/dist/cli/commands/history/activity.js +1 -1
  24. package/dist/cli/commands/history/history-compact.js +1 -1
  25. package/dist/cli/commands/history/history-redact.js +1 -1
  26. package/dist/cli/commands/history/history-repair.js +1 -1
  27. package/dist/cli/commands/history/history.js +1 -1
  28. package/dist/cli/commands/history/restore.js +1 -1
  29. package/dist/cli/commands/lifecycle/append.js +1 -1
  30. package/dist/cli/commands/lifecycle/claim.js +1 -1
  31. package/dist/cli/commands/lifecycle/close-many.js +1 -1
  32. package/dist/cli/commands/lifecycle/close.js +1 -1
  33. package/dist/cli/commands/lifecycle/copy.js +1 -1
  34. package/dist/cli/commands/lifecycle/create.js +1 -1
  35. package/dist/cli/commands/lifecycle/delete.js +1 -1
  36. package/dist/cli/commands/lifecycle/focus.js +1 -1
  37. package/dist/cli/commands/lifecycle/plan.js +1 -1
  38. package/dist/cli/commands/lifecycle/update-many.js +1 -1
  39. package/dist/cli/commands/lifecycle/update.js +1 -1
  40. package/dist/cli/commands/query/aggregate.js +1 -1
  41. package/dist/cli/commands/query/context.js +1 -1
  42. package/dist/cli/commands/query/deps.js +1 -1
  43. package/dist/cli/commands/query/duplicates.js +1 -1
  44. package/dist/cli/commands/query/eval.js +1 -1
  45. package/dist/cli/commands/query/get.js +1 -1
  46. package/dist/cli/commands/query/graph.js +1 -1
  47. package/dist/cli/commands/query/list.js +1 -1
  48. package/dist/cli/commands/query/next.js +1 -1
  49. package/dist/cli/commands/query/search.js +1 -1
  50. package/dist/cli/commands/query/stats.js +1 -1
  51. package/dist/cli/commands/test/test-all.js +1 -1
  52. package/dist/cli/commands/test/test-runs.js +1 -1
  53. package/dist/cli/commands/test/test.js +1 -1
  54. package/dist/cli/commands/workspace/config.js +1 -1
  55. package/dist/cli/commands/workspace/contracts.js +1 -1
  56. package/dist/cli/commands/workspace/init.js +1 -1
  57. package/dist/cli/commands/workspace/merge.js +1 -1
  58. package/dist/cli/commands/workspace/profile.js +1 -1
  59. package/dist/cli/commands/workspace/schema.js +1 -1
  60. package/dist/cli/commands/workspace/upgrade.js +1 -1
  61. package/dist/cli/context-intent-invocation.js +1 -1
  62. package/dist/cli/description-stdin.js +1 -1
  63. package/dist/cli/error-guidance.js +3 -1
  64. package/dist/cli/extension-command-help.js +5 -3
  65. package/dist/cli/extension-command-options.js +1 -1
  66. package/dist/cli/extension-recovery.js +1 -1
  67. package/dist/cli/help-content.js +5 -2
  68. package/dist/cli/help-json-payload.js +6 -3
  69. package/dist/cli/invocation-profile.js +2 -2
  70. package/dist/cli/main.js +5 -5
  71. package/dist/cli/migration-gates.js +1 -1
  72. package/dist/cli/option-values.js +1 -1
  73. package/dist/cli/public.js +1 -1
  74. package/dist/cli/register-annotations.js +1 -1
  75. package/dist/cli/register-assurance.js +1 -1
  76. package/dist/cli/register-files-lookup.js +1 -1
  77. package/dist/cli/register-history-activity.js +1 -1
  78. package/dist/cli/register-history-author.js +1 -1
  79. package/dist/cli/register-history-maintenance.js +2 -2
  80. package/dist/cli/register-list-query.js +10 -10
  81. package/dist/cli/register-mutation-options.js +1 -1
  82. package/dist/cli/register-mutation.js +2 -2
  83. package/dist/cli/register-operations.js +1 -1
  84. package/dist/cli/register-setup.js +1 -1
  85. package/dist/cli/register-structured-mutation.js +1 -1
  86. package/dist/cli/registration-helpers.js +1 -1
  87. package/dist/cli/runtime/activation.js +1 -1
  88. package/dist/cli/runtime/invocation-options.js +1 -1
  89. package/dist/cli/runtime/projection-retry.js +1 -1
  90. package/dist/cli/runtime/selection.js +1 -1
  91. package/dist/cli/runtime/telemetry-outcome.js +1 -1
  92. package/dist/cli/runtime-compatibility-boundary.d.ts +1 -1
  93. package/dist/cli/runtime-compatibility-boundary.js +4 -4
  94. package/dist/cli/schema/registration.js +2 -2
  95. package/dist/cli/schema-registration-helpers.js +1 -1
  96. package/dist/cli/search-refresh.js +1 -1
  97. package/dist/cli/stats-analytics-json.js +1 -1
  98. package/dist/cli/telemetry-flush.js +1 -1
  99. package/dist/cli-bundle/bundle-manifest.json +162 -162
  100. package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
  101. package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
  102. package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
  103. package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
  104. package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
  105. package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
  106. package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
  107. package/dist/cli-bundle/chunks/chunk-OOLYASYJ.js +2 -0
  108. package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
  109. package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
  110. package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
  111. package/dist/cli-bundle/chunks/{chunk-44UGMMQ6.js → chunk-VZ63DEVJ.js} +3 -3
  112. package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
  113. package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
  114. package/dist/cli-bundle/chunks/{chunk-5XKF5SQV.js → chunk-Z66DWDAU.js} +91 -91
  115. package/dist/cli-bundle/chunks/{register-list-query-DYCGUQEW.js → register-list-query-75QXHIFH.js} +11 -11
  116. package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
  117. package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
  118. package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
  119. package/dist/cli-bundle/focused-chunks/{chunk-3BIYG72P.js → chunk-2CVX3KR3.js} +2 -2
  120. package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
  121. package/dist/cli-bundle/focused-chunks/{chunk-DBD4W4QP.js → chunk-ABV67XCC.js} +3 -3
  122. package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
  124. package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
  125. package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
  126. package/dist/cli-bundle/focused-chunks/{chunk-EJN7DY3B.js → chunk-DOVTUKJQ.js} +2 -2
  127. package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
  129. package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
  130. package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
  131. package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
  134. package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
  135. package/dist/cli-bundle/focused-chunks/{chunk-XRSCIYHR.js → chunk-YMU42COG.js} +2 -2
  136. package/dist/cli-bundle/main.js +28 -28
  137. package/dist/cli-bundle/sdk-authoring.js +1 -1
  138. package/dist/cli-bundle/sdk-contracts.js +2 -2
  139. package/dist/cli-bundle/sdk-core.js +32 -32
  140. package/dist/cli-bundle/sdk-governance.js +1 -1
  141. package/dist/cli-bundle/sdk-graph.js +1 -1
  142. package/dist/cli-bundle/sdk-merge.js +55 -55
  143. package/dist/cli-bundle/sdk-query.js +1 -1
  144. package/dist/cli-bundle/sdk-runtime.js +1 -1
  145. package/dist/cli-bundle/sdk-testing.js +1 -1
  146. package/dist/cli-bundle/sdk.js +10 -10
  147. package/dist/cli.js +1 -1
  148. package/dist/core/checkpoint/checkpoint-gc.js +1 -1
  149. package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
  150. package/dist/core/config/nested-settings.js +1 -1
  151. package/dist/core/config/positional-value.js +1 -1
  152. package/dist/core/diagnostics/remediation.js +1 -1
  153. package/dist/core/extensions/activation-summary-markdown.js +2 -1
  154. package/dist/core/extensions/activation-summary.js +1 -1
  155. package/dist/core/extensions/activation-transaction.js +1 -1
  156. package/dist/core/extensions/capability-usage.js +1 -1
  157. package/dist/core/extensions/command-hook-context.js +1 -1
  158. package/dist/core/extensions/command-metadata-contract.js +1 -1
  159. package/dist/core/extensions/command-visibility-tier.js +1 -1
  160. package/dist/core/extensions/contribution-inventory.js +1 -1
  161. package/dist/core/extensions/exporter-output-contract.js +1 -1
  162. package/dist/core/extensions/extension-candidate.js +1 -1
  163. package/dist/core/extensions/extension-capability-aliases.js +1 -1
  164. package/dist/core/extensions/extension-hook-runtime.js +1 -1
  165. package/dist/core/extensions/extension-policy.js +1 -1
  166. package/dist/core/extensions/extension-registries.js +1 -1
  167. package/dist/core/extensions/extension-runtime-helpers.js +1 -1
  168. package/dist/core/extensions/extension-types.d.ts +8 -1
  169. package/dist/core/extensions/extension-types.js +1 -1
  170. package/dist/core/extensions/flag-definition-validation.js +1 -1
  171. package/dist/core/extensions/flag-value-types.js +1 -1
  172. package/dist/core/extensions/index.js +1 -1
  173. package/dist/core/extensions/item-field-types.js +1 -1
  174. package/dist/core/extensions/item-fields.js +1 -1
  175. package/dist/core/extensions/loader.js +1 -1
  176. package/dist/core/extensions/manifest-parser.js +1 -1
  177. package/dist/core/extensions/manifest-schema.js +1 -1
  178. package/dist/core/extensions/module-graph-snapshot.js +1 -1
  179. package/dist/core/extensions/preflight-ownership.js +1 -1
  180. package/dist/core/extensions/registration-contracts.js +1 -1
  181. package/dist/core/extensions/registration-validation.js +1 -1
  182. package/dist/core/extensions/registration-values.js +1 -1
  183. package/dist/core/extensions/reserved-host-flags.js +1 -1
  184. package/dist/core/extensions/runtime-registrations.js +1 -1
  185. package/dist/core/extensions/service-ownership.js +1 -1
  186. package/dist/core/extensions/version-compat.js +1 -1
  187. package/dist/core/fs/atomic-create.js +1 -1
  188. package/dist/core/fs/fs-utils.js +2 -2
  189. package/dist/core/fs/host-environment-errors.js +1 -1
  190. package/dist/core/fs/index.js +1 -1
  191. package/dist/core/fs/path-utils.js +1 -1
  192. package/dist/core/governance/content-fields.js +1 -1
  193. package/dist/core/governance/issue-codes.js +1 -1
  194. package/dist/core/governance/metadata-coverage.js +1 -1
  195. package/dist/core/history/digest.js +1 -1
  196. package/dist/core/history/drift-cache.js +3 -3
  197. package/dist/core/history/drift-scan.d.ts +4 -0
  198. package/dist/core/history/drift-scan.js +1 -1
  199. package/dist/core/history/event-classification.js +1 -1
  200. package/dist/core/history/event-index.js +8 -7
  201. package/dist/core/history/history-compact-bulk.js +1 -1
  202. package/dist/core/history/history-diff.js +1 -1
  203. package/dist/core/history/history-rewrite.js +1 -1
  204. package/dist/core/history/history-storage-stats.js +1 -1
  205. package/dist/core/history/history-stream-policy.js +1 -1
  206. package/dist/core/history/history.js +2 -2
  207. package/dist/core/history/identity.js +1 -1
  208. package/dist/core/history/index.js +1 -1
  209. package/dist/core/history/operation-contract.js +1 -1
  210. package/dist/core/history/projection.js +1 -1
  211. package/dist/core/history/read.js +1 -1
  212. package/dist/core/history/replay.js +2 -1
  213. package/dist/core/history/tombstone.js +1 -1
  214. package/dist/core/history/version-address.js +1 -1
  215. package/dist/core/history/workspace-history.js +2 -2
  216. package/dist/core/io/body-file.js +1 -1
  217. package/dist/core/io/bulk-ids-input.js +2 -1
  218. package/dist/core/item/actionability.js +1 -1
  219. package/dist/core/item/dependency-reference.js +1 -1
  220. package/dist/core/item/id.js +1 -1
  221. package/dist/core/item/index.js +1 -1
  222. package/dist/core/item/item-format-version.js +1 -1
  223. package/dist/core/item/item-format.js +6 -4
  224. package/dist/core/item/item-record.js +1 -1
  225. package/dist/core/item/item-type-definition.js +1 -1
  226. package/dist/core/item/parent-reference-policy.js +1 -1
  227. package/dist/core/item/parse.js +8 -2
  228. package/dist/core/item/plan-lifecycle.js +1 -1
  229. package/dist/core/item/priority.js +1 -1
  230. package/dist/core/item/sprint-release-format.js +1 -1
  231. package/dist/core/item/status-filter.js +1 -1
  232. package/dist/core/item/status.js +1 -1
  233. package/dist/core/item/toon-decode.js +1 -1
  234. package/dist/core/item/type-registry.js +1 -1
  235. package/dist/core/item/type-synonyms.js +1 -1
  236. package/dist/core/lock/index.js +1 -1
  237. package/dist/core/lock/lock-gc.js +1 -1
  238. package/dist/core/lock/lock.js +3 -3
  239. package/dist/core/output/mutation-projection.js +1 -1
  240. package/dist/core/output/output-control.js +1 -1
  241. package/dist/core/output/output.js +22 -10
  242. package/dist/core/output/query-summary.js +1 -1
  243. package/dist/core/output/tabular.js +3 -1
  244. package/dist/core/packages/manifest.js +1 -1
  245. package/dist/core/packages/root.js +1 -1
  246. package/dist/core/policy/workflow-policy-schema.js +1 -1
  247. package/dist/core/policy/workflow-policy-store.js +1 -1
  248. package/dist/core/policy/workflow-policy.js +1 -1
  249. package/dist/core/profile/profile-describe.js +1 -1
  250. package/dist/core/profile/profile-lint.js +1 -1
  251. package/dist/core/profile/profile-plan.js +1 -1
  252. package/dist/core/profile/profile-presets.js +25 -1
  253. package/dist/core/reproducibility/context.js +1 -1
  254. package/dist/core/schema/fields-file.js +2 -2
  255. package/dist/core/schema/item-types-file.js +2 -2
  256. package/dist/core/schema/runtime-field-filters.js +1 -1
  257. package/dist/core/schema/runtime-field-values.js +1 -1
  258. package/dist/core/schema/runtime-schema.js +2 -2
  259. package/dist/core/schema/status-defs-file.js +2 -2
  260. package/dist/core/schema/status-token.js +1 -1
  261. package/dist/core/schema/type-inference.js +1 -1
  262. package/dist/core/schema/type-presets.js +1 -1
  263. package/dist/core/schema/type-workflows.js +1 -1
  264. package/dist/core/search/background-refresh.js +2 -2
  265. package/dist/core/search/bm25.js +1 -1
  266. package/dist/core/search/cache.js +2 -2
  267. package/dist/core/search/corpus.js +1 -1
  268. package/dist/core/search/embedding-batches.js +1 -1
  269. package/dist/core/search/eval-thresholds.js +1 -1
  270. package/dist/core/search/eval.js +1 -1
  271. package/dist/core/search/http-client.js +1 -1
  272. package/dist/core/search/providers.js +1 -1
  273. package/dist/core/search/relevance.js +1 -1
  274. package/dist/core/search/semantic-defaults.js +1 -1
  275. package/dist/core/search/staleness.js +1 -1
  276. package/dist/core/search/vector-stores.js +2 -2
  277. package/dist/core/search/vectorization-metadata.js +1 -1
  278. package/dist/core/sentry/helpers.js +1 -1
  279. package/dist/core/sentry/instrument.js +1 -1
  280. package/dist/core/session/session-state.js +1 -1
  281. package/dist/core/shared/agent-session-context.js +1 -1
  282. package/dist/core/shared/author.js +5 -1
  283. package/dist/core/shared/command-line.js +1 -1
  284. package/dist/core/shared/command-types.js +1 -1
  285. package/dist/core/shared/conflict-markers.js +1 -1
  286. package/dist/core/shared/constants.js +1 -1
  287. package/dist/core/shared/errors.js +1 -1
  288. package/dist/core/shared/html-entity-decode.js +1 -1
  289. package/dist/core/shared/index.js +1 -1
  290. package/dist/core/shared/item-metadata-contract.js +1 -1
  291. package/dist/core/shared/lazy-module.js +1 -1
  292. package/dist/core/shared/levenshtein.js +1 -1
  293. package/dist/core/shared/memo.js +1 -1
  294. package/dist/core/shared/numeric-parsers.js +1 -1
  295. package/dist/core/shared/option-alias-visibility.js +1 -1
  296. package/dist/core/shared/primitives.js +1 -1
  297. package/dist/core/shared/secret-rules.js +1 -1
  298. package/dist/core/shared/serial-queue.js +1 -1
  299. package/dist/core/shared/serialization.js +1 -1
  300. package/dist/core/shared/split-comma-list.js +1 -1
  301. package/dist/core/shared/text-normalization.js +1 -1
  302. package/dist/core/shared/time.js +2 -1
  303. package/dist/core/store/index.js +1 -1
  304. package/dist/core/store/item-format-migration.js +1 -1
  305. package/dist/core/store/item-metadata-cache.js +1 -1
  306. package/dist/core/store/item-metadata-query-index.js +7 -7
  307. package/dist/core/store/item-metadata-read-work.js +1 -1
  308. package/dist/core/store/item-store.js +1 -1
  309. package/dist/core/store/paths.js +1 -1
  310. package/dist/core/store/settings-concurrency.js +1 -1
  311. package/dist/core/store/settings-read-cache.js +1 -1
  312. package/dist/core/store/settings-validator.js +1 -1
  313. package/dist/core/store/settings.d.ts +11 -2
  314. package/dist/core/store/settings.js +3 -3
  315. package/dist/core/store/tracker-preflight.js +1 -1
  316. package/dist/core/telemetry/consent.js +2 -2
  317. package/dist/core/telemetry/observability.js +1 -1
  318. package/dist/core/telemetry/policy.js +1 -1
  319. package/dist/core/telemetry/read-sampling.js +2 -2
  320. package/dist/core/telemetry/runtime.js +9 -5
  321. package/dist/core/test/background-runs.js +3 -3
  322. package/dist/core/test/item-test-run-tracking.js +1 -1
  323. package/dist/core/test/run-selectors.js +1 -1
  324. package/dist/core/validate/estimate-defaults.js +1 -1
  325. package/dist/core/validate/fix-planning.js +1 -1
  326. package/dist/core/validate/linked-artifact-reference.js +1 -1
  327. package/dist/core/validate/missing-by-type.js +1 -1
  328. package/dist/core/validate/missing-link-owners.js +1 -1
  329. package/dist/core/validate/stale-file-classification.js +1 -1
  330. package/dist/mcp/http-server.js +6 -4
  331. package/dist/mcp/legacy-adapter.js +1 -1
  332. package/dist/mcp/runtime-capabilities.js +1 -1
  333. package/dist/mcp/server.js +4 -4
  334. package/dist/mcp/tool-definitions.js +1 -1
  335. package/dist/sdk/actionability.js +1 -1
  336. package/dist/sdk/agent/closed-domain-contracts.js +1 -1
  337. package/dist/sdk/agent/command-recovery.js +1 -1
  338. package/dist/sdk/agent/command-suggestions.js +1 -1
  339. package/dist/sdk/agent/create-option-policy.js +1 -1
  340. package/dist/sdk/agent/identity-config.js +1 -1
  341. package/dist/sdk/agent/item-addressing.js +1 -1
  342. package/dist/sdk/agent/refusal-closure-census.js +2 -1
  343. package/dist/sdk/agent/refusal-closure.js +1 -1
  344. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
  345. package/dist/sdk/agent/refusal-reachability.js +3 -1
  346. package/dist/sdk/agent/subcommand-recovery.js +1 -1
  347. package/dist/sdk/agent/task-transcript-contracts.js +1 -1
  348. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
  349. package/dist/sdk/agent-capability-contracts.js +3 -1
  350. package/dist/sdk/agent-session-context.js +1 -1
  351. package/dist/sdk/annotations.js +1 -1
  352. package/dist/sdk/author-attribution.js +1 -1
  353. package/dist/sdk/authoring.js +1 -1
  354. package/dist/sdk/cli-bootstrap.js +1 -1
  355. package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
  356. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
  357. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  358. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
  359. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
  360. package/dist/sdk/cli-contracts/commander-types.js +1 -1
  361. package/dist/sdk/cli-contracts/completeness.js +1 -1
  362. package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
  363. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  364. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
  365. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  366. package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
  367. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  368. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
  369. package/dist/sdk/cli-contracts/string-lists.js +1 -1
  370. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
  371. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
  372. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  373. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
  374. package/dist/sdk/cli-contracts.js +1 -1
  375. package/dist/sdk/cli-program.js +1 -1
  376. package/dist/sdk/command-line.js +1 -1
  377. package/dist/sdk/comments.js +1 -1
  378. package/dist/sdk/compile-cache.js +1 -1
  379. package/dist/sdk/completion/bash.js +2 -1
  380. package/dist/sdk/completion/fish.js +13 -7
  381. package/dist/sdk/completion/shared.js +1 -1
  382. package/dist/sdk/completion/zsh.js +14 -8
  383. package/dist/sdk/completion.js +1 -1
  384. package/dist/sdk/compose.js +1 -1
  385. package/dist/sdk/config.js +1 -1
  386. package/dist/sdk/context/recency.js +1 -1
  387. package/dist/sdk/context/semantic-session-attribution.js +1 -1
  388. package/dist/sdk/context/usage-egress.js +1 -1
  389. package/dist/sdk/context/usage-ledger.js +6 -3
  390. package/dist/sdk/context-intent-contracts.js +1 -1
  391. package/dist/sdk/context-intent-runtime.js +1 -1
  392. package/dist/sdk/context-packing.js +1 -1
  393. package/dist/sdk/context-relevance.js +1 -1
  394. package/dist/sdk/context-signal-store.js +2 -2
  395. package/dist/sdk/context-usage.js +1 -1
  396. package/dist/sdk/contracts.js +1 -1
  397. package/dist/sdk/core-governance.js +1 -1
  398. package/dist/sdk/core.js +1 -1
  399. package/dist/sdk/corpus-shape.js +1 -1
  400. package/dist/sdk/define.js +1 -1
  401. package/dist/sdk/dependencies.js +1 -1
  402. package/dist/sdk/dependency-flag-validation.js +1 -1
  403. package/dist/sdk/dependency-provenance.js +1 -1
  404. package/dist/sdk/docs.js +1 -1
  405. package/dist/sdk/duplicates.js +1 -1
  406. package/dist/sdk/environment/agent-environment.js +1 -1
  407. package/dist/sdk/environment/host-environment-errors.js +1 -1
  408. package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
  409. package/dist/sdk/environment/source-context.js +1 -1
  410. package/dist/sdk/environment/tracker-preflight.js +1 -1
  411. package/dist/sdk/error-code-catalog.js +1 -1
  412. package/dist/sdk/error-runtime.js +1 -1
  413. package/dist/sdk/errors.js +1 -1
  414. package/dist/sdk/eval.js +1 -1
  415. package/dist/sdk/extension/author-manifest.js +1 -1
  416. package/dist/sdk/extension/bundled-catalog.js +1 -1
  417. package/dist/sdk/extension/concurrency.js +1 -1
  418. package/dist/sdk/extension/copy-scope.js +1 -1
  419. package/dist/sdk/extension/custom-field-collisions.js +1 -1
  420. package/dist/sdk/extension/describe.js +4 -2
  421. package/dist/sdk/extension/doctor.js +1 -1
  422. package/dist/sdk/extension/install-plan.js +1 -1
  423. package/dist/sdk/extension/install-receipts.js +1 -1
  424. package/dist/sdk/extension/install-runtime.js +3 -3
  425. package/dist/sdk/extension/install-snapshot.js +1 -1
  426. package/dist/sdk/extension/install-sources.js +5 -5
  427. package/dist/sdk/extension/managed-state.js +2 -2
  428. package/dist/sdk/extension/migrations.js +2 -2
  429. package/dist/sdk/extension/output-ownership.js +1 -1
  430. package/dist/sdk/extension/runtime-summary.js +1 -1
  431. package/dist/sdk/extension/scaffold.js +11 -4
  432. package/dist/sdk/extension/shared.js +1 -1
  433. package/dist/sdk/extension/source-resolution.js +1 -1
  434. package/dist/sdk/extension/static-inventory.js +1 -1
  435. package/dist/sdk/extension/update-check.js +1 -1
  436. package/dist/sdk/extension-command-context.js +1 -1
  437. package/dist/sdk/extension-contracts.js +1 -1
  438. package/dist/sdk/extension.js +1 -1
  439. package/dist/sdk/files.js +1 -1
  440. package/dist/sdk/flag-invocation-contracts.js +1 -1
  441. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  442. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  443. package/dist/sdk/generated-error-code-catalog.js +1 -1
  444. package/dist/sdk/governance/assurance-action-contracts.js +1 -1
  445. package/dist/sdk/governance/assurance-action.js +1 -1
  446. package/dist/sdk/governance/assurance-limits.js +1 -1
  447. package/dist/sdk/governance/assurance-mutation-error.js +1 -1
  448. package/dist/sdk/governance/assurance-presets.js +1 -1
  449. package/dist/sdk/governance/assurance-runtime.js +1 -1
  450. package/dist/sdk/governance/assurance.js +4 -4
  451. package/dist/sdk/governance/boundary-fixtures.js +1 -1
  452. package/dist/sdk/governance/closure-timestamps.js +1 -1
  453. package/dist/sdk/governance/coverage-assurance.js +1 -1
  454. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
  455. package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
  456. package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
  457. package/dist/sdk/governance/defect-recurrence.js +1 -1
  458. package/dist/sdk/governance/extension-host-version.js +1 -1
  459. package/dist/sdk/governance/gc.js +1 -1
  460. package/dist/sdk/governance/health-merge-evidence.js +1 -1
  461. package/dist/sdk/governance/health.js +2 -1
  462. package/dist/sdk/governance/hierarchy-validation.js +1 -1
  463. package/dist/sdk/governance/linked-file-report.js +1 -1
  464. package/dist/sdk/governance/merge-receipt-history.js +1 -1
  465. package/dist/sdk/governance/provenance-health.js +4 -1
  466. package/dist/sdk/governance/reindex.js +5 -4
  467. package/dist/sdk/governance/stale-work.js +1 -1
  468. package/dist/sdk/governance/status-role-diagnostics.js +1 -1
  469. package/dist/sdk/governance/storage-integrity.js +1 -1
  470. package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
  471. package/dist/sdk/governance/upgrade.js +2 -2
  472. package/dist/sdk/governance/validate-history-drift.js +1 -1
  473. package/dist/sdk/governance/validate-item-reader.js +1 -1
  474. package/dist/sdk/governance/validate-normalization.js +1 -1
  475. package/dist/sdk/governance/validate.js +1 -1
  476. package/dist/sdk/governance/workflow-completeness.js +1 -1
  477. package/dist/sdk/governance/workflow-policy.js +3 -3
  478. package/dist/sdk/governance/workspace-position.js +2 -1
  479. package/dist/sdk/governance.js +1 -1
  480. package/dist/sdk/graph/adapter.js +1 -1
  481. package/dist/sdk/graph/analytics.js +1 -1
  482. package/dist/sdk/graph/assembly.js +1 -1
  483. package/dist/sdk/graph/cache.js +1 -1
  484. package/dist/sdk/graph/centrality.js +1 -1
  485. package/dist/sdk/graph/conformance.js +1 -1
  486. package/dist/sdk/graph/deadline-scheduling.js +1 -1
  487. package/dist/sdk/graph/durable-cache.js +1 -1
  488. package/dist/sdk/graph/governance-contracts.js +1 -1
  489. package/dist/sdk/graph/governance.js +1 -1
  490. package/dist/sdk/graph/hierarchy-integrity.js +1 -1
  491. package/dist/sdk/graph/index.js +1 -1
  492. package/dist/sdk/graph/lifecycle-coverage.js +1 -1
  493. package/dist/sdk/graph/mutation-advisory.js +1 -1
  494. package/dist/sdk/graph/query-contracts.js +1 -1
  495. package/dist/sdk/graph/remediation.js +1 -1
  496. package/dist/sdk/graph/run.js +1 -1
  497. package/dist/sdk/graph/scheduling.js +1 -1
  498. package/dist/sdk/graph/traversal.js +1 -1
  499. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
  500. package/dist/sdk/graph.js +1 -1
  501. package/dist/sdk/guide-topics.js +1 -1
  502. package/dist/sdk/guide.js +8 -1
  503. package/dist/sdk/history/attestation-command.js +1 -1
  504. package/dist/sdk/history/attestation-contract.js +1 -1
  505. package/dist/sdk/history/attestation-scan.js +1 -1
  506. package/dist/sdk/history/attestation.js +1 -1
  507. package/dist/sdk/history/maintenance.js +1 -1
  508. package/dist/sdk/history/salvage.js +3 -2
  509. package/dist/sdk/history/subject.js +1 -1
  510. package/dist/sdk/history-analytics.js +1 -1
  511. package/dist/sdk/history-compact.js +1 -1
  512. package/dist/sdk/history-mcp.js +1 -1
  513. package/dist/sdk/history-provenance.js +1 -1
  514. package/dist/sdk/history-read.js +1 -1
  515. package/dist/sdk/history-redact.js +1 -1
  516. package/dist/sdk/history-repair.js +1 -1
  517. package/dist/sdk/improvement-ledger-validation.js +1 -1
  518. package/dist/sdk/improvement-ledger.js +2 -2
  519. package/dist/sdk/index.js +1 -1
  520. package/dist/sdk/init-agent-guidance.js +16 -2
  521. package/dist/sdk/init.js +16 -2
  522. package/dist/sdk/invocation-author.js +1 -1
  523. package/dist/sdk/item-children.js +1 -1
  524. package/dist/sdk/item-metadata-index.js +1 -1
  525. package/dist/sdk/item-schedule.js +1 -1
  526. package/dist/sdk/item-transaction.js +1 -1
  527. package/dist/sdk/learnings.js +1 -1
  528. package/dist/sdk/lifecycle/append.js +4 -2
  529. package/dist/sdk/lifecycle/claim.js +1 -1
  530. package/dist/sdk/lifecycle/close-many.js +1 -1
  531. package/dist/sdk/lifecycle/close.js +1 -1
  532. package/dist/sdk/lifecycle/copy.js +1 -1
  533. package/dist/sdk/lifecycle/create.js +1 -1
  534. package/dist/sdk/lifecycle/delete.js +1 -1
  535. package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
  536. package/dist/sdk/lifecycle/focus.js +1 -1
  537. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  538. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
  539. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
  540. package/dist/sdk/lifecycle/mcp-actions.js +1 -1
  541. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
  542. package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
  543. package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
  544. package/dist/sdk/lifecycle/plan.js +1 -1
  545. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
  546. package/dist/sdk/lifecycle/reopen.js +1 -1
  547. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
  548. package/dist/sdk/lifecycle/restore.js +1 -1
  549. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
  550. package/dist/sdk/lifecycle/task-composition.js +1 -1
  551. package/dist/sdk/lifecycle/update-many.js +1 -1
  552. package/dist/sdk/lifecycle/update.js +2 -1
  553. package/dist/sdk/lifecycle-completion.js +1 -1
  554. package/dist/sdk/lifecycle-policy.js +1 -1
  555. package/dist/sdk/linked-artifacts.js +2 -1
  556. package/dist/sdk/mcp/apps.js +1 -1
  557. package/dist/sdk/mcp/authorization.js +1 -1
  558. package/dist/sdk/mcp/discovery.js +1 -1
  559. package/dist/sdk/mcp/interactions.js +1 -1
  560. package/dist/sdk/mcp/protocol.js +1 -1
  561. package/dist/sdk/mcp/skills.js +3 -1
  562. package/dist/sdk/mcp/subscriptions.js +1 -1
  563. package/dist/sdk/mcp/tasks.js +2 -2
  564. package/dist/sdk/mcp/transport.js +1 -1
  565. package/dist/sdk/merge/abandoned-receipts.js +1 -1
  566. package/dist/sdk/merge/driver.js +1 -1
  567. package/dist/sdk/merge/index.js +1 -1
  568. package/dist/sdk/merge/install.js +4 -2
  569. package/dist/sdk/merge/receipt-file-boundary.js +1 -1
  570. package/dist/sdk/merge/receipt-operation.js +1 -1
  571. package/dist/sdk/merge/receipt-schema.js +1 -1
  572. package/dist/sdk/merge/receipts.js +4 -4
  573. package/dist/sdk/merge/reconcile.js +1 -1
  574. package/dist/sdk/merge/three-way.js +3 -2
  575. package/dist/sdk/merge/worktree-config.js +1 -1
  576. package/dist/sdk/merge.js +1 -1
  577. package/dist/sdk/mutation-events.js +1 -1
  578. package/dist/sdk/mutation-guard.js +1 -1
  579. package/dist/sdk/notes.js +1 -1
  580. package/dist/sdk/output-contracts.js +1 -1
  581. package/dist/sdk/output-projection.js +1 -1
  582. package/dist/sdk/output-token-accounting.js +1 -1
  583. package/dist/sdk/output.js +2 -1
  584. package/dist/sdk/ownership-source.js +1 -1
  585. package/dist/sdk/package-import-adapters.js +1 -1
  586. package/dist/sdk/package-migrations.js +1 -1
  587. package/dist/sdk/package-runtime-options.js +1 -1
  588. package/dist/sdk/pagination.js +1 -1
  589. package/dist/sdk/profile.js +5 -1
  590. package/dist/sdk/provenance.js +1 -1
  591. package/dist/sdk/public-surface.json +1 -1
  592. package/dist/sdk/query/activity.js +1 -1
  593. package/dist/sdk/query/aggregate.js +1 -1
  594. package/dist/sdk/query/calendar.js +4 -1
  595. package/dist/sdk/query/complete-list.js +1 -1
  596. package/dist/sdk/query/context.js +2 -1
  597. package/dist/sdk/query/duplicate-candidates.js +1 -1
  598. package/dist/sdk/query/get.d.ts +14 -2
  599. package/dist/sdk/query/get.js +1 -1
  600. package/dist/sdk/query/history.js +1 -1
  601. package/dist/sdk/query/item-filter-options.js +1 -1
  602. package/dist/sdk/query/light-metadata.js +1 -1
  603. package/dist/sdk/query/list-filter-shared.js +1 -1
  604. package/dist/sdk/query/list.js +1 -1
  605. package/dist/sdk/query/multi-value-filters.js +1 -1
  606. package/dist/sdk/query/next-ready-budget.js +1 -1
  607. package/dist/sdk/query/next.js +2 -1
  608. package/dist/sdk/query/parsers.js +1 -1
  609. package/dist/sdk/query/projection-contracts.js +1 -1
  610. package/dist/sdk/query/search/corpus.js +2 -1
  611. package/dist/sdk/query/search/filters.js +1 -1
  612. package/dist/sdk/query/search/input.js +1 -1
  613. package/dist/sdk/query/search/lexical.js +1 -1
  614. package/dist/sdk/query/search/response.js +1 -1
  615. package/dist/sdk/query/search/semantic.js +3 -2
  616. package/dist/sdk/query/search/types.js +1 -1
  617. package/dist/sdk/query/search-contracts.js +1 -1
  618. package/dist/sdk/query/search-pagination.d.ts +1 -1
  619. package/dist/sdk/query/search-pagination.js +1 -1
  620. package/dist/sdk/query/search-rendering.js +1 -1
  621. package/dist/sdk/query/search.js +1 -1
  622. package/dist/sdk/query/workspace-contracts.js +1 -1
  623. package/dist/sdk/query.js +1 -1
  624. package/dist/sdk/read-output/continuation.js +1 -1
  625. package/dist/sdk/read-output/options.js +1 -1
  626. package/dist/sdk/read-output/provenance.js +1 -1
  627. package/dist/sdk/read-output-budget.js +1 -1
  628. package/dist/sdk/read-output-contracts.js +1 -1
  629. package/dist/sdk/read-output-rows.js +1 -1
  630. package/dist/sdk/read-output-session.js +1 -1
  631. package/dist/sdk/relationship-analytics.js +1 -1
  632. package/dist/sdk/relationship-context.js +1 -1
  633. package/dist/sdk/relationship-history.js +7 -4
  634. package/dist/sdk/relationship-kinds/contract.js +1 -1
  635. package/dist/sdk/relationship-migration.js +1 -1
  636. package/dist/sdk/relationships.js +1 -1
  637. package/dist/sdk/reproducibility/process.js +1 -1
  638. package/dist/sdk/runtime/actions.js +1 -1
  639. package/dist/sdk/runtime/context.js +1 -1
  640. package/dist/sdk/runtime/schema-preview.js +1 -1
  641. package/dist/sdk/runtime/schema.js +1 -1
  642. package/dist/sdk/runtime-action-aliases.js +1 -1
  643. package/dist/sdk/runtime-extended-actions.js +1 -1
  644. package/dist/sdk/runtime-input.js +1 -1
  645. package/dist/sdk/runtime-primitives.js +1 -1
  646. package/dist/sdk/runtime-public-contracts.js +1 -1
  647. package/dist/sdk/runtime-stats-options.js +1 -1
  648. package/dist/sdk/runtime.js +1 -1
  649. package/dist/sdk/scheduling-shortcuts.js +1 -1
  650. package/dist/sdk/schema-migration.js +4 -3
  651. package/dist/sdk/schema.js +7 -1
  652. package/dist/sdk/search-refresh-worker.js +1 -1
  653. package/dist/sdk/similarity-scoring.js +1 -1
  654. package/dist/sdk/similarity.js +1 -1
  655. package/dist/sdk/start-task-status.js +1 -1
  656. package/dist/sdk/stats.js +1 -1
  657. package/dist/sdk/structured-mutations.js +1 -1
  658. package/dist/sdk/telemetry-flush.js +1 -1
  659. package/dist/sdk/telemetry.js +4 -3
  660. package/dist/sdk/templates.js +26 -2
  661. package/dist/sdk/test/batch.js +2 -2
  662. package/dist/sdk/test/entry.js +1 -1
  663. package/dist/sdk/test/execution.js +6 -5
  664. package/dist/sdk/test/json-path.js +1 -1
  665. package/dist/sdk/test/linked-command-detection.js +1 -1
  666. package/dist/sdk/test/measurements.js +1 -1
  667. package/dist/sdk/test/parsers.js +1 -1
  668. package/dist/sdk/test/runs.js +1 -1
  669. package/dist/sdk/test/trust.js +2 -2
  670. package/dist/sdk/test/workspace-snapshot.js +1 -1
  671. package/dist/sdk/testing.js +7 -4
  672. package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
  673. package/dist/sdk/traceability/source-traceability.js +2 -1
  674. package/dist/sdk/tracker-root-discovery.js +1 -1
  675. package/dist/sdk/workspace-contracts-cache.js +1 -1
  676. package/dist/sdk/workspace-contracts.js +1 -1
  677. package/dist/sdk/workspace-memory.js +2 -2
  678. package/dist/sdk/workspace-recipe.js +1 -1
  679. package/dist/sdk/workspace-snapshot.js +5 -4
  680. package/dist/sdk/workspace-transaction-gc.js +1 -1
  681. package/dist/sdk/workspace-transaction.js +2 -2
  682. package/dist/sdk/workspace.js +3 -2
  683. package/dist/types/index.js +1 -1
  684. package/dist/types.js +1 -1
  685. package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
  686. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +25 -0
  687. package/docs/GET_READ_EVIDENCE.md +68 -0
  688. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
  689. package/docs/README.md +2 -0
  690. package/docs/SDK_AUDITED_MUTATIONS.md +35 -0
  691. package/docs/TESTING.md +8 -0
  692. package/docs/ecosystem-review-2026-09-28.json +2864 -3157
  693. package/marketplace.json +2 -2
  694. package/package.json +1 -1
  695. package/packages/pm-beads/package.json +1 -1
  696. package/packages/pm-calendar/package.json +1 -1
  697. package/packages/pm-command-kit/package.json +1 -1
  698. package/packages/pm-digital-twin/package.json +1 -1
  699. package/packages/pm-governance-audit/package.json +1 -1
  700. package/packages/pm-guide-shell/package.json +1 -1
  701. package/packages/pm-kanban/package.json +1 -1
  702. package/packages/pm-lifecycle-hooks/package.json +1 -1
  703. package/packages/pm-linked-test-adapters/package.json +1 -1
  704. package/packages/pm-search-advanced/package.json +1 -1
  705. package/packages/pm-templates/package.json +1 -1
  706. package/packages/pm-todos/package.json +1 -1
  707. package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
  708. package/packages/pm-vcs/package.json +1 -1
  709. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  710. package/plugins/pm-claude/package.json +2 -2
  711. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  712. package/plugins/pm-codex/package.json +2 -2
  713. package/plugins/pm-codex/plugin.json +1 -1
  714. package/scripts/finalize-build.mjs +3 -2
  715. package/dist/cli-bundle/chunks/chunk-3AF2R3Y6.js +0 -6
  716. package/dist/cli-bundle/chunks/chunk-6ST3SCQ6.js +0 -2
  717. package/dist/cli-bundle/chunks/chunk-6Z4IV2MC.js +0 -8
  718. package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
  719. package/dist/cli-bundle/chunks/chunk-FW5LJXQY.js +0 -31
  720. package/dist/cli-bundle/chunks/chunk-H2DZW6I6.js +0 -3
  721. package/dist/cli-bundle/chunks/chunk-H7CXQBGQ.js +0 -2
  722. package/dist/cli-bundle/chunks/chunk-KP7NBQK3.js +0 -80
  723. package/dist/cli-bundle/chunks/chunk-MKXBCBAN.js +0 -20
  724. package/dist/cli-bundle/chunks/chunk-QPKQKSQU.js +0 -238
  725. package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
  726. package/dist/cli-bundle/chunks/chunk-YCBGZF3T.js +0 -2
  727. package/dist/cli-bundle/chunks/chunk-YDWKGUQU.js +0 -3
  728. package/dist/cli-bundle/chunks/register-mutation-5PT3NW3A.js +0 -20
  729. package/dist/cli-bundle/chunks/register-operations-QDDQOAAV.js +0 -2
  730. package/dist/cli-bundle/chunks/register-setup-BBX67YMA.js +0 -2
  731. package/dist/cli-bundle/focused-chunks/chunk-4FFPGNCJ.js +0 -6
  732. package/dist/cli-bundle/focused-chunks/chunk-73DA7ISY.js +0 -75
  733. package/dist/cli-bundle/focused-chunks/chunk-E754JDLY.js +0 -2
  734. package/dist/cli-bundle/focused-chunks/chunk-FKK2HI3S.js +0 -2
  735. package/dist/cli-bundle/focused-chunks/chunk-GMYUNHST.js +0 -3
  736. package/dist/cli-bundle/focused-chunks/chunk-HIA2ZF64.js +0 -12
  737. package/dist/cli-bundle/focused-chunks/chunk-UTRSM3ZK.js +0 -8
  738. package/dist/cli-bundle/focused-chunks/chunk-VVWYI2X7.js +0 -2
  739. package/dist/cli-bundle/focused-chunks/chunk-WAJNX4RN.js +0 -20
  740. package/dist/cli-bundle/focused-chunks/chunk-WCY6HRZO.js +0 -30
  741. package/dist/cli-bundle/focused-chunks/chunk-YC32ZSLS.js +0 -165
  742. package/dist/cli-bundle/focused-chunks/chunk-ZIXFMIUL.js +0 -3
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8d07624c-8663-5aba-8018-1b2c47997bef")}catch(e2){}})();import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isTerminalStatus,normalizeStatusInput}from"../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{listAllItemMetadataLight}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{querySimilarItemMetadataIndex}from"../core/store/item-metadata-query-index.js";import{collectDuplicateCandidatePairs,MAX_DUPLICATE_CANDIDATE_PAIRS}from"./query/duplicate-candidates.js";import{prepareSimilarityText,scoreItemSimilarity,scorePreparedItemSimilarity,tokenizeSimilarityText}from"./similarity-scoring.js";import{jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText as prepareSimilarityText2,scoreItemSimilarity as scoreItemSimilarity2,scorePreparedItemSimilarity as scorePreparedItemSimilarity2,tokenizeSimilarityText as tokenizeSimilarityText2}from"./similarity-scoring.js";const DEFAULT_SIMILARITY_LIMIT=3;const MAX_SIMILARITY_LIMIT=20;const DEFAULT_SIMILARITY_THRESHOLD=.8;const DEFAULT_DUPLICATE_CLUSTER_LIMIT=100;const MAX_DUPLICATE_CLUSTER_LIMIT=1e3;function similarityAdvisoryWarnings(advisory){return advisory===void 0?[]:[`likely_duplicates:${advisory.result.items.map(item=>item.id).join(",")}`,`likely_duplicate_recovery:${advisory.recovery.action}:${advisory.recovery.item_id}`]}async function resolveSimilarityRecovery(result,options){const strongest=result.items[0];const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);const statusRegistry=resolveRuntimeStatusRegistry((await readSettings(pmRoot)).schema);if(isTerminalStatus(strongest.status,statusRegistry)){return{action:"reopen",item_id:strongest.id,command:`pm item reopen ${strongest.id} "<recurrence reason>"`,args:["item","reopen",strongest.id,"<recurrence reason>"]}}return{action:"reuse",item_id:strongest.id,command:`pm get ${strongest.id} --full`,args:["get",strongest.id,"--full"]}}function validateSimilarityOptions(options){const limit=options.limit??DEFAULT_SIMILARITY_LIMIT;const threshold=options.threshold??DEFAULT_SIMILARITY_THRESHOLD;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_SIMILARITY_LIMIT){throw new PmCliError(`Similarity limit must be an integer from 0 to ${MAX_SIMILARITY_LIMIT}.`,EXIT_CODE.USAGE)}if(!Number.isFinite(threshold)||threshold<0||threshold>1){throw new PmCliError("Similarity threshold must be a number from 0 to 1.",EXIT_CODE.USAGE)}return{limit,threshold}}function validateDuplicateClusterOptions(options){const limit=options.limit??DEFAULT_DUPLICATE_CLUSTER_LIMIT;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_DUPLICATE_CLUSTER_LIMIT){throw new PmCliError(`Duplicate cluster limit must be an integer from 0 to ${MAX_DUPLICATE_CLUSTER_LIMIT}.`,EXIT_CODE.USAGE)}const since=options.since===void 0?void 0:new Date(options.since);if(since&&Number.isNaN(since.getTime())){throw new PmCliError("Duplicate cluster --since must be a valid ISO timestamp.",EXIT_CODE.USAGE)}return{limit,since}}async function loadDuplicateItems(options,since){const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings);const requestedStatuses=options.statuses?.map(status=>status.trim().toLowerCase()).filter(Boolean);if(options.statuses!==void 0&&requestedStatuses?.length===0){throw new PmCliError("Duplicate cluster statuses must include at least one lifecycle status or all.",EXIT_CODE.USAGE)}const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const normalizedStatuses=requestedStatuses?.map(status=>{if(status==="all")return status;const normalized=normalizeStatusInput(status,statusRegistry);if(!normalized){throw new PmCliError(`Unknown duplicate-cluster status "${status}". Allowed: all, ${statusRegistry.definitions.map(entry=>entry.id).join(", ")}.`,EXIT_CODE.USAGE)}return normalized});const hasAll=normalizedStatuses?.includes("all")===true;if(hasAll&&normalizedStatuses?.some(status=>status!=="all")){throw new PmCliError('The "all" status cannot be combined with other statuses.',EXIT_CODE.USAGE)}const effectiveStatuses=hasAll?void 0:normalizedStatuses;const allowedStatuses=effectiveStatuses?new Set(effectiveStatuses):void 0;return{items:(await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema)).filter(item=>(!allowedStatuses||allowedStatuses.has(item.status))&&(!since||new Date(item.created_at).getTime()>=since.getTime())),statuses:effectiveStatuses}}const _testOnlySimilarity={buildDuplicateClusters,collectDuplicateCandidatePairs,createDuplicateUnionFind};function createDuplicateUnionFind(size){const parent=Array.from({length:size},(_entry,index)=>index);const findRoot=index=>{let root=index;while(parent[root]!==root)root=parent[root];while(parent[index]!==index){const next=parent[index];parent[index]=root;index=next}return root};return{parent,findRoot}}function scoreDuplicateCandidates(items,candidates,threshold,union){const matches=[];for(const candidate of candidates){const[leftIndex,rightIndex]=candidate.split(":").map(value=>Number.parseInt(value,10));const scored=scorePreparedItemSimilarity(items[leftIndex].prepared,items[rightIndex].prepared);if(scored.score<threshold)continue;const leftRoot=union.findRoot(leftIndex);const rightRoot=union.findRoot(rightIndex);if(leftRoot!==rightRoot)union.parent[rightRoot]=leftRoot;matches.push({left_id:items[leftIndex].item.id,right_id:items[rightIndex].item.id,...scored})}return matches}function buildDuplicateClusters(items,matches,union,limit){const components=new Map;for(const index of items.keys()){const root=union.findRoot(index);const component=components.get(root)??[];component.push(index);components.set(root,component)}const rootsById=new Map(items.map(({item},index)=>[item.id,union.findRoot(index)]));const matchesByRoot=new Map;for(const match of matches){const root=rootsById.get(match.left_id);const rows=matchesByRoot.get(root)??[];rows.push(match);matchesByRoot.set(root,rows)}return[...components.values()].filter(component=>component.length>1).map(component=>{const clusterMatches=(matchesByRoot.get(union.findRoot(component[0]))??[]).sort((left,right)=>right.score-left.score||left.left_id.localeCompare(right.left_id)||left.right_id.localeCompare(right.right_id));return{id:items[component[0]].item.id,items:component.map(itemIndex=>{const item=items[itemIndex].item;return{id:item.id,title:item.title,status:item.status,type:item.type}}),matches:clusterMatches,max_score:clusterMatches[0]?.score??0}}).sort((left,right)=>right.max_score-left.max_score||left.id.localeCompare(right.id)).slice(0,limit)}function rankSimilarItems(title,candidates,excludedIds,threshold,limit){return candidates.filter(item=>!excludedIds.has(item.id)).map(item=>({id:item.id,title:item.title,status:item.status,type:item.type,...scoreItemSimilarity(title,item.title)})).filter(item=>item.score>=threshold).sort((left,right)=>right.score-left.score||left.id.localeCompare(right.id)).slice(0,limit)}async function findSimilarItems(candidate,options={}){const title=candidate.title.trim();if(title.length===0){throw new PmCliError("Similarity candidate title must not be empty.",EXIT_CODE.USAGE)}const{limit,threshold}=validateSimilarityOptions(options);const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings);const indexState=await readItemMetadataDerivedIndexState(pmRoot,Object.values(typeRegistry.type_to_folder));const tokens=tokenizeSimilarityText(title);const indexed=indexState&&tokens.length>0?await querySimilarItemMetadataIndex({pmRoot,expectedSourceCursor:indexState.source_cursor,query:tokens.map(token=>`"${token.replaceAll('"','""')}"`).join(" OR "),limit:Math.max(limit*10,50)}):null;const candidates=indexed===null?await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):indexed.items;const items=rankSimilarItems(title,candidates,new Set(candidate.excludeIds??[]),threshold,limit);return{items,count:items.length,threshold,source:indexed?"persistent_index":"metadata_fallback"}}function analyzeDuplicateItems(input,options={}){const{threshold}=validateSimilarityOptions({...options,limit:void 0});const{limit}=validateDuplicateClusterOptions(options);const ids=new Set;for(const item of input){if(!item.id.trim()||ids.has(item.id)){throw new PmCliError("Duplicate analysis requires unique non-empty item ids.",EXIT_CODE.USAGE)}ids.add(item.id)}const items=[...input].sort((left,right)=>left.id.localeCompare(right.id)).map(item=>({item,prepared:prepareSimilarityText(item.title)}));const candidates=collectDuplicateCandidatePairs(items,MAX_DUPLICATE_CANDIDATE_PAIRS,threshold,options.exhaustive===true);const union=createDuplicateUnionFind(items.length);const matches=scoreDuplicateCandidates(items,candidates,threshold,union);const clusters=buildDuplicateClusters(items,matches,union,limit);return{clusters,count:clusters.length,threshold,cost:{item_count:items.length,algorithm:options.exhaustive===true||threshold===0?"exhaustive":"prefix_exact",possible_pairs:items.length*(items.length-1)/2,pair_limit:MAX_DUPLICATE_CANDIDATE_PAIRS,recall_guarantee:"exact",candidate_pairs:candidates.size,scored_pairs:candidates.size}}}async function findDuplicateClusters(options={}){validateSimilarityOptions({...options,limit:void 0});const{since}=validateDuplicateClusterOptions(options);const{items,statuses}=await loadDuplicateItems(options,since);return{...analyzeDuplicateItems(items,options),source:"metadata_scan",filters:{statuses:statuses??null,since:options.since??null}}}async function evaluateSimilarityGovernance(candidate,options){if(options.mode==="off")return void 0;const result=await findSimilarItems(candidate,options);if(result.count===0)return void 0;const recovery=await resolveSimilarityRecovery(result,options);const bypassed=options.mode==="strict"&&options.allowDuplicate===true;if(options.mode==="strict"&&!bypassed){const candidates=result.items.map(item=>`${item.id} (${item.status}): ${item.title}`).join("; ");const recoveryInstruction=recovery.action==="reopen"?"Reopen the canonical item":"Reuse the canonical item";throw new PmCliError(`Likely duplicate item(s) found: ${candidates}. ${recoveryInstruction} or pass --allow-duplicate with explicit intent.`,EXIT_CODE.CONFLICT,{code:"likely_duplicate",required:`${recoveryInstruction}, or explicitly acknowledge the duplicate with --allow-duplicate.`,recovery:{suggested_flags:["--allow-duplicate"],suggested_retry:recovery.command,suggested_retry_args:recovery.args}})}return{mode:options.mode,bypassed,result,recovery}}export{_testOnlySimilarity,analyzeDuplicateItems,evaluateSimilarityGovernance,findDuplicateClusters,findSimilarItems,jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText2 as prepareSimilarityText,scoreItemSimilarity2 as scoreItemSimilarity,scorePreparedItemSimilarity2 as scorePreparedItemSimilarity,similarityAdvisoryWarnings,tokenizeSimilarityText2 as tokenizeSimilarityText};
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]="a5f450bd-8970-5b1b-8250-b76b7818e6e1")}catch{}})();import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isTerminalStatus,normalizeStatusInput}from"../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{listAllItemMetadataLight}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{querySimilarItemMetadataIndex}from"../core/store/item-metadata-query-index.js";import{collectDuplicateCandidatePairs,MAX_DUPLICATE_CANDIDATE_PAIRS}from"./query/duplicate-candidates.js";import{prepareSimilarityText,scoreItemSimilarity,scorePreparedItemSimilarity,tokenizeSimilarityText}from"./similarity-scoring.js";import{jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText as prepareSimilarityText2,scoreItemSimilarity as scoreItemSimilarity2,scorePreparedItemSimilarity as scorePreparedItemSimilarity2,tokenizeSimilarityText as tokenizeSimilarityText2}from"./similarity-scoring.js";const DEFAULT_SIMILARITY_LIMIT=3,MAX_SIMILARITY_LIMIT=20,DEFAULT_SIMILARITY_THRESHOLD=.8,DEFAULT_DUPLICATE_CLUSTER_LIMIT=100,MAX_DUPLICATE_CLUSTER_LIMIT=1e3;function similarityAdvisoryWarnings(advisory){return advisory===void 0?[]:[`likely_duplicates:${advisory.result.items.map(item=>item.id).join(",")}`,`likely_duplicate_recovery:${advisory.recovery.action}:${advisory.recovery.item_id}`]}async function resolveSimilarityRecovery(result,options){const strongest=result.items[0],pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot),statusRegistry=resolveRuntimeStatusRegistry((await readSettings(pmRoot)).schema);return isTerminalStatus(strongest.status,statusRegistry)?{action:"reopen",item_id:strongest.id,command:`pm item reopen ${strongest.id} "<recurrence reason>"`,args:["item","reopen",strongest.id,"<recurrence reason>"]}:{action:"reuse",item_id:strongest.id,command:`pm get ${strongest.id} --full`,args:["get",strongest.id,"--full"]}}function validateSimilarityOptions(options){const limit=options.limit??DEFAULT_SIMILARITY_LIMIT,threshold=options.threshold??DEFAULT_SIMILARITY_THRESHOLD;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_SIMILARITY_LIMIT)throw new PmCliError(`Similarity limit must be an integer from 0 to ${MAX_SIMILARITY_LIMIT}.`,EXIT_CODE.USAGE);if(!Number.isFinite(threshold)||threshold<0||threshold>1)throw new PmCliError("Similarity threshold must be a number from 0 to 1.",EXIT_CODE.USAGE);return{limit,threshold}}function validateDuplicateClusterOptions(options){const limit=options.limit??DEFAULT_DUPLICATE_CLUSTER_LIMIT;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_DUPLICATE_CLUSTER_LIMIT)throw new PmCliError(`Duplicate cluster limit must be an integer from 0 to ${MAX_DUPLICATE_CLUSTER_LIMIT}.`,EXIT_CODE.USAGE);const since=options.since===void 0?void 0:new Date(options.since);if(since&&Number.isNaN(since.getTime()))throw new PmCliError("Duplicate cluster --since must be a valid ISO timestamp.",EXIT_CODE.USAGE);return{limit,since}}async function loadDuplicateItems(options,since){const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot),settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings),requestedStatuses=options.statuses?.map(status=>status.trim().toLowerCase()).filter(Boolean);if(options.statuses!==void 0&&requestedStatuses?.length===0)throw new PmCliError("Duplicate cluster statuses must include at least one lifecycle status or all.",EXIT_CODE.USAGE);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema),normalizedStatuses=requestedStatuses?.map(status=>{if(status==="all")return status;const normalized=normalizeStatusInput(status,statusRegistry);if(!normalized)throw new PmCliError(`Unknown duplicate-cluster status "${status}". Allowed: all, ${statusRegistry.definitions.map(entry=>entry.id).join(", ")}.`,EXIT_CODE.USAGE);return normalized}),hasAll=normalizedStatuses?.includes("all")===!0;if(hasAll&&normalizedStatuses?.some(status=>status!=="all"))throw new PmCliError('The "all" status cannot be combined with other statuses.',EXIT_CODE.USAGE);const effectiveStatuses=hasAll?void 0:normalizedStatuses,allowedStatuses=effectiveStatuses?new Set(effectiveStatuses):void 0;return{items:(await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema)).filter(item=>(!allowedStatuses||allowedStatuses.has(item.status))&&(!since||new Date(item.created_at).getTime()>=since.getTime())),statuses:effectiveStatuses}}const _testOnlySimilarity={buildDuplicateClusters,collectDuplicateCandidatePairs,createDuplicateUnionFind};function createDuplicateUnionFind(size){const parent=Array.from({length:size},(_entry,index)=>index);return{parent,findRoot:index=>{let root=index;for(;parent[root]!==root;)root=parent[root];for(;parent[index]!==index;){const next=parent[index];parent[index]=root,index=next}return root}}}function scoreDuplicateCandidates(items,candidates,threshold,union){const matches=[];for(const candidate of candidates){const[leftIndex,rightIndex]=candidate.split(":").map(value=>Number.parseInt(value,10)),scored=scorePreparedItemSimilarity(items[leftIndex].prepared,items[rightIndex].prepared);if(scored.score<threshold)continue;const leftRoot=union.findRoot(leftIndex),rightRoot=union.findRoot(rightIndex);leftRoot!==rightRoot&&(union.parent[rightRoot]=leftRoot),matches.push({left_id:items[leftIndex].item.id,right_id:items[rightIndex].item.id,...scored})}return matches}function buildDuplicateClusters(items,matches,union,limit){const components=new Map;for(const index of items.keys()){const root=union.findRoot(index),component=components.get(root)??[];component.push(index),components.set(root,component)}const rootsById=new Map(items.map(({item},index)=>[item.id,union.findRoot(index)])),matchesByRoot=new Map;for(const match of matches){const root=rootsById.get(match.left_id),rows=matchesByRoot.get(root)??[];rows.push(match),matchesByRoot.set(root,rows)}return[...components.values()].filter(component=>component.length>1).map(component=>{const clusterMatches=(matchesByRoot.get(union.findRoot(component[0]))??[]).sort((left,right)=>right.score-left.score||left.left_id.localeCompare(right.left_id)||left.right_id.localeCompare(right.right_id));return{id:items[component[0]].item.id,items:component.map(itemIndex=>{const item=items[itemIndex].item;return{id:item.id,title:item.title,status:item.status,type:item.type}}),matches:clusterMatches,max_score:clusterMatches[0]?.score??0}}).sort((left,right)=>right.max_score-left.max_score||left.id.localeCompare(right.id)).slice(0,limit)}function rankSimilarItems(title,candidates,excludedIds,threshold,limit){return candidates.filter(item=>!excludedIds.has(item.id)).map(item=>({id:item.id,title:item.title,status:item.status,type:item.type,...scoreItemSimilarity(title,item.title)})).filter(item=>item.score>=threshold).sort((left,right)=>right.score-left.score||left.id.localeCompare(right.id)).slice(0,limit)}async function findSimilarItems(candidate,options={}){const title=candidate.title.trim();if(title.length===0)throw new PmCliError("Similarity candidate title must not be empty.",EXIT_CODE.USAGE);const{limit,threshold}=validateSimilarityOptions(options),pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot),settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings),indexState=await readItemMetadataDerivedIndexState(pmRoot,Object.values(typeRegistry.type_to_folder)),tokens=tokenizeSimilarityText(title),indexed=indexState&&tokens.length>0?await querySimilarItemMetadataIndex({pmRoot,expectedSourceCursor:indexState.source_cursor,query:tokens.map(token=>`"${token.replaceAll('"','""')}"`).join(" OR "),limit:Math.max(limit*10,50)}):null,candidates=indexed===null?await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):indexed.items,items=rankSimilarItems(title,candidates,new Set(candidate.excludeIds??[]),threshold,limit);return{items,count:items.length,threshold,source:indexed?"persistent_index":"metadata_fallback"}}function analyzeDuplicateItems(input,options={}){const{threshold}=validateSimilarityOptions({...options,limit:void 0}),{limit}=validateDuplicateClusterOptions(options),ids=new Set;for(const item of input){if(!item.id.trim()||ids.has(item.id))throw new PmCliError("Duplicate analysis requires unique non-empty item ids.",EXIT_CODE.USAGE);ids.add(item.id)}const items=[...input].sort((left,right)=>left.id.localeCompare(right.id)).map(item=>({item,prepared:prepareSimilarityText(item.title)})),candidates=collectDuplicateCandidatePairs(items,MAX_DUPLICATE_CANDIDATE_PAIRS,threshold,options.exhaustive===!0),union=createDuplicateUnionFind(items.length),matches=scoreDuplicateCandidates(items,candidates,threshold,union),clusters=buildDuplicateClusters(items,matches,union,limit);return{clusters,count:clusters.length,threshold,cost:{item_count:items.length,algorithm:options.exhaustive===!0||threshold===0?"exhaustive":"prefix_exact",possible_pairs:items.length*(items.length-1)/2,pair_limit:MAX_DUPLICATE_CANDIDATE_PAIRS,recall_guarantee:"exact",candidate_pairs:candidates.size,scored_pairs:candidates.size}}}async function findDuplicateClusters(options={}){validateSimilarityOptions({...options,limit:void 0});const{since}=validateDuplicateClusterOptions(options),{items,statuses}=await loadDuplicateItems(options,since);return{...analyzeDuplicateItems(items,options),source:"metadata_scan",filters:{statuses:statuses??null,since:options.since??null}}}async function evaluateSimilarityGovernance(candidate,options){if(options.mode==="off")return;const result=await findSimilarItems(candidate,options);if(result.count===0)return;const recovery=await resolveSimilarityRecovery(result,options),bypassed=options.mode==="strict"&&options.allowDuplicate===!0;if(options.mode==="strict"&&!bypassed){const candidates=result.items.map(item=>`${item.id} (${item.status}): ${item.title}`).join("; "),recoveryInstruction=recovery.action==="reopen"?"Reopen the canonical item":"Reuse the canonical item";throw new PmCliError(`Likely duplicate item(s) found: ${candidates}. ${recoveryInstruction} or pass --allow-duplicate with explicit intent.`,EXIT_CODE.CONFLICT,{code:"likely_duplicate",required:`${recoveryInstruction}, or explicitly acknowledge the duplicate with --allow-duplicate.`,recovery:{suggested_flags:["--allow-duplicate"],suggested_retry:recovery.command,suggested_retry_args:recovery.args}})}return{mode:options.mode,bypassed,result,recovery}}export{_testOnlySimilarity,analyzeDuplicateItems,evaluateSimilarityGovernance,findDuplicateClusters,findSimilarItems,jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText2 as prepareSimilarityText,scoreItemSimilarity2 as scoreItemSimilarity,scorePreparedItemSimilarity2 as scorePreparedItemSimilarity,similarityAdvisoryWarnings,tokenizeSimilarityText2 as tokenizeSimilarityText};
2
2
  //# sourceMappingURL=similarity.js.map
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="961c1918-75f9-5e5d-bbae-b333ca29534f")}catch(e2){}})();import{normalizeStatusInputWithRegistry}from"../core/schema/runtime-schema.js";function resolveStartTaskInProgressStatus(statusRegistry){return normalizeStatusInputWithRegistry("in_progress",statusRegistry)??statusRegistry.open_status}export{resolveStartTaskInProgressStatus};
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]="961c1918-75f9-5e5d-bbae-b333ca29534f")}catch{}})();import{normalizeStatusInputWithRegistry}from"../core/schema/runtime-schema.js";function resolveStartTaskInProgressStatus(statusRegistry){return normalizeStatusInputWithRegistry("in_progress",statusRegistry)??statusRegistry.open_status}export{resolveStartTaskInProgressStatus};
2
2
  //# sourceMappingURL=start-task-status.js.map
package/dist/sdk/stats.js CHANGED
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a567e72a-faff-580d-b9ae-e2ebfa492b89")}catch(e2){}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,runActiveOnReadHooks}from"../core/extensions/index.js";import{computeContentFieldUtilization}from"../core/governance/content-fields.js";import{computeMetadataCoverage,groupItemsByDimension,lifecycleClassifierFromStatusRegistry}from"../core/governance/metadata-coverage.js";import{pathExists,readFileIfExists}from"../core/fs/fs-utils.js";import{enforceHistoryStreamPolicyForItems}from"../core/history/history-stream-policy.js";import{computeHistoryStorageStats}from"../core/history/history-storage-stats.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{nowIso}from"../core/shared/time.js";import{listAllItemMetadataLight,listAllItemMetadataWithBody}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{recordImprovementObservation,readImprovementLedger}from"./improvement-ledger.js";import{projectFleetAttributionAnalytics,projectProvenanceCoverageAnalytics,readHistoryAnalyticsWindow}from"./history-analytics.js";import{parseTestRunMeasurements}from"./test/measurements.js";function zeroByType(itemTypes){return itemTypes.reduce((acc,value)=>{acc[value]=0;return acc},{})}function zeroByStatus(statuses){return statuses.reduce((acc,value)=>{acc[value]=0;return acc},{})}function projectStatsDistributions(items,itemTypes,statuses,classifier,includeEmpty){const grouped=groupItemsByDimension(items,"type",classifier);const presentTypes=new Set(grouped.rows.map(row=>row.key));const missingTypes=itemTypes.filter(type=>!presentTypes.has(type));const groupedRows=includeEmpty?[...grouped.rows,...missingTypes.map(type=>({label:type,key:type,total:0,buckets:{open:0,in_progress:0,blocked:0,draft:0,closed:0,canceled:0,other:0}}))]:grouped.rows;const byType=groupedRows.map(row=>({type:row.key??row.label,total:row.total,open:row.buckets.open,in_progress:row.buckets.in_progress,blocked:row.buckets.blocked,draft:row.buckets.draft,closed:row.buckets.closed,canceled:row.buckets.canceled,other:row.buckets.other}));const counts=zeroByStatus([...statuses]);for(const item of items)counts[item.status]+=1;const byStatus=Object.fromEntries(Object.entries(counts).filter(([,count])=>includeEmpty||count>0));return{byType,byStatus,omitted:includeEmpty?0:missingTypes.length+Object.values(counts).filter(count=>count===0).length}}function countNonEmptyLines(raw){if(raw.trim().length===0){return 0}return raw.split(/\r?\n/u).filter(line=>line.trim().length>0).length}async function readHistoryStreamContents(pmRoot){const historyDir=path.join(pmRoot,"history");if(!await pathExists(historyDir)){return[]}await runActiveOnReadHooks({path:historyDir,scope:"project"});const historyFiles=(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((a,b)=>a.localeCompare(b));const streams=[];for(const file of historyFiles){const historyPath=path.join(historyDir,file);const raw=await readFileIfExists(historyPath);if(raw===null){continue}await runActiveOnReadHooks({path:historyPath,scope:"project"});streams.push({id:file.slice(0,-".jsonl".length),raw})}return streams}const _testOnly={zeroByType,zeroByStatus,countNonEmptyLines,readHistoryStreamContents,projectStatsDistributions};async function recordStatsObservations(global2,options){const recorded=[];const observedAt=nowIso();for(const measurement of parseTestRunMeasurements(options.observe,observedAt)){recorded.push(await recordImprovementObservation({metric:measurement.name,value:measurement.value,direction:options.direction,unit:measurement.unit,threshold:measurement.threshold,source:options.measurementSource,itemId:options.measurementItem,revision:options.measurementRevision,observedAt,author:options.author,message:options.message},global2))}return recorded}function requestedBreakdowns(items,options,classifier){const breakdowns={};if(options.byAssignee){breakdowns.assignee=groupItemsByDimension(items,"assignee",classifier)}if(options.byTag){breakdowns.tag=groupItemsByDimension(items,"tag",classifier,{tagPrefix:options.tagPrefix})}if(options.byPriority){breakdowns.priority=groupItemsByDimension(items,"priority",classifier)}return breakdowns}async function requestedHistoryAnalytics(pmRoot,items,settings,terminalStatuses,options){const historyOptions={since:options.since,eventLimit:options.eventLimit,minimumSample:options.minimumSample};const sharedWindow=options.provenanceCoverage||options.fleetAttribution?await readHistoryAnalyticsWindow(pmRoot,historyOptions):void 0;return{provenanceCoverage:options.provenanceCoverage&&sharedWindow?projectProvenanceCoverageAnalytics(sharedWindow,settings.agent_identity?.harness_signals,historyOptions):void 0,fleetAttribution:options.fleetAttribution&&sharedWindow?projectFleetAttributionAnalytics(sharedWindow,items,terminalStatuses,historyOptions):void 0}}function assembleStatsResult(totals,byType,byStatus,omittedZeroBuckets,optional){const hasBreakdowns=Object.keys(optional.breakdowns).length>0;return{totals,by_type:byType,by_status:byStatus,omitted_zero_buckets:omittedZeroBuckets,...optional.metadataCoverage?{metadata_coverage:optional.metadataCoverage}:{},...hasBreakdowns?{breakdowns:optional.breakdowns}:{},...optional.storage?{storage:optional.storage}:{},...optional.fieldUtilization?{field_utilization:optional.fieldUtilization}:{},...optional.improvementLedger?{improvement_ledger:optional.improvementLedger}:{},...optional.recordedObservations.length>0?{recorded_observations:optional.recordedObservations}:{},...optional.provenanceCoverage?{provenance_coverage:optional.provenanceCoverage}:{},...optional.fleetAttribution?{fleet_attribution:optional.fleetAttribution}:{},generated_at:nowIso()}}async function runStats(global2,options={}){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const recordedObservations=await recordStatsObservations(global2,options);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const items=options.fieldUtilization?await listAllItemMetadataWithBody(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema);await enforceHistoryStreamPolicyForItems({pmRoot,settings,itemIds:items.map(item=>item.id),commandLabel:"stats"});const classifier=lifecycleClassifierFromStatusRegistry(statusRegistry);const distributions=projectStatsDistributions(items,typeRegistry.types,statusRegistry.definitions.map(definition=>definition.id),classifier,options.includeEmpty===true);const streams=await readHistoryStreamContents(pmRoot);let historyEntries=0;for(const stream of streams){historyEntries+=countNonEmptyLines(stream.raw)}const storage=options.storage?computeHistoryStorageStats(streams):void 0;const metadataCoverage=options.metadataCoverage?computeMetadataCoverage(items,classifier):void 0;const breakdowns=requestedBreakdowns(items,options,classifier);const fieldUtilization=options.fieldUtilization?computeContentFieldUtilization(items):void 0;const improvementLedger=options.measurements===true||recordedObservations.length>0?await readImprovementLedger({pmRoot,metric:options.metric,itemId:options.measurementItem,limit:options.measurementLimit}):void 0;const{provenanceCoverage,fleetAttribution}=await requestedHistoryAnalytics(pmRoot,items,settings,statusRegistry.terminal_statuses,options);return assembleStatsResult({items:items.length,history_streams:streams.length,history_entries:historyEntries},distributions.byType,distributions.byStatus,distributions.omitted,{metadataCoverage,breakdowns,storage,fieldUtilization,improvementLedger,recordedObservations,provenanceCoverage,fleetAttribution})}export{_testOnly,runStats};
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]="b9d089ef-bca9-547f-a860-4002ec181cd0")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,runActiveOnReadHooks}from"../core/extensions/index.js";import{computeContentFieldUtilization}from"../core/governance/content-fields.js";import{computeMetadataCoverage,groupItemsByDimension,lifecycleClassifierFromStatusRegistry}from"../core/governance/metadata-coverage.js";import{pathExists,readFileIfExists}from"../core/fs/fs-utils.js";import{enforceHistoryStreamPolicyForItems}from"../core/history/history-stream-policy.js";import{computeHistoryStorageStats}from"../core/history/history-storage-stats.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{nowIso}from"../core/shared/time.js";import{listAllItemMetadataLight,listAllItemMetadataWithBody}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{recordImprovementObservation,readImprovementLedger}from"./improvement-ledger.js";import{projectFleetAttributionAnalytics,projectProvenanceCoverageAnalytics,readHistoryAnalyticsWindow}from"./history-analytics.js";import{parseTestRunMeasurements}from"./test/measurements.js";function zeroByType(itemTypes){return itemTypes.reduce((acc,value)=>(acc[value]=0,acc),{})}function zeroByStatus(statuses){return statuses.reduce((acc,value)=>(acc[value]=0,acc),{})}function projectStatsDistributions(items,itemTypes,statuses,classifier,includeEmpty){const grouped=groupItemsByDimension(items,"type",classifier),presentTypes=new Set(grouped.rows.map(row=>row.key)),missingTypes=itemTypes.filter(type=>!presentTypes.has(type)),byType=(includeEmpty?[...grouped.rows,...missingTypes.map(type=>({label:type,key:type,total:0,buckets:{open:0,in_progress:0,blocked:0,draft:0,closed:0,canceled:0,other:0}}))]:grouped.rows).map(row=>({type:row.key??row.label,total:row.total,open:row.buckets.open,in_progress:row.buckets.in_progress,blocked:row.buckets.blocked,draft:row.buckets.draft,closed:row.buckets.closed,canceled:row.buckets.canceled,other:row.buckets.other})),counts=zeroByStatus([...statuses]);for(const item of items)counts[item.status]+=1;const byStatus=Object.fromEntries(Object.entries(counts).filter(([,count])=>includeEmpty||count>0));return{byType,byStatus,omitted:includeEmpty?0:missingTypes.length+Object.values(counts).filter(count=>count===0).length}}function countNonEmptyLines(raw){return raw.trim().length===0?0:raw.split(/\r?\n/u).filter(line=>line.trim().length>0).length}async function readHistoryStreamContents(pmRoot){const historyDir=path.join(pmRoot,"history");if(!await pathExists(historyDir))return[];await runActiveOnReadHooks({path:historyDir,scope:"project"});const historyFiles=(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((a,b)=>a.localeCompare(b)),streams=[];for(const file of historyFiles){const historyPath=path.join(historyDir,file),raw=await readFileIfExists(historyPath);raw!==null&&(await runActiveOnReadHooks({path:historyPath,scope:"project"}),streams.push({id:file.slice(0,-6),raw}))}return streams}const _testOnly={zeroByType,zeroByStatus,countNonEmptyLines,readHistoryStreamContents,projectStatsDistributions};async function recordStatsObservations(global2,options){const recorded=[],observedAt=nowIso();for(const measurement of parseTestRunMeasurements(options.observe,observedAt))recorded.push(await recordImprovementObservation({metric:measurement.name,value:measurement.value,direction:options.direction,unit:measurement.unit,threshold:measurement.threshold,source:options.measurementSource,itemId:options.measurementItem,revision:options.measurementRevision,observedAt,author:options.author,message:options.message},global2));return recorded}function requestedBreakdowns(items,options,classifier){const breakdowns={};return options.byAssignee&&(breakdowns.assignee=groupItemsByDimension(items,"assignee",classifier)),options.byTag&&(breakdowns.tag=groupItemsByDimension(items,"tag",classifier,{tagPrefix:options.tagPrefix})),options.byPriority&&(breakdowns.priority=groupItemsByDimension(items,"priority",classifier)),breakdowns}async function requestedHistoryAnalytics(pmRoot,items,settings,terminalStatuses,options){const historyOptions={since:options.since,eventLimit:options.eventLimit,minimumSample:options.minimumSample},sharedWindow=options.provenanceCoverage||options.fleetAttribution?await readHistoryAnalyticsWindow(pmRoot,historyOptions):void 0;return{provenanceCoverage:options.provenanceCoverage&&sharedWindow?projectProvenanceCoverageAnalytics(sharedWindow,settings.agent_identity?.harness_signals,historyOptions):void 0,fleetAttribution:options.fleetAttribution&&sharedWindow?projectFleetAttributionAnalytics(sharedWindow,items,terminalStatuses,historyOptions):void 0}}function assembleStatsResult(totals,byType,byStatus,omittedZeroBuckets,optional){const hasBreakdowns=Object.keys(optional.breakdowns).length>0;return{totals,by_type:byType,by_status:byStatus,omitted_zero_buckets:omittedZeroBuckets,...optional.metadataCoverage?{metadata_coverage:optional.metadataCoverage}:{},...hasBreakdowns?{breakdowns:optional.breakdowns}:{},...optional.storage?{storage:optional.storage}:{},...optional.fieldUtilization?{field_utilization:optional.fieldUtilization}:{},...optional.improvementLedger?{improvement_ledger:optional.improvementLedger}:{},...optional.recordedObservations.length>0?{recorded_observations:optional.recordedObservations}:{},...optional.provenanceCoverage?{provenance_coverage:optional.provenanceCoverage}:{},...optional.fleetAttribution?{fleet_attribution:optional.fleetAttribution}:{},generated_at:nowIso()}}async function runStats(global2,options={}){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),recordedObservations=await recordStatsObservations(global2,options),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),items=options.fieldUtilization?await listAllItemMetadataWithBody(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema);await enforceHistoryStreamPolicyForItems({pmRoot,settings,itemIds:items.map(item=>item.id),commandLabel:"stats"});const classifier=lifecycleClassifierFromStatusRegistry(statusRegistry),distributions=projectStatsDistributions(items,typeRegistry.types,statusRegistry.definitions.map(definition=>definition.id),classifier,options.includeEmpty===!0),streams=await readHistoryStreamContents(pmRoot);let historyEntries=0;for(const stream of streams)historyEntries+=countNonEmptyLines(stream.raw);const storage=options.storage?computeHistoryStorageStats(streams):void 0,metadataCoverage=options.metadataCoverage?computeMetadataCoverage(items,classifier):void 0,breakdowns=requestedBreakdowns(items,options,classifier),fieldUtilization=options.fieldUtilization?computeContentFieldUtilization(items):void 0,improvementLedger=options.measurements===!0||recordedObservations.length>0?await readImprovementLedger({pmRoot,metric:options.metric,itemId:options.measurementItem,limit:options.measurementLimit}):void 0,{provenanceCoverage,fleetAttribution}=await requestedHistoryAnalytics(pmRoot,items,settings,statusRegistry.terminal_statuses,options);return assembleStatsResult({items:items.length,history_streams:streams.length,history_entries:historyEntries},distributions.byType,distributions.byStatus,distributions.omitted,{metadataCoverage,breakdowns,storage,fieldUtilization,improvementLedger,recordedObservations,provenanceCoverage,fleetAttribution})}export{_testOnly,runStats};
2
2
  //# sourceMappingURL=stats.js.map
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2b75ffc0-8175-58fc-8d63-98081a68dcb8")}catch(e2){}})();import crypto from"node:crypto";import{normalizeItemId,normalizePrefix}from"../core/item/id.js";import{preserveMutationStdinTokenLiterals}from"../core/item/parse.js";import{EXIT_CODE,ITEM_PROJECT_CONTEXT_KEYS}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{CLOSE_FLAG_CONTRACTS,RELEASE_FLAG_CONTRACTS}from"./cli-contracts/flag-contracts.js";import{CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS}from"./cli-contracts/commander-mutation-options.js";const MUTATION_ROW_KEYS=["op","id","reason","options"];const REFERENCED_MUTATION_ROW_KEYS=[...MUTATION_ROW_KEYS,"ref"];const MUTATION_DOCUMENT_KEYS=["schema_version","mutations"];const MUTATION_REFERENCE_SOURCE="[a-z][a-z0-9._-]{0,63}";const MUTATION_REFERENCE_PATTERN=new RegExp(`^${MUTATION_REFERENCE_SOURCE}$`,"u");const MUTATION_DEPENDENCY_REFERENCE_PATTERN=new RegExp(`(^|,)id=@(${MUTATION_REFERENCE_SOURCE})(?=,|$)`,"gu");const flagToOptionKey=flag=>flag.slice(2).replaceAll(/-([a-z])/gu,(_match,letter)=>letter.toUpperCase());const ITEM_ENVELOPE_KEYS=["item","linked","schedule","claim_state","children","omission_receipt","row_contract","context_intent"];const READ_ONLY_ITEM_KEYS=new Set(["created_at","updated_at","closed_at","version","format_version","path","author","collection_counts","notes_count","tests_count"]);const UPDATE_READ_ONLY_ITEM_KEYS=new Set([...READ_ONLY_ITEM_KEYS,"completed_at","id"]);const ITEM_FIELD_KEYS=new Set(["id","title","description","type","status","priority","tags","body","deadline","estimated_minutes","acceptance_criteria","definition_of_ready","order","rank","assignee",...ITEM_PROJECT_CONTEXT_KEYS,"affected_version","fixed_version","component","regression","customer_impact","close_reason","completed_at","dependencies","comments","notes","learnings","files","tests","docs","reminders","events","type_options"]);const MUTATION_OPTION_KEYS={create:CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(contract=>contract.target),update:UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(contract=>contract.target),close:CLOSE_FLAG_CONTRACTS.map(contract=>flagToOptionKey(contract.flag)).filter(key=>key!=="reason"),release:RELEASE_FLAG_CONTRACTS.map(contract=>flagToOptionKey(contract.flag))};function parseAtomicMutationControls(value){const controls={};const compensation=value.createCompensation;if(compensation!==void 0){if(compensation!=="close"&&compensation!=="delete"){throw new PmCliError("createCompensation must be close or delete.",EXIT_CODE.USAGE)}controls.createCompensation=compensation}for(const key of["lockTtlSeconds","lockWaitMs"]){const raw=value[key];if(raw===void 0)continue;const parsed=typeof raw==="number"||typeof raw==="string"&&raw.trim().length>0?Number(raw):Number.NaN;if(!Number.isSafeInteger(parsed)||parsed<=0){throw new PmCliError(`${key} must be a positive safe integer.`,EXIT_CODE.USAGE)}controls[key]=parsed}return controls}function isPlainObject(value){if(typeof value!=="object"||value===null||Array.isArray(value)){return false}const prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function nearestKey(key,candidates){const limit=Math.max(1,Math.min(3,Math.floor(key.length/4)+1));let best;for(const candidate of candidates){const distance=levenshteinDistanceWithinLimit(key,candidate,limit);if(distance!==null&&(best===void 0||distance<best.distance)){best={key:candidate,distance}}}return best?.key}function unknownKeyError(scope,key,candidates){const suggestion=nearestKey(key,candidates);return new PmCliError(suggestion===void 0?`${scope} does not recognize key "${key}". Allowed keys: ${candidates.join(", ")}.`:`${scope} does not recognize key "${key}". Did you mean "${suggestion}"?`,EXIT_CODE.USAGE,{code:"stdin_json_unknown_key",required:`Use documented ${scope} keys only.`,why:"Strict structured input prevents silent typos from creating incomplete or unintended mutations.",nextSteps:[suggestion===void 0?`Remove or correct "${key}".`:`Replace "${key}" with "${suggestion}".`]})}function parseJsonValue(input,label){try{return JSON.parse(input)}catch(error){const detail=error instanceof Error?error.message:String(error);throw new PmCliError(`${label} must be valid JSON: ${detail}`,EXIT_CODE.USAGE,{code:"stdin_json_invalid",required:`Pipe one valid JSON ${label.toLowerCase()} into stdin.`,why:"Structured mutation input must parse deterministically before any tracker write begins."})}}function validateMutationObject(value,index){if(!isPlainObject(value)){throw new PmCliError(`Mutation ${index+1} must be an object.`,EXIT_CODE.USAGE)}for(const key of Object.keys(value)){if(!MUTATION_ROW_KEYS.includes(key)){throw unknownKeyError(`mutation ${index+1}`,key,MUTATION_ROW_KEYS)}}return value}function validateMutationOptions(options,op,index){if(options===void 0)return void 0;if(!isPlainObject(options)){throw new PmCliError(`Mutation ${index+1} options must be an object.`,EXIT_CODE.USAGE)}for(const key of Object.keys(options)){if(!MUTATION_OPTION_KEYS[op].includes(key)){throw unknownKeyError(`mutation ${index+1} ${op} options`,key,MUTATION_OPTION_KEYS[op])}}return options}function validateMutationRow(value,index){const mutation=validateMutationObject(value,index);const{op,id,reason}=mutation;if(op!=="create"&&op!=="update"&&op!=="close"&&op!=="release"){throw new PmCliError(`Mutation ${index+1} op must be create, update, close, or release.`,EXIT_CODE.USAGE)}const options=validateMutationOptions(mutation.options,op,index);if(typeof id!=="string"||id.trim().length===0){throw new PmCliError(`Mutation ${index+1} requires a non-empty id.`,EXIT_CODE.USAGE)}const normalizedId=id.trim();if(op==="close"){if(typeof reason!=="string"||reason.trim().length===0){throw new PmCliError(`Mutation ${index+1} close requires a non-empty reason.`,EXIT_CODE.USAGE)}return{op,id:normalizedId,reason:reason.trim(),...options===void 0?{}:{options}}}if(op==="release"){return{op,id:normalizedId,...options===void 0?{}:{options}}}if(!isPlainObject(options)){throw new PmCliError(`Mutation ${index+1} ${op} requires an options object.`,EXIT_CODE.USAGE)}return{op,id:normalizedId,options}}function parseItemMutationBatch(input){const parsed=parseJsonValue(input,"Mutation batch");const rows=Array.isArray(parsed)?parsed:isPlainObject(parsed)&&Array.isArray(parsed.mutations)?parsed.mutations:void 0;if(rows===void 0||rows.length===0){throw new PmCliError("Mutation batch must be a non-empty JSON array or an object with a non-empty mutations array.",EXIT_CODE.USAGE)}return rows.map((row,index)=>{const mutation=validateMutationRow(row,index);if(mutation.options!==void 0){preserveMutationStdinTokenLiterals(mutation.options)}return mutation})}function deriveReferencedItemId(transactionId,reference,idPrefix){const digest=crypto.createHash("sha256").update(transactionId).update("\0").update(reference).digest("hex");const token=BigInt(`0x${digest.slice(0,16)}`).toString(36).padStart(13,"0").slice(-12);return`${normalizePrefix(idPrefix)}${token}`}function replaceExactMutationReference(value,references){if(typeof value!=="string"||!value.startsWith("@")){return value}const reference=value.slice(1);const resolved=references[reference];if(resolved===void 0){throw new PmCliError(`Unknown mutation reference "${value}".`,EXIT_CODE.USAGE)}return resolved}function replaceDependencyReference(value,references){if(typeof value!=="string")return value;const resolvedValue=value.replace(MUTATION_DEPENDENCY_REFERENCE_PATTERN,(_match,prefix,reference)=>{const resolved=references[reference];if(resolved===void 0){throw new PmCliError(`Unknown mutation reference "@${reference}".`,EXIT_CODE.USAGE)}return`${prefix}id=${resolved}`});if(/(^|,)id=@/u.test(resolvedValue)){throw new PmCliError(`Malformed mutation reference in dependency "${value}".`,EXIT_CODE.USAGE)}return resolvedValue}function referencedAliases(value){if(typeof value!=="string")return[];if(value.startsWith("@"))return[value.slice(1)];return[...value.matchAll(MUTATION_DEPENDENCY_REFERENCE_PATTERN)].map(match=>match[1]).filter(reference=>reference!==void 0)}function assertAcyclicCreateReferences(rows){const graph=new Map;for(const row of rows){if(row.op!=="create"||typeof row.ref!=="string")continue;const mutationOptions=isPlainObject(row.options)?row.options:{};const dependencies=Array.isArray(mutationOptions.dep)?mutationOptions.dep:mutationOptions.dep===void 0?[]:[mutationOptions.dep];graph.set(row.ref,[mutationOptions.parent,mutationOptions.blockedBy,...dependencies].flatMap(referencedAliases))}const visiting=new Set;const visited=new Set;const visit=reference=>{if(visiting.has(reference)){throw new PmCliError(`Mutation reference cycle includes "@${reference}".`,EXIT_CODE.USAGE)}if(visited.has(reference))return;visiting.add(reference);for(const dependency of graph.get(reference)){if(graph.has(dependency))visit(dependency)}visiting.delete(reference);visited.add(reference)};for(const reference of graph.keys())visit(reference)}function parseMutationDocumentRows(input){const parsed=parseJsonValue(input,"Mutation document");const envelope=Array.isArray(parsed)?{schema_version:1,mutations:parsed}:parsed;if(!isPlainObject(envelope)){throw new PmCliError("Mutation document must be a JSON array or object.",EXIT_CODE.USAGE)}for(const key of Object.keys(envelope)){if(!MUTATION_DOCUMENT_KEYS.includes(key)){throw unknownKeyError("mutation document",key,MUTATION_DOCUMENT_KEYS)}}if(envelope.schema_version!==void 0&&envelope.schema_version!==1){throw new PmCliError("Mutation document schema_version must be 1.",EXIT_CODE.USAGE)}if(!Array.isArray(envelope.mutations)||envelope.mutations.length===0){throw new PmCliError("Mutation document requires a non-empty mutations array.",EXIT_CODE.USAGE)}return envelope.mutations.map((row,index)=>{if(!isPlainObject(row)){throw new PmCliError(`Mutation ${index+1} must be an object.`,EXIT_CODE.USAGE)}for(const key of Object.keys(row)){if(!REFERENCED_MUTATION_ROW_KEYS.includes(key)){throw unknownKeyError(`mutation ${index+1}`,key,REFERENCED_MUTATION_ROW_KEYS)}}return{...row}})}function collectMutationReferences(rows,options){const references=Object.create(null);for(const[index,row]of rows.entries()){if(row.ref===void 0)continue;if(row.op!=="create"){throw new PmCliError(`Mutation ${index+1} ref is only valid for create operations.`,EXIT_CODE.USAGE)}if(typeof row.ref!=="string"||!MUTATION_REFERENCE_PATTERN.test(row.ref)){throw new PmCliError(`Mutation ${index+1} ref must match ${MUTATION_REFERENCE_PATTERN.source}.`,EXIT_CODE.USAGE)}if(references[row.ref]!==void 0){throw new PmCliError(`Duplicate mutation ref "${row.ref}".`,EXIT_CODE.USAGE)}references[row.ref]=typeof row.id==="string"&&row.id.trim().length>0?normalizeItemId(row.id,options.idPrefix):deriveReferencedItemId(options.transactionId,row.ref,options.idPrefix)}return references}function resolveItemMutationDocument(input,options){const rows=parseMutationDocumentRows(input);const references=collectMutationReferences(rows,options);assertAcyclicCreateReferences(rows);const resolvedRows=rows.map(row=>{const resolved={...row};const reference=typeof resolved.ref==="string"?resolved.ref:void 0;delete resolved.ref;if(reference!==void 0){resolved.id=references[reference]}else{resolved.id=replaceExactMutationReference(resolved.id,references)}if(isPlainObject(resolved.options)){const mutationOptions={...resolved.options};for(const key of["parent","blockedBy"]){if(mutationOptions[key]!==void 0){mutationOptions[key]=replaceExactMutationReference(mutationOptions[key],references)}}if(Array.isArray(mutationOptions.dep)){mutationOptions.dep=mutationOptions.dep.map(entry=>replaceDependencyReference(entry,references))}else if(mutationOptions.dep!==void 0){mutationOptions.dep=replaceDependencyReference(mutationOptions.dep,references)}resolved.options=mutationOptions}return resolved});const mutations=parseItemMutationBatch(JSON.stringify(resolvedRows));const createIds=mutations.filter(mutation=>mutation.op==="create").map(mutation=>mutation.id);if(new Set(createIds).size!==createIds.length){throw new PmCliError("Duplicate resolved create id in mutation document.",EXIT_CODE.USAGE)}return{schema_version:1,mutations,references}}function serializePairs(value,keys){return keys.filter(key=>value[key]!==void 0&&value[key]!==null).map(key=>{const rendered=String(value[key]);return`${key}=${/[",\n\r\\]/u.test(rendered)?JSON.stringify(rendered):rendered}`}).join(",")}function serializeObjectArray(value,keys,label){if(value===void 0)return void 0;if(!Array.isArray(value)||!value.every(isPlainObject)){throw new PmCliError(`${label} must be an array of objects.`,EXIT_CODE.USAGE)}return value.map(entry=>serializePairs(entry,keys))}function scalarItemOption(key,value){if(key==="tags"&&Array.isArray(value)&&value.every(entry=>typeof entry==="string")){return JSON.stringify(value)}if(typeof value==="number"||typeof value==="boolean"){return String(value)}return value}function appendFacetOptions(target,source,skipPersistedAnnotations=false){const mappings=[["dependencies","dep",["id","kind","created_at","author","source_kind"]],["comments","comment",["text","created_at","author"]],["notes","note",["text","created_at","author"]],["learnings","learning",["text","created_at","author"]],["files","file",["path","scope","note"]],["tests","test",["command","scope","timeout_seconds"]],["docs","doc",["path","scope","note"]],["reminders","reminder",["at","text","created_at"]],["events","event",["start_at","end_at","title","location"]],["type_options","typeOption",["key","value"]]];for(const[sourceKey,targetKey,keys]of mappings){const sourceValue=source[sourceKey];const serialized=serializeObjectArray(skipPersistedAnnotations&&["comments","notes","learnings"].includes(sourceKey)&&Array.isArray(sourceValue)?sourceValue.filter(entry=>!isPlainObject(entry)||entry.created_at===void 0):sourceValue,keys,sourceKey);if(serialized!==void 0&&serialized.length>0)target[targetKey]=serialized}}function validateItemDocumentKeys(parsed,envelope){for(const key of Object.keys(parsed)){if(envelope){if(!ITEM_ENVELOPE_KEYS.includes(key))throw unknownKeyError("item envelope",key,ITEM_ENVELOPE_KEYS);continue}if(!ITEM_FIELD_KEYS.has(key)&&nearestKey(key,[...ITEM_FIELD_KEYS])===void 0&&nearestKey(key,ITEM_ENVELOPE_KEYS)==="item")throw unknownKeyError("item envelope",key,ITEM_ENVELOPE_KEYS)}}function resolveItemDocument(parsed){const envelope=Object.hasOwn(parsed,"item");validateItemDocumentKeys(parsed,envelope);const item=envelope?parsed.item:parsed;if(!isPlainObject(item)){throw new PmCliError("Item document item must be an object.",EXIT_CODE.USAGE)}return{item,...envelope&&isPlainObject(parsed.linked)?{linked:parsed.linked}:{}}}function appendItemDocumentEntry(documentOptions,key,value,mode){const readOnlyKeys=mode==="update"?UPDATE_READ_ONLY_ITEM_KEYS:READ_ONLY_ITEM_KEYS;if(readOnlyKeys.has(key))return;if(!ITEM_FIELD_KEYS.has(key)){const suggestion=nearestKey(key,[...ITEM_FIELD_KEYS]);if(suggestion!==void 0)throw unknownKeyError("item document",key,[...ITEM_FIELD_KEYS]);const fields=Array.isArray(documentOptions.field)?documentOptions.field:[];fields.push(serializePairs({key,value:typeof value==="string"?value:JSON.stringify(value)},["key","value"]));documentOptions.field=fields;return}if(["dependencies","comments","notes","learnings","files","tests","docs","reminders","events","type_options"].includes(key))return;documentOptions[key.replaceAll(/_([a-z])/gu,(_match,letter)=>letter.toUpperCase())]=scalarItemOption(key,value)}function itemDocumentToMutationOptions(input,mode,explicitOptions={}){const parsed=parseJsonValue(input,"Item document");if(!isPlainObject(parsed)){throw new PmCliError("Item document must be a JSON object.",EXIT_CODE.USAGE)}const{item,linked}=resolveItemDocument(parsed);const documentOptions={};for(const[key,value]of Object.entries(item)){appendItemDocumentEntry(documentOptions,key,value,mode)}appendFacetOptions(documentOptions,item,mode==="update");if(linked!==void 0)appendFacetOptions(documentOptions,linked);if(mode==="update"){const annotations=Object.fromEntries(["comments","notes","learnings"].filter(key=>Object.hasOwn(item,key)).map(key=>[key,item[key].filter(entry=>isPlainObject(entry)&&entry.created_at!==void 0)]));if(Object.keys(annotations).length>0){documentOptions.documentAnnotationSnapshot=annotations}}return{...documentOptions,...Object.fromEntries(Object.entries(explicitOptions).filter(([,value])=>value!==void 0)),stdinJson:void 0}}function validateItemMutationRows(value){return parseItemMutationBatch(JSON.stringify(value))}export{itemDocumentToMutationOptions,parseAtomicMutationControls,parseItemMutationBatch,resolveItemMutationDocument,validateItemMutationRows};
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]="62e0ef49-30c8-56e0-985e-49c83d14695e")}catch{}})();import crypto from"node:crypto";import{normalizeItemId,normalizePrefix}from"../core/item/id.js";import{preserveMutationStdinTokenLiterals}from"../core/item/parse.js";import{EXIT_CODE,ITEM_PROJECT_CONTEXT_KEYS}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{CLOSE_FLAG_CONTRACTS,RELEASE_FLAG_CONTRACTS}from"./cli-contracts/flag-contracts.js";import{CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS}from"./cli-contracts/commander-mutation-options.js";const MUTATION_ROW_KEYS=["op","id","reason","options"],REFERENCED_MUTATION_ROW_KEYS=[...MUTATION_ROW_KEYS,"ref"],MUTATION_DOCUMENT_KEYS=["schema_version","mutations"],MUTATION_REFERENCE_SOURCE="[a-z][a-z0-9._-]{0,63}",MUTATION_REFERENCE_PATTERN=new RegExp(`^${MUTATION_REFERENCE_SOURCE}$`,"u"),MUTATION_DEPENDENCY_REFERENCE_PATTERN=new RegExp(`(^|,)id=@(${MUTATION_REFERENCE_SOURCE})(?=,|$)`,"gu"),flagToOptionKey=flag=>flag.slice(2).replaceAll(/-([a-z])/gu,(_match,letter)=>letter.toUpperCase()),ITEM_ENVELOPE_KEYS=["item","linked","schedule","claim_state","children","omission_receipt","row_contract","context_intent"],READ_ONLY_ITEM_KEYS=new Set(["created_at","updated_at","closed_at","version","format_version","path","author","collection_counts","notes_count","tests_count"]),UPDATE_READ_ONLY_ITEM_KEYS=new Set([...READ_ONLY_ITEM_KEYS,"completed_at","id"]),ITEM_FIELD_KEYS=new Set(["id","title","description","type","status","priority","tags","body","deadline","estimated_minutes","acceptance_criteria","definition_of_ready","order","rank","assignee",...ITEM_PROJECT_CONTEXT_KEYS,"affected_version","fixed_version","component","regression","customer_impact","close_reason","completed_at","dependencies","comments","notes","learnings","files","tests","docs","reminders","events","type_options"]),MUTATION_OPTION_KEYS={create:CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(contract=>contract.target),update:UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(contract=>contract.target),close:CLOSE_FLAG_CONTRACTS.map(contract=>flagToOptionKey(contract.flag)).filter(key=>key!=="reason"),release:RELEASE_FLAG_CONTRACTS.map(contract=>flagToOptionKey(contract.flag))};function parseAtomicMutationControls(value){const controls={},compensation=value.createCompensation;if(compensation!==void 0){if(compensation!=="close"&&compensation!=="delete")throw new PmCliError("createCompensation must be close or delete.",EXIT_CODE.USAGE);controls.createCompensation=compensation}for(const key of["lockTtlSeconds","lockWaitMs"]){const raw=value[key];if(raw===void 0)continue;const parsed=typeof raw=="number"||typeof raw=="string"&&raw.trim().length>0?Number(raw):Number.NaN;if(!Number.isSafeInteger(parsed)||parsed<=0)throw new PmCliError(`${key} must be a positive safe integer.`,EXIT_CODE.USAGE);controls[key]=parsed}return controls}function isPlainObject(value){if(typeof value!="object"||value===null||Array.isArray(value))return!1;const prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function nearestKey(key,candidates){const limit=Math.max(1,Math.min(3,Math.floor(key.length/4)+1));let best;for(const candidate of candidates){const distance=levenshteinDistanceWithinLimit(key,candidate,limit);distance!==null&&(best===void 0||distance<best.distance)&&(best={key:candidate,distance})}return best?.key}function unknownKeyError(scope,key,candidates){const suggestion=nearestKey(key,candidates);return new PmCliError(suggestion===void 0?`${scope} does not recognize key "${key}". Allowed keys: ${candidates.join(", ")}.`:`${scope} does not recognize key "${key}". Did you mean "${suggestion}"?`,EXIT_CODE.USAGE,{code:"stdin_json_unknown_key",required:`Use documented ${scope} keys only.`,why:"Strict structured input prevents silent typos from creating incomplete or unintended mutations.",nextSteps:[suggestion===void 0?`Remove or correct "${key}".`:`Replace "${key}" with "${suggestion}".`]})}function parseJsonValue(input,label){try{return JSON.parse(input)}catch(error){const detail=error instanceof Error?error.message:String(error);throw new PmCliError(`${label} must be valid JSON: ${detail}`,EXIT_CODE.USAGE,{code:"stdin_json_invalid",required:`Pipe one valid JSON ${label.toLowerCase()} into stdin.`,why:"Structured mutation input must parse deterministically before any tracker write begins."})}}function validateMutationObject(value,index){if(!isPlainObject(value))throw new PmCliError(`Mutation ${index+1} must be an object.`,EXIT_CODE.USAGE);for(const key of Object.keys(value))if(!MUTATION_ROW_KEYS.includes(key))throw unknownKeyError(`mutation ${index+1}`,key,MUTATION_ROW_KEYS);return value}function validateMutationOptions(options,op,index){if(options!==void 0){if(!isPlainObject(options))throw new PmCliError(`Mutation ${index+1} options must be an object.`,EXIT_CODE.USAGE);for(const key of Object.keys(options))if(!MUTATION_OPTION_KEYS[op].includes(key))throw unknownKeyError(`mutation ${index+1} ${op} options`,key,MUTATION_OPTION_KEYS[op]);return options}}function validateMutationRow(value,index){const mutation=validateMutationObject(value,index),{op,id,reason}=mutation;if(op!=="create"&&op!=="update"&&op!=="close"&&op!=="release")throw new PmCliError(`Mutation ${index+1} op must be create, update, close, or release.`,EXIT_CODE.USAGE);const options=validateMutationOptions(mutation.options,op,index);if(typeof id!="string"||id.trim().length===0)throw new PmCliError(`Mutation ${index+1} requires a non-empty id.`,EXIT_CODE.USAGE);const normalizedId=id.trim();if(op==="close"){if(typeof reason!="string"||reason.trim().length===0)throw new PmCliError(`Mutation ${index+1} close requires a non-empty reason.`,EXIT_CODE.USAGE);return{op,id:normalizedId,reason:reason.trim(),...options===void 0?{}:{options}}}if(op==="release")return{op,id:normalizedId,...options===void 0?{}:{options}};if(!isPlainObject(options))throw new PmCliError(`Mutation ${index+1} ${op} requires an options object.`,EXIT_CODE.USAGE);return{op,id:normalizedId,options}}function parseItemMutationBatch(input){const parsed=parseJsonValue(input,"Mutation batch"),rows=Array.isArray(parsed)?parsed:isPlainObject(parsed)&&Array.isArray(parsed.mutations)?parsed.mutations:void 0;if(rows===void 0||rows.length===0)throw new PmCliError("Mutation batch must be a non-empty JSON array or an object with a non-empty mutations array.",EXIT_CODE.USAGE);return rows.map((row,index)=>{const mutation=validateMutationRow(row,index);return mutation.options!==void 0&&preserveMutationStdinTokenLiterals(mutation.options),mutation})}function deriveReferencedItemId(transactionId,reference,idPrefix){const digest=crypto.createHash("sha256").update(transactionId).update("\0").update(reference).digest("hex"),token=BigInt(`0x${digest.slice(0,16)}`).toString(36).padStart(13,"0").slice(-12);return`${normalizePrefix(idPrefix)}${token}`}function replaceExactMutationReference(value,references){if(typeof value!="string"||!value.startsWith("@"))return value;const reference=value.slice(1),resolved=references[reference];if(resolved===void 0)throw new PmCliError(`Unknown mutation reference "${value}".`,EXIT_CODE.USAGE);return resolved}function replaceDependencyReference(value,references){if(typeof value!="string")return value;const resolvedValue=value.replace(MUTATION_DEPENDENCY_REFERENCE_PATTERN,(_match,prefix,reference)=>{const resolved=references[reference];if(resolved===void 0)throw new PmCliError(`Unknown mutation reference "@${reference}".`,EXIT_CODE.USAGE);return`${prefix}id=${resolved}`});if(/(^|,)id=@/u.test(resolvedValue))throw new PmCliError(`Malformed mutation reference in dependency "${value}".`,EXIT_CODE.USAGE);return resolvedValue}function referencedAliases(value){return typeof value!="string"?[]:value.startsWith("@")?[value.slice(1)]:[...value.matchAll(MUTATION_DEPENDENCY_REFERENCE_PATTERN)].map(match=>match[1]).filter(reference=>reference!==void 0)}function assertAcyclicCreateReferences(rows){const graph=new Map;for(const row of rows){if(row.op!=="create"||typeof row.ref!="string")continue;const mutationOptions=isPlainObject(row.options)?row.options:{},dependencies=Array.isArray(mutationOptions.dep)?mutationOptions.dep:mutationOptions.dep===void 0?[]:[mutationOptions.dep];graph.set(row.ref,[mutationOptions.parent,mutationOptions.blockedBy,...dependencies].flatMap(referencedAliases))}const visiting=new Set,visited=new Set,visit=reference=>{if(visiting.has(reference))throw new PmCliError(`Mutation reference cycle includes "@${reference}".`,EXIT_CODE.USAGE);if(!visited.has(reference)){visiting.add(reference);for(const dependency of graph.get(reference))graph.has(dependency)&&visit(dependency);visiting.delete(reference),visited.add(reference)}};for(const reference of graph.keys())visit(reference)}function parseMutationDocumentRows(input){const parsed=parseJsonValue(input,"Mutation document"),envelope=Array.isArray(parsed)?{schema_version:1,mutations:parsed}:parsed;if(!isPlainObject(envelope))throw new PmCliError("Mutation document must be a JSON array or object.",EXIT_CODE.USAGE);for(const key of Object.keys(envelope))if(!MUTATION_DOCUMENT_KEYS.includes(key))throw unknownKeyError("mutation document",key,MUTATION_DOCUMENT_KEYS);if(envelope.schema_version!==void 0&&envelope.schema_version!==1)throw new PmCliError("Mutation document schema_version must be 1.",EXIT_CODE.USAGE);if(!Array.isArray(envelope.mutations)||envelope.mutations.length===0)throw new PmCliError("Mutation document requires a non-empty mutations array.",EXIT_CODE.USAGE);return envelope.mutations.map((row,index)=>{if(!isPlainObject(row))throw new PmCliError(`Mutation ${index+1} must be an object.`,EXIT_CODE.USAGE);for(const key of Object.keys(row))if(!REFERENCED_MUTATION_ROW_KEYS.includes(key))throw unknownKeyError(`mutation ${index+1}`,key,REFERENCED_MUTATION_ROW_KEYS);return{...row}})}function collectMutationReferences(rows,options){const references=Object.create(null);for(const[index,row]of rows.entries())if(row.ref!==void 0){if(row.op!=="create")throw new PmCliError(`Mutation ${index+1} ref is only valid for create operations.`,EXIT_CODE.USAGE);if(typeof row.ref!="string"||!MUTATION_REFERENCE_PATTERN.test(row.ref))throw new PmCliError(`Mutation ${index+1} ref must match ${MUTATION_REFERENCE_PATTERN.source}.`,EXIT_CODE.USAGE);if(references[row.ref]!==void 0)throw new PmCliError(`Duplicate mutation ref "${row.ref}".`,EXIT_CODE.USAGE);references[row.ref]=typeof row.id=="string"&&row.id.trim().length>0?normalizeItemId(row.id,options.idPrefix):deriveReferencedItemId(options.transactionId,row.ref,options.idPrefix)}return references}function resolveItemMutationDocument(input,options){const rows=parseMutationDocumentRows(input),references=collectMutationReferences(rows,options);assertAcyclicCreateReferences(rows);const resolvedRows=rows.map(row=>{const resolved={...row},reference=typeof resolved.ref=="string"?resolved.ref:void 0;if(delete resolved.ref,reference!==void 0?resolved.id=references[reference]:resolved.id=replaceExactMutationReference(resolved.id,references),isPlainObject(resolved.options)){const mutationOptions={...resolved.options};for(const key of["parent","blockedBy"])mutationOptions[key]!==void 0&&(mutationOptions[key]=replaceExactMutationReference(mutationOptions[key],references));Array.isArray(mutationOptions.dep)?mutationOptions.dep=mutationOptions.dep.map(entry=>replaceDependencyReference(entry,references)):mutationOptions.dep!==void 0&&(mutationOptions.dep=replaceDependencyReference(mutationOptions.dep,references)),resolved.options=mutationOptions}return resolved}),mutations=parseItemMutationBatch(JSON.stringify(resolvedRows)),createIds=mutations.filter(mutation=>mutation.op==="create").map(mutation=>mutation.id);if(new Set(createIds).size!==createIds.length)throw new PmCliError("Duplicate resolved create id in mutation document.",EXIT_CODE.USAGE);return{schema_version:1,mutations,references}}function serializePairs(value,keys){return keys.filter(key=>value[key]!==void 0&&value[key]!==null).map(key=>{const rendered=String(value[key]);return`${key}=${/[",\n\r\\]/u.test(rendered)?JSON.stringify(rendered):rendered}`}).join(",")}function serializeObjectArray(value,keys,label){if(value!==void 0){if(!Array.isArray(value)||!value.every(isPlainObject))throw new PmCliError(`${label} must be an array of objects.`,EXIT_CODE.USAGE);return value.map(entry=>serializePairs(entry,keys))}}function scalarItemOption(key,value){return key==="tags"&&Array.isArray(value)&&value.every(entry=>typeof entry=="string")?JSON.stringify(value):typeof value=="number"||typeof value=="boolean"?String(value):value}function appendFacetOptions(target,source,skipPersistedAnnotations=!1){const mappings=[["dependencies","dep",["id","kind","created_at","author","source_kind"]],["comments","comment",["text","created_at","author"]],["notes","note",["text","created_at","author"]],["learnings","learning",["text","created_at","author"]],["files","file",["path","scope","note"]],["tests","test",["command","scope","timeout_seconds"]],["docs","doc",["path","scope","note"]],["reminders","reminder",["at","text","created_at"]],["events","event",["start_at","end_at","title","location"]],["type_options","typeOption",["key","value"]]];for(const[sourceKey,targetKey,keys]of mappings){const sourceValue=source[sourceKey],serialized=serializeObjectArray(skipPersistedAnnotations&&["comments","notes","learnings"].includes(sourceKey)&&Array.isArray(sourceValue)?sourceValue.filter(entry=>!isPlainObject(entry)||entry.created_at===void 0):sourceValue,keys,sourceKey);serialized!==void 0&&serialized.length>0&&(target[targetKey]=serialized)}}function validateItemDocumentKeys(parsed,envelope){for(const key of Object.keys(parsed)){if(envelope){if(!ITEM_ENVELOPE_KEYS.includes(key))throw unknownKeyError("item envelope",key,ITEM_ENVELOPE_KEYS);continue}if(!ITEM_FIELD_KEYS.has(key)&&nearestKey(key,[...ITEM_FIELD_KEYS])===void 0&&nearestKey(key,ITEM_ENVELOPE_KEYS)==="item")throw unknownKeyError("item envelope",key,ITEM_ENVELOPE_KEYS)}}function resolveItemDocument(parsed){const envelope=Object.hasOwn(parsed,"item");validateItemDocumentKeys(parsed,envelope);const item=envelope?parsed.item:parsed;if(!isPlainObject(item))throw new PmCliError("Item document item must be an object.",EXIT_CODE.USAGE);return{item,...envelope&&isPlainObject(parsed.linked)?{linked:parsed.linked}:{}}}function appendItemDocumentEntry(documentOptions,key,value,mode){if(!(mode==="update"?UPDATE_READ_ONLY_ITEM_KEYS:READ_ONLY_ITEM_KEYS).has(key)){if(!ITEM_FIELD_KEYS.has(key)){if(nearestKey(key,[...ITEM_FIELD_KEYS])!==void 0)throw unknownKeyError("item document",key,[...ITEM_FIELD_KEYS]);const fields=Array.isArray(documentOptions.field)?documentOptions.field:[];fields.push(serializePairs({key,value:typeof value=="string"?value:JSON.stringify(value)},["key","value"])),documentOptions.field=fields;return}["dependencies","comments","notes","learnings","files","tests","docs","reminders","events","type_options"].includes(key)||(documentOptions[key.replaceAll(/_([a-z])/gu,(_match,letter)=>letter.toUpperCase())]=scalarItemOption(key,value))}}function itemDocumentToMutationOptions(input,mode,explicitOptions={}){const parsed=parseJsonValue(input,"Item document");if(!isPlainObject(parsed))throw new PmCliError("Item document must be a JSON object.",EXIT_CODE.USAGE);const{item,linked}=resolveItemDocument(parsed),documentOptions={};for(const[key,value]of Object.entries(item))appendItemDocumentEntry(documentOptions,key,value,mode);if(appendFacetOptions(documentOptions,item,mode==="update"),linked!==void 0&&appendFacetOptions(documentOptions,linked),mode==="update"){const annotations=Object.fromEntries(["comments","notes","learnings"].filter(key=>Object.hasOwn(item,key)).map(key=>[key,item[key].filter(entry=>isPlainObject(entry)&&entry.created_at!==void 0)]));Object.keys(annotations).length>0&&(documentOptions.documentAnnotationSnapshot=annotations)}return{...documentOptions,...Object.fromEntries(Object.entries(explicitOptions).filter(([,value])=>value!==void 0)),stdinJson:void 0}}function validateItemMutationRows(value){return parseItemMutationBatch(JSON.stringify(value))}export{itemDocumentToMutationOptions,parseAtomicMutationControls,parseItemMutationBatch,resolveItemMutationDocument,validateItemMutationRows};
2
2
  //# sourceMappingURL=structured-mutations.js.map
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4534b1c9-de27-5745-88f2-641b00b94714")}catch(e2){}})();import{flushTelemetryQueueNow}from"../core/telemetry/runtime.js";async function flushTelemetryQueue(){await flushTelemetryQueueNow()}export{flushTelemetryQueue};
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]="4534b1c9-de27-5745-88f2-641b00b94714")}catch{}})();import{flushTelemetryQueueNow}from"../core/telemetry/runtime.js";async function flushTelemetryQueue(){await flushTelemetryQueueNow()}export{flushTelemetryQueue};
2
2
  //# sourceMappingURL=telemetry-flush.js.map
@@ -1,4 +1,5 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3bc2412e-9aa0-55ea-bc51-97a6bb9b4763")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{pathExists,readFileIfExists,writeFileAtomic}from"../core/fs/fs-utils.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{nowIso}from"../core/shared/time.js";import{resolveGlobalPmRoot}from"../core/store/paths.js";import{readSettings,writeSettings}from"../core/store/settings.js";import{resolveTelemetryEnvironmentPolicy}from"../core/telemetry/policy.js";import{flushTelemetryQueueNow,withTelemetryQueueMutation}from"../core/telemetry/runtime.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{PM_COMMAND_ALIAS_CONTRACTS}from"./cli-contracts/command-aliases.js";const TELEMETRY_QUEUE_RELATIVE_PATH=path.join("runtime","telemetry","events.jsonl");const TELEMETRY_STATE_RELATIVE_PATH=path.join("runtime","telemetry","state.json");const TELEMETRY_RUNTIME_RELATIVE_PATH=path.join("runtime","telemetry");const DEFAULT_STATS_LIMIT=20;const DEPRECATED_ALIASES=PM_COMMAND_ALIAS_CONTRACTS.filter(contract=>contract.lifecycle==="deprecated");const TELEMETRY_SUBCOMMANDS=["status","flush","stats","clear"];const nearestRankPercentile=(sortedAscending,fraction)=>{const rank=Math.ceil(fraction*sortedAscending.length);const index=Math.min(sortedAscending.length-1,Math.max(0,rank-1));return sortedAscending[index]};const normalizeTelemetryText=(value,fallback)=>{if(typeof value!=="string"){return fallback}return value.trim().length>0?value:fallback};const normalizeFiniteInteger=value=>{if(typeof value!=="number"||!Number.isFinite(value)){return void 0}return Math.trunc(value)};const normalizeTelemetryQueueEntry=entry=>{return{command:normalizeTelemetryText(entry.event.command,"<unknown>"),eventType:normalizeTelemetryText(entry.event.event_type,"unknown"),eventSchemaVersion:normalizeFiniteInteger(entry.event.schema_version),clientSchemaVersion:normalizeFiniteInteger(entry.client_schema_version)}};const createTelemetryStatsAccumulator=()=>{return{count:0,max_attempts:0,event_type_counts:{},event_schema_versions:new Set,client_schema_versions:new Set,finish_durations_ms:[],ok_count:0,error_count:0,resolution_counts:{}}};const readTelemetryDuration=payload=>{const value=payload?.duration_ms;return typeof value==="number"&&Number.isFinite(value)?value:void 0};const readTelemetryResolution=payload=>{const value=payload?.command_resolution;return normalizeTelemetryText(value,"")||void 0};const incrementTelemetryCount=(counts,key)=>{counts[key]=(counts[key]??0)+1};const recordTelemetryFinishPayload=(current,payload)=>{const durationMs=readTelemetryDuration(payload);if(durationMs!==void 0){current.finish_durations_ms.push(durationMs)}if(payload?.ok===true){current.ok_count+=1}else{current.error_count+=1}const resolution=readTelemetryResolution(payload);if(resolution!==void 0){incrementTelemetryCount(current.resolution_counts,resolution)}};const normalizeTelemetryAttempts=attempts=>Number.isFinite(attempts)?Math.max(0,Math.trunc(attempts)):0;const addTelemetryDimension=(values,value)=>{if(value!==void 0){values.add(value)}};const recordTelemetryQueueEntry=(grouped,entry)=>{const normalized=normalizeTelemetryQueueEntry(entry);const current=grouped.get(normalized.command)??createTelemetryStatsAccumulator();current.count+=1;current.max_attempts=Math.max(current.max_attempts,normalizeTelemetryAttempts(entry.attempts));incrementTelemetryCount(current.event_type_counts,normalized.eventType);addTelemetryDimension(current.event_schema_versions,normalized.eventSchemaVersion);addTelemetryDimension(current.client_schema_versions,normalized.clientSchemaVersion);if(normalized.eventType==="command_finish"){recordTelemetryFinishPayload(current,entry.event.payload)}grouped.set(normalized.command,current)};const buildTelemetryStatsBucket=(command,value)=>{const finishCount=value.ok_count+value.error_count;const sortedDurations=[...value.finish_durations_ms].sort((left,right)=>left-right);const resolutionEntries=Object.entries(value.resolution_counts).sort((left,right)=>left[0].localeCompare(right[0]));return{command,count:value.count,event_type_counts:Object.fromEntries(Object.entries(value.event_type_counts).sort((left,right)=>left[0].localeCompare(right[0]))),max_attempts:value.max_attempts,event_schema_versions:[...value.event_schema_versions].sort((left,right)=>left-right),client_schema_versions:[...value.client_schema_versions].sort((left,right)=>left-right),...sortedDurations.length>0?{duration_p50_ms:nearestRankPercentile(sortedDurations,.5),duration_p95_ms:nearestRankPercentile(sortedDurations,.95),duration_max_ms:sortedDurations[sortedDurations.length-1]}:{},...finishCount>0?{ok_count:value.ok_count,error_count:value.error_count,error_rate:value.error_count/finishCount}:{},...resolutionEntries.length>0?{command_resolution_counts:Object.fromEntries(resolutionEntries)}:{}}};const normalizeTelemetrySubcommand=value=>{const normalized=(value??"status").trim().toLowerCase();if(TELEMETRY_SUBCOMMANDS.includes(normalized)){return normalized}throw createUnknownSubcommandError({command_path:"telemetry",token:value?.trim()||"<empty>",allowed:TELEMETRY_SUBCOMMANDS,examples:["pm telemetry status","pm telemetry flush","pm telemetry stats --limit 10","pm telemetry clear"]})};const throwInvalidTelemetryLimit=()=>{throw new PmCliError("--limit must be a positive integer",EXIT_CODE.USAGE)};const requirePositiveTelemetryLimit=value=>{if([!Number.isFinite(value),!Number.isInteger(value),value<=0].includes(true)){return throwInvalidTelemetryLimit()}return value};const parseTelemetryStringLimit=raw=>{const trimmed=raw.trim();if([trimmed.length===0,!/^\d+$/.test(trimmed)].includes(true)){return throwInvalidTelemetryLimit()}return requirePositiveTelemetryLimit(Number.parseInt(trimmed,10))};const parseTelemetryStatsLimit=raw=>{if(raw===void 0){return DEFAULT_STATS_LIMIT}if(typeof raw==="number"){return requirePositiveTelemetryLimit(raw)}if(typeof raw==="string"){return parseTelemetryStringLimit(raw)}return throwInvalidTelemetryLimit()};const isTelemetryQueueEntry=value=>{if(typeof value!=="object"||value===null){return false}const candidate=value;return typeof candidate.attempts==="number"&&typeof candidate.event==="object"&&candidate.event!==null};const parseTelemetryQueueRow=row=>{try{const parsed=JSON.parse(row);return isTelemetryQueueEntry(parsed)?parsed:void 0}catch{return void 0}};const splitTelemetryQueueRows=raw=>{if(raw===null){return[]}return raw.split("\n").map(line=>line.trim()).filter(line=>line.length>0)};const parseTelemetryQueue=raw=>{const rows=splitTelemetryQueueRows(raw);const entries=[];let invalidRows=0;for(const row of rows){const parsed=parseTelemetryQueueRow(row);if(parsed===void 0){invalidRows+=1}else{entries.push(parsed)}}return{rows_total:rows.length,valid_entries:entries.length,invalid_rows:invalidRows,entries}};const isTelemetryRuntimeState=value=>typeof value==="object"&&value!==null&&!Array.isArray(value);const parseTelemetryRuntimeState=raw=>{try{const parsed=JSON.parse(raw);return isTelemetryRuntimeState(parsed)?parsed:{}}catch{return{}}};const readTelemetryRuntimeState=async statePath=>{const stateRaw=await readFileIfExists(statePath);if(stateRaw===null||stateRaw.trim().length===0){return{}}return parseTelemetryRuntimeState(stateRaw)};function aliasUsageCutoff(retentionDays){const now=new Date;return new Date(Date.UTC(now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate()-Math.max(1,Math.trunc(retentionDays))+1)).toISOString().slice(0,10)}function normalizeAliasUsageDays(value,cutoff,today){const days=Object.create(null);for(const[day,entry]of Object.entries(value)){if(!/^\d{4}-\d{2}-\d{2}$/u.test(day)||day<cutoff||day>today||typeof entry!=="object"||entry===null||Array.isArray(entry))continue;const observation=entry;if(!Number.isSafeInteger(observation.count)||observation.count<1||typeof observation.last_seen!=="string"||!observation.last_seen.startsWith(day))continue;days[day]={count:observation.count,last_seen:observation.last_seen}}return days}function normalizeAliasUsage(value,cutoff){const result=Object.create(null);if(typeof value!=="object"||value===null||Array.isArray(value))return result;const stored=value;const today=new Date().toISOString().slice(0,10);for(const contract of DEPRECATED_ALIASES){const candidate=stored[contract.alias];if(typeof candidate!=="object"||candidate===null||Array.isArray(candidate))continue;const row=candidate;if(row.canonical!==contract.canonical||typeof row.days!=="object"||row.days===null||Array.isArray(row.days))continue;const days=normalizeAliasUsageDays(row.days,cutoff,today);if(Object.keys(days).length>0)result[contract.alias]={canonical:contract.canonical,days}}return result}async function readRetainedAliasUsage(globalPmRoot,statePath,retentionDays){const cutoff=aliasUsageCutoff(retentionDays);const state=await readTelemetryRuntimeState(statePath);const usage=normalizeAliasUsage(state.alias_usage,cutoff);if(JSON.stringify(state.alias_usage??{})===JSON.stringify(usage))return usage;try{await withTelemetryQueueMutation(async()=>{const current=await readTelemetryRuntimeState(statePath);if(current.alias_usage===void 0)return;const retained=normalizeAliasUsage(current.alias_usage,cutoff);if(JSON.stringify(current.alias_usage)===JSON.stringify(retained))return;await writeFileAtomic(statePath,`${JSON.stringify({...current,alias_usage:retained},null,2)}
2
- `)},globalPmRoot,250)}catch{}return usage}async function recordDeprecatedAliasUsage(alias){const contract=DEPRECATED_ALIASES.find(entry=>entry.alias===alias);if(!contract||resolveTelemetryEnvironmentPolicy().telemetry_disabled)return false;const globalPmRoot=resolveGlobalPmRoot(process.cwd());try{return await withTelemetryQueueMutation(async()=>{const settings=await readSettings(globalPmRoot);if(!settings.telemetry.enabled||resolveTelemetryEnvironmentPolicy().telemetry_disabled)return false;const statePath=path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH);const state=await readTelemetryRuntimeState(statePath);const usage=normalizeAliasUsage(state.alias_usage,aliasUsageCutoff(settings.telemetry.retention_days));const day=new Date().toISOString().slice(0,10);const previous=usage[alias]?.days[day];usage[alias]={canonical:contract.canonical,days:{...usage[alias]?.days,[day]:{count:Math.min(Number.MAX_SAFE_INTEGER,(previous?.count??0)+1),last_seen:nowIso()}}};await writeFileAtomic(statePath,`${JSON.stringify({...state,alias_usage:usage},null,2)}
3
- `);return true},globalPmRoot,250)}catch{return false}}const nullableTelemetryStateValue=value=>value??null;const buildTelemetryStatusSummary=async globalPmRoot=>{const settings=await readSettings(globalPmRoot);const queuePath=path.join(globalPmRoot,TELEMETRY_QUEUE_RELATIVE_PATH);const statePath=path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH);const queueRaw=await readFileIfExists(queuePath);const queue=parseTelemetryQueue(queueRaw);const runtimeState=await readTelemetryRuntimeState(statePath);const environmentPolicy=resolveTelemetryEnvironmentPolicy();return{enabled:settings.telemetry.enabled&&!environmentPolicy.telemetry_disabled,configured_enabled:settings.telemetry.enabled,env_overrides:environmentPolicy,endpoint:settings.telemetry.endpoint,queue_path:queuePath,state_path:statePath,queue_rows_total:queue.rows_total,queue_entries:queue.valid_entries,queue_invalid_rows:queue.invalid_rows,queue_size_bytes:Buffer.byteLength(queueRaw??"","utf8"),last_attempted_flush_at:nullableTelemetryStateValue(runtimeState.last_attempted_flush_at),last_successful_flush_at:nullableTelemetryStateValue(runtimeState.last_successful_flush_at),last_failed_flush_at:nullableTelemetryStateValue(runtimeState.last_failed_flush_at),last_failed_flush_error:nullableTelemetryStateValue(runtimeState.last_failed_flush_error)}};const buildTelemetryStatsBuckets=entries=>{const grouped=new Map;for(const entry of entries){recordTelemetryQueueEntry(grouped,entry)}return[...grouped.entries()].map(([command,value])=>buildTelemetryStatsBucket(command,value)).sort((left,right)=>right.count-left.count||left.command.localeCompare(right.command))};const runTelemetryStatus=async(_options,context)=>({action:"telemetry",subcommand:"status",status:await buildTelemetryStatusSummary(context.globalPmRoot),generated_at:nowIso()});const runTelemetryFlush=async(_options,context)=>{const before=await buildTelemetryStatusSummary(context.globalPmRoot);await flushTelemetryQueueNow(context.globalPmRoot);const after=await buildTelemetryStatusSummary(context.globalPmRoot);const queueEntriesDrained=Math.max(0,before.queue_entries-after.queue_entries);const queueEmpty=after.queue_entries===0;return{action:"telemetry",subcommand:"flush",queue_entries_before:before.queue_entries,queue_entries_after:after.queue_entries,queue_entries_drained:queueEntriesDrained,queue_progressed:queueEntriesDrained>0,queue_empty:queueEmpty,queue_drained:queueEmpty,status:after,generated_at:nowIso()}};const runTelemetryStats=async(options,context)=>{const limit=parseTelemetryStatsLimit(options.limit);const queueRaw=await readFileIfExists(context.queuePath);const queue=parseTelemetryQueue(queueRaw);const buckets=buildTelemetryStatsBuckets(queue.entries);const selected=buckets.slice(0,limit);const settings=await readSettings(context.globalPmRoot);const usage=await readRetainedAliasUsage(context.globalPmRoot,context.statePath,settings.telemetry.retention_days);const aliasUsage=Object.entries(usage).map(([alias,entry])=>{const days=Object.values(entry.days);return{alias,canonical:entry.canonical,count:days.reduce((total,day)=>Math.min(Number.MAX_SAFE_INTEGER,total+day.count),0),last_seen:days.map(day=>day.last_seen).sort().at(-1)}}).sort((left,right)=>right.count-left.count||left.alias.localeCompare(right.alias));return{action:"telemetry",subcommand:"stats",limit,total_commands:buckets.length,queue_entries:queue.valid_entries,queue_invalid_rows:queue.invalid_rows,queue_rows_total:queue.rows_total,truncated:buckets.length>selected.length,stats:selected,alias_usage:aliasUsage,zero_use_aliases:DEPRECATED_ALIASES.map(entry=>entry.alias).filter(alias=>usage[alias]===void 0),alias_usage_retention_days:settings.telemetry.retention_days,generated_at:nowIso()}};const runTelemetryClear=async(_options,context)=>{return withTelemetryQueueMutation(async()=>{const settings=await readSettings(context.globalPmRoot);const settingsChanged=[settings.telemetry.enabled!==false,settings.telemetry.installation_id!=="",settings.telemetry.first_run_prompt_completed!==true].includes(true);settings.telemetry.enabled=false;settings.telemetry.first_run_prompt_completed=true;settings.telemetry.installation_id="";if(settingsChanged){await writeSettings(context.globalPmRoot,settings,"telemetry:clear")}const telemetryRuntimePath=path.join(context.globalPmRoot,TELEMETRY_RUNTIME_RELATIVE_PATH);const existed=await pathExists(telemetryRuntimePath);await fs.rm(telemetryRuntimePath,{recursive:true,force:true});return{action:"telemetry",subcommand:"clear",settings_changed:settingsChanged,runtime_dir_removed:existed&&!await pathExists(telemetryRuntimePath),queue_exists_after:await pathExists(context.queuePath),state_exists_after:await pathExists(context.statePath),status:await buildTelemetryStatusSummary(context.globalPmRoot),generated_at:nowIso()}},context.globalPmRoot)};const TELEMETRY_COMMAND_HANDLERS={status:runTelemetryStatus,flush:runTelemetryFlush,stats:runTelemetryStats,clear:runTelemetryClear};async function runTelemetry(options,_global){void _global;const subcommand=normalizeTelemetrySubcommand(options.subcommand);const globalPmRoot=resolveGlobalPmRoot(process.cwd());return TELEMETRY_COMMAND_HANDLERS[subcommand](options,{globalPmRoot,queuePath:path.join(globalPmRoot,TELEMETRY_QUEUE_RELATIVE_PATH),statePath:path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH)})}export{TELEMETRY_SUBCOMMANDS,recordDeprecatedAliasUsage,runTelemetry};
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]="a41eaff2-6a15-5e82-b3aa-03ca48fc3eb5")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{pathExists,readFileIfExists,writeFileAtomic}from"../core/fs/fs-utils.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{nowIso}from"../core/shared/time.js";import{resolveGlobalPmRoot}from"../core/store/paths.js";import{readSettings,writeSettings}from"../core/store/settings.js";import{resolveTelemetryEnvironmentPolicy}from"../core/telemetry/policy.js";import{flushTelemetryQueueNow,withTelemetryQueueMutation}from"../core/telemetry/runtime.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{PM_COMMAND_ALIAS_CONTRACTS}from"./cli-contracts/command-aliases.js";const TELEMETRY_QUEUE_RELATIVE_PATH=path.join("runtime","telemetry","events.jsonl"),TELEMETRY_STATE_RELATIVE_PATH=path.join("runtime","telemetry","state.json"),TELEMETRY_RUNTIME_RELATIVE_PATH=path.join("runtime","telemetry"),DEFAULT_STATS_LIMIT=20,DEPRECATED_ALIASES=PM_COMMAND_ALIAS_CONTRACTS.filter(contract=>contract.lifecycle==="deprecated"),TELEMETRY_SUBCOMMANDS=["status","flush","stats","clear"],nearestRankPercentile=(sortedAscending,fraction)=>{const rank=Math.ceil(fraction*sortedAscending.length),index=Math.min(sortedAscending.length-1,Math.max(0,rank-1));return sortedAscending[index]},normalizeTelemetryText=(value,fallback)=>typeof value!="string"?fallback:value.trim().length>0?value:fallback,normalizeFiniteInteger=value=>{if(!(typeof value!="number"||!Number.isFinite(value)))return Math.trunc(value)},normalizeTelemetryQueueEntry=entry=>({command:normalizeTelemetryText(entry.event.command,"<unknown>"),eventType:normalizeTelemetryText(entry.event.event_type,"unknown"),eventSchemaVersion:normalizeFiniteInteger(entry.event.schema_version),clientSchemaVersion:normalizeFiniteInteger(entry.client_schema_version)}),createTelemetryStatsAccumulator=()=>({count:0,max_attempts:0,event_type_counts:{},event_schema_versions:new Set,client_schema_versions:new Set,finish_durations_ms:[],ok_count:0,error_count:0,resolution_counts:{}}),readTelemetryDuration=payload=>{const value=payload?.duration_ms;return typeof value=="number"&&Number.isFinite(value)?value:void 0},readTelemetryResolution=payload=>{const value=payload?.command_resolution;return normalizeTelemetryText(value,"")||void 0},incrementTelemetryCount=(counts,key)=>{counts[key]=(counts[key]??0)+1},recordTelemetryFinishPayload=(current,payload)=>{const durationMs=readTelemetryDuration(payload);durationMs!==void 0&&current.finish_durations_ms.push(durationMs),payload?.ok===!0?current.ok_count+=1:current.error_count+=1;const resolution=readTelemetryResolution(payload);resolution!==void 0&&incrementTelemetryCount(current.resolution_counts,resolution)},normalizeTelemetryAttempts=attempts=>Number.isFinite(attempts)?Math.max(0,Math.trunc(attempts)):0,addTelemetryDimension=(values,value)=>{value!==void 0&&values.add(value)},recordTelemetryQueueEntry=(grouped,entry)=>{const normalized=normalizeTelemetryQueueEntry(entry),current=grouped.get(normalized.command)??createTelemetryStatsAccumulator();current.count+=1,current.max_attempts=Math.max(current.max_attempts,normalizeTelemetryAttempts(entry.attempts)),incrementTelemetryCount(current.event_type_counts,normalized.eventType),addTelemetryDimension(current.event_schema_versions,normalized.eventSchemaVersion),addTelemetryDimension(current.client_schema_versions,normalized.clientSchemaVersion),normalized.eventType==="command_finish"&&recordTelemetryFinishPayload(current,entry.event.payload),grouped.set(normalized.command,current)},buildTelemetryStatsBucket=(command,value)=>{const finishCount=value.ok_count+value.error_count,sortedDurations=[...value.finish_durations_ms].sort((left,right)=>left-right),resolutionEntries=Object.entries(value.resolution_counts).sort((left,right)=>left[0].localeCompare(right[0]));return{command,count:value.count,event_type_counts:Object.fromEntries(Object.entries(value.event_type_counts).sort((left,right)=>left[0].localeCompare(right[0]))),max_attempts:value.max_attempts,event_schema_versions:[...value.event_schema_versions].sort((left,right)=>left-right),client_schema_versions:[...value.client_schema_versions].sort((left,right)=>left-right),...sortedDurations.length>0?{duration_p50_ms:nearestRankPercentile(sortedDurations,.5),duration_p95_ms:nearestRankPercentile(sortedDurations,.95),duration_max_ms:sortedDurations[sortedDurations.length-1]}:{},...finishCount>0?{ok_count:value.ok_count,error_count:value.error_count,error_rate:value.error_count/finishCount}:{},...resolutionEntries.length>0?{command_resolution_counts:Object.fromEntries(resolutionEntries)}:{}}},normalizeTelemetrySubcommand=value=>{const normalized=(value??"status").trim().toLowerCase();if(TELEMETRY_SUBCOMMANDS.includes(normalized))return normalized;throw createUnknownSubcommandError({command_path:"telemetry",token:value?.trim()||"<empty>",allowed:TELEMETRY_SUBCOMMANDS,examples:["pm telemetry status","pm telemetry flush","pm telemetry stats --limit 10","pm telemetry clear"]})},throwInvalidTelemetryLimit=()=>{throw new PmCliError("--limit must be a positive integer",EXIT_CODE.USAGE)},requirePositiveTelemetryLimit=value=>[!Number.isFinite(value),!Number.isInteger(value),value<=0].includes(!0)?throwInvalidTelemetryLimit():value,parseTelemetryStringLimit=raw=>{const trimmed=raw.trim();return[trimmed.length===0,!/^\d+$/.test(trimmed)].includes(!0)?throwInvalidTelemetryLimit():requirePositiveTelemetryLimit(Number.parseInt(trimmed,10))},parseTelemetryStatsLimit=raw=>raw===void 0?DEFAULT_STATS_LIMIT:typeof raw=="number"?requirePositiveTelemetryLimit(raw):typeof raw=="string"?parseTelemetryStringLimit(raw):throwInvalidTelemetryLimit(),isTelemetryQueueEntry=value=>{if(typeof value!="object"||value===null)return!1;const candidate=value;return typeof candidate.attempts=="number"&&typeof candidate.event=="object"&&candidate.event!==null},parseTelemetryQueueRow=row=>{try{const parsed=JSON.parse(row);return isTelemetryQueueEntry(parsed)?parsed:void 0}catch{return}},splitTelemetryQueueRows=raw=>raw===null?[]:raw.split(`
2
+ `).map(line=>line.trim()).filter(line=>line.length>0),parseTelemetryQueue=raw=>{const rows=splitTelemetryQueueRows(raw),entries=[];let invalidRows=0;for(const row of rows){const parsed=parseTelemetryQueueRow(row);parsed===void 0?invalidRows+=1:entries.push(parsed)}return{rows_total:rows.length,valid_entries:entries.length,invalid_rows:invalidRows,entries}},isTelemetryRuntimeState=value=>typeof value=="object"&&value!==null&&!Array.isArray(value),parseTelemetryRuntimeState=raw=>{try{const parsed=JSON.parse(raw);return isTelemetryRuntimeState(parsed)?parsed:{}}catch{return{}}},readTelemetryRuntimeState=async statePath=>{const stateRaw=await readFileIfExists(statePath);return stateRaw===null||stateRaw.trim().length===0?{}:parseTelemetryRuntimeState(stateRaw)};function aliasUsageCutoff(retentionDays){const now=new Date;return new Date(Date.UTC(now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate()-Math.max(1,Math.trunc(retentionDays))+1)).toISOString().slice(0,10)}function normalizeAliasUsageDays(value,cutoff,today){const days=Object.create(null);for(const[day,entry]of Object.entries(value)){if(!/^\d{4}-\d{2}-\d{2}$/u.test(day)||day<cutoff||day>today||typeof entry!="object"||entry===null||Array.isArray(entry))continue;const observation=entry;!Number.isSafeInteger(observation.count)||observation.count<1||typeof observation.last_seen!="string"||!observation.last_seen.startsWith(day)||(days[day]={count:observation.count,last_seen:observation.last_seen})}return days}function normalizeAliasUsage(value,cutoff){const result=Object.create(null);if(typeof value!="object"||value===null||Array.isArray(value))return result;const stored=value,today=new Date().toISOString().slice(0,10);for(const contract of DEPRECATED_ALIASES){const candidate=stored[contract.alias];if(typeof candidate!="object"||candidate===null||Array.isArray(candidate))continue;const row=candidate;if(row.canonical!==contract.canonical||typeof row.days!="object"||row.days===null||Array.isArray(row.days))continue;const days=normalizeAliasUsageDays(row.days,cutoff,today);Object.keys(days).length>0&&(result[contract.alias]={canonical:contract.canonical,days})}return result}async function readRetainedAliasUsage(globalPmRoot,statePath,retentionDays){const cutoff=aliasUsageCutoff(retentionDays),state=await readTelemetryRuntimeState(statePath),usage=normalizeAliasUsage(state.alias_usage,cutoff);if(JSON.stringify(state.alias_usage??{})===JSON.stringify(usage))return usage;try{await withTelemetryQueueMutation(async()=>{const current=await readTelemetryRuntimeState(statePath);if(current.alias_usage===void 0)return;const retained=normalizeAliasUsage(current.alias_usage,cutoff);JSON.stringify(current.alias_usage)!==JSON.stringify(retained)&&await writeFileAtomic(statePath,`${JSON.stringify({...current,alias_usage:retained},null,2)}
3
+ `)},globalPmRoot,250)}catch{}return usage}async function recordDeprecatedAliasUsage(alias){const contract=DEPRECATED_ALIASES.find(entry=>entry.alias===alias);if(!contract||resolveTelemetryEnvironmentPolicy().telemetry_disabled)return!1;const globalPmRoot=resolveGlobalPmRoot(process.cwd());try{return await withTelemetryQueueMutation(async()=>{const settings=await readSettings(globalPmRoot);if(!settings.telemetry.enabled||resolveTelemetryEnvironmentPolicy().telemetry_disabled)return!1;const statePath=path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH),state=await readTelemetryRuntimeState(statePath),usage=normalizeAliasUsage(state.alias_usage,aliasUsageCutoff(settings.telemetry.retention_days)),day=new Date().toISOString().slice(0,10),previous=usage[alias]?.days[day];return usage[alias]={canonical:contract.canonical,days:{...usage[alias]?.days,[day]:{count:Math.min(Number.MAX_SAFE_INTEGER,(previous?.count??0)+1),last_seen:nowIso()}}},await writeFileAtomic(statePath,`${JSON.stringify({...state,alias_usage:usage},null,2)}
4
+ `),!0},globalPmRoot,250)}catch{return!1}}const nullableTelemetryStateValue=value=>value??null,buildTelemetryStatusSummary=async globalPmRoot=>{const settings=await readSettings(globalPmRoot),queuePath=path.join(globalPmRoot,TELEMETRY_QUEUE_RELATIVE_PATH),statePath=path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH),queueRaw=await readFileIfExists(queuePath),queue=parseTelemetryQueue(queueRaw),runtimeState=await readTelemetryRuntimeState(statePath),environmentPolicy=resolveTelemetryEnvironmentPolicy();return{enabled:settings.telemetry.enabled&&!environmentPolicy.telemetry_disabled,configured_enabled:settings.telemetry.enabled,env_overrides:environmentPolicy,endpoint:settings.telemetry.endpoint,queue_path:queuePath,state_path:statePath,queue_rows_total:queue.rows_total,queue_entries:queue.valid_entries,queue_invalid_rows:queue.invalid_rows,queue_size_bytes:Buffer.byteLength(queueRaw??"","utf8"),last_attempted_flush_at:nullableTelemetryStateValue(runtimeState.last_attempted_flush_at),last_successful_flush_at:nullableTelemetryStateValue(runtimeState.last_successful_flush_at),last_failed_flush_at:nullableTelemetryStateValue(runtimeState.last_failed_flush_at),last_failed_flush_error:nullableTelemetryStateValue(runtimeState.last_failed_flush_error)}},buildTelemetryStatsBuckets=entries=>{const grouped=new Map;for(const entry of entries)recordTelemetryQueueEntry(grouped,entry);return[...grouped.entries()].map(([command,value])=>buildTelemetryStatsBucket(command,value)).sort((left,right)=>right.count-left.count||left.command.localeCompare(right.command))},runTelemetryStatus=async(_options,context)=>({action:"telemetry",subcommand:"status",status:await buildTelemetryStatusSummary(context.globalPmRoot),generated_at:nowIso()}),runTelemetryFlush=async(_options,context)=>{const before=await buildTelemetryStatusSummary(context.globalPmRoot);await flushTelemetryQueueNow(context.globalPmRoot);const after=await buildTelemetryStatusSummary(context.globalPmRoot),queueEntriesDrained=Math.max(0,before.queue_entries-after.queue_entries),queueEmpty=after.queue_entries===0;return{action:"telemetry",subcommand:"flush",queue_entries_before:before.queue_entries,queue_entries_after:after.queue_entries,queue_entries_drained:queueEntriesDrained,queue_progressed:queueEntriesDrained>0,queue_empty:queueEmpty,queue_drained:queueEmpty,status:after,generated_at:nowIso()}},runTelemetryStats=async(options,context)=>{const limit=parseTelemetryStatsLimit(options.limit),queueRaw=await readFileIfExists(context.queuePath),queue=parseTelemetryQueue(queueRaw),buckets=buildTelemetryStatsBuckets(queue.entries),selected=buckets.slice(0,limit),settings=await readSettings(context.globalPmRoot),usage=await readRetainedAliasUsage(context.globalPmRoot,context.statePath,settings.telemetry.retention_days),aliasUsage=Object.entries(usage).map(([alias,entry])=>{const days=Object.values(entry.days);return{alias,canonical:entry.canonical,count:days.reduce((total,day)=>Math.min(Number.MAX_SAFE_INTEGER,total+day.count),0),last_seen:days.map(day=>day.last_seen).sort().at(-1)}}).sort((left,right)=>right.count-left.count||left.alias.localeCompare(right.alias));return{action:"telemetry",subcommand:"stats",limit,total_commands:buckets.length,queue_entries:queue.valid_entries,queue_invalid_rows:queue.invalid_rows,queue_rows_total:queue.rows_total,truncated:buckets.length>selected.length,stats:selected,alias_usage:aliasUsage,zero_use_aliases:DEPRECATED_ALIASES.map(entry=>entry.alias).filter(alias=>usage[alias]===void 0),alias_usage_retention_days:settings.telemetry.retention_days,generated_at:nowIso()}},runTelemetryClear=async(_options,context)=>withTelemetryQueueMutation(async()=>{const settings=await readSettings(context.globalPmRoot),settingsChanged=[settings.telemetry.enabled!==!1,settings.telemetry.installation_id!=="",settings.telemetry.first_run_prompt_completed!==!0].includes(!0);settings.telemetry.enabled=!1,settings.telemetry.first_run_prompt_completed=!0,settings.telemetry.installation_id="",settingsChanged&&await writeSettings(context.globalPmRoot,settings,"telemetry:clear");const telemetryRuntimePath=path.join(context.globalPmRoot,TELEMETRY_RUNTIME_RELATIVE_PATH),existed=await pathExists(telemetryRuntimePath);return await fs.rm(telemetryRuntimePath,{recursive:!0,force:!0}),{action:"telemetry",subcommand:"clear",settings_changed:settingsChanged,runtime_dir_removed:existed&&!await pathExists(telemetryRuntimePath),queue_exists_after:await pathExists(context.queuePath),state_exists_after:await pathExists(context.statePath),status:await buildTelemetryStatusSummary(context.globalPmRoot),generated_at:nowIso()}},context.globalPmRoot),TELEMETRY_COMMAND_HANDLERS={status:runTelemetryStatus,flush:runTelemetryFlush,stats:runTelemetryStats,clear:runTelemetryClear};async function runTelemetry(options,_global){const subcommand=normalizeTelemetrySubcommand(options.subcommand),globalPmRoot=resolveGlobalPmRoot(process.cwd());return TELEMETRY_COMMAND_HANDLERS[subcommand](options,{globalPmRoot,queuePath:path.join(globalPmRoot,TELEMETRY_QUEUE_RELATIVE_PATH),statePath:path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH)})}export{TELEMETRY_SUBCOMMANDS,recordDeprecatedAliasUsage,runTelemetry};
4
5
  //# sourceMappingURL=telemetry.js.map
@@ -1,3 +1,27 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ff76c0f3-d8cf-51de-a7e6-acb0a4942268")}catch(e2){}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{pathExists,readFileIfExists}from"../core/fs/fs-utils.js";import{writeWorkspaceJsonWithHistory}from"../core/history/workspace-history.js";import{resolveAuthor}from"../core/shared/author.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{nowIso}from"../core/shared/time.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS}from"./cli-contracts.js";const TEMPLATE_DIRECTORY_NAME="templates";const TEMPLATE_FILE_EXTENSION=".json";const TEMPLATE_NAME_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;const TEMPLATE_OPTION_REPEATABLE_KEYS=CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS.map(entry=>entry.target).filter(target=>target!=="acceptanceCriteria");const TEMPLATE_OPTION_REPEATABLE_KEY_SET=new Set(TEMPLATE_OPTION_REPEATABLE_KEYS);const BUILTIN_TEMPLATE_TIMESTAMP="1970-01-01T00:00:00.000Z";const BUILTIN_TEMPLATES={bug:{type:"Issue",priority:"1",tags:"bug",acceptanceCriteria:"Bug no longer reproduces with the steps below and a regression test guards it.",expectedResult:"Describe the correct behavior.",actualResult:"Describe the observed (buggy) behavior.",body:"## Repro steps\n1. \n2. \n3. \n\n## Expected\n\n## Actual\n"},feature:{type:"Feature",priority:"2",tags:"feature",acceptanceCriteria:"Feature is shipped behind agreed scope with tests and docs updated.",whyNow:"Explain why this is worth doing now (impact / urgency).",body:"## Goal\n\n## Why now\n\n## Out of scope\n"},spike:{type:"Task",priority:"2",tags:"spike",estimatedMinutes:"120",acceptanceCriteria:"Timeboxed investigation complete; findings and a recommendation are recorded.",body:"## Question to answer\n\n## Timebox\n2h\n\n## Findings\n\n## Recommendation\n"},chore:{type:"Chore",priority:"3",tags:"chore",acceptanceCriteria:"Maintenance task done with no behavior change and green checks.",body:"## What\n\n## Why\n"}};const _testOnly={normalizeTemplateName,extractTemplateOptions,parseStoredTemplateDocument,builtinTemplateDocument,readStoredTemplateDocument};function normalizeTemplateName(rawName){const name=rawName.trim();if(!TEMPLATE_NAME_PATTERN.test(name)){throw new PmCliError(`Invalid template name "${rawName}". Expected 1-64 characters matching [A-Za-z0-9][A-Za-z0-9._-]*.`,EXIT_CODE.USAGE)}return name}function templatesDirectory(pmRoot){return path.join(pmRoot,TEMPLATE_DIRECTORY_NAME)}function templatePath(pmRoot,normalizedName){return path.join(templatesDirectory(pmRoot),`${normalizedName}${TEMPLATE_FILE_EXTENSION}`)}async function ensureTrackerInitialized(pmRoot){await assertInitializedTracker(pmRoot)}function sortTemplateOptions(options){return Object.fromEntries(Object.entries(options).sort(([left],[right])=>left.localeCompare(right)))}function extractTemplateOptions(rawOptions){const next={};for(const[key,value]of Object.entries(rawOptions)){if(value===void 0){continue}if(TEMPLATE_OPTION_REPEATABLE_KEY_SET.has(key)){if(typeof value==="string"){next[key]=[value];continue}if(!Array.isArray(value)){continue}const values=value.filter(entry=>typeof entry==="string");if(values.length>0){next[key]=values}continue}if(typeof value==="string"){next[key]=value;continue}if(Array.isArray(value)&&value.every(entry=>typeof entry==="string")){next[key]=[...value]}}return sortTemplateOptions(next)}function parseStoredTemplateOptions(rawOptions,templateName){if(typeof rawOptions!=="object"||rawOptions===null||Array.isArray(rawOptions)){throw new PmCliError(`Template "${templateName}" has invalid options payload.`,EXIT_CODE.GENERIC_FAILURE)}const optionsRecord=rawOptions;const normalized={};for(const[key,value]of Object.entries(optionsRecord)){const normalizedKey=key.trim();if(normalizedKey.length===0){throw new PmCliError(`Template "${templateName}" contains an empty option key.`,EXIT_CODE.GENERIC_FAILURE)}if(typeof value==="string"){normalized[normalizedKey]=value;continue}if(Array.isArray(value)&&value.every(entry=>typeof entry==="string")){normalized[normalizedKey]=[...value];continue}throw new PmCliError(`Template "${templateName}" contains invalid value for option "${normalizedKey}".`,EXIT_CODE.GENERIC_FAILURE)}return sortTemplateOptions(normalized)}function parseStoredTemplateDocument(raw,normalizedName){let parsed;try{parsed=JSON.parse(raw)}catch{throw new PmCliError(`Template "${normalizedName}" contains invalid JSON.`,EXIT_CODE.GENERIC_FAILURE)}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){throw new PmCliError(`Template "${normalizedName}" has invalid document shape.`,EXIT_CODE.GENERIC_FAILURE)}const record=parsed;const options=parseStoredTemplateOptions(record.options,normalizedName);const now=nowIso();return{name:typeof record.name==="string"&&record.name.trim().length>0?record.name.trim():normalizedName,created_at:typeof record.created_at==="string"?record.created_at:now,updated_at:typeof record.updated_at==="string"?record.updated_at:now,options}}function builtinTemplateDocument(normalizedName){const options=BUILTIN_TEMPLATES[normalizedName];if(!options){return null}return{name:normalizedName,created_at:BUILTIN_TEMPLATE_TIMESTAMP,updated_at:BUILTIN_TEMPLATE_TIMESTAMP,options:sortTemplateOptions({...options})}}async function resolveTemplateDocument(pmRoot,normalizedName){const raw=await readFileIfExists(templatePath(pmRoot,normalizedName));if(raw!==null){return{document:parseStoredTemplateDocument(raw,normalizedName),source:"user"}}const builtin=builtinTemplateDocument(normalizedName);if(builtin){return{document:builtin,source:"builtin"}}throw new PmCliError(`Template "${normalizedName}" not found`,EXIT_CODE.NOT_FOUND)}async function readStoredTemplateDocument(pmRoot,normalizedName){const raw=await readFileIfExists(templatePath(pmRoot,normalizedName));if(raw===null){throw new PmCliError(`Template "${normalizedName}" not found`,EXIT_CODE.NOT_FOUND)}return parseStoredTemplateDocument(raw,normalizedName)}async function loadCreateTemplateOptions(pmRoot,rawTemplateName){const normalizedName=normalizeTemplateName(rawTemplateName);const{document}=await resolveTemplateDocument(pmRoot,normalizedName);return document.options}async function runTemplatesSave(rawTemplateName,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await ensureTrackerInitialized(pmRoot);const normalizedName=normalizeTemplateName(rawTemplateName);const nextOptions=extractTemplateOptions(options);if(Object.keys(nextOptions).length===0){throw new PmCliError("templates save requires at least one create option flag",EXIT_CODE.USAGE)}const now=nowIso();const storedPath=templatePath(pmRoot,normalizedName);let createdAt=now;if(await pathExists(storedPath)){const existing=await readStoredTemplateDocument(pmRoot,normalizedName);createdAt=existing.created_at}const document={name:normalizedName,created_at:createdAt,updated_at:now,options:nextOptions};const settings=await readSettings(pmRoot);await fs.mkdir(templatesDirectory(pmRoot),{recursive:true});await writeWorkspaceJsonWithHistory({pmRoot,filePath:storedPath,raw:`${JSON.stringify(document,null,2)}
2
- `,op:"templates:save",author:resolveAuthor(void 0,settings.author_default),lockTtlSeconds:settings.locks.ttl_seconds,lockWaitMs:settings.locks.wait_ms});return{name:document.name,created_at:document.created_at,updated_at:document.updated_at,path:storedPath,options:document.options}}async function readUserTemplateNames(pmRoot){const dirPath=templatesDirectory(pmRoot);if(!await pathExists(dirPath)){return[]}const entries=await fs.readdir(dirPath);return entries.filter(entry=>entry.toLowerCase().endsWith(TEMPLATE_FILE_EXTENSION)).map(entry=>entry.slice(0,-TEMPLATE_FILE_EXTENSION.length)).filter(entry=>TEMPLATE_NAME_PATTERN.test(entry))}async function runTemplatesList(global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await ensureTrackerInitialized(pmRoot);const userTemplates=await readUserTemplateNames(pmRoot);const userTemplateSet=new Set(userTemplates);const builtinTemplates=Object.keys(BUILTIN_TEMPLATES).filter(name=>!userTemplateSet.has(name));const sortedUser=[...userTemplates].sort((left,right)=>left.localeCompare(right));const sortedBuiltin=[...builtinTemplates].sort((left,right)=>left.localeCompare(right));const templates=[...new Set([...sortedUser,...sortedBuiltin])].sort((left,right)=>left.localeCompare(right));return{templates,count:templates.length,builtin_templates:sortedBuiltin,user_templates:sortedUser}}async function runTemplatesShow(rawTemplateName,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await ensureTrackerInitialized(pmRoot);const normalizedName=normalizeTemplateName(rawTemplateName);const{document,source}=await resolveTemplateDocument(pmRoot,normalizedName);return{name:document.name,source,created_at:document.created_at,updated_at:document.updated_at,path:source==="builtin"?`builtin:${normalizedName}`:templatePath(pmRoot,normalizedName),options:document.options}}export{_testOnly,loadCreateTemplateOptions,runTemplatesList,runTemplatesSave,runTemplatesShow};
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]="ac2020a4-78bf-5aa3-a5c4-88d3196dfb1f")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{pathExists,readFileIfExists}from"../core/fs/fs-utils.js";import{writeWorkspaceJsonWithHistory}from"../core/history/workspace-history.js";import{resolveAuthor}from"../core/shared/author.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{nowIso}from"../core/shared/time.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS}from"./cli-contracts.js";const TEMPLATE_DIRECTORY_NAME="templates",TEMPLATE_FILE_EXTENSION=".json",TEMPLATE_NAME_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,TEMPLATE_OPTION_REPEATABLE_KEYS=CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS.map(entry=>entry.target).filter(target=>target!=="acceptanceCriteria"),TEMPLATE_OPTION_REPEATABLE_KEY_SET=new Set(TEMPLATE_OPTION_REPEATABLE_KEYS),BUILTIN_TEMPLATE_TIMESTAMP="1970-01-01T00:00:00.000Z",BUILTIN_TEMPLATES={bug:{type:"Issue",priority:"1",tags:"bug",acceptanceCriteria:"Bug no longer reproduces with the steps below and a regression test guards it.",expectedResult:"Describe the correct behavior.",actualResult:"Describe the observed (buggy) behavior.",body:`## Repro steps
2
+ 1.
3
+ 2.
4
+ 3.
5
+
6
+ ## Expected
7
+
8
+ ## Actual
9
+ `},feature:{type:"Feature",priority:"2",tags:"feature",acceptanceCriteria:"Feature is shipped behind agreed scope with tests and docs updated.",whyNow:"Explain why this is worth doing now (impact / urgency).",body:`## Goal
10
+
11
+ ## Why now
12
+
13
+ ## Out of scope
14
+ `},spike:{type:"Task",priority:"2",tags:"spike",estimatedMinutes:"120",acceptanceCriteria:"Timeboxed investigation complete; findings and a recommendation are recorded.",body:`## Question to answer
15
+
16
+ ## Timebox
17
+ 2h
18
+
19
+ ## Findings
20
+
21
+ ## Recommendation
22
+ `},chore:{type:"Chore",priority:"3",tags:"chore",acceptanceCriteria:"Maintenance task done with no behavior change and green checks.",body:`## What
23
+
24
+ ## Why
25
+ `}},_testOnly={normalizeTemplateName,extractTemplateOptions,parseStoredTemplateDocument,builtinTemplateDocument,readStoredTemplateDocument};function normalizeTemplateName(rawName){const name=rawName.trim();if(!TEMPLATE_NAME_PATTERN.test(name))throw new PmCliError(`Invalid template name "${rawName}". Expected 1-64 characters matching [A-Za-z0-9][A-Za-z0-9._-]*.`,EXIT_CODE.USAGE);return name}function templatesDirectory(pmRoot){return path.join(pmRoot,TEMPLATE_DIRECTORY_NAME)}function templatePath(pmRoot,normalizedName){return path.join(templatesDirectory(pmRoot),`${normalizedName}${TEMPLATE_FILE_EXTENSION}`)}async function ensureTrackerInitialized(pmRoot){await assertInitializedTracker(pmRoot)}function sortTemplateOptions(options){return Object.fromEntries(Object.entries(options).sort(([left],[right])=>left.localeCompare(right)))}function extractTemplateOptions(rawOptions){const next={};for(const[key,value]of Object.entries(rawOptions))if(value!==void 0){if(TEMPLATE_OPTION_REPEATABLE_KEY_SET.has(key)){if(typeof value=="string"){next[key]=[value];continue}if(!Array.isArray(value))continue;const values=value.filter(entry=>typeof entry=="string");values.length>0&&(next[key]=values);continue}if(typeof value=="string"){next[key]=value;continue}Array.isArray(value)&&value.every(entry=>typeof entry=="string")&&(next[key]=[...value])}return sortTemplateOptions(next)}function parseStoredTemplateOptions(rawOptions,templateName){if(typeof rawOptions!="object"||rawOptions===null||Array.isArray(rawOptions))throw new PmCliError(`Template "${templateName}" has invalid options payload.`,EXIT_CODE.GENERIC_FAILURE);const optionsRecord=rawOptions,normalized={};for(const[key,value]of Object.entries(optionsRecord)){const normalizedKey=key.trim();if(normalizedKey.length===0)throw new PmCliError(`Template "${templateName}" contains an empty option key.`,EXIT_CODE.GENERIC_FAILURE);if(typeof value=="string"){normalized[normalizedKey]=value;continue}if(Array.isArray(value)&&value.every(entry=>typeof entry=="string")){normalized[normalizedKey]=[...value];continue}throw new PmCliError(`Template "${templateName}" contains invalid value for option "${normalizedKey}".`,EXIT_CODE.GENERIC_FAILURE)}return sortTemplateOptions(normalized)}function parseStoredTemplateDocument(raw,normalizedName){let parsed;try{parsed=JSON.parse(raw)}catch{throw new PmCliError(`Template "${normalizedName}" contains invalid JSON.`,EXIT_CODE.GENERIC_FAILURE)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new PmCliError(`Template "${normalizedName}" has invalid document shape.`,EXIT_CODE.GENERIC_FAILURE);const record=parsed,options=parseStoredTemplateOptions(record.options,normalizedName),now=nowIso();return{name:typeof record.name=="string"&&record.name.trim().length>0?record.name.trim():normalizedName,created_at:typeof record.created_at=="string"?record.created_at:now,updated_at:typeof record.updated_at=="string"?record.updated_at:now,options}}function builtinTemplateDocument(normalizedName){const options=BUILTIN_TEMPLATES[normalizedName];return options?{name:normalizedName,created_at:BUILTIN_TEMPLATE_TIMESTAMP,updated_at:BUILTIN_TEMPLATE_TIMESTAMP,options:sortTemplateOptions({...options})}:null}async function resolveTemplateDocument(pmRoot,normalizedName){const raw=await readFileIfExists(templatePath(pmRoot,normalizedName));if(raw!==null)return{document:parseStoredTemplateDocument(raw,normalizedName),source:"user"};const builtin=builtinTemplateDocument(normalizedName);if(builtin)return{document:builtin,source:"builtin"};throw new PmCliError(`Template "${normalizedName}" not found`,EXIT_CODE.NOT_FOUND)}async function readStoredTemplateDocument(pmRoot,normalizedName){const raw=await readFileIfExists(templatePath(pmRoot,normalizedName));if(raw===null)throw new PmCliError(`Template "${normalizedName}" not found`,EXIT_CODE.NOT_FOUND);return parseStoredTemplateDocument(raw,normalizedName)}async function loadCreateTemplateOptions(pmRoot,rawTemplateName){const normalizedName=normalizeTemplateName(rawTemplateName),{document}=await resolveTemplateDocument(pmRoot,normalizedName);return document.options}async function runTemplatesSave(rawTemplateName,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await ensureTrackerInitialized(pmRoot);const normalizedName=normalizeTemplateName(rawTemplateName),nextOptions=extractTemplateOptions(options);if(Object.keys(nextOptions).length===0)throw new PmCliError("templates save requires at least one create option flag",EXIT_CODE.USAGE);const now=nowIso(),storedPath=templatePath(pmRoot,normalizedName);let createdAt=now;await pathExists(storedPath)&&(createdAt=(await readStoredTemplateDocument(pmRoot,normalizedName)).created_at);const document={name:normalizedName,created_at:createdAt,updated_at:now,options:nextOptions},settings=await readSettings(pmRoot);return await fs.mkdir(templatesDirectory(pmRoot),{recursive:!0}),await writeWorkspaceJsonWithHistory({pmRoot,filePath:storedPath,raw:`${JSON.stringify(document,null,2)}
26
+ `,op:"templates:save",author:resolveAuthor(void 0,settings.author_default),lockTtlSeconds:settings.locks.ttl_seconds,lockWaitMs:settings.locks.wait_ms}),{name:document.name,created_at:document.created_at,updated_at:document.updated_at,path:storedPath,options:document.options}}async function readUserTemplateNames(pmRoot){const dirPath=templatesDirectory(pmRoot);return await pathExists(dirPath)?(await fs.readdir(dirPath)).filter(entry=>entry.toLowerCase().endsWith(TEMPLATE_FILE_EXTENSION)).map(entry=>entry.slice(0,-TEMPLATE_FILE_EXTENSION.length)).filter(entry=>TEMPLATE_NAME_PATTERN.test(entry)):[]}async function runTemplatesList(global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await ensureTrackerInitialized(pmRoot);const userTemplates=await readUserTemplateNames(pmRoot),userTemplateSet=new Set(userTemplates),builtinTemplates=Object.keys(BUILTIN_TEMPLATES).filter(name=>!userTemplateSet.has(name)),sortedUser=[...userTemplates].sort((left,right)=>left.localeCompare(right)),sortedBuiltin=[...builtinTemplates].sort((left,right)=>left.localeCompare(right)),templates=[...new Set([...sortedUser,...sortedBuiltin])].sort((left,right)=>left.localeCompare(right));return{templates,count:templates.length,builtin_templates:sortedBuiltin,user_templates:sortedUser}}async function runTemplatesShow(rawTemplateName,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await ensureTrackerInitialized(pmRoot);const normalizedName=normalizeTemplateName(rawTemplateName),{document,source}=await resolveTemplateDocument(pmRoot,normalizedName);return{name:document.name,source,created_at:document.created_at,updated_at:document.updated_at,path:source==="builtin"?`builtin:${normalizedName}`:templatePath(pmRoot,normalizedName),options:document.options}}export{_testOnly,loadCreateTemplateOptions,runTemplatesList,runTemplatesSave,runTemplatesShow};
3
27
  //# sourceMappingURL=templates.js.map
@@ -1,3 +1,3 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e3e3a1d4-4552-5f3c-9b02-c33ae72ea32b")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{parseOptionalNumber}from"../../core/item/parse.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{nowIso}from"../../core/shared/time.js";import{listAllItemMetadataLight}from"../../core/store/item-store.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{appendTrackedTestRunSummary}from"../../core/test/item-test-run-tracking.js";import{resolveAuthor}from"../../core/shared/author.js";import{countFailureCategories,runLinkedTests,runTest,summarizeContextPreflight}from"./execution.js";const parseStatus=(raw,statusRegistry)=>{if(raw===void 0){return void 0}const normalized=normalizeStatusInput(raw,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid --status value "${raw}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE)}return normalized};const parseTimeout=raw=>{if(raw===void 0){return void 0}const parsed=parseOptionalNumber(raw,"timeout");if(parsed<=0){throw new PmCliError("timeout must be a positive number",EXIT_CODE.USAGE)}return parsed};const parseNonNegativeInteger=(raw,flag)=>{if(raw===void 0){return void 0}const parsed=Number(raw);if(!Number.isInteger(parsed)||parsed<0){throw new PmCliError(`${flag} must be a non-negative integer`,EXIT_CODE.USAGE)}return parsed};const formatTrackingError=error=>{return error instanceof Error?error.message:String(error)};const resolveTrackedRunId=()=>{const fromEnv=process.env.PM_BACKGROUND_TEST_RUN_ID?.trim();if(fromEnv&&fromEnv.length>0){return fromEnv}return`test-all-local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`};const normalizeCommand=command=>{return command.trim().replaceAll(/\s+/g," ")};const normalizeEnvSetSignature=value=>{if(!value||Object.keys(value).length===0){return"{}"}return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([left],[right])=>left.localeCompare(right))))};const normalizeEnvClearSignature=value=>{if(!value||value.length===0){return"[]"}return JSON.stringify([...value].sort((left,right)=>left.localeCompare(right)))};const normalizePmContextModeSignature=value=>{const normalized=value?.trim().toLowerCase();return normalized&&normalized.length>0?normalized:"none"};const normalizeWorkspaceContextModeSignature=value=>{const normalized=value?.trim().toLowerCase();return normalized&&normalized.length>0?normalized:"source"};const normalizeAssertionStrings=values=>[...new Set(values??[])].sort((left,right)=>left.localeCompare(right));const normalizeAssertionMap=value=>Object.fromEntries(Object.entries(value??{}).sort(([left],[right])=>left.localeCompare(right)));const normalizeAssertionLineCount=value=>typeof value==="number"?value:void 0;const normalizeAssertionSignature=test=>{const normalized={assert_stdout_contains:normalizeAssertionStrings(test.assert_stdout_contains),assert_stdout_regex:normalizeAssertionStrings(test.assert_stdout_regex),assert_stderr_contains:normalizeAssertionStrings(test.assert_stderr_contains),assert_stderr_regex:normalizeAssertionStrings(test.assert_stderr_regex),assert_stdout_min_lines:normalizeAssertionLineCount(test.assert_stdout_min_lines),assert_json_field_equals:normalizeAssertionMap(test.assert_json_field_equals),assert_json_field_gte:normalizeAssertionMap(test.assert_json_field_gte)};return JSON.stringify(normalized)};const resolveLinkedTestTargetSignature=test=>{const command=resolveOptionalEnvironmentValue(test.command);if(command!==void 0){return`command:${test.scope}:${normalizeCommand(command)}`}return`path:${test.scope}:${resolveOptionalEnvironmentValue(test.path)??""}`};const buildLinkedTestKey=test=>{const envSet=normalizeEnvSetSignature(test.env_set);const envClear=normalizeEnvClearSignature(test.env_clear);const pmContextMode=normalizePmContextModeSignature(test.pm_context_mode);const workspaceContextMode=normalizeWorkspaceContextModeSignature(test.workspace_context_mode);const sharedHostSafe=test.shared_host_safe===true?"true":"false";const assertions=normalizeAssertionSignature(test);return`${resolveLinkedTestTargetSignature(test)}:${envSet}:${envClear}:${pmContextMode}:${workspaceContextMode}:${sharedHostSafe}:${assertions}`};const maxTimeoutSeconds=(current,candidate)=>{if(candidate===void 0){return current}if(current===void 0||candidate>current){return candidate}return current};const countStatuses=runResults=>{let passed=0;let failed=0;let skipped=0;for(const result of runResults){if(result.status==="passed"){passed+=1;continue}if(result.status==="failed"){failed+=1;continue}skipped+=1}return{passed,failed,skipped}};const mergeFailureCategoryCounts=(target,source)=>{for(const[key,value]of Object.entries(source)){target[key]+=value}};const emitTestAllProgress=(options,message)=>{if(options.progress!==true){return}try{process.stderr.write(`[pm test-all] ${message}
2
- `)}catch{}};const collectTestAllItemTests=async(filteredItems,global2,pmRoot)=>{const itemTests=[];let linkedTests=0;for(const item of filteredItems){const readResult=await runTest(item.id,{run:false},{...global2,path:pmRoot});linkedTests+=readResult.tests.length;itemTests.push({item,tests:readResult.tests})}return{itemTests,linkedTests}};const selectTestAllItems=async params=>{const statusRegistry=resolveRuntimeStatusRegistry(params.settings.schema);const typeRegistry=resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations());const statusFilter=parseStatus(params.options.status,statusRegistry);const limitFilter=parseNonNegativeInteger(params.options.limit,"--limit");const offsetFilter=parseNonNegativeInteger(params.options.offset,"--offset")??0;const allItems=await listAllItemMetadataLight(params.pmRoot,params.settings.item_format,typeRegistry.type_to_folder,void 0,params.settings.schema);const statusFilteredItems=allItems.filter(item=>statusFilter?item.status===statusFilter:true).sort((a,b)=>a.id.localeCompare(b.id));const filteredItems=limitFilter===void 0?statusFilteredItems.slice(offsetFilter):statusFilteredItems.slice(offsetFilter,offsetFilter+limitFilter);return{filteredItems,statusFilter,limitFilter,offsetFilter}};const buildEffectiveTimeoutByKey=itemTests=>{const effectiveTimeoutByKey=new Map;for(const{tests}of itemTests){for(const test of tests){const key=buildLinkedTestKey(test);if(!effectiveTimeoutByKey.has(key)){effectiveTimeoutByKey.set(key,test.timeout_seconds);continue}effectiveTimeoutByKey.set(key,maxTimeoutSeconds(effectiveTimeoutByKey.get(key),test.timeout_seconds))}}return effectiveTimeoutByKey};const runTestAllItem=async(entry,context)=>{const testsToRun=[];const keyedTests=entry.tests.map(test=>{const key=buildLinkedTestKey(test);const duplicate=context.seenTestKeys.has(key);if(!duplicate){context.seenTestKeys.add(key);const effectiveTimeoutSeconds=context.effectiveTimeoutByKey.get(key);testsToRun.push(effectiveTimeoutSeconds===void 0?test:{...test,timeout_seconds:effectiveTimeoutSeconds})}return{test,key,duplicate}});const executedResults=testsToRun.length>0?await runLinkedTests(testsToRun,context.defaultTimeoutSeconds,{progress:context.options.progress,sourceRoots:context.sourceRoots,envSet:context.options.envSet,envClear:context.options.envClear,sharedHostSafe:context.options.sharedHostSafe,pmContext:context.options.pmContext,overrideLinkedPmContext:context.options.overrideLinkedPmContext,failOnContextMismatch:context.options.failOnContextMismatch,failOnEmptyTestRun:context.options.failOnEmptyTestRun,requireAssertionsForPm:context.options.requireAssertionsForPm,checkContext:context.options.checkContext,autoPmContext:context.options.autoPmContext,workspaceContext:context.options.workspaceContext,overrideLinkedWorkspaceContext:context.options.overrideLinkedWorkspaceContext,pmRoot:context.pmRoot,allowUntrustedLinkedTests:context.options.allowUntrustedLinkedTests,untrustedLinkedTestsPolicyEnabled:context.settings.testing.allow_untrusted_linked_tests}):[];let executedIndex=0;const runResults=keyedTests.map(({test,key,duplicate})=>{if(!duplicate){const executed=executedResults[executedIndex];executedIndex+=1;return executed}return{command:test.command,path:test.path,status:"skipped",error:`Duplicate linked test skipped (key=${key}).`}});const summary=countStatuses(runResults);const failureCategories=countFailureCategories(runResults);const trackingWarnings=await appendTestAllItemTracking(entry,summary,runResults,context);return{passed:summary.passed,failed:summary.failed,skipped:summary.skipped,trackingWarnings,failureCategories,result:{ok:summary.failed===0&&!(context.options.failOnSkipped===true&&summary.skipped>0),id:entry.item.id,status:entry.item.status,test_count:entry.tests.length,passed:summary.passed,failed:summary.failed,skipped:summary.skipped,run_results:runResults,failure_categories:failureCategories}}};const trackedRunFailed=(summary,options)=>[summary.failed>0,options.failOnSkipped===true&&summary.skipped>0].includes(true);const optionalTrue=value=>value?true:void 0;const appendTestAllItemTracking=async(entry,summary,runResults,context)=>{if(!context.trackingEnabled){return[]}try{const failed=trackedRunFailed(summary,context.options);await appendTrackedTestRunSummary({pmRoot:context.pmRoot,settings:context.settings,itemId:entry.item.id,author:context.trackingAuthor,message:`Track test-all run summary (${context.trackingRunId})`,entry:{run_id:context.trackingRunId,kind:"test-all",status:failed?"failed":"passed",started_at:context.runStartedAt,finished_at:nowIso(),recorded_at:nowIso(),attempt:context.trackingAttempt,resumed_from:context.trackingResumedFrom,passed:summary.passed,failed:summary.failed,skipped:summary.skipped,items:1,linked_tests:entry.tests.length,fail_on_skipped_triggered:optionalTrue(context.options.failOnSkipped===true&&summary.skipped>0),executions:runResults.filter(result=>result.command?.trim()).slice(0,32).map(result=>({command:result.command.trim(),requested_pm_context_mode:result.execution_context?.requested_pm_context_mode,pm_context_mode:result.execution_context?.pm_context_mode,workspace_context_mode:result.execution_context?.workspace_context_mode,trust_reason:result.execution_context?.trust.reason}))}})}catch(error){return[`test_result_tracking_failed:${entry.item.id}:${formatTrackingError(error)}`]}return[]};const resolveTrackingAttempt=()=>{const raw=process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();const parsed=raw?Number.parseInt(raw,10):Number.NaN;return Number.isFinite(parsed)&&parsed>=1?parsed:void 0};const resolveOptionalEnvironmentValue=value=>{const trimmed=value?.trim();return trimmed&&trimmed.length>0?trimmed:void 0};const buildTestAllItemRunContext=params=>{return{pmRoot:params.pmRoot,settings:params.settings,options:params.options,defaultTimeoutSeconds:params.defaultTimeoutSeconds,sourceRoots:{projectPmRoot:params.pmRoot,globalPmRoot:resolveGlobalPmRoot(process.cwd())},seenTestKeys:new Set,effectiveTimeoutByKey:buildEffectiveTimeoutByKey(params.itemTests),trackingEnabled:params.settings.testing.record_results_to_items===true,trackingAuthor:resolveAuthor(params.options.author,params.settings.author_default),trackingRunId:resolveTrackedRunId(),trackingAttempt:resolveTrackingAttempt(),trackingResumedFrom:resolveOptionalEnvironmentValue(process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM),runStartedAt:params.runStartedAt}};const initializeTestAllAccumulation=(options,linkedTests,filteredItems)=>{const accumulation={results:[],passed:0,failed:0,skipped:0,failureCategories:countFailureCategories([]),trackingWarnings:[]};const failOnEmptyTestRunTriggered=options.failOnEmptyTestRun===true&&linkedTests===0;if(failOnEmptyTestRunTriggered){accumulation.failed+=1;accumulation.failureCategories.empty_run+=1;accumulation.trackingWarnings.push(`empty_linked_test_selection:items=${filteredItems.length};linked_tests=0;fail_on_empty_test_run=true`)}return{accumulation,failOnEmptyTestRunTriggered}};const runTestAllItems=async(itemTests,context,accumulation)=>{for(const[itemIndex,entry]of itemTests.entries()){emitTestAllProgress(context.options,`item ${itemIndex+1}/${itemTests.length} start id=${entry.item.id} linked_tests=${entry.tests.length}`);const execution=await runTestAllItem(entry,context);mergeFailureCategoryCounts(accumulation.failureCategories,execution.failureCategories);accumulation.passed+=execution.passed;accumulation.failed+=execution.failed;accumulation.skipped+=execution.skipped;accumulation.trackingWarnings.push(...execution.trackingWarnings);accumulation.results.push(execution.result);emitTestAllProgress(context.options,`item ${itemIndex+1}/${itemTests.length} end id=${entry.item.id} status=${execution.failed===0?"passed":"failed"} passed=${execution.passed} failed=${execution.failed} skipped=${execution.skipped}`)}};const appendContextPreflightWarning=(options,accumulation)=>{if(options.checkContext!==true){return}const allRunResults=accumulation.results.flatMap(entry=>entry.run_results);const preflight=summarizeContextPreflight(allRunResults);accumulation.trackingWarnings.push(`context_preflight:checked_pm_commands=${preflight.checked_pm_commands};tracker_read_commands=${preflight.tracker_read_commands};mismatches=${preflight.mismatches};auto_remediated=${preflight.auto_remediated}`)};const buildTestAllResult=params=>{return{ok:params.ok,totals:{items:params.filteredItems.length,linked_tests:params.linkedTests,passed:params.accumulation.passed,failed:params.accumulation.failed,skipped:params.accumulation.skipped,failure_categories:params.accumulation.failureCategories},failed:params.accumulation.failed,passed:params.accumulation.passed,skipped:params.accumulation.skipped,fail_on_skipped_triggered:params.failOnSkippedTriggered?true:void 0,fail_on_empty_test_run_triggered:params.failOnEmptyTestRunTriggered?true:void 0,warnings:params.accumulation.trackingWarnings.length>0?params.accumulation.trackingWarnings:void 0,results:params.accumulation.results}};const buildTestAllSelectionProgress=params=>[`selection items=${params.filteredItems.length}`,`linked_tests=${params.linkedTests}`,params.statusFilter===void 0?"":`status=${params.statusFilter}`,params.limitFilter===void 0?"":`limit=${params.limitFilter}`,params.offsetFilter>0?`offset=${params.offsetFilter}`:""].filter(entry=>entry.length>0).join(" ");const prepareTestAllRun=async(options,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const selection=await selectTestAllItems({pmRoot,settings,options});const defaultTimeoutSeconds=parseTimeout(options.timeout);const runStartedAt=nowIso();const collected=await collectTestAllItemTests(selection.filteredItems,global2,pmRoot);emitTestAllProgress(options,buildTestAllSelectionProgress({...selection,linkedTests:collected.linkedTests}));return{pmRoot,settings,filteredItems:selection.filteredItems,itemTests:collected.itemTests,linkedTests:collected.linkedTests,defaultTimeoutSeconds,runStartedAt}};const resolveTestAllOutcome=params=>{const failOnSkippedTriggered=params.options.failOnSkipped===true&&params.accumulation.skipped>0;const ok=![params.accumulation.failed>0,failOnSkippedTriggered,params.failOnEmptyTestRunTriggered].includes(true);return{failOnSkippedTriggered,ok}};const runTestAll=async(options,global2)=>{const prepared=await prepareTestAllRun(options,global2);const{accumulation,failOnEmptyTestRunTriggered}=initializeTestAllAccumulation(options,prepared.linkedTests,prepared.filteredItems);const itemRunContext=buildTestAllItemRunContext({pmRoot:prepared.pmRoot,settings:prepared.settings,options,itemTests:prepared.itemTests,defaultTimeoutSeconds:prepared.defaultTimeoutSeconds,runStartedAt:prepared.runStartedAt});await runTestAllItems(prepared.itemTests,itemRunContext,accumulation);appendContextPreflightWarning(options,accumulation);const outcome=resolveTestAllOutcome({options,accumulation,failOnEmptyTestRunTriggered});emitTestAllProgress(options,`end status=${outcome.ok?"passed":"failed"} items=${prepared.filteredItems.length} linked_tests=${prepared.linkedTests} passed=${accumulation.passed} failed=${accumulation.failed} skipped=${accumulation.skipped}`);return buildTestAllResult({ok:outcome.ok,filteredItems:prepared.filteredItems,linkedTests:prepared.linkedTests,accumulation,failOnSkippedTriggered:outcome.failOnSkippedTriggered,failOnEmptyTestRunTriggered})};const _testOnlyTestAll={buildLinkedTestKey,formatTrackingError};export{_testOnlyTestAll,runTestAll};
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]="8371273e-fb3c-5615-bd0e-f7aeb2a0b303")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{parseOptionalNumber}from"../../core/item/parse.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{nowIso}from"../../core/shared/time.js";import{listAllItemMetadataLight}from"../../core/store/item-store.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{appendTrackedTestRunSummary}from"../../core/test/item-test-run-tracking.js";import{resolveAuthor}from"../../core/shared/author.js";import{countFailureCategories,runLinkedTests,runTest,summarizeContextPreflight}from"./execution.js";const parseStatus=(raw,statusRegistry)=>{if(raw===void 0)return;const normalized=normalizeStatusInput(raw,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid --status value "${raw}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE)}return normalized},parseTimeout=raw=>{if(raw===void 0)return;const parsed=parseOptionalNumber(raw,"timeout");if(parsed<=0)throw new PmCliError("timeout must be a positive number",EXIT_CODE.USAGE);return parsed},parseNonNegativeInteger=(raw,flag)=>{if(raw===void 0)return;const parsed=Number(raw);if(!Number.isInteger(parsed)||parsed<0)throw new PmCliError(`${flag} must be a non-negative integer`,EXIT_CODE.USAGE);return parsed},formatTrackingError=error=>error instanceof Error?error.message:String(error),resolveTrackedRunId=()=>{const fromEnv=process.env.PM_BACKGROUND_TEST_RUN_ID?.trim();return fromEnv&&fromEnv.length>0?fromEnv:`test-all-local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`},normalizeCommand=command=>command.trim().replaceAll(/\s+/g," "),normalizeEnvSetSignature=value=>!value||Object.keys(value).length===0?"{}":JSON.stringify(Object.fromEntries(Object.entries(value).sort(([left],[right])=>left.localeCompare(right)))),normalizeEnvClearSignature=value=>!value||value.length===0?"[]":JSON.stringify([...value].sort((left,right)=>left.localeCompare(right))),normalizePmContextModeSignature=value=>{const normalized=value?.trim().toLowerCase();return normalized&&normalized.length>0?normalized:"none"},normalizeWorkspaceContextModeSignature=value=>{const normalized=value?.trim().toLowerCase();return normalized&&normalized.length>0?normalized:"source"},normalizeAssertionStrings=values=>[...new Set(values??[])].sort((left,right)=>left.localeCompare(right)),normalizeAssertionMap=value=>Object.fromEntries(Object.entries(value??{}).sort(([left],[right])=>left.localeCompare(right))),normalizeAssertionLineCount=value=>typeof value=="number"?value:void 0,normalizeAssertionSignature=test=>{const normalized={assert_stdout_contains:normalizeAssertionStrings(test.assert_stdout_contains),assert_stdout_regex:normalizeAssertionStrings(test.assert_stdout_regex),assert_stderr_contains:normalizeAssertionStrings(test.assert_stderr_contains),assert_stderr_regex:normalizeAssertionStrings(test.assert_stderr_regex),assert_stdout_min_lines:normalizeAssertionLineCount(test.assert_stdout_min_lines),assert_json_field_equals:normalizeAssertionMap(test.assert_json_field_equals),assert_json_field_gte:normalizeAssertionMap(test.assert_json_field_gte)};return JSON.stringify(normalized)},resolveLinkedTestTargetSignature=test=>{const command=resolveOptionalEnvironmentValue(test.command);return command!==void 0?`command:${test.scope}:${normalizeCommand(command)}`:`path:${test.scope}:${resolveOptionalEnvironmentValue(test.path)??""}`},buildLinkedTestKey=test=>{const envSet=normalizeEnvSetSignature(test.env_set),envClear=normalizeEnvClearSignature(test.env_clear),pmContextMode=normalizePmContextModeSignature(test.pm_context_mode),workspaceContextMode=normalizeWorkspaceContextModeSignature(test.workspace_context_mode),sharedHostSafe=test.shared_host_safe===!0?"true":"false",assertions=normalizeAssertionSignature(test);return`${resolveLinkedTestTargetSignature(test)}:${envSet}:${envClear}:${pmContextMode}:${workspaceContextMode}:${sharedHostSafe}:${assertions}`},maxTimeoutSeconds=(current,candidate)=>candidate===void 0?current:current===void 0||candidate>current?candidate:current,countStatuses=runResults=>{let passed=0,failed=0,skipped=0;for(const result of runResults){if(result.status==="passed"){passed+=1;continue}if(result.status==="failed"){failed+=1;continue}skipped+=1}return{passed,failed,skipped}},mergeFailureCategoryCounts=(target,source)=>{for(const[key,value]of Object.entries(source))target[key]+=value},emitTestAllProgress=(options,message)=>{if(options.progress===!0)try{process.stderr.write(`[pm test-all] ${message}
2
+ `)}catch{}},collectTestAllItemTests=async(filteredItems,global2,pmRoot)=>{const itemTests=[];let linkedTests=0;for(const item of filteredItems){const readResult=await runTest(item.id,{run:!1},{...global2,path:pmRoot});linkedTests+=readResult.tests.length,itemTests.push({item,tests:readResult.tests})}return{itemTests,linkedTests}},selectTestAllItems=async params=>{const statusRegistry=resolveRuntimeStatusRegistry(params.settings.schema),typeRegistry=resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations()),statusFilter=parseStatus(params.options.status,statusRegistry),limitFilter=parseNonNegativeInteger(params.options.limit,"--limit"),offsetFilter=parseNonNegativeInteger(params.options.offset,"--offset")??0,statusFilteredItems=(await listAllItemMetadataLight(params.pmRoot,params.settings.item_format,typeRegistry.type_to_folder,void 0,params.settings.schema)).filter(item=>statusFilter?item.status===statusFilter:!0).sort((a,b)=>a.id.localeCompare(b.id));return{filteredItems:limitFilter===void 0?statusFilteredItems.slice(offsetFilter):statusFilteredItems.slice(offsetFilter,offsetFilter+limitFilter),statusFilter,limitFilter,offsetFilter}},buildEffectiveTimeoutByKey=itemTests=>{const effectiveTimeoutByKey=new Map;for(const{tests}of itemTests)for(const test of tests){const key=buildLinkedTestKey(test);if(!effectiveTimeoutByKey.has(key)){effectiveTimeoutByKey.set(key,test.timeout_seconds);continue}effectiveTimeoutByKey.set(key,maxTimeoutSeconds(effectiveTimeoutByKey.get(key),test.timeout_seconds))}return effectiveTimeoutByKey},runTestAllItem=async(entry,context)=>{const testsToRun=[],keyedTests=entry.tests.map(test=>{const key=buildLinkedTestKey(test),duplicate=context.seenTestKeys.has(key);if(!duplicate){context.seenTestKeys.add(key);const effectiveTimeoutSeconds=context.effectiveTimeoutByKey.get(key);testsToRun.push(effectiveTimeoutSeconds===void 0?test:{...test,timeout_seconds:effectiveTimeoutSeconds})}return{test,key,duplicate}}),executedResults=testsToRun.length>0?await runLinkedTests(testsToRun,context.defaultTimeoutSeconds,{progress:context.options.progress,sourceRoots:context.sourceRoots,envSet:context.options.envSet,envClear:context.options.envClear,sharedHostSafe:context.options.sharedHostSafe,pmContext:context.options.pmContext,overrideLinkedPmContext:context.options.overrideLinkedPmContext,failOnContextMismatch:context.options.failOnContextMismatch,failOnEmptyTestRun:context.options.failOnEmptyTestRun,requireAssertionsForPm:context.options.requireAssertionsForPm,checkContext:context.options.checkContext,autoPmContext:context.options.autoPmContext,workspaceContext:context.options.workspaceContext,overrideLinkedWorkspaceContext:context.options.overrideLinkedWorkspaceContext,pmRoot:context.pmRoot,allowUntrustedLinkedTests:context.options.allowUntrustedLinkedTests,untrustedLinkedTestsPolicyEnabled:context.settings.testing.allow_untrusted_linked_tests}):[];let executedIndex=0;const runResults=keyedTests.map(({test,key,duplicate})=>{if(!duplicate){const executed=executedResults[executedIndex];return executedIndex+=1,executed}return{command:test.command,path:test.path,status:"skipped",error:`Duplicate linked test skipped (key=${key}).`}}),summary=countStatuses(runResults),failureCategories=countFailureCategories(runResults),trackingWarnings=await appendTestAllItemTracking(entry,summary,runResults,context);return{passed:summary.passed,failed:summary.failed,skipped:summary.skipped,trackingWarnings,failureCategories,result:{ok:summary.failed===0&&!(context.options.failOnSkipped===!0&&summary.skipped>0),id:entry.item.id,status:entry.item.status,test_count:entry.tests.length,passed:summary.passed,failed:summary.failed,skipped:summary.skipped,run_results:runResults,failure_categories:failureCategories}}},trackedRunFailed=(summary,options)=>[summary.failed>0,options.failOnSkipped===!0&&summary.skipped>0].includes(!0),optionalTrue=value=>value?!0:void 0,appendTestAllItemTracking=async(entry,summary,runResults,context)=>{if(!context.trackingEnabled)return[];try{const failed=trackedRunFailed(summary,context.options);await appendTrackedTestRunSummary({pmRoot:context.pmRoot,settings:context.settings,itemId:entry.item.id,author:context.trackingAuthor,message:`Track test-all run summary (${context.trackingRunId})`,entry:{run_id:context.trackingRunId,kind:"test-all",status:failed?"failed":"passed",started_at:context.runStartedAt,finished_at:nowIso(),recorded_at:nowIso(),attempt:context.trackingAttempt,resumed_from:context.trackingResumedFrom,passed:summary.passed,failed:summary.failed,skipped:summary.skipped,items:1,linked_tests:entry.tests.length,fail_on_skipped_triggered:optionalTrue(context.options.failOnSkipped===!0&&summary.skipped>0),executions:runResults.filter(result=>result.command?.trim()).slice(0,32).map(result=>({command:result.command.trim(),requested_pm_context_mode:result.execution_context?.requested_pm_context_mode,pm_context_mode:result.execution_context?.pm_context_mode,workspace_context_mode:result.execution_context?.workspace_context_mode,trust_reason:result.execution_context?.trust.reason}))}})}catch(error){return[`test_result_tracking_failed:${entry.item.id}:${formatTrackingError(error)}`]}return[]},resolveTrackingAttempt=()=>{const raw=process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim(),parsed=raw?Number.parseInt(raw,10):Number.NaN;return Number.isFinite(parsed)&&parsed>=1?parsed:void 0},resolveOptionalEnvironmentValue=value=>{const trimmed=value?.trim();return trimmed&&trimmed.length>0?trimmed:void 0},buildTestAllItemRunContext=params=>({pmRoot:params.pmRoot,settings:params.settings,options:params.options,defaultTimeoutSeconds:params.defaultTimeoutSeconds,sourceRoots:{projectPmRoot:params.pmRoot,globalPmRoot:resolveGlobalPmRoot(process.cwd())},seenTestKeys:new Set,effectiveTimeoutByKey:buildEffectiveTimeoutByKey(params.itemTests),trackingEnabled:params.settings.testing.record_results_to_items===!0,trackingAuthor:resolveAuthor(params.options.author,params.settings.author_default),trackingRunId:resolveTrackedRunId(),trackingAttempt:resolveTrackingAttempt(),trackingResumedFrom:resolveOptionalEnvironmentValue(process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM),runStartedAt:params.runStartedAt}),initializeTestAllAccumulation=(options,linkedTests,filteredItems)=>{const accumulation={results:[],passed:0,failed:0,skipped:0,failureCategories:countFailureCategories([]),trackingWarnings:[]},failOnEmptyTestRunTriggered=options.failOnEmptyTestRun===!0&&linkedTests===0;return failOnEmptyTestRunTriggered&&(accumulation.failed+=1,accumulation.failureCategories.empty_run+=1,accumulation.trackingWarnings.push(`empty_linked_test_selection:items=${filteredItems.length};linked_tests=0;fail_on_empty_test_run=true`)),{accumulation,failOnEmptyTestRunTriggered}},runTestAllItems=async(itemTests,context,accumulation)=>{for(const[itemIndex,entry]of itemTests.entries()){emitTestAllProgress(context.options,`item ${itemIndex+1}/${itemTests.length} start id=${entry.item.id} linked_tests=${entry.tests.length}`);const execution=await runTestAllItem(entry,context);mergeFailureCategoryCounts(accumulation.failureCategories,execution.failureCategories),accumulation.passed+=execution.passed,accumulation.failed+=execution.failed,accumulation.skipped+=execution.skipped,accumulation.trackingWarnings.push(...execution.trackingWarnings),accumulation.results.push(execution.result),emitTestAllProgress(context.options,`item ${itemIndex+1}/${itemTests.length} end id=${entry.item.id} status=${execution.failed===0?"passed":"failed"} passed=${execution.passed} failed=${execution.failed} skipped=${execution.skipped}`)}},appendContextPreflightWarning=(options,accumulation)=>{if(options.checkContext!==!0)return;const allRunResults=accumulation.results.flatMap(entry=>entry.run_results),preflight=summarizeContextPreflight(allRunResults);accumulation.trackingWarnings.push(`context_preflight:checked_pm_commands=${preflight.checked_pm_commands};tracker_read_commands=${preflight.tracker_read_commands};mismatches=${preflight.mismatches};auto_remediated=${preflight.auto_remediated}`)},buildTestAllResult=params=>({ok:params.ok,totals:{items:params.filteredItems.length,linked_tests:params.linkedTests,passed:params.accumulation.passed,failed:params.accumulation.failed,skipped:params.accumulation.skipped,failure_categories:params.accumulation.failureCategories},failed:params.accumulation.failed,passed:params.accumulation.passed,skipped:params.accumulation.skipped,fail_on_skipped_triggered:params.failOnSkippedTriggered?!0:void 0,fail_on_empty_test_run_triggered:params.failOnEmptyTestRunTriggered?!0:void 0,warnings:params.accumulation.trackingWarnings.length>0?params.accumulation.trackingWarnings:void 0,results:params.accumulation.results}),buildTestAllSelectionProgress=params=>[`selection items=${params.filteredItems.length}`,`linked_tests=${params.linkedTests}`,params.statusFilter===void 0?"":`status=${params.statusFilter}`,params.limitFilter===void 0?"":`limit=${params.limitFilter}`,params.offsetFilter>0?`offset=${params.offsetFilter}`:""].filter(entry=>entry.length>0).join(" "),prepareTestAllRun=async(options,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),selection=await selectTestAllItems({pmRoot,settings,options}),defaultTimeoutSeconds=parseTimeout(options.timeout),runStartedAt=nowIso(),collected=await collectTestAllItemTests(selection.filteredItems,global2,pmRoot);return emitTestAllProgress(options,buildTestAllSelectionProgress({...selection,linkedTests:collected.linkedTests})),{pmRoot,settings,filteredItems:selection.filteredItems,itemTests:collected.itemTests,linkedTests:collected.linkedTests,defaultTimeoutSeconds,runStartedAt}},resolveTestAllOutcome=params=>{const failOnSkippedTriggered=params.options.failOnSkipped===!0&&params.accumulation.skipped>0,ok=![params.accumulation.failed>0,failOnSkippedTriggered,params.failOnEmptyTestRunTriggered].includes(!0);return{failOnSkippedTriggered,ok}},runTestAll=async(options,global2)=>{const prepared=await prepareTestAllRun(options,global2),{accumulation,failOnEmptyTestRunTriggered}=initializeTestAllAccumulation(options,prepared.linkedTests,prepared.filteredItems),itemRunContext=buildTestAllItemRunContext({pmRoot:prepared.pmRoot,settings:prepared.settings,options,itemTests:prepared.itemTests,defaultTimeoutSeconds:prepared.defaultTimeoutSeconds,runStartedAt:prepared.runStartedAt});await runTestAllItems(prepared.itemTests,itemRunContext,accumulation),appendContextPreflightWarning(options,accumulation);const outcome=resolveTestAllOutcome({options,accumulation,failOnEmptyTestRunTriggered});return emitTestAllProgress(options,`end status=${outcome.ok?"passed":"failed"} items=${prepared.filteredItems.length} linked_tests=${prepared.linkedTests} passed=${accumulation.passed} failed=${accumulation.failed} skipped=${accumulation.skipped}`),buildTestAllResult({ok:outcome.ok,filteredItems:prepared.filteredItems,linkedTests:prepared.linkedTests,accumulation,failOnSkippedTriggered:outcome.failOnSkippedTriggered,failOnEmptyTestRunTriggered})},_testOnlyTestAll={buildLinkedTestKey,formatTrackingError};export{_testOnlyTestAll,runTestAll};
3
3
  //# sourceMappingURL=batch.js.map
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="70971b2a-c025-50a8-918f-871fc8adfd2a")}catch(e2){}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{looksLikeStructuredKeyValueEntry}from"../../core/item/parse.js";const STRUCTURED_LINKED_TEST_KEYS=["command","cmd","path","scope","timeout","timeout_seconds","pm_context_mode","workspace_context_mode","env_set","env_clear","shared_host_safe","assert_stdout_contains","assert_stdout_regex","assert_stderr_contains","assert_stderr_regex","assert_stdout_min_lines","assert_json_field_equals","assert_json_field_gte","note"];const STRUCTURED_LINKED_TEST_KEY_SET=new Set(STRUCTURED_LINKED_TEST_KEYS);function looksLikeStructuredLinkedTestEntry(raw){return looksLikeStructuredKeyValueEntry(raw,STRUCTURED_LINKED_TEST_KEYS)}function normalizeStructuredLinkedTestEntry(kv,optionName){const normalizedKv={};const unknownKeys=[];for(const[key,value]of Object.entries(kv)){const normalizedKey=key.toLowerCase();if(!STRUCTURED_LINKED_TEST_KEY_SET.has(normalizedKey)){unknownKeys.push(key);continue}if(Object.hasOwn(normalizedKv,normalizedKey)){throw new PmCliError(`${optionName} provides key "${key}" more than once after case normalization`,EXIT_CODE.USAGE)}normalizedKv[normalizedKey]=value}if(unknownKeys.length>0){throw new PmCliError(`${optionName} does not recognize key${unknownKeys.length>1?"s":""} ${unknownKeys.map(key=>`"${key}"`).join(", ")}. Allowed keys: ${STRUCTURED_LINKED_TEST_KEYS.join(", ")}.`,EXIT_CODE.USAGE)}if(normalizedKv.cmd!==void 0){if(normalizedKv.command!==void 0&&normalizedKv.command.trim()!==normalizedKv.cmd.trim()){throw new PmCliError(`${optionName} command and cmd must match when both are provided`,EXIT_CODE.USAGE)}const{cmd,...rest}=normalizedKv;return{...rest,command:rest.command??cmd}}return normalizedKv}export{STRUCTURED_LINKED_TEST_KEYS,looksLikeStructuredLinkedTestEntry,normalizeStructuredLinkedTestEntry};
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]="b968be78-8489-5735-8f95-8e38a36e160a")}catch{}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{looksLikeStructuredKeyValueEntry}from"../../core/item/parse.js";const STRUCTURED_LINKED_TEST_KEYS=["command","cmd","path","scope","timeout","timeout_seconds","pm_context_mode","workspace_context_mode","env_set","env_clear","shared_host_safe","assert_stdout_contains","assert_stdout_regex","assert_stderr_contains","assert_stderr_regex","assert_stdout_min_lines","assert_json_field_equals","assert_json_field_gte","note"],STRUCTURED_LINKED_TEST_KEY_SET=new Set(STRUCTURED_LINKED_TEST_KEYS);function looksLikeStructuredLinkedTestEntry(raw){return looksLikeStructuredKeyValueEntry(raw,STRUCTURED_LINKED_TEST_KEYS)}function normalizeStructuredLinkedTestEntry(kv,optionName){const normalizedKv={},unknownKeys=[];for(const[key,value]of Object.entries(kv)){const normalizedKey=key.toLowerCase();if(!STRUCTURED_LINKED_TEST_KEY_SET.has(normalizedKey)){unknownKeys.push(key);continue}if(Object.hasOwn(normalizedKv,normalizedKey))throw new PmCliError(`${optionName} provides key "${key}" more than once after case normalization`,EXIT_CODE.USAGE);normalizedKv[normalizedKey]=value}if(unknownKeys.length>0)throw new PmCliError(`${optionName} does not recognize key${unknownKeys.length>1?"s":""} ${unknownKeys.map(key=>`"${key}"`).join(", ")}. Allowed keys: ${STRUCTURED_LINKED_TEST_KEYS.join(", ")}.`,EXIT_CODE.USAGE);if(normalizedKv.cmd!==void 0){if(normalizedKv.command!==void 0&&normalizedKv.command.trim()!==normalizedKv.cmd.trim())throw new PmCliError(`${optionName} command and cmd must match when both are provided`,EXIT_CODE.USAGE);const{cmd,...rest}=normalizedKv;return{...rest,command:rest.command??cmd}}return normalizedKv}export{STRUCTURED_LINKED_TEST_KEYS,looksLikeStructuredLinkedTestEntry,normalizeStructuredLinkedTestEntry};
2
2
  //# sourceMappingURL=entry.js.map