@unbrained/pm-cli 2026.5.14 → 2026.5.24

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 (436) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/AGENTS.md +78 -457
  3. package/CHANGELOG.md +71 -0
  4. package/CONTRIBUTING.md +1 -0
  5. package/README.md +8 -6
  6. package/dist/cli/argv-utils.js +4 -1
  7. package/dist/cli/argv-utils.js.map +1 -1
  8. package/dist/cli/bootstrap-args.js +4 -1
  9. package/dist/cli/bootstrap-args.js.map +1 -1
  10. package/dist/cli/commander-usage.js +19 -1
  11. package/dist/cli/commander-usage.js.map +1 -1
  12. package/dist/cli/commands/activity.js +4 -1
  13. package/dist/cli/commands/activity.js.map +1 -1
  14. package/dist/cli/commands/aggregate.js +5 -2
  15. package/dist/cli/commands/aggregate.js.map +1 -1
  16. package/dist/cli/commands/annotation-command.d.ts +49 -0
  17. package/dist/cli/commands/annotation-command.js +135 -0
  18. package/dist/cli/commands/annotation-command.js.map +1 -0
  19. package/dist/cli/commands/append.js +5 -6
  20. package/dist/cli/commands/append.js.map +1 -1
  21. package/dist/cli/commands/calendar.js +5 -5
  22. package/dist/cli/commands/calendar.js.map +1 -1
  23. package/dist/cli/commands/claim.d.ts +3 -0
  24. package/dist/cli/commands/claim.js +29 -23
  25. package/dist/cli/commands/claim.js.map +1 -1
  26. package/dist/cli/commands/close.js +63 -8
  27. package/dist/cli/commands/close.js.map +1 -1
  28. package/dist/cli/commands/comments-audit.js +4 -1
  29. package/dist/cli/commands/comments-audit.js.map +1 -1
  30. package/dist/cli/commands/comments.d.ts +5 -0
  31. package/dist/cli/commands/comments.js +29 -116
  32. package/dist/cli/commands/comments.js.map +1 -1
  33. package/dist/cli/commands/completion.js +198 -15
  34. package/dist/cli/commands/completion.js.map +1 -1
  35. package/dist/cli/commands/config.js +4 -1
  36. package/dist/cli/commands/config.js.map +1 -1
  37. package/dist/cli/commands/context.js +21 -13
  38. package/dist/cli/commands/context.js.map +1 -1
  39. package/dist/cli/commands/contracts.d.ts +9 -0
  40. package/dist/cli/commands/contracts.js +314 -64
  41. package/dist/cli/commands/contracts.js.map +1 -1
  42. package/dist/cli/commands/create.js +77 -48
  43. package/dist/cli/commands/create.js.map +1 -1
  44. package/dist/cli/commands/dedupe-audit.js +9 -3
  45. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  46. package/dist/cli/commands/delete.d.ts +3 -0
  47. package/dist/cli/commands/delete.js +11 -7
  48. package/dist/cli/commands/delete.js.map +1 -1
  49. package/dist/cli/commands/deps.js +4 -1
  50. package/dist/cli/commands/deps.js.map +1 -1
  51. package/dist/cli/commands/docs.d.ts +1 -0
  52. package/dist/cli/commands/docs.js +6 -7
  53. package/dist/cli/commands/docs.js.map +1 -1
  54. package/dist/cli/commands/event-validation-messages.d.ts +3 -0
  55. package/dist/cli/commands/event-validation-messages.js +44 -0
  56. package/dist/cli/commands/event-validation-messages.js.map +1 -0
  57. package/dist/cli/commands/extension.d.ts +3 -1
  58. package/dist/cli/commands/extension.js +259 -52
  59. package/dist/cli/commands/extension.js.map +1 -1
  60. package/dist/cli/commands/files.js +8 -12
  61. package/dist/cli/commands/files.js.map +1 -1
  62. package/dist/cli/commands/gc.js +19 -3
  63. package/dist/cli/commands/gc.js.map +1 -1
  64. package/dist/cli/commands/get.d.ts +10 -5
  65. package/dist/cli/commands/get.js +135 -20
  66. package/dist/cli/commands/get.js.map +1 -1
  67. package/dist/cli/commands/guide.js +6 -8
  68. package/dist/cli/commands/guide.js.map +1 -1
  69. package/dist/cli/commands/health.d.ts +14 -0
  70. package/dist/cli/commands/health.js +269 -67
  71. package/dist/cli/commands/health.js.map +1 -1
  72. package/dist/cli/commands/history-redact.d.ts +50 -0
  73. package/dist/cli/commands/history-redact.js +476 -0
  74. package/dist/cli/commands/history-redact.js.map +1 -0
  75. package/dist/cli/commands/history-repair.d.ts +33 -0
  76. package/dist/cli/commands/history-repair.js +166 -0
  77. package/dist/cli/commands/history-repair.js.map +1 -0
  78. package/dist/cli/commands/history.d.ts +4 -0
  79. package/dist/cli/commands/history.js +12 -79
  80. package/dist/cli/commands/history.js.map +1 -1
  81. package/dist/cli/commands/index.d.ts +5 -1
  82. package/dist/cli/commands/index.js +9 -2
  83. package/dist/cli/commands/index.js.map +1 -1
  84. package/dist/cli/commands/init-agent-guidance.d.ts +31 -0
  85. package/dist/cli/commands/init-agent-guidance.js +336 -0
  86. package/dist/cli/commands/init-agent-guidance.js.map +1 -0
  87. package/dist/cli/commands/init.d.ts +42 -0
  88. package/dist/cli/commands/init.js +96 -1
  89. package/dist/cli/commands/init.js.map +1 -1
  90. package/dist/cli/commands/learnings.js +22 -118
  91. package/dist/cli/commands/learnings.js.map +1 -1
  92. package/dist/cli/commands/linked-test-entry.d.ts +3 -0
  93. package/dist/cli/commands/linked-test-entry.js +62 -0
  94. package/dist/cli/commands/linked-test-entry.js.map +1 -0
  95. package/dist/cli/commands/list.d.ts +1 -0
  96. package/dist/cli/commands/list.js +72 -38
  97. package/dist/cli/commands/list.js.map +1 -1
  98. package/dist/cli/commands/metadata-normalizers.js +4 -1
  99. package/dist/cli/commands/metadata-normalizers.js.map +1 -1
  100. package/dist/cli/commands/normalize.js +4 -1
  101. package/dist/cli/commands/normalize.js.map +1 -1
  102. package/dist/cli/commands/notes.js +22 -118
  103. package/dist/cli/commands/notes.js.map +1 -1
  104. package/dist/cli/commands/plan.d.ts +121 -0
  105. package/dist/cli/commands/plan.js +1137 -0
  106. package/dist/cli/commands/plan.js.map +1 -0
  107. package/dist/cli/commands/reindex.js +4 -1
  108. package/dist/cli/commands/reindex.js.map +1 -1
  109. package/dist/cli/commands/restore.js +9 -49
  110. package/dist/cli/commands/restore.js.map +1 -1
  111. package/dist/cli/commands/schema.d.ts +31 -0
  112. package/dist/cli/commands/schema.js +98 -0
  113. package/dist/cli/commands/schema.js.map +1 -0
  114. package/dist/cli/commands/search.js +156 -40
  115. package/dist/cli/commands/search.js.map +1 -1
  116. package/dist/cli/commands/stats.js +4 -1
  117. package/dist/cli/commands/stats.js.map +1 -1
  118. package/dist/cli/commands/templates.d.ts +4 -0
  119. package/dist/cli/commands/templates.js +91 -16
  120. package/dist/cli/commands/templates.js.map +1 -1
  121. package/dist/cli/commands/test-all.js +6 -7
  122. package/dist/cli/commands/test-all.js.map +1 -1
  123. package/dist/cli/commands/test-runs.js +4 -1
  124. package/dist/cli/commands/test-runs.js.map +1 -1
  125. package/dist/cli/commands/test.d.ts +1 -0
  126. package/dist/cli/commands/test.js +9 -9
  127. package/dist/cli/commands/test.js.map +1 -1
  128. package/dist/cli/commands/update-many.js +6 -7
  129. package/dist/cli/commands/update-many.js.map +1 -1
  130. package/dist/cli/commands/update.js +204 -103
  131. package/dist/cli/commands/update.js.map +1 -1
  132. package/dist/cli/commands/upgrade.js +6 -3
  133. package/dist/cli/commands/upgrade.js.map +1 -1
  134. package/dist/cli/commands/validate.d.ts +3 -1
  135. package/dist/cli/commands/validate.js +44 -64
  136. package/dist/cli/commands/validate.js.map +1 -1
  137. package/dist/cli/error-guidance.js +99 -6
  138. package/dist/cli/error-guidance.js.map +1 -1
  139. package/dist/cli/extension-command-help.d.ts +0 -1
  140. package/dist/cli/extension-command-help.js +4 -12
  141. package/dist/cli/extension-command-help.js.map +1 -1
  142. package/dist/cli/extension-command-options.d.ts +1 -0
  143. package/dist/cli/extension-command-options.js +108 -6
  144. package/dist/cli/extension-command-options.js.map +1 -1
  145. package/dist/cli/guide-topics.js +4 -1
  146. package/dist/cli/guide-topics.js.map +1 -1
  147. package/dist/cli/help-content.d.ts +0 -1
  148. package/dist/cli/help-content.js +46 -22
  149. package/dist/cli/help-content.js.map +1 -1
  150. package/dist/cli/help-json-payload.d.ts +1 -0
  151. package/dist/cli/help-json-payload.js +35 -2
  152. package/dist/cli/help-json-payload.js.map +1 -1
  153. package/dist/cli/main.js +214 -30
  154. package/dist/cli/main.js.map +1 -1
  155. package/dist/cli/migration-gates.js +4 -1
  156. package/dist/cli/migration-gates.js.map +1 -1
  157. package/dist/cli/register-list-query.d.ts +1 -1
  158. package/dist/cli/register-list-query.js +75 -29
  159. package/dist/cli/register-list-query.js.map +1 -1
  160. package/dist/cli/register-mutation.d.ts +1 -1
  161. package/dist/cli/register-mutation.js +430 -38
  162. package/dist/cli/register-mutation.js.map +1 -1
  163. package/dist/cli/register-operations.js +47 -10
  164. package/dist/cli/register-operations.js.map +1 -1
  165. package/dist/cli/register-setup.js +47 -25
  166. package/dist/cli/register-setup.js.map +1 -1
  167. package/dist/cli/registration-helpers.d.ts +0 -2
  168. package/dist/cli/registration-helpers.js +21 -40
  169. package/dist/cli/registration-helpers.js.map +1 -1
  170. package/dist/cli/shared-parsers.js +4 -1
  171. package/dist/cli/shared-parsers.js.map +1 -1
  172. package/dist/cli/telemetry-flush.js +4 -1
  173. package/dist/cli/telemetry-flush.js.map +1 -1
  174. package/dist/cli.js +65 -3
  175. package/dist/cli.js.map +1 -1
  176. package/dist/core/extensions/extension-types.js +4 -1
  177. package/dist/core/extensions/extension-types.js.map +1 -1
  178. package/dist/core/extensions/index.d.ts +0 -1
  179. package/dist/core/extensions/index.js +4 -13
  180. package/dist/core/extensions/index.js.map +1 -1
  181. package/dist/core/extensions/item-fields.js +4 -1
  182. package/dist/core/extensions/item-fields.js.map +1 -1
  183. package/dist/core/extensions/loader.js +78 -60
  184. package/dist/core/extensions/loader.js.map +1 -1
  185. package/dist/core/extensions/runtime-registrations.js +4 -1
  186. package/dist/core/extensions/runtime-registrations.js.map +1 -1
  187. package/dist/core/fs/fs-utils.js +4 -1
  188. package/dist/core/fs/fs-utils.js.map +1 -1
  189. package/dist/core/fs/index.js +4 -1
  190. package/dist/core/fs/index.js.map +1 -1
  191. package/dist/core/fs/path-utils.d.ts +1 -0
  192. package/dist/core/fs/path-utils.js +12 -0
  193. package/dist/core/fs/path-utils.js.map +1 -0
  194. package/dist/core/history/drift-scan.d.ts +11 -0
  195. package/dist/core/history/drift-scan.js +67 -0
  196. package/dist/core/history/drift-scan.js.map +1 -0
  197. package/dist/core/history/history-stream-policy.js +4 -1
  198. package/dist/core/history/history-stream-policy.js.map +1 -1
  199. package/dist/core/history/history.js +4 -1
  200. package/dist/core/history/history.js.map +1 -1
  201. package/dist/core/history/index.js +4 -1
  202. package/dist/core/history/index.js.map +1 -1
  203. package/dist/core/history/replay.d.ts +82 -0
  204. package/dist/core/history/replay.js +249 -0
  205. package/dist/core/history/replay.js.map +1 -0
  206. package/dist/core/item/id.js +4 -1
  207. package/dist/core/item/id.js.map +1 -1
  208. package/dist/core/item/index.js +4 -1
  209. package/dist/core/item/index.js.map +1 -1
  210. package/dist/core/item/item-format.js +250 -8
  211. package/dist/core/item/item-format.js.map +1 -1
  212. package/dist/core/item/item-type-definition.d.ts +52 -0
  213. package/dist/core/item/item-type-definition.js +123 -0
  214. package/dist/core/item/item-type-definition.js.map +1 -0
  215. package/dist/core/item/parent-reference-policy.js +4 -1
  216. package/dist/core/item/parent-reference-policy.js.map +1 -1
  217. package/dist/core/item/parse.js +34 -3
  218. package/dist/core/item/parse.js.map +1 -1
  219. package/dist/core/item/priority.d.ts +23 -0
  220. package/dist/core/item/priority.js +55 -0
  221. package/dist/core/item/priority.js.map +1 -0
  222. package/dist/core/item/sprint-release-format.js +4 -1
  223. package/dist/core/item/sprint-release-format.js.map +1 -1
  224. package/dist/core/item/status.d.ts +14 -1
  225. package/dist/core/item/status.js +24 -1
  226. package/dist/core/item/status.js.map +1 -1
  227. package/dist/core/item/toon-decode.d.ts +19 -0
  228. package/dist/core/item/toon-decode.js +69 -0
  229. package/dist/core/item/toon-decode.js.map +1 -0
  230. package/dist/core/item/type-registry.js +15 -83
  231. package/dist/core/item/type-registry.js.map +1 -1
  232. package/dist/core/lock/index.js +4 -1
  233. package/dist/core/lock/index.js.map +1 -1
  234. package/dist/core/lock/lock.js +4 -1
  235. package/dist/core/lock/lock.js.map +1 -1
  236. package/dist/core/output/output.d.ts +4 -0
  237. package/dist/core/output/output.js +47 -6
  238. package/dist/core/output/output.js.map +1 -1
  239. package/dist/core/packages/manifest.d.ts +1 -0
  240. package/dist/core/packages/manifest.js +6 -8
  241. package/dist/core/packages/manifest.js.map +1 -1
  242. package/dist/core/packages/root.d.ts +3 -0
  243. package/dist/core/packages/root.js +51 -0
  244. package/dist/core/packages/root.js.map +1 -0
  245. package/dist/core/schema/item-types-file.d.ts +85 -0
  246. package/dist/core/schema/item-types-file.js +243 -0
  247. package/dist/core/schema/item-types-file.js.map +1 -0
  248. package/dist/core/schema/runtime-field-filters.js +4 -1
  249. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  250. package/dist/core/schema/runtime-field-values.js +4 -1
  251. package/dist/core/schema/runtime-field-values.js.map +1 -1
  252. package/dist/core/schema/runtime-schema.d.ts +2 -1
  253. package/dist/core/schema/runtime-schema.js +13 -8
  254. package/dist/core/schema/runtime-schema.js.map +1 -1
  255. package/dist/core/search/cache.js +7 -2
  256. package/dist/core/search/cache.js.map +1 -1
  257. package/dist/core/search/corpus.d.ts +2 -0
  258. package/dist/core/search/corpus.js +77 -2
  259. package/dist/core/search/corpus.js.map +1 -1
  260. package/dist/core/search/embedding-batches.js +21 -7
  261. package/dist/core/search/embedding-batches.js.map +1 -1
  262. package/dist/core/search/http-client.js +4 -1
  263. package/dist/core/search/http-client.js.map +1 -1
  264. package/dist/core/search/providers.js +4 -1
  265. package/dist/core/search/providers.js.map +1 -1
  266. package/dist/core/search/semantic-defaults.js +12 -3
  267. package/dist/core/search/semantic-defaults.js.map +1 -1
  268. package/dist/core/search/vector-stores.js +4 -1
  269. package/dist/core/search/vector-stores.js.map +1 -1
  270. package/dist/core/sentry/helpers.js +4 -1
  271. package/dist/core/sentry/helpers.js.map +1 -1
  272. package/dist/core/sentry/instrument.js +10 -13
  273. package/dist/core/sentry/instrument.js.map +1 -1
  274. package/dist/core/shared/author.d.ts +1 -0
  275. package/dist/core/shared/author.js +9 -0
  276. package/dist/core/shared/author.js.map +1 -0
  277. package/dist/core/shared/command-types.js +4 -1
  278. package/dist/core/shared/command-types.js.map +1 -1
  279. package/dist/core/shared/conflict-markers.js +4 -1
  280. package/dist/core/shared/conflict-markers.js.map +1 -1
  281. package/dist/core/shared/constants.d.ts +2 -2
  282. package/dist/core/shared/constants.js +24 -1
  283. package/dist/core/shared/constants.js.map +1 -1
  284. package/dist/core/shared/errors.js +4 -1
  285. package/dist/core/shared/errors.js.map +1 -1
  286. package/dist/core/shared/index.js +4 -1
  287. package/dist/core/shared/index.js.map +1 -1
  288. package/dist/core/shared/lazy-module.d.ts +1 -0
  289. package/dist/core/shared/lazy-module.js +11 -0
  290. package/dist/core/shared/lazy-module.js.map +1 -0
  291. package/dist/core/shared/levenshtein.js +4 -1
  292. package/dist/core/shared/levenshtein.js.map +1 -1
  293. package/dist/core/shared/option-alias-visibility.d.ts +44 -0
  294. package/dist/core/shared/option-alias-visibility.js +76 -0
  295. package/dist/core/shared/option-alias-visibility.js.map +1 -0
  296. package/dist/core/shared/primitives.js +4 -1
  297. package/dist/core/shared/primitives.js.map +1 -1
  298. package/dist/core/shared/serialization.js +4 -1
  299. package/dist/core/shared/serialization.js.map +1 -1
  300. package/dist/core/shared/text-normalization.d.ts +0 -1
  301. package/dist/core/shared/text-normalization.js +4 -4
  302. package/dist/core/shared/text-normalization.js.map +1 -1
  303. package/dist/core/shared/time.js +4 -1
  304. package/dist/core/shared/time.js.map +1 -1
  305. package/dist/core/store/front-matter-cache.js +8 -3
  306. package/dist/core/store/front-matter-cache.js.map +1 -1
  307. package/dist/core/store/index.js +4 -1
  308. package/dist/core/store/index.js.map +1 -1
  309. package/dist/core/store/item-format-migration.js +4 -1
  310. package/dist/core/store/item-format-migration.js.map +1 -1
  311. package/dist/core/store/item-store.d.ts +4 -0
  312. package/dist/core/store/item-store.js +133 -39
  313. package/dist/core/store/item-store.js.map +1 -1
  314. package/dist/core/store/paths.js +4 -1
  315. package/dist/core/store/paths.js.map +1 -1
  316. package/dist/core/store/settings-validator.d.ts +106 -0
  317. package/dist/core/store/settings-validator.js +279 -0
  318. package/dist/core/store/settings-validator.js.map +1 -0
  319. package/dist/core/store/settings.js +32 -331
  320. package/dist/core/store/settings.js.map +1 -1
  321. package/dist/core/telemetry/consent.js +4 -1
  322. package/dist/core/telemetry/consent.js.map +1 -1
  323. package/dist/core/telemetry/observability.d.ts +1 -1
  324. package/dist/core/telemetry/observability.js +11 -2
  325. package/dist/core/telemetry/observability.js.map +1 -1
  326. package/dist/core/telemetry/runtime.js +34 -6
  327. package/dist/core/telemetry/runtime.js.map +1 -1
  328. package/dist/core/test/background-runs.js +4 -1
  329. package/dist/core/test/background-runs.js.map +1 -1
  330. package/dist/core/test/item-test-run-tracking.js +4 -1
  331. package/dist/core/test/item-test-run-tracking.js.map +1 -1
  332. package/dist/mcp/server.js +182 -22
  333. package/dist/mcp/server.js.map +1 -1
  334. package/dist/sdk/cli-contracts/commander-mutation-options.js +10 -3
  335. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -1
  336. package/dist/sdk/cli-contracts/commander-types.js +4 -1
  337. package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
  338. package/dist/sdk/cli-contracts.d.ts +13 -2
  339. package/dist/sdk/cli-contracts.js +410 -26
  340. package/dist/sdk/cli-contracts.js.map +1 -1
  341. package/dist/sdk/index.js +4 -1
  342. package/dist/sdk/index.js.map +1 -1
  343. package/dist/sdk/runtime.d.ts +25 -1
  344. package/dist/sdk/runtime.js +48 -2
  345. package/dist/sdk/runtime.js.map +1 -1
  346. package/dist/types/index.js +4 -1
  347. package/dist/types/index.js.map +1 -1
  348. package/dist/types.d.ts +92 -2
  349. package/dist/types.js +42 -1
  350. package/dist/types.js.map +1 -1
  351. package/docs/AGENT_GUIDE.md +23 -7
  352. package/docs/ARCHITECTURE.md +1 -1
  353. package/docs/CLAUDE_CODE_PLUGIN.md +10 -10
  354. package/docs/CODEX_PLUGIN.md +2 -2
  355. package/docs/COMMANDS.md +117 -12
  356. package/docs/CONFIGURATION.md +5 -2
  357. package/docs/EXTENSIONS.md +158 -814
  358. package/docs/QUICKSTART.md +11 -5
  359. package/docs/README.md +7 -6
  360. package/docs/RELEASING.md +13 -9
  361. package/docs/SDK.md +11 -2
  362. package/docs/TESTING.md +2 -2
  363. package/marketplace.json +3 -3
  364. package/package.json +15 -12
  365. package/packages/pm-beads/package.json +1 -1
  366. package/packages/pm-calendar/README.md +4 -2
  367. package/packages/pm-calendar/extensions/calendar/index.js +22 -3
  368. package/packages/pm-calendar/extensions/calendar/index.ts +22 -3
  369. package/packages/pm-calendar/extensions/calendar/runtime.js +26 -7
  370. package/packages/pm-calendar/extensions/calendar/runtime.ts +26 -7
  371. package/packages/pm-calendar/package.json +1 -1
  372. package/packages/pm-governance-audit/package.json +1 -1
  373. package/packages/pm-guide-shell/extensions/guide-shell/index.js +1 -1
  374. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +1 -1
  375. package/packages/pm-guide-shell/package.json +1 -1
  376. package/packages/pm-linked-test-adapters/package.json +1 -1
  377. package/packages/pm-search-advanced/README.md +8 -0
  378. package/packages/pm-search-advanced/extensions/search-advanced/index.js +74 -0
  379. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +75 -1
  380. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +67 -9
  381. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +67 -9
  382. package/packages/pm-search-advanced/package.json +1 -1
  383. package/packages/pm-templates/README.md +1 -1
  384. package/packages/pm-templates/extensions/templates/runtime.js +11 -202
  385. package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
  386. package/packages/pm-templates/package.json +1 -1
  387. package/packages/pm-todos/package.json +1 -1
  388. package/plugins/{pm-cli-claude → pm-claude}/.claude-plugin/plugin.json +2 -2
  389. package/plugins/{pm-cli-claude → pm-claude}/.mcp.json +1 -1
  390. package/plugins/{pm-cli-claude → pm-claude}/README.md +4 -4
  391. package/plugins/{pm-cli-claude → pm-claude}/agents/pm-coordinator.md +1 -1
  392. package/plugins/{pm-cli-claude → pm-claude}/commands/pm-init.md +10 -1
  393. package/plugins/{pm-cli-claude → pm-claude}/commands/pm-planner.md +18 -0
  394. package/plugins/{pm-cli-claude → pm-claude}/skills/pm-planner/SKILL.md +46 -1
  395. package/plugins/{pm-cli-codex → pm-codex}/.codex-plugin/plugin.json +3 -3
  396. package/plugins/{pm-cli-codex → pm-codex}/.mcp.json +1 -1
  397. package/plugins/{pm-cli-codex → pm-codex}/README.md +7 -4
  398. package/plugins/pm-codex/skills/pm-native/SKILL.md +81 -0
  399. package/scripts/finalize-build.mjs +28 -0
  400. package/scripts/prepare-build-cache.mjs +37 -0
  401. package/dist/core/output/command-aware.d.ts +0 -1
  402. package/dist/core/output/command-aware.js +0 -394
  403. package/dist/core/output/command-aware.js.map +0 -1
  404. package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +0 -57
  405. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-delivery-chain.md +0 -0
  406. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-triage-agent.md +0 -0
  407. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-verification-agent.md +0 -0
  408. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-audit.md +0 -0
  409. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-calendar.md +0 -0
  410. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-close-task.md +0 -0
  411. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-developer.md +0 -0
  412. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-list.md +0 -0
  413. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-new.md +0 -0
  414. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-release.md +0 -0
  415. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-search.md +0 -0
  416. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-start-task.md +0 -0
  417. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-status.md +0 -0
  418. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-triage.md +0 -0
  419. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-workflow.md +0 -0
  420. /package/plugins/{pm-cli-claude → pm-claude}/hooks/hooks.json +0 -0
  421. /package/plugins/{pm-cli-claude → pm-claude}/hooks/session-start.mjs +0 -0
  422. /package/plugins/{pm-cli-claude → pm-claude}/scripts/pm-mcp-server.mjs +0 -0
  423. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-audit/SKILL.md +0 -0
  424. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-developer/SKILL.md +0 -0
  425. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-release/SKILL.md +0 -0
  426. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-workflow/SKILL.md +0 -0
  427. /package/plugins/{pm-cli-codex → pm-codex}/assets/pm-cli-small.svg +0 -0
  428. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-audit.md +0 -0
  429. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-close-task.md +0 -0
  430. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-start-task.md +0 -0
  431. /package/plugins/{pm-cli-codex → pm-codex}/scripts/pm-mcp-server.mjs +0 -0
  432. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/SKILL.md +0 -0
  433. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/agents/openai.yaml +0 -0
  434. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-native/agents/openai.yaml +0 -0
  435. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/SKILL.md +0 -0
  436. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/agents/openai.yaml +0 -0
@@ -1,3 +1,5 @@
1
+
2
+ !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]="2b2ff59e-d0db-53b1-b67f-a7dcc221ff00")}catch(e){}}();
1
3
  import fs from "node:fs/promises";
2
4
  import path from "node:path";
3
5
  import { getActiveExtensionRegistrations, runActiveOnReadHooks, runActiveOnWriteHooks, runActiveServiceOverride, } from "../extensions/index.js";
@@ -155,38 +157,132 @@ async function listAllDocuments(pmRoot, preferredFormat, typeToFolder = TYPE_TO_
155
157
  .sort((left, right) => left.document.metadata.id.localeCompare(right.document.metadata.id))
156
158
  .map((entry) => entry.document);
157
159
  }
158
- export async function mutateItem(params) {
159
- const typeToFolder = params.typeToFolder ?? resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations()).type_to_folder;
160
+ async function listKnownItemIds(pmRoot, typeToFolder) {
161
+ const folders = new Set(Object.values(typeToFolder));
162
+ const allIds = [];
163
+ await Promise.all([...folders].map(async (folder) => {
164
+ try {
165
+ const entries = await fs.readdir(path.join(pmRoot, folder));
166
+ for (const entry of entries) {
167
+ for (const ext of ITEM_FILE_EXTENSIONS) {
168
+ if (entry.toLowerCase().endsWith(ext)) {
169
+ allIds.push(entry.slice(0, -ext.length));
170
+ break;
171
+ }
172
+ }
173
+ }
174
+ }
175
+ catch {
176
+ // ignore missing folders
177
+ }
178
+ }));
179
+ return allIds;
180
+ }
181
+ function levenshtein(a, b) {
182
+ if (a === b)
183
+ return 0;
184
+ if (a.length === 0)
185
+ return b.length;
186
+ if (b.length === 0)
187
+ return a.length;
188
+ let prev = Array.from({ length: b.length + 1 }, (_, i) => i);
189
+ for (let i = 1; i <= a.length; i++) {
190
+ const curr = [i];
191
+ for (let j = 1; j <= b.length; j++) {
192
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
193
+ curr.push(Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost));
194
+ }
195
+ prev = curr;
196
+ }
197
+ return prev[b.length];
198
+ }
199
+ async function buildDidYouMeanSuggestions(pmRoot, badId, idPrefix, typeToFolder) {
200
+ const normalized = normalizeItemId(badId, idPrefix);
201
+ const ids = await listKnownItemIds(pmRoot, typeToFolder);
202
+ if (ids.length === 0)
203
+ return [];
204
+ const scored = ids
205
+ .map((id) => ({ id, distance: levenshtein(id, normalized) }))
206
+ .filter((entry) => entry.distance <= Math.max(3, Math.floor(normalized.length / 2)))
207
+ .sort((left, right) => left.distance - right.distance)
208
+ .slice(0, 3)
209
+ .map((entry) => entry.id);
210
+ return scored;
211
+ }
212
+ export async function buildItemNotFoundError(pmRoot, badId, idPrefix, typeToFolder) {
213
+ const suggestions = await buildDidYouMeanSuggestions(pmRoot, badId, idPrefix, typeToFolder);
214
+ const nextSteps = ["Confirm the active --path/PM_PATH scope, then retry with a valid id."];
215
+ if (suggestions.length > 0) {
216
+ nextSteps.unshift(`Did you mean one of: ${suggestions.join(", ")}?`);
217
+ }
218
+ return new PmCliError(`Item ${badId} not found`, EXIT_CODE.NOT_FOUND, { nextSteps });
219
+ }
220
+ function bypassesAssigneeConflict(op, bypassAssigneeConflict) {
221
+ return (op === "claim" ||
222
+ (bypassAssigneeConflict === true &&
223
+ (op === "comment_add" ||
224
+ op === "note_add" ||
225
+ op === "learning_add" ||
226
+ op === "release" ||
227
+ op === "update" ||
228
+ op === "update_audit")));
229
+ }
230
+ async function prepareLockedItem(params) {
231
+ const typeToFolder = params.typeToFolder ??
232
+ resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations())
233
+ .type_to_folder;
160
234
  const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);
161
235
  if (!located) {
162
- throw new PmCliError(`Item ${params.id} not found`, EXIT_CODE.NOT_FOUND);
236
+ throw await buildItemNotFoundError(params.pmRoot, params.id, params.settings.id_prefix, typeToFolder);
163
237
  }
164
238
  const releaseLock = await acquireLock(params.pmRoot, located.id, params.settings.locks.ttl_seconds, params.author, Boolean(params.force), params.settings.governance.force_required_for_stale_lock);
165
239
  try {
166
- const parseWarnings = [];
240
+ const warnings = [];
167
241
  const { raw: originalRaw, document } = await readLocatedItem(located, {
168
242
  schema: params.settings.schema,
169
- warnings: parseWarnings,
243
+ warnings,
170
244
  });
171
245
  const assigned = document.metadata.assignee?.trim();
172
246
  const governance = resolveGovernanceKnobs(params.settings);
173
- const bypassAssigneeConflict = params.op === "claim" ||
174
- ((params.op === "comment_add" ||
175
- params.op === "note_add" ||
176
- params.op === "learning_add" ||
177
- params.op === "release" ||
178
- params.op === "update" ||
179
- params.op === "update_audit") &&
180
- params.bypassAssigneeConflict === true);
181
- const hasOwnershipConflict = assigned && assigned !== params.author && !params.force && !bypassAssigneeConflict;
247
+ const hasOwnershipConflict = assigned &&
248
+ assigned !== params.author &&
249
+ !params.force &&
250
+ !bypassesAssigneeConflict(params.op, params.bypassAssigneeConflict);
182
251
  if (hasOwnershipConflict) {
183
252
  if (governance.ownership_enforcement === "strict") {
184
253
  throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
185
254
  }
186
255
  if (governance.ownership_enforcement === "warn") {
187
- parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
256
+ warnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
188
257
  }
189
258
  }
259
+ return {
260
+ typeToFolder,
261
+ located,
262
+ originalRaw,
263
+ document,
264
+ warnings,
265
+ releaseLock,
266
+ };
267
+ }
268
+ catch (error) {
269
+ await releaseLock();
270
+ throw error;
271
+ }
272
+ }
273
+ export async function mutateItem(params) {
274
+ const prepared = await prepareLockedItem({
275
+ pmRoot: params.pmRoot,
276
+ settings: params.settings,
277
+ id: params.id,
278
+ op: params.op,
279
+ author: params.author,
280
+ force: params.force,
281
+ bypassAssigneeConflict: params.bypassAssigneeConflict,
282
+ typeToFolder: params.typeToFolder,
283
+ });
284
+ const { typeToFolder, located, originalRaw, document, warnings: parseWarnings, releaseLock, } = prepared;
285
+ try {
190
286
  const historyPolicy = await enforceHistoryStreamPolicyForItem({
191
287
  pmRoot: params.pmRoot,
192
288
  settings: params.settings,
@@ -220,7 +316,9 @@ export async function mutateItem(params) {
220
316
  let effectiveTargetItemPath = targetItemPath;
221
317
  let effectiveSerializedAfter = serializedAfter;
222
318
  let skipItemWrite = false;
223
- if (serviceWriteOverride.handled && typeof serviceWriteOverride.result === "object" && serviceWriteOverride.result !== null) {
319
+ if (serviceWriteOverride.handled &&
320
+ typeof serviceWriteOverride.result === "object" &&
321
+ serviceWriteOverride.result !== null) {
224
322
  const overrideRecord = serviceWriteOverride.result;
225
323
  if (typeof overrideRecord.target_item_path === "string" && overrideRecord.target_item_path.trim().length > 0) {
226
324
  effectiveTargetItemPath = overrideRecord.target_item_path;
@@ -289,29 +387,16 @@ export async function mutateItem(params) {
289
387
  }
290
388
  }
291
389
  export async function deleteItem(params) {
292
- const typeToFolder = resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations()).type_to_folder;
293
- const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);
294
- if (!located) {
295
- throw new PmCliError(`Item ${params.id} not found`, EXIT_CODE.NOT_FOUND);
296
- }
297
- const releaseLock = await acquireLock(params.pmRoot, located.id, params.settings.locks.ttl_seconds, params.author, Boolean(params.force), params.settings.governance.force_required_for_stale_lock);
390
+ const prepared = await prepareLockedItem({
391
+ pmRoot: params.pmRoot,
392
+ settings: params.settings,
393
+ id: params.id,
394
+ op: "delete",
395
+ author: params.author,
396
+ force: params.force,
397
+ });
398
+ const { located, originalRaw, document, warnings: parseWarnings, releaseLock } = prepared;
298
399
  try {
299
- const parseWarnings = [];
300
- const { raw: originalRaw, document } = await readLocatedItem(located, {
301
- schema: params.settings.schema,
302
- warnings: parseWarnings,
303
- });
304
- const assigned = document.metadata.assignee?.trim();
305
- const governance = resolveGovernanceKnobs(params.settings);
306
- const hasOwnershipConflict = assigned && assigned !== params.author && !params.force;
307
- if (hasOwnershipConflict) {
308
- if (governance.ownership_enforcement === "strict") {
309
- throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
310
- }
311
- if (governance.ownership_enforcement === "warn") {
312
- parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
313
- }
314
- }
315
400
  const historyPolicy = await enforceHistoryStreamPolicyForItem({
316
401
  pmRoot: params.pmRoot,
317
402
  settings: params.settings,
@@ -351,6 +436,14 @@ export async function deleteItem(params) {
351
436
  skipDelete = true;
352
437
  }
353
438
  }
439
+ if (params.dryRun === true) {
440
+ return {
441
+ item: beforeDocument.metadata,
442
+ changedFields: ["deleted"],
443
+ targetPath: effectiveItemPath,
444
+ warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings],
445
+ };
446
+ }
354
447
  if (!skipDelete) {
355
448
  await fs.rm(effectiveItemPath);
356
449
  }
@@ -385,4 +478,5 @@ export async function deleteItem(params) {
385
478
  await releaseLock();
386
479
  }
387
480
  }
388
- //# sourceMappingURL=item-store.js.map
481
+ //# sourceMappingURL=item-store.js.map
482
+ //# debugId=2b2ff59e-d0db-53b1-b67f-a7dcc221ff00
@@ -1 +1 @@
1
- {"version":3,"file":"item-store.js","sourceRoot":"/","sources":["core/store/item-store.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n getActiveExtensionRegistrations,\n runActiveOnReadHooks,\n runActiveOnWriteHooks,\n runActiveServiceOverride,\n} from \"../extensions/index.js\";\nimport { EMPTY_CANONICAL_DOCUMENT, EXIT_CODE, TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { appendHistoryEntry, createHistoryEntry } from \"../history/history.js\";\nimport { enforceHistoryStreamPolicyForItem } from \"../history/history-stream-policy.js\";\nimport { canonicalDocument, parseItemDocument, serializeItemDocument } from \"../item/item-format.js\";\nimport { resolveItemTypeRegistry } from \"../item/type-registry.js\";\nimport { acquireLock } from \"../lock/lock.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { normalizeItemId, normalizeRawItemId } from \"../item/id.js\";\nimport { listAllDocumentsCached } from \"./front-matter-cache.js\";\nimport { getHistoryPath, getItemFormatFromPath, getItemPath, ITEM_FILE_EXTENSIONS } from \"./paths.js\";\nimport { resolveGovernanceKnobs } from \"./settings.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport type { ItemDocument, ItemFormat, ItemFrontMatter, ItemType, PmSettings, RuntimeSchemaSettings } from \"../../types/index.js\";\n\nexport interface LocatedItem {\n id: string;\n type: ItemType;\n itemPath: string;\n item_format: ItemFormat;\n}\n\nasync function fileExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === code;\n}\n\nfunction appendWarning(warnings: string[] | undefined, warning: string): void {\n if (!warnings) {\n return;\n }\n if (!warnings.includes(warning)) {\n warnings.push(warning);\n }\n}\n\nfunction resolveItemFormatSearchOrder(preferredFormat?: ItemFormat): ItemFormat[] {\n if (preferredFormat === \"toon\") {\n return [\"toon\", \"json_markdown\"];\n }\n if (preferredFormat === \"json_markdown\") {\n return [\"json_markdown\", \"toon\"];\n }\n return [\"toon\", \"json_markdown\"];\n}\n\nexport async function locateItem(\n pmRoot: string,\n rawId: string,\n idPrefix: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n): Promise<LocatedItem | null> {\n const normalizedId = normalizeItemId(rawId, idPrefix);\n const rawNormalizedId = normalizeRawItemId(rawId);\n const candidateIds = normalizedId === rawNormalizedId ? [normalizedId] : [normalizedId, rawNormalizedId];\n const entries = Object.entries(typeToFolder) as Array<[ItemType, string]>;\n const searchOrder = resolveItemFormatSearchOrder(preferredFormat);\n for (const candidateId of candidateIds) {\n for (const [type] of entries) {\n for (const itemFormat of searchOrder) {\n const itemPath = getItemPath(pmRoot, type, candidateId, itemFormat, typeToFolder);\n if (await fileExists(itemPath)) {\n return {\n id: candidateId,\n type,\n itemPath,\n item_format: itemFormat,\n };\n }\n }\n }\n }\n return null;\n}\n\nexport async function readLocatedItem(\n item: LocatedItem,\n options: { schema?: RuntimeSchemaSettings; warnings?: string[] } = {},\n): Promise<{ raw: string; document: ItemDocument }> {\n const raw = await fs.readFile(item.itemPath, \"utf8\");\n await runActiveOnReadHooks({\n path: item.itemPath,\n scope: \"project\",\n });\n const document = parseItemDocument(raw, {\n format: item.item_format,\n schema: options.schema,\n onWarning: (warning) => appendWarning(options.warnings, warning),\n });\n return { raw, document };\n}\n\nexport async function listAllFrontMatter(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<ItemFrontMatter[]> {\n const documents = await listAllDocumentsCached(pmRoot, preferredFormat, typeToFolder, warnings, schema);\n return documents.map((document) => document.metadata);\n}\n\nexport async function listAllFrontMatterWithBody(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<Array<ItemFrontMatter & { body: string }>> {\n const documents = await listAllDocuments(pmRoot, preferredFormat, typeToFolder, warnings, schema);\n return documents.map((document) => ({\n ...document.metadata,\n body: document.body,\n }));\n}\n\nasync function listAllDocuments(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<ItemDocument[]> {\n const entries = Object.entries(typeToFolder) as Array<[ItemType, string]>;\n const documentsById = new Map<string, { document: ItemDocument; itemFormat: ItemFormat }>();\n\n const dirResults = await Promise.all(\n entries.map(async ([, folder]) => {\n const dirPath = path.join(pmRoot, folder);\n try {\n return { folder, files: await fs.readdir(dirPath) };\n } catch (error: unknown) {\n if (!isErrno(error, \"ENOENT\")) {\n appendWarning(warnings, `item_list_directory_read_failed:${folder}`);\n }\n return { folder, files: [] as string[] };\n }\n }),\n );\n\n const readTasks: Array<Promise<{ folder: string; file: string; document: ItemDocument; itemFormat: ItemFormat } | null>> = [];\n for (const { folder, files } of dirResults) {\n const dirPath = path.join(pmRoot, folder);\n for (const file of files.filter((entry) => ITEM_FILE_EXTENSIONS.some((ext) => entry.toLowerCase().endsWith(ext)))) {\n readTasks.push(\n (async () => {\n try {\n const itemPath = path.join(dirPath, file);\n const itemFormat = getItemFormatFromPath(itemPath) as ItemFormat;\n const raw = await fs.readFile(itemPath, \"utf8\");\n await runActiveOnReadHooks({ path: itemPath, scope: \"project\" });\n const parsed = parseItemDocument(raw, {\n format: itemFormat,\n schema,\n onWarning: (warning) => appendWarning(warnings, warning),\n });\n return { folder, file, document: parsed, itemFormat };\n } catch {\n appendWarning(warnings, `item_list_item_read_failed:${folder}/${file}`);\n return null;\n }\n })(),\n );\n }\n }\n\n const results = await Promise.all(readTasks);\n for (const result of results) {\n if (!result) continue;\n const existing = documentsById.get(result.document.metadata.id);\n if (!existing) {\n documentsById.set(result.document.metadata.id, {\n document: result.document,\n itemFormat: result.itemFormat,\n });\n continue;\n }\n const shouldReplace = preferredFormat\n ? result.itemFormat === preferredFormat && existing.itemFormat !== preferredFormat\n : result.itemFormat === \"toon\" && existing.itemFormat !== \"toon\";\n if (shouldReplace) {\n documentsById.set(result.document.metadata.id, {\n document: result.document,\n itemFormat: result.itemFormat,\n });\n }\n }\n return [...documentsById.values()]\n .sort((left, right) => left.document.metadata.id.localeCompare(right.document.metadata.id))\n .map((entry) => entry.document);\n}\n\nexport async function mutateItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n op: string;\n author: string;\n message?: string;\n force?: boolean;\n bypassAssigneeConflict?: boolean;\n typeToFolder?: Record<string, string>;\n mutate: (document: ItemDocument) => { changedFields: string[]; warnings?: string[] };\n}): Promise<{ item: ItemFrontMatter; body: string; changedFields: string[]; warnings: string[] }> {\n const typeToFolder =\n params.typeToFolder ?? resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations()).type_to_folder;\n const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);\n if (!located) {\n throw new PmCliError(`Item ${params.id} not found`, EXIT_CODE.NOT_FOUND);\n }\n\n const releaseLock = await acquireLock(\n params.pmRoot,\n located.id,\n params.settings.locks.ttl_seconds,\n params.author,\n Boolean(params.force),\n params.settings.governance.force_required_for_stale_lock,\n );\n\n try {\n const parseWarnings: string[] = [];\n const { raw: originalRaw, document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n warnings: parseWarnings,\n });\n\n const assigned = document.metadata.assignee?.trim();\n const governance = resolveGovernanceKnobs(params.settings);\n const bypassAssigneeConflict =\n params.op === \"claim\" ||\n ((\n params.op === \"comment_add\" ||\n params.op === \"note_add\" ||\n params.op === \"learning_add\" ||\n params.op === \"release\" ||\n params.op === \"update\" ||\n params.op === \"update_audit\"\n ) &&\n params.bypassAssigneeConflict === true);\n const hasOwnershipConflict = assigned && assigned !== params.author && !params.force && !bypassAssigneeConflict;\n if (hasOwnershipConflict) {\n if (governance.ownership_enforcement === \"strict\") {\n throw new PmCliError(\n `Item ${located.id} is assigned to ${assigned}. Use --force to override.`,\n EXIT_CODE.CONFLICT,\n );\n }\n if (governance.ownership_enforcement === \"warn\") {\n parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);\n }\n }\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemId: located.id,\n commandLabel: params.op,\n });\n\n const beforeDocument = canonicalDocument(document, { schema: params.settings.schema });\n const mutableDocument = canonicalDocument(structuredClone(document), { schema: params.settings.schema });\n const mutation = params.mutate(mutableDocument);\n mutableDocument.metadata.updated_at = nowIso();\n const afterDocument = canonicalDocument(mutableDocument, { schema: params.settings.schema });\n const targetItemFormat: ItemFormat = \"toon\";\n const serializedAfter = serializeItemDocument(afterDocument, {\n format: targetItemFormat,\n schema: params.settings.schema,\n });\n const targetItemPath = getItemPath(\n params.pmRoot,\n afterDocument.metadata.type,\n located.id,\n targetItemFormat,\n typeToFolder,\n );\n const historyPath = getHistoryPath(params.pmRoot, located.id);\n const serviceWriteOverride = await runActiveServiceOverride(\"item_store_write\", {\n op: params.op,\n pm_root: params.pmRoot,\n item_id: located.id,\n source_item_path: located.itemPath,\n target_item_path: targetItemPath,\n history_path: historyPath,\n item_format: targetItemFormat,\n before: beforeDocument,\n after: afterDocument,\n contents: serializedAfter,\n });\n let effectiveTargetItemPath = targetItemPath;\n let effectiveSerializedAfter = serializedAfter;\n let skipItemWrite = false;\n if (serviceWriteOverride.handled && typeof serviceWriteOverride.result === \"object\" && serviceWriteOverride.result !== null) {\n const overrideRecord = serviceWriteOverride.result as {\n target_item_path?: unknown;\n contents?: unknown;\n skip_write?: unknown;\n };\n if (typeof overrideRecord.target_item_path === \"string\" && overrideRecord.target_item_path.trim().length > 0) {\n effectiveTargetItemPath = overrideRecord.target_item_path;\n }\n if (typeof overrideRecord.contents === \"string\") {\n effectiveSerializedAfter = overrideRecord.contents;\n }\n if (overrideRecord.skip_write === true) {\n skipItemWrite = true;\n }\n }\n\n if (!skipItemWrite) {\n await writeFileAtomic(effectiveTargetItemPath, effectiveSerializedAfter);\n }\n if (!skipItemWrite && effectiveTargetItemPath !== located.itemPath) {\n await fs.rm(located.itemPath);\n }\n const entry = createHistoryEntry({\n nowIso: afterDocument.metadata.updated_at,\n author: params.author,\n op: params.op,\n before: beforeDocument,\n after: afterDocument,\n message: params.message,\n });\n\n try {\n await appendHistoryEntry(historyPath, entry);\n } catch (error: unknown) {\n if (!skipItemWrite && effectiveTargetItemPath !== located.itemPath) {\n await writeFileAtomic(located.itemPath, originalRaw);\n await fs.rm(effectiveTargetItemPath, { force: true });\n } else if (!skipItemWrite) {\n await writeFileAtomic(located.itemPath, originalRaw);\n }\n throw error;\n }\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: effectiveTargetItemPath,\n scope: \"project\",\n op: params.op,\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: `${params.op}:history`,\n })),\n ];\n\n return {\n item: afterDocument.metadata,\n body: afterDocument.body,\n changedFields: mutation.changedFields,\n warnings: [\n ...parseWarnings,\n ...(mutation.warnings ?? []),\n ...historyPolicy.warnings,\n ...serviceWriteOverride.warnings,\n ...hookWarnings,\n ],\n };\n } finally {\n await releaseLock();\n }\n}\n\nexport async function deleteItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n author: string;\n message?: string;\n force?: boolean;\n}): Promise<{ item: ItemFrontMatter; changedFields: string[]; warnings: string[] }> {\n const typeToFolder = resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations()).type_to_folder;\n const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);\n if (!located) {\n throw new PmCliError(`Item ${params.id} not found`, EXIT_CODE.NOT_FOUND);\n }\n\n const releaseLock = await acquireLock(\n params.pmRoot,\n located.id,\n params.settings.locks.ttl_seconds,\n params.author,\n Boolean(params.force),\n params.settings.governance.force_required_for_stale_lock,\n );\n\n try {\n const parseWarnings: string[] = [];\n const { raw: originalRaw, document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n warnings: parseWarnings,\n });\n\n const assigned = document.metadata.assignee?.trim();\n const governance = resolveGovernanceKnobs(params.settings);\n const hasOwnershipConflict = assigned && assigned !== params.author && !params.force;\n if (hasOwnershipConflict) {\n if (governance.ownership_enforcement === \"strict\") {\n throw new PmCliError(\n `Item ${located.id} is assigned to ${assigned}. Use --force to override.`,\n EXIT_CODE.CONFLICT,\n );\n }\n if (governance.ownership_enforcement === \"warn\") {\n parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);\n }\n }\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemId: located.id,\n commandLabel: \"delete\",\n });\n\n const beforeDocument = canonicalDocument(document, { schema: params.settings.schema });\n const deletionTimestamp = nowIso();\n const tombstoneDocument = EMPTY_CANONICAL_DOCUMENT as unknown as ItemDocument;\n const historyEntry = createHistoryEntry({\n nowIso: deletionTimestamp,\n author: params.author,\n op: \"delete\",\n before: beforeDocument,\n after: tombstoneDocument,\n message: params.message,\n });\n const historyPath = getHistoryPath(params.pmRoot, located.id);\n const serviceDeleteOverride = await runActiveServiceOverride(\"item_store_delete\", {\n op: \"delete\",\n pm_root: params.pmRoot,\n item_id: located.id,\n item_path: located.itemPath,\n history_path: historyPath,\n before: beforeDocument,\n });\n let effectiveItemPath = located.itemPath;\n let skipDelete = false;\n if (\n serviceDeleteOverride.handled &&\n typeof serviceDeleteOverride.result === \"object\" &&\n serviceDeleteOverride.result !== null\n ) {\n const overrideRecord = serviceDeleteOverride.result as {\n item_path?: unknown;\n skip_delete?: unknown;\n };\n if (typeof overrideRecord.item_path === \"string\" && overrideRecord.item_path.trim().length > 0) {\n effectiveItemPath = overrideRecord.item_path;\n }\n if (overrideRecord.skip_delete === true) {\n skipDelete = true;\n }\n }\n\n if (!skipDelete) {\n await fs.rm(effectiveItemPath);\n }\n try {\n await appendHistoryEntry(historyPath, historyEntry);\n } catch (error: unknown) {\n if (!skipDelete) {\n await writeFileAtomic(effectiveItemPath, originalRaw);\n }\n throw error;\n }\n\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: effectiveItemPath,\n scope: \"project\",\n op: \"delete\",\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: \"delete:history\",\n })),\n ];\n\n return {\n item: beforeDocument.metadata,\n changedFields: [\"deleted\"],\n warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings, ...hookWarnings],\n };\n } finally {\n await releaseLock();\n }\n}\n"]}
1
+ {"version":3,"file":"item-store.js","sources":["core/store/item-store.ts"],"sourceRoot":"/","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n getActiveExtensionRegistrations,\n runActiveOnReadHooks,\n runActiveOnWriteHooks,\n runActiveServiceOverride,\n} from \"../extensions/index.js\";\nimport { EMPTY_CANONICAL_DOCUMENT, EXIT_CODE, TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { appendHistoryEntry, createHistoryEntry } from \"../history/history.js\";\nimport { enforceHistoryStreamPolicyForItem } from \"../history/history-stream-policy.js\";\nimport { canonicalDocument, parseItemDocument, serializeItemDocument } from \"../item/item-format.js\";\nimport { resolveItemTypeRegistry } from \"../item/type-registry.js\";\nimport { acquireLock } from \"../lock/lock.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { normalizeItemId, normalizeRawItemId } from \"../item/id.js\";\nimport { listAllDocumentsCached } from \"./front-matter-cache.js\";\nimport { getHistoryPath, getItemFormatFromPath, getItemPath, ITEM_FILE_EXTENSIONS } from \"./paths.js\";\nimport { resolveGovernanceKnobs } from \"./settings.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport type { ItemDocument, ItemFormat, ItemFrontMatter, ItemType, PmSettings, RuntimeSchemaSettings } from \"../../types/index.js\";\n\nexport interface LocatedItem {\n id: string;\n type: ItemType;\n itemPath: string;\n item_format: ItemFormat;\n}\n\nasync function fileExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: string }).code === code;\n}\n\nfunction appendWarning(warnings: string[] | undefined, warning: string): void {\n if (!warnings) {\n return;\n }\n if (!warnings.includes(warning)) {\n warnings.push(warning);\n }\n}\n\nfunction resolveItemFormatSearchOrder(preferredFormat?: ItemFormat): ItemFormat[] {\n if (preferredFormat === \"toon\") {\n return [\"toon\", \"json_markdown\"];\n }\n if (preferredFormat === \"json_markdown\") {\n return [\"json_markdown\", \"toon\"];\n }\n return [\"toon\", \"json_markdown\"];\n}\n\nexport async function locateItem(\n pmRoot: string,\n rawId: string,\n idPrefix: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n): Promise<LocatedItem | null> {\n const normalizedId = normalizeItemId(rawId, idPrefix);\n const rawNormalizedId = normalizeRawItemId(rawId);\n const candidateIds = normalizedId === rawNormalizedId ? [normalizedId] : [normalizedId, rawNormalizedId];\n const entries = Object.entries(typeToFolder) as Array<[ItemType, string]>;\n const searchOrder = resolveItemFormatSearchOrder(preferredFormat);\n for (const candidateId of candidateIds) {\n for (const [type] of entries) {\n for (const itemFormat of searchOrder) {\n const itemPath = getItemPath(pmRoot, type, candidateId, itemFormat, typeToFolder);\n if (await fileExists(itemPath)) {\n return {\n id: candidateId,\n type,\n itemPath,\n item_format: itemFormat,\n };\n }\n }\n }\n }\n return null;\n}\n\nexport async function readLocatedItem(\n item: LocatedItem,\n options: { schema?: RuntimeSchemaSettings; warnings?: string[] } = {},\n): Promise<{ raw: string; document: ItemDocument }> {\n const raw = await fs.readFile(item.itemPath, \"utf8\");\n await runActiveOnReadHooks({\n path: item.itemPath,\n scope: \"project\",\n });\n const document = parseItemDocument(raw, {\n format: item.item_format,\n schema: options.schema,\n onWarning: (warning) => appendWarning(options.warnings, warning),\n });\n return { raw, document };\n}\n\nexport async function listAllFrontMatter(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<ItemFrontMatter[]> {\n const documents = await listAllDocumentsCached(pmRoot, preferredFormat, typeToFolder, warnings, schema);\n return documents.map((document) => document.metadata);\n}\n\nexport async function listAllFrontMatterWithBody(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<Array<ItemFrontMatter & { body: string }>> {\n const documents = await listAllDocuments(pmRoot, preferredFormat, typeToFolder, warnings, schema);\n return documents.map((document) => ({\n ...document.metadata,\n body: document.body,\n }));\n}\n\nasync function listAllDocuments(\n pmRoot: string,\n preferredFormat?: ItemFormat,\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n warnings?: string[],\n schema?: RuntimeSchemaSettings,\n): Promise<ItemDocument[]> {\n const entries = Object.entries(typeToFolder) as Array<[ItemType, string]>;\n const documentsById = new Map<string, { document: ItemDocument; itemFormat: ItemFormat }>();\n\n const dirResults = await Promise.all(\n entries.map(async ([, folder]) => {\n const dirPath = path.join(pmRoot, folder);\n try {\n return { folder, files: await fs.readdir(dirPath) };\n } catch (error: unknown) {\n if (!isErrno(error, \"ENOENT\")) {\n appendWarning(warnings, `item_list_directory_read_failed:${folder}`);\n }\n return { folder, files: [] as string[] };\n }\n }),\n );\n\n const readTasks: Array<Promise<{ folder: string; file: string; document: ItemDocument; itemFormat: ItemFormat } | null>> = [];\n for (const { folder, files } of dirResults) {\n const dirPath = path.join(pmRoot, folder);\n for (const file of files.filter((entry) => ITEM_FILE_EXTENSIONS.some((ext) => entry.toLowerCase().endsWith(ext)))) {\n readTasks.push(\n (async () => {\n try {\n const itemPath = path.join(dirPath, file);\n const itemFormat = getItemFormatFromPath(itemPath) as ItemFormat;\n const raw = await fs.readFile(itemPath, \"utf8\");\n await runActiveOnReadHooks({ path: itemPath, scope: \"project\" });\n const parsed = parseItemDocument(raw, {\n format: itemFormat,\n schema,\n onWarning: (warning) => appendWarning(warnings, warning),\n });\n return { folder, file, document: parsed, itemFormat };\n } catch {\n appendWarning(warnings, `item_list_item_read_failed:${folder}/${file}`);\n return null;\n }\n })(),\n );\n }\n }\n\n const results = await Promise.all(readTasks);\n for (const result of results) {\n if (!result) continue;\n const existing = documentsById.get(result.document.metadata.id);\n if (!existing) {\n documentsById.set(result.document.metadata.id, {\n document: result.document,\n itemFormat: result.itemFormat,\n });\n continue;\n }\n const shouldReplace = preferredFormat\n ? result.itemFormat === preferredFormat && existing.itemFormat !== preferredFormat\n : result.itemFormat === \"toon\" && existing.itemFormat !== \"toon\";\n if (shouldReplace) {\n documentsById.set(result.document.metadata.id, {\n document: result.document,\n itemFormat: result.itemFormat,\n });\n }\n }\n return [...documentsById.values()]\n .sort((left, right) => left.document.metadata.id.localeCompare(right.document.metadata.id))\n .map((entry) => entry.document);\n}\n\nasync function listKnownItemIds(\n pmRoot: string,\n typeToFolder: Record<string, string>,\n): Promise<string[]> {\n const folders = new Set(Object.values(typeToFolder));\n const allIds: string[] = [];\n await Promise.all(\n [...folders].map(async (folder) => {\n try {\n const entries = await fs.readdir(path.join(pmRoot, folder));\n for (const entry of entries) {\n for (const ext of ITEM_FILE_EXTENSIONS) {\n if (entry.toLowerCase().endsWith(ext)) {\n allIds.push(entry.slice(0, -ext.length));\n break;\n }\n }\n }\n } catch {\n // ignore missing folders\n }\n }),\n );\n return allIds;\n}\n\nfunction levenshtein(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const curr = [i];\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr.push(Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost));\n }\n prev = curr;\n }\n return prev[b.length];\n}\n\nasync function buildDidYouMeanSuggestions(\n pmRoot: string,\n badId: string,\n idPrefix: string,\n typeToFolder: Record<string, string>,\n): Promise<string[]> {\n const normalized = normalizeItemId(badId, idPrefix);\n const ids = await listKnownItemIds(pmRoot, typeToFolder);\n if (ids.length === 0) return [];\n const scored = ids\n .map((id) => ({ id, distance: levenshtein(id, normalized) }))\n .filter((entry) => entry.distance <= Math.max(3, Math.floor(normalized.length / 2)))\n .sort((left, right) => left.distance - right.distance)\n .slice(0, 3)\n .map((entry) => entry.id);\n return scored;\n}\n\nexport async function buildItemNotFoundError(\n pmRoot: string,\n badId: string,\n idPrefix: string,\n typeToFolder: Record<string, string>,\n): Promise<PmCliError> {\n const suggestions = await buildDidYouMeanSuggestions(pmRoot, badId, idPrefix, typeToFolder);\n const nextSteps: string[] = [\"Confirm the active --path/PM_PATH scope, then retry with a valid id.\"];\n if (suggestions.length > 0) {\n nextSteps.unshift(`Did you mean one of: ${suggestions.join(\", \")}?`);\n }\n return new PmCliError(`Item ${badId} not found`, EXIT_CODE.NOT_FOUND, { nextSteps });\n}\n\nfunction bypassesAssigneeConflict(\n op: string,\n bypassAssigneeConflict?: boolean,\n): boolean {\n return (\n op === \"claim\" ||\n (bypassAssigneeConflict === true &&\n (op === \"comment_add\" ||\n op === \"note_add\" ||\n op === \"learning_add\" ||\n op === \"release\" ||\n op === \"update\" ||\n op === \"update_audit\"))\n );\n}\n\nasync function prepareLockedItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n op: string;\n author: string;\n force?: boolean;\n bypassAssigneeConflict?: boolean;\n typeToFolder?: Record<string, string>;\n}): Promise<{\n typeToFolder: Record<string, string>;\n located: LocatedItem;\n originalRaw: string;\n document: ItemDocument;\n warnings: string[];\n releaseLock: () => Promise<void>;\n}> {\n const typeToFolder =\n params.typeToFolder ??\n resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations())\n .type_to_folder;\n const located = await locateItem(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n params.settings.item_format,\n typeToFolder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n params.pmRoot,\n params.id,\n params.settings.id_prefix,\n typeToFolder,\n );\n }\n\n const releaseLock = await acquireLock(\n params.pmRoot,\n located.id,\n params.settings.locks.ttl_seconds,\n params.author,\n Boolean(params.force),\n params.settings.governance.force_required_for_stale_lock,\n );\n\n try {\n const warnings: string[] = [];\n const { raw: originalRaw, document } = await readLocatedItem(located, {\n schema: params.settings.schema,\n warnings,\n });\n\n const assigned = document.metadata.assignee?.trim();\n const governance = resolveGovernanceKnobs(params.settings);\n const hasOwnershipConflict =\n assigned &&\n assigned !== params.author &&\n !params.force &&\n !bypassesAssigneeConflict(params.op, params.bypassAssigneeConflict);\n if (hasOwnershipConflict) {\n if (governance.ownership_enforcement === \"strict\") {\n throw new PmCliError(\n `Item ${located.id} is assigned to ${assigned}. Use --force to override.`,\n EXIT_CODE.CONFLICT,\n );\n }\n if (governance.ownership_enforcement === \"warn\") {\n warnings.push(\n `ownership_warning:assignee_conflict:${located.id}:${assigned}`,\n );\n }\n }\n\n return {\n typeToFolder,\n located,\n originalRaw,\n document,\n warnings,\n releaseLock,\n };\n } catch (error: unknown) {\n await releaseLock();\n throw error;\n }\n}\n\nexport async function mutateItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n op: string;\n author: string;\n message?: string;\n force?: boolean;\n bypassAssigneeConflict?: boolean;\n typeToFolder?: Record<string, string>;\n mutate: (document: ItemDocument) => {\n changedFields: string[];\n warnings?: string[];\n };\n}): Promise<{\n item: ItemFrontMatter;\n body: string;\n changedFields: string[];\n warnings: string[];\n}> {\n const prepared = await prepareLockedItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n id: params.id,\n op: params.op,\n author: params.author,\n force: params.force,\n bypassAssigneeConflict: params.bypassAssigneeConflict,\n typeToFolder: params.typeToFolder,\n });\n const {\n typeToFolder,\n located,\n originalRaw,\n document,\n warnings: parseWarnings,\n releaseLock,\n } = prepared;\n\n try {\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemId: located.id,\n commandLabel: params.op,\n });\n\n const beforeDocument = canonicalDocument(document, { schema: params.settings.schema });\n const mutableDocument = canonicalDocument(structuredClone(document), { schema: params.settings.schema });\n const mutation = params.mutate(mutableDocument);\n mutableDocument.metadata.updated_at = nowIso();\n const afterDocument = canonicalDocument(mutableDocument, { schema: params.settings.schema });\n const targetItemFormat: ItemFormat = \"toon\";\n const serializedAfter = serializeItemDocument(afterDocument, {\n format: targetItemFormat,\n schema: params.settings.schema,\n });\n const targetItemPath = getItemPath(\n params.pmRoot,\n afterDocument.metadata.type,\n located.id,\n targetItemFormat,\n typeToFolder,\n );\n const historyPath = getHistoryPath(params.pmRoot, located.id);\n const serviceWriteOverride = await runActiveServiceOverride(\"item_store_write\", {\n op: params.op,\n pm_root: params.pmRoot,\n item_id: located.id,\n source_item_path: located.itemPath,\n target_item_path: targetItemPath,\n history_path: historyPath,\n item_format: targetItemFormat,\n before: beforeDocument,\n after: afterDocument,\n contents: serializedAfter,\n });\n let effectiveTargetItemPath = targetItemPath;\n let effectiveSerializedAfter = serializedAfter;\n let skipItemWrite = false;\n if (\n serviceWriteOverride.handled &&\n typeof serviceWriteOverride.result === \"object\" &&\n serviceWriteOverride.result !== null\n ) {\n const overrideRecord = serviceWriteOverride.result as {\n target_item_path?: unknown;\n contents?: unknown;\n skip_write?: unknown;\n };\n if (typeof overrideRecord.target_item_path === \"string\" && overrideRecord.target_item_path.trim().length > 0) {\n effectiveTargetItemPath = overrideRecord.target_item_path;\n }\n if (typeof overrideRecord.contents === \"string\") {\n effectiveSerializedAfter = overrideRecord.contents;\n }\n if (overrideRecord.skip_write === true) {\n skipItemWrite = true;\n }\n }\n\n if (!skipItemWrite) {\n await writeFileAtomic(effectiveTargetItemPath, effectiveSerializedAfter);\n }\n if (!skipItemWrite && effectiveTargetItemPath !== located.itemPath) {\n await fs.rm(located.itemPath);\n }\n const entry = createHistoryEntry({\n nowIso: afterDocument.metadata.updated_at,\n author: params.author,\n op: params.op,\n before: beforeDocument,\n after: afterDocument,\n message: params.message,\n });\n\n try {\n await appendHistoryEntry(historyPath, entry);\n } catch (error: unknown) {\n if (!skipItemWrite && effectiveTargetItemPath !== located.itemPath) {\n await writeFileAtomic(located.itemPath, originalRaw);\n await fs.rm(effectiveTargetItemPath, { force: true });\n } else if (!skipItemWrite) {\n await writeFileAtomic(located.itemPath, originalRaw);\n }\n throw error;\n }\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: effectiveTargetItemPath,\n scope: \"project\",\n op: params.op,\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: `${params.op}:history`,\n })),\n ];\n\n return {\n item: afterDocument.metadata,\n body: afterDocument.body,\n changedFields: mutation.changedFields,\n warnings: [\n ...parseWarnings,\n ...(mutation.warnings ?? []),\n ...historyPolicy.warnings,\n ...serviceWriteOverride.warnings,\n ...hookWarnings,\n ],\n };\n } finally {\n await releaseLock();\n }\n}\n\nexport async function deleteItem(params: {\n pmRoot: string;\n settings: PmSettings;\n id: string;\n author: string;\n message?: string;\n force?: boolean;\n dryRun?: boolean;\n}): Promise<{ item: ItemFrontMatter; changedFields: string[]; warnings: string[]; targetPath?: string }> {\n const prepared = await prepareLockedItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n id: params.id,\n op: \"delete\",\n author: params.author,\n force: params.force,\n });\n const { located, originalRaw, document, warnings: parseWarnings, releaseLock } = prepared;\n\n try {\n const historyPolicy = await enforceHistoryStreamPolicyForItem({\n pmRoot: params.pmRoot,\n settings: params.settings,\n itemId: located.id,\n commandLabel: \"delete\",\n });\n\n const beforeDocument = canonicalDocument(document, { schema: params.settings.schema });\n const deletionTimestamp = nowIso();\n const tombstoneDocument = EMPTY_CANONICAL_DOCUMENT as unknown as ItemDocument;\n const historyEntry = createHistoryEntry({\n nowIso: deletionTimestamp,\n author: params.author,\n op: \"delete\",\n before: beforeDocument,\n after: tombstoneDocument,\n message: params.message,\n });\n const historyPath = getHistoryPath(params.pmRoot, located.id);\n const serviceDeleteOverride = await runActiveServiceOverride(\"item_store_delete\", {\n op: \"delete\",\n pm_root: params.pmRoot,\n item_id: located.id,\n item_path: located.itemPath,\n history_path: historyPath,\n before: beforeDocument,\n });\n let effectiveItemPath = located.itemPath;\n let skipDelete = false;\n if (\n serviceDeleteOverride.handled &&\n typeof serviceDeleteOverride.result === \"object\" &&\n serviceDeleteOverride.result !== null\n ) {\n const overrideRecord = serviceDeleteOverride.result as {\n item_path?: unknown;\n skip_delete?: unknown;\n };\n if (typeof overrideRecord.item_path === \"string\" && overrideRecord.item_path.trim().length > 0) {\n effectiveItemPath = overrideRecord.item_path;\n }\n if (overrideRecord.skip_delete === true) {\n skipDelete = true;\n }\n }\n\n if (params.dryRun === true) {\n return {\n item: beforeDocument.metadata,\n changedFields: [\"deleted\"],\n targetPath: effectiveItemPath,\n warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings],\n };\n }\n\n if (!skipDelete) {\n await fs.rm(effectiveItemPath);\n }\n try {\n await appendHistoryEntry(historyPath, historyEntry);\n } catch (error: unknown) {\n if (!skipDelete) {\n await writeFileAtomic(effectiveItemPath, originalRaw);\n }\n throw error;\n }\n\n const hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: effectiveItemPath,\n scope: \"project\",\n op: \"delete\",\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: \"delete:history\",\n })),\n ];\n\n return {\n item: beforeDocument.metadata,\n changedFields: [\"deleted\"],\n warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings, ...hookWarnings],\n };\n } finally {\n await releaseLock();\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,+BAA+B,EAC/B,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAU3C,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAK,KAA2B,CAAC,IAAI,KAAK,IAAI,CAAC;AACtH,CAAC;AAED,SAAS,aAAa,CAAC,QAA8B,EAAE,OAAe;IACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,eAA4B;IAChE,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,eAAe,KAAK,eAAe,EAAE,CAAC;QACxC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,eAA4B,EAC5B,eAAuC,cAAc;IAErD,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,YAAY,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAA8B,CAAC;IAC1E,MAAM,WAAW,GAAG,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAClE,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBAClF,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,OAAO;wBACL,EAAE,EAAE,WAAW;wBACf,IAAI;wBACJ,QAAQ;wBACR,WAAW,EAAE,UAAU;qBACxB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAiB,EACjB,UAAmE,EAAE;IAErE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,oBAAoB,CAAC;QACzB,IAAI,EAAE,IAAI,CAAC,QAAQ;QACnB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE;QACtC,MAAM,EAAE,IAAI,CAAC,WAAW;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;KACjE,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,eAA4B,EAC5B,eAAuC,cAAc,EACrD,QAAmB,EACnB,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxG,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAc,EACd,eAA4B,EAC5B,eAAuC,cAAc,EACrD,QAAmB,EACnB,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClG,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,GAAG,QAAQ,CAAC,QAAQ;QACpB,IAAI,EAAE,QAAQ,CAAC,IAAI;KACpB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,eAA4B,EAC5B,eAAuC,cAAc,EACrD,QAAmB,EACnB,MAA8B;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAA8B,CAAC;IAC1E,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8D,CAAC;IAE5F,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC9B,aAAa,CAAC,QAAQ,EAAE,mCAAmC,MAAM,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAc,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAA4G,EAAE,CAAC;IAC9H,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAClH,SAAS,CAAC,IAAI,CACZ,CAAC,KAAK,IAAI,EAAE;gBACV,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAC1C,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAe,CAAC;oBACjE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAChD,MAAM,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBACjE,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE;wBACpC,MAAM,EAAE,UAAU;wBAClB,MAAM;wBACN,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC;qBACzD,CAAC,CAAC;oBACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;gBACxD,CAAC;gBAAC,MAAM,CAAC;oBACP,aAAa,CAAC,QAAQ,EAAE,8BAA8B,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;oBACxE,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,EAAE,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAC7C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,aAAa,GAAG,eAAe;YACnC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,eAAe,IAAI,QAAQ,CAAC,UAAU,KAAK,eAAe;YAClF,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC;QACnE,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAC7C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC1F,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,YAAoC;IAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;oBACvC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;wBACzC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,YAAoC;IAEpC,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,GAAG;SACf,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;SAC5D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;SACnF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;SACrD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,YAAoC;IAEpC,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC5F,MAAM,SAAS,GAAa,CAAC,sEAAsE,CAAC,CAAC;IACrG,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,OAAO,CAAC,wBAAwB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,QAAQ,KAAK,YAAY,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,wBAAwB,CAC/B,EAAU,EACV,sBAAgC;IAEhC,OAAO,CACL,EAAE,KAAK,OAAO;QACd,CAAC,sBAAsB,KAAK,IAAI;YAC9B,CAAC,EAAE,KAAK,aAAa;gBACnB,EAAE,KAAK,UAAU;gBACjB,EAAE,KAAK,cAAc;gBACrB,EAAE,KAAK,SAAS;gBAChB,EAAE,KAAK,QAAQ;gBACf,EAAE,KAAK,cAAc,CAAC,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAShC;IAQC,MAAM,YAAY,GAChB,MAAM,CAAC,YAAY;QACnB,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,CAAC;aACxE,cAAc,CAAC;IACpB,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,QAAQ,CAAC,SAAS,EACzB,MAAM,CAAC,QAAQ,CAAC,WAAW,EAC3B,YAAY,CACb,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,sBAAsB,CAChC,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,QAAQ,CAAC,SAAS,EACzB,YAAY,CACb,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,WAAW,CACnC,MAAM,CAAC,MAAM,EACb,OAAO,CAAC,EAAE,EACV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EACjC,MAAM,CAAC,MAAM,EACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EACrB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,6BAA6B,CACzD,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE;YACpE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAC9B,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,oBAAoB,GACxB,QAAQ;YACR,QAAQ,KAAK,MAAM,CAAC,MAAM;YAC1B,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtE,IAAI,oBAAoB,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,qBAAqB,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,UAAU,CAClB,QAAQ,OAAO,CAAC,EAAE,mBAAmB,QAAQ,4BAA4B,EACzE,SAAS,CAAC,QAAQ,CACnB,CAAC;YACJ,CAAC;YACD,IAAI,UAAU,CAAC,qBAAqB,KAAK,MAAM,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CACX,uCAAuC,OAAO,CAAC,EAAE,IAAI,QAAQ,EAAE,CAChE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,YAAY;YACZ,OAAO;YACP,WAAW;YACX,QAAQ;YACR,QAAQ;YACR,WAAW;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAchC;IAMC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;QACvC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;IACH,MAAM,EACJ,YAAY,EACZ,OAAO,EACP,WAAW,EACX,QAAQ,EACR,QAAQ,EAAE,aAAa,EACvB,WAAW,GACZ,GAAG,QAAQ,CAAC;IAEb,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,iCAAiC,CAAC;YAC5D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,OAAO,CAAC,EAAE;YAClB,YAAY,EAAE,MAAM,CAAC,EAAE;SACxB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,MAAM,eAAe,GAAG,iBAAiB,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACzG,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAChD,eAAe,CAAC,QAAQ,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,iBAAiB,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,gBAAgB,GAAe,MAAM,CAAC;QAC5C,MAAM,eAAe,GAAG,qBAAqB,CAAC,aAAa,EAAE;YAC3D,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;SAC/B,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,WAAW,CAChC,MAAM,CAAC,MAAM,EACb,aAAa,CAAC,QAAQ,CAAC,IAAI,EAC3B,OAAO,CAAC,EAAE,EACV,gBAAgB,EAChB,YAAY,CACb,CAAC;QACF,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,oBAAoB,GAAG,MAAM,wBAAwB,CAAC,kBAAkB,EAAE;YAC9E,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,gBAAgB,EAAE,OAAO,CAAC,QAAQ;YAClC,gBAAgB,EAAE,cAAc;YAChC,YAAY,EAAE,WAAW;YACzB,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC;QACH,IAAI,uBAAuB,GAAG,cAAc,CAAC;QAC7C,IAAI,wBAAwB,GAAG,eAAe,CAAC;QAC/C,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IACE,oBAAoB,CAAC,OAAO;YAC5B,OAAO,oBAAoB,CAAC,MAAM,KAAK,QAAQ;YAC/C,oBAAoB,CAAC,MAAM,KAAK,IAAI,EACpC,CAAC;YACD,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAI3C,CAAC;YACF,IAAI,OAAO,cAAc,CAAC,gBAAgB,KAAK,QAAQ,IAAI,cAAc,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7G,uBAAuB,GAAG,cAAc,CAAC,gBAAgB,CAAC;YAC5D,CAAC;YACD,IAAI,OAAO,cAAc,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChD,wBAAwB,GAAG,cAAc,CAAC,QAAQ,CAAC;YACrD,CAAC;YACD,IAAI,cAAc,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACvC,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,eAAe,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,uBAAuB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnE,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC;YAC/B,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU;YACzC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,IAAI,uBAAuB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACnE,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACrD,MAAM,EAAE,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC1B,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,YAAY,GAAG;YACnB,GAAG,CAAC,MAAM,qBAAqB,CAAC;gBAC9B,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,SAAS;gBAChB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;YACH,GAAG,CAAC,MAAM,qBAAqB,CAAC;gBAC9B,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,SAAS;gBAChB,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,UAAU;aAC3B,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,aAAa,CAAC,QAAQ;YAC5B,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,QAAQ,EAAE;gBACR,GAAG,aAAa;gBAChB,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAC5B,GAAG,aAAa,CAAC,QAAQ;gBACzB,GAAG,oBAAoB,CAAC,QAAQ;gBAChC,GAAG,YAAY;aAChB;SACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAQhC;IACC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;QACvC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAE1F,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,iCAAiC,CAAC;YAC5D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,OAAO,CAAC,EAAE;YAClB,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,wBAAmD,CAAC;QAC9E,MAAM,YAAY,GAAG,kBAAkB,CAAC;YACtC,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,qBAAqB,GAAG,MAAM,wBAAwB,CAAC,mBAAmB,EAAE;YAChF,EAAE,EAAE,QAAQ;YACZ,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,SAAS,EAAE,OAAO,CAAC,QAAQ;YAC3B,YAAY,EAAE,WAAW;YACzB,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;QACH,IAAI,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;QACzC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IACE,qBAAqB,CAAC,OAAO;YAC7B,OAAO,qBAAqB,CAAC,MAAM,KAAK,QAAQ;YAChD,qBAAqB,CAAC,MAAM,KAAK,IAAI,EACrC,CAAC;YACD,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAG5C,CAAC;YACF,IAAI,OAAO,cAAc,CAAC,SAAS,KAAK,QAAQ,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/F,iBAAiB,GAAG,cAAc,CAAC,SAAS,CAAC;YAC/C,CAAC;YACD,IAAI,cAAc,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBACxC,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,cAAc,CAAC,QAAQ;gBAC7B,aAAa,EAAE,CAAC,SAAS,CAAC;gBAC1B,UAAU,EAAE,iBAAiB;gBAC7B,QAAQ,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,qBAAqB,CAAC,QAAQ,CAAC;aAC3F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,eAAe,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG;YACnB,GAAG,CAAC,MAAM,qBAAqB,CAAC;gBAC9B,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,SAAS;gBAChB,EAAE,EAAE,QAAQ;aACb,CAAC,CAAC;YACH,GAAG,CAAC,MAAM,qBAAqB,CAAC;gBAC9B,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,SAAS;gBAChB,EAAE,EAAE,gBAAgB;aACrB,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,cAAc,CAAC,QAAQ;YAC7B,aAAa,EAAE,CAAC,SAAS,CAAC;YAC1B,QAAQ,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,YAAY,CAAC;SAC5G,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC;AACH,CAAC","debugId":"2b2ff59e-d0db-53b1-b67f-a7dcc221ff00"}
@@ -1,3 +1,5 @@
1
+
2
+ !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]="66d39566-a27a-5e26-af05-925ddc8ec97f")}catch(e){}}();
1
3
  import { statSync } from "node:fs";
2
4
  import os from "node:os";
3
5
  import path from "node:path";
@@ -114,4 +116,5 @@ export function getTestRunsResultsPath(pmRoot) {
114
116
  export function getTestRunResultPath(pmRoot, runId) {
115
117
  return path.join(getTestRunsResultsPath(pmRoot), `${runId}.json`);
116
118
  }
117
- //# sourceMappingURL=paths.js.map
119
+ //# sourceMappingURL=paths.js.map
120
+ //# debugId=66d39566-a27a-5e26-af05-925ddc8ec97f
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"/","sources":["core/store/paths.ts"],"names":[],"mappings":"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","sourcesContent":["import { statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { PM_DIRNAME, SETTINGS_FILENAME, TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport type { ItemFormat, ItemType } from \"../../types/index.js\";\n\nexport const ITEM_FILE_EXTENSION_BY_FORMAT: Record<ItemFormat, \".md\" | \".toon\"> = {\n json_markdown: \".md\",\n toon: \".toon\",\n};\n\nconst ITEM_FORMAT_BY_EXTENSION = {\n \".md\": \"json_markdown\",\n \".toon\": \"toon\",\n} as const satisfies Record<string, ItemFormat>;\n\nexport const ITEM_FILE_EXTENSIONS: Array<keyof typeof ITEM_FORMAT_BY_EXTENSION> = [\".md\", \".toon\"];\n\nfunction pathExists(pathValue: string): boolean {\n try {\n statSync(pathValue);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction discoverPmRootFromAncestors(cwd: string): string | undefined {\n let current = path.resolve(cwd);\n while (true) {\n const candidateRoot = path.join(current, PM_DIRNAME);\n const candidateSettingsPath = path.join(candidateRoot, SETTINGS_FILENAME);\n if (pathExists(candidateSettingsPath)) {\n return candidateRoot;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nexport function resolvePmRoot(cwd: string, cliPath?: string): string {\n const envPath = process.env.PM_PATH;\n const explicitPath = cliPath?.trim() || envPath?.trim();\n if (explicitPath) {\n return path.resolve(cwd, explicitPath);\n }\n const discoveredRoot = discoverPmRootFromAncestors(cwd);\n if (discoveredRoot) {\n return discoveredRoot;\n }\n const selected = PM_DIRNAME;\n return path.resolve(cwd, selected);\n}\n\nexport function resolveGlobalPmRoot(cwd: string): string {\n const envPath = process.env.PM_GLOBAL_PATH?.trim();\n const selected = envPath && envPath.length > 0 ? envPath : path.join(os.homedir(), \".pm-cli\");\n return path.resolve(cwd, selected);\n}\n\nexport function getSettingsPath(pmRoot: string): string {\n return path.join(pmRoot, SETTINGS_FILENAME);\n}\n\nfunction deriveDefaultTypeFolder(type: string): string {\n const normalized = type\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (normalized.length === 0) {\n return \"items\";\n }\n return normalized.endsWith(\"s\") ? normalized : `${normalized}s`;\n}\n\nexport function getTypeDirPath(pmRoot: string, type: ItemType, typeToFolder: Record<string, string> = TYPE_TO_FOLDER): string {\n const folder = typeToFolder[type] ?? deriveDefaultTypeFolder(type);\n return path.join(pmRoot, folder);\n}\n\nexport function getItemPath(\n pmRoot: string,\n type: ItemType,\n id: string,\n itemFormat: ItemFormat = \"toon\",\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n): string {\n return path.join(getTypeDirPath(pmRoot, type, typeToFolder), `${id}${ITEM_FILE_EXTENSION_BY_FORMAT[itemFormat]}`);\n}\n\nexport function getItemFormatFromPath(itemPath: string): ItemFormat | null {\n const extension = path.extname(itemPath).toLowerCase() as keyof typeof ITEM_FORMAT_BY_EXTENSION;\n return ITEM_FORMAT_BY_EXTENSION[extension] ?? null;\n}\n\nexport function getHistoryPath(pmRoot: string, id: string): string {\n return path.join(pmRoot, \"history\", `${id}.jsonl`);\n}\n\nexport function getLockPath(pmRoot: string, id: string): string {\n return path.join(pmRoot, \"locks\", `${id}.lock`);\n}\n\nexport function getRuntimePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\");\n}\n\nexport function getTestRunsPath(pmRoot: string): string {\n return path.join(getRuntimePath(pmRoot), \"test-runs\");\n}\n\nexport function getTestRunsRecordsPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"runs\");\n}\n\nexport function getTestRunRecordPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsRecordsPath(pmRoot), `${runId}.json`);\n}\n\nexport function getTestRunsStdoutPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"stdout\");\n}\n\nexport function getTestRunsStderrPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"stderr\");\n}\n\nexport function getTestRunStdoutPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsStdoutPath(pmRoot), `${runId}.log`);\n}\n\nexport function getTestRunStderrPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsStderrPath(pmRoot), `${runId}.log`);\n}\n\nexport function getTestRunsResultsPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"results\");\n}\n\nexport function getTestRunResultPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsResultsPath(pmRoot), `${runId}.json`);\n}\n"]}
1
+ {"version":3,"file":"paths.js","sources":["core/store/paths.ts"],"sourceRoot":"/","sourcesContent":["import { statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { PM_DIRNAME, SETTINGS_FILENAME, TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport type { ItemFormat, ItemType } from \"../../types/index.js\";\n\nexport const ITEM_FILE_EXTENSION_BY_FORMAT: Record<ItemFormat, \".md\" | \".toon\"> = {\n json_markdown: \".md\",\n toon: \".toon\",\n};\n\nconst ITEM_FORMAT_BY_EXTENSION = {\n \".md\": \"json_markdown\",\n \".toon\": \"toon\",\n} as const satisfies Record<string, ItemFormat>;\n\nexport const ITEM_FILE_EXTENSIONS: Array<keyof typeof ITEM_FORMAT_BY_EXTENSION> = [\".md\", \".toon\"];\n\nfunction pathExists(pathValue: string): boolean {\n try {\n statSync(pathValue);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction discoverPmRootFromAncestors(cwd: string): string | undefined {\n let current = path.resolve(cwd);\n while (true) {\n const candidateRoot = path.join(current, PM_DIRNAME);\n const candidateSettingsPath = path.join(candidateRoot, SETTINGS_FILENAME);\n if (pathExists(candidateSettingsPath)) {\n return candidateRoot;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nexport function resolvePmRoot(cwd: string, cliPath?: string): string {\n const envPath = process.env.PM_PATH;\n const explicitPath = cliPath?.trim() || envPath?.trim();\n if (explicitPath) {\n return path.resolve(cwd, explicitPath);\n }\n const discoveredRoot = discoverPmRootFromAncestors(cwd);\n if (discoveredRoot) {\n return discoveredRoot;\n }\n const selected = PM_DIRNAME;\n return path.resolve(cwd, selected);\n}\n\nexport function resolveGlobalPmRoot(cwd: string): string {\n const envPath = process.env.PM_GLOBAL_PATH?.trim();\n const selected = envPath && envPath.length > 0 ? envPath : path.join(os.homedir(), \".pm-cli\");\n return path.resolve(cwd, selected);\n}\n\nexport function getSettingsPath(pmRoot: string): string {\n return path.join(pmRoot, SETTINGS_FILENAME);\n}\n\nfunction deriveDefaultTypeFolder(type: string): string {\n const normalized = type\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (normalized.length === 0) {\n return \"items\";\n }\n return normalized.endsWith(\"s\") ? normalized : `${normalized}s`;\n}\n\nexport function getTypeDirPath(pmRoot: string, type: ItemType, typeToFolder: Record<string, string> = TYPE_TO_FOLDER): string {\n const folder = typeToFolder[type] ?? deriveDefaultTypeFolder(type);\n return path.join(pmRoot, folder);\n}\n\nexport function getItemPath(\n pmRoot: string,\n type: ItemType,\n id: string,\n itemFormat: ItemFormat = \"toon\",\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n): string {\n return path.join(getTypeDirPath(pmRoot, type, typeToFolder), `${id}${ITEM_FILE_EXTENSION_BY_FORMAT[itemFormat]}`);\n}\n\nexport function getItemFormatFromPath(itemPath: string): ItemFormat | null {\n const extension = path.extname(itemPath).toLowerCase() as keyof typeof ITEM_FORMAT_BY_EXTENSION;\n return ITEM_FORMAT_BY_EXTENSION[extension] ?? null;\n}\n\nexport function getHistoryPath(pmRoot: string, id: string): string {\n return path.join(pmRoot, \"history\", `${id}.jsonl`);\n}\n\nexport function getLockPath(pmRoot: string, id: string): string {\n return path.join(pmRoot, \"locks\", `${id}.lock`);\n}\n\nexport function getRuntimePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\");\n}\n\nexport function getTestRunsPath(pmRoot: string): string {\n return path.join(getRuntimePath(pmRoot), \"test-runs\");\n}\n\nexport function getTestRunsRecordsPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"runs\");\n}\n\nexport function getTestRunRecordPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsRecordsPath(pmRoot), `${runId}.json`);\n}\n\nexport function getTestRunsStdoutPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"stdout\");\n}\n\nexport function getTestRunsStderrPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"stderr\");\n}\n\nexport function getTestRunStdoutPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsStdoutPath(pmRoot), `${runId}.log`);\n}\n\nexport function getTestRunStderrPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsStderrPath(pmRoot), `${runId}.log`);\n}\n\nexport function getTestRunsResultsPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"results\");\n}\n\nexport function getTestRunResultPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsResultsPath(pmRoot), `${runId}.json`);\n}\n"],"names":[],"mappings":"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","debugId":"66d39566-a27a-5e26-af05-925ddc8ec97f"}
@@ -0,0 +1,106 @@
1
+ import type { AgentGuidanceSettings, ExtensionPolicySettings, GovernanceSettings, ItemTypeDefinition, RuntimeSchemaSettings } from "../../types.js";
2
+ /** Validated, unknown-key-stripped settings input (pre-merge), matching the legacy zod inference. */
3
+ export interface ParsedSettings {
4
+ version: number;
5
+ id_prefix: string;
6
+ author_default: string;
7
+ item_format?: "toon" | "json_markdown";
8
+ locks: {
9
+ ttl_seconds: number;
10
+ };
11
+ output: {
12
+ default_format: "toon" | "json";
13
+ };
14
+ history?: {
15
+ missing_stream: "auto_create" | "strict_error";
16
+ };
17
+ validation?: {
18
+ sprint_release_format: "warn" | "strict_error";
19
+ parent_reference?: "warn" | "strict_error";
20
+ metadata_profile?: "core" | "strict" | "custom";
21
+ metadata_required_fields?: string[];
22
+ lifecycle_stale_blocker_reason_patterns?: string[];
23
+ lifecycle_closure_like_blocked_reason_patterns?: string[];
24
+ lifecycle_closure_like_resolution_patterns?: string[];
25
+ lifecycle_closure_like_actual_result_patterns?: string[];
26
+ };
27
+ governance?: Partial<GovernanceSettings>;
28
+ workflow?: {
29
+ definition_of_done: string[];
30
+ };
31
+ testing?: {
32
+ record_results_to_items: boolean;
33
+ };
34
+ telemetry?: {
35
+ enabled: boolean;
36
+ first_run_prompt_completed?: boolean;
37
+ capture_level?: "minimal" | "redacted" | "max";
38
+ endpoint?: string;
39
+ installation_id?: string;
40
+ retention_days?: number;
41
+ };
42
+ agent_guidance?: Partial<AgentGuidanceSettings>;
43
+ item_types?: {
44
+ definitions: ItemTypeDefinition[];
45
+ };
46
+ schema?: Partial<RuntimeSchemaSettings>;
47
+ context?: {
48
+ default_depth?: "brief" | "standard" | "deep";
49
+ activity_limit?: number;
50
+ stale_threshold_days?: number;
51
+ sections?: {
52
+ hierarchy?: boolean;
53
+ activity?: boolean;
54
+ progress?: boolean;
55
+ blockers?: boolean;
56
+ files?: boolean;
57
+ workload?: boolean;
58
+ staleness?: boolean;
59
+ tests?: boolean;
60
+ };
61
+ };
62
+ extensions: {
63
+ enabled: string[];
64
+ disabled: string[];
65
+ policy?: Partial<ExtensionPolicySettings>;
66
+ };
67
+ search: {
68
+ score_threshold: number;
69
+ hybrid_semantic_weight?: number;
70
+ max_results: number;
71
+ embedding_model: string;
72
+ embedding_batch_size: number;
73
+ embedding_timeout_ms?: number;
74
+ scanner_max_batch_retries: number;
75
+ provider?: string;
76
+ };
77
+ providers: {
78
+ openai: {
79
+ base_url: string;
80
+ api_key: string;
81
+ model: string;
82
+ };
83
+ ollama: {
84
+ base_url: string;
85
+ model: string;
86
+ };
87
+ };
88
+ vector_store: {
89
+ adapter?: string;
90
+ qdrant: {
91
+ url: string;
92
+ api_key: string;
93
+ };
94
+ lancedb: {
95
+ path: string;
96
+ };
97
+ };
98
+ }
99
+ export type SettingsValidationResult = {
100
+ success: true;
101
+ data: ParsedSettings;
102
+ } | {
103
+ success: false;
104
+ };
105
+ /** Validate raw settings, returning stripped, type-checked data or failure (matching the legacy zod safeParse). */
106
+ export declare function validateSettings(raw: unknown): SettingsValidationResult;