@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]="d005f4dc-ee7b-522d-823b-558840d3ccd6")}catch(e){}}();
1
3
  import { runActiveCommandOverride, runActiveRendererOverride, runActiveServiceOverrideSync, setActiveCommandResult, } from "../extensions/index.js";
2
4
  import { EXIT_CODE } from "../shared/constants.js";
3
5
  let streamErrorHandlersInstalled = false;
@@ -122,8 +124,7 @@ function renderToonValue(value, depth) {
122
124
  if (rest.length === 0) {
123
125
  return `${indent}- ${firstLine.trimStart()}`;
124
126
  }
125
- const nested = rest.map((line) => `${indent} ${line}`).join("\n");
126
- return `${indent}- ${firstLine.trimStart()}\n${nested}`;
127
+ return `${indent}- ${firstLine.trimStart()}\n${rest.join("\n")}`;
127
128
  })
128
129
  .join("\n");
129
130
  }
@@ -148,6 +149,33 @@ function renderToonValue(value, depth) {
148
149
  }
149
150
  return `${indent}${renderScalar(value)}`;
150
151
  }
152
+ function renderDefaultMarkdownResult(value) {
153
+ if (!isPlainObject(value) || value.output_default !== "markdown") {
154
+ return null;
155
+ }
156
+ if (typeof value.view !== "string" || !Array.isArray(value.events) || !Array.isArray(value.days)) {
157
+ return null;
158
+ }
159
+ const lines = [`# pm calendar (${value.view})`, ""];
160
+ const summary = isPlainObject(value.summary) ? value.summary : {};
161
+ lines.push(`- events: ${String(summary.events ?? 0)}`);
162
+ lines.push("");
163
+ if (value.events.length === 0) {
164
+ lines.push("No calendar events matched the selected filters.");
165
+ return `${lines.join("\n")}\n`;
166
+ }
167
+ for (const event of value.events) {
168
+ if (!isPlainObject(event)) {
169
+ continue;
170
+ }
171
+ const kind = typeof event.kind === "string" ? event.kind : "event";
172
+ const title = typeof event.item_title === "string" ? event.item_title : "";
173
+ const itemId = typeof event.item_id === "string" ? event.item_id : "";
174
+ const reminderText = typeof event.reminder_text === "string" && event.reminder_text.length > 0 ? ` ${event.reminder_text}` : "";
175
+ lines.push(`- [${kind}] ${itemId} ${title}${reminderText}`.trim());
176
+ }
177
+ return `${lines.join("\n")}\n`;
178
+ }
151
179
  export function formatOutput(result, options) {
152
180
  const commandOverride = runActiveCommandOverride(result);
153
181
  const effectiveResult = commandOverride.result;
@@ -160,6 +188,11 @@ export function formatOutput(result, options) {
160
188
  ? "json"
161
189
  : "toon";
162
190
  const serviceOverride = runActiveServiceOverrideSync("output_format", {
191
+ command: options.command,
192
+ args: options.commandArgs,
193
+ command_options: options.commandOptions,
194
+ global: { ...options },
195
+ pm_root: options.pmRoot,
163
196
  format,
164
197
  options: { ...options },
165
198
  result: effectiveResult,
@@ -167,14 +200,21 @@ export function formatOutput(result, options) {
167
200
  if (serviceOverride.handled && typeof serviceOverride.result === "string") {
168
201
  return serviceOverride.result.endsWith("\n") ? serviceOverride.result : `${serviceOverride.result}\n`;
169
202
  }
170
- const rendererOverride = runActiveRendererOverride(format, effectiveResult);
203
+ const outputResult = serviceOverride.handled ? serviceOverride.result : effectiveResult;
204
+ if (format === "toon") {
205
+ const markdownDefault = renderDefaultMarkdownResult(outputResult);
206
+ if (markdownDefault !== null) {
207
+ return markdownDefault;
208
+ }
209
+ }
210
+ const rendererOverride = runActiveRendererOverride(format, outputResult);
171
211
  if (rendererOverride.rendered !== null) {
172
212
  return rendererOverride.rendered.endsWith("\n") ? rendererOverride.rendered : `${rendererOverride.rendered}\n`;
173
213
  }
174
214
  if (format === "json") {
175
- return `${JSON.stringify(effectiveResult, null, 2)}\n`;
215
+ return `${JSON.stringify(outputResult, null, 2)}\n`;
176
216
  }
177
- const compactedToon = compactToonValue(effectiveResult);
217
+ const compactedToon = compactToonValue(outputResult);
178
218
  if (compactedToon === undefined) {
179
219
  return "{}\n";
180
220
  }
@@ -194,4 +234,5 @@ export function printError(message) {
194
234
  const rendered = override.handled && typeof override.result === "string" ? override.result : message;
195
235
  writeStderr(rendered.endsWith("\n") ? rendered : `${rendered}\n`);
196
236
  }
197
- //# sourceMappingURL=output.js.map
237
+ //# sourceMappingURL=output.js.map
238
+ //# debugId=d005f4dc-ee7b-522d-823b-558840d3ccd6
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"/","sources":["core/output/output.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n runActiveCommandOverride,\n runActiveRendererOverride,\n runActiveServiceOverrideSync,\n setActiveCommandResult,\n} from \"../extensions/index.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\n\nexport interface OutputOptions {\n json?: boolean;\n quiet?: boolean;\n defaultOutputFormat?: \"toon\" | \"json\";\n}\n\ninterface NodeLikeError {\n code?: string;\n}\n\nlet streamErrorHandlersInstalled = false;\ntype OutputStreamTarget = \"stdout\" | \"stderr\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isBrokenPipeError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && (error as NodeLikeError).code === \"EPIPE\";\n}\n\nfunction markStdoutBrokenPipeExitCode(): void {\n if (process.exitCode === undefined || process.exitCode === EXIT_CODE.SUCCESS) {\n process.exitCode = EXIT_CODE.SUCCESS;\n }\n}\n\nfunction markStderrBrokenPipeExitCode(): void {\n if (process.exitCode === undefined || process.exitCode === EXIT_CODE.SUCCESS) {\n process.exitCode = EXIT_CODE.GENERIC_FAILURE;\n }\n}\n\nfunction markBrokenPipeExitCode(target: OutputStreamTarget): void {\n if (target === \"stdout\") {\n markStdoutBrokenPipeExitCode();\n return;\n }\n markStderrBrokenPipeExitCode();\n}\n\nfunction handleUnhandledStreamError(error: unknown): void {\n const unhandled = error instanceof Error ? error : new Error(String(error));\n setImmediate(() => {\n throw unhandled;\n });\n}\n\nfunction installStreamErrorHandlers(): void {\n if (streamErrorHandlersInstalled) {\n return;\n }\n streamErrorHandlersInstalled = true;\n process.stdout.on(\"error\", (error: unknown) => {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(\"stdout\");\n return;\n }\n handleUnhandledStreamError(error);\n });\n process.stderr.on(\"error\", (error: unknown) => {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(\"stderr\");\n return;\n }\n handleUnhandledStreamError(error);\n });\n}\n\nfunction writeToStream(target: OutputStreamTarget, text: string): boolean {\n installStreamErrorHandlers();\n try {\n if (target === \"stdout\") {\n process.stdout.write(text);\n } else {\n process.stderr.write(text);\n }\n return true;\n } catch (error: unknown) {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(target);\n return false;\n }\n throw error;\n }\n}\n\nexport function writeStdout(text: string): boolean {\n return writeToStream(\"stdout\", text);\n}\n\nexport function writeStderr(text: string): boolean {\n return writeToStream(\"stderr\", text);\n}\n\nfunction renderScalar(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value === null) return \"null\";\n return JSON.stringify(value);\n}\n\nfunction compactToonValue(value: unknown): unknown | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const compactedEntries = value\n .map((entry) => compactToonValue(entry))\n .filter((entry): entry is unknown => entry !== undefined);\n return compactedEntries.length > 0 ? compactedEntries : undefined;\n }\n\n if (isPlainObject(value)) {\n const compacted: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const compactedEntry = compactToonValue(entry);\n if (compactedEntry !== undefined) {\n compacted[key] = compactedEntry;\n }\n }\n return Object.keys(compacted).length > 0 ? compacted : undefined;\n }\n\n return value;\n}\n\nfunction renderToonValue(value: unknown, depth: number): string {\n const indent = \" \".repeat(depth);\n\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n return value\n .map((entry) => {\n if (!isPlainObject(entry) && !Array.isArray(entry)) {\n return `${indent}- ${renderScalar(entry)}`;\n }\n const rendered = renderToonValue(entry, depth + 1);\n const lines = rendered.split(\"\\n\");\n const [firstLine, ...rest] = lines;\n if (rest.length === 0) {\n return `${indent}- ${firstLine.trimStart()}`;\n }\n const nested = rest.map((line) => `${indent} ${line}`).join(\"\\n\");\n return `${indent}- ${firstLine.trimStart()}\\n${nested}`;\n })\n .join(\"\\n\");\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value);\n if (entries.length === 0) return \"{}\";\n return entries\n .map(([key, entry]) => {\n if (!isPlainObject(entry) && !Array.isArray(entry)) {\n return `${indent}${key}: ${renderScalar(entry)}`;\n }\n if (Array.isArray(entry) && entry.length === 0) {\n return `${indent}${key}: []`;\n }\n if (isPlainObject(entry) && Object.keys(entry).length === 0) {\n return `${indent}${key}: {}`;\n }\n return `${indent}${key}:\\n${renderToonValue(entry, depth + 1)}`;\n })\n .join(\"\\n\");\n }\n\n return `${indent}${renderScalar(value)}`;\n}\n\nexport function formatOutput(result: unknown, options: OutputOptions): string {\n const commandOverride = runActiveCommandOverride(result);\n const effectiveResult = commandOverride.result;\n setActiveCommandResult(effectiveResult);\n const format =\n options.json === true\n ? \"json\"\n : options.json === false\n ? \"toon\"\n : options.defaultOutputFormat === \"json\"\n ? \"json\"\n : \"toon\";\n const serviceOverride = runActiveServiceOverrideSync(\"output_format\", {\n format,\n options: { ...options },\n result: effectiveResult,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result.endsWith(\"\\n\") ? serviceOverride.result : `${serviceOverride.result}\\n`;\n }\n const rendererOverride = runActiveRendererOverride(format, effectiveResult);\n if (rendererOverride.rendered !== null) {\n return rendererOverride.rendered.endsWith(\"\\n\") ? rendererOverride.rendered : `${rendererOverride.rendered}\\n`;\n }\n if (format === \"json\") {\n return `${JSON.stringify(effectiveResult, null, 2)}\\n`;\n }\n const compactedToon = compactToonValue(effectiveResult);\n if (compactedToon === undefined) {\n return \"{}\\n\";\n }\n return `${renderToonValue(compactedToon, 0)}\\n`;\n}\n\nexport function printResult(result: unknown, options: OutputOptions): void {\n const rendered = formatOutput(result, options);\n if (options.quiet) {\n return;\n }\n writeStdout(rendered);\n}\n\nexport function printError(message: string): void {\n const override = runActiveServiceOverrideSync(\"error_format\", {\n message,\n });\n const rendered = override.handled && typeof override.result === \"string\" ? override.result : message;\n writeStderr(rendered.endsWith(\"\\n\") ? rendered : `${rendered}\\n`);\n}\n"]}
1
+ {"version":3,"file":"output.js","sources":["core/output/output.ts"],"sourceRoot":"/","sourcesContent":["import {\n runActiveCommandOverride,\n runActiveRendererOverride,\n runActiveServiceOverrideSync,\n setActiveCommandResult,\n} from \"../extensions/index.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\n\nexport interface OutputOptions {\n json?: boolean;\n quiet?: boolean;\n defaultOutputFormat?: \"toon\" | \"json\";\n command?: string;\n commandArgs?: string[];\n commandOptions?: Record<string, unknown>;\n pmRoot?: string;\n}\n\ninterface NodeLikeError {\n code?: string;\n}\n\nlet streamErrorHandlersInstalled = false;\ntype OutputStreamTarget = \"stdout\" | \"stderr\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isBrokenPipeError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && (error as NodeLikeError).code === \"EPIPE\";\n}\n\nfunction markStdoutBrokenPipeExitCode(): void {\n if (process.exitCode === undefined || process.exitCode === EXIT_CODE.SUCCESS) {\n process.exitCode = EXIT_CODE.SUCCESS;\n }\n}\n\nfunction markStderrBrokenPipeExitCode(): void {\n if (process.exitCode === undefined || process.exitCode === EXIT_CODE.SUCCESS) {\n process.exitCode = EXIT_CODE.GENERIC_FAILURE;\n }\n}\n\nfunction markBrokenPipeExitCode(target: OutputStreamTarget): void {\n if (target === \"stdout\") {\n markStdoutBrokenPipeExitCode();\n return;\n }\n markStderrBrokenPipeExitCode();\n}\n\nfunction handleUnhandledStreamError(error: unknown): void {\n const unhandled = error instanceof Error ? error : new Error(String(error));\n setImmediate(() => {\n throw unhandled;\n });\n}\n\nfunction installStreamErrorHandlers(): void {\n if (streamErrorHandlersInstalled) {\n return;\n }\n streamErrorHandlersInstalled = true;\n process.stdout.on(\"error\", (error: unknown) => {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(\"stdout\");\n return;\n }\n handleUnhandledStreamError(error);\n });\n process.stderr.on(\"error\", (error: unknown) => {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(\"stderr\");\n return;\n }\n handleUnhandledStreamError(error);\n });\n}\n\nfunction writeToStream(target: OutputStreamTarget, text: string): boolean {\n installStreamErrorHandlers();\n try {\n if (target === \"stdout\") {\n process.stdout.write(text);\n } else {\n process.stderr.write(text);\n }\n return true;\n } catch (error: unknown) {\n if (isBrokenPipeError(error)) {\n markBrokenPipeExitCode(target);\n return false;\n }\n throw error;\n }\n}\n\nexport function writeStdout(text: string): boolean {\n return writeToStream(\"stdout\", text);\n}\n\nexport function writeStderr(text: string): boolean {\n return writeToStream(\"stderr\", text);\n}\n\nfunction renderScalar(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value === null) return \"null\";\n return JSON.stringify(value);\n}\n\nfunction compactToonValue(value: unknown): unknown | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const compactedEntries = value\n .map((entry) => compactToonValue(entry))\n .filter((entry): entry is unknown => entry !== undefined);\n return compactedEntries.length > 0 ? compactedEntries : undefined;\n }\n\n if (isPlainObject(value)) {\n const compacted: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const compactedEntry = compactToonValue(entry);\n if (compactedEntry !== undefined) {\n compacted[key] = compactedEntry;\n }\n }\n return Object.keys(compacted).length > 0 ? compacted : undefined;\n }\n\n return value;\n}\n\nfunction renderToonValue(value: unknown, depth: number): string {\n const indent = \" \".repeat(depth);\n\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n return value\n .map((entry) => {\n if (!isPlainObject(entry) && !Array.isArray(entry)) {\n return `${indent}- ${renderScalar(entry)}`;\n }\n const rendered = renderToonValue(entry, depth + 1);\n const lines = rendered.split(\"\\n\");\n const [firstLine, ...rest] = lines;\n if (rest.length === 0) {\n return `${indent}- ${firstLine.trimStart()}`;\n }\n return `${indent}- ${firstLine.trimStart()}\\n${rest.join(\"\\n\")}`;\n })\n .join(\"\\n\");\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value);\n if (entries.length === 0) return \"{}\";\n return entries\n .map(([key, entry]) => {\n if (!isPlainObject(entry) && !Array.isArray(entry)) {\n return `${indent}${key}: ${renderScalar(entry)}`;\n }\n if (Array.isArray(entry) && entry.length === 0) {\n return `${indent}${key}: []`;\n }\n if (isPlainObject(entry) && Object.keys(entry).length === 0) {\n return `${indent}${key}: {}`;\n }\n return `${indent}${key}:\\n${renderToonValue(entry, depth + 1)}`;\n })\n .join(\"\\n\");\n }\n\n return `${indent}${renderScalar(value)}`;\n}\n\nfunction renderDefaultMarkdownResult(value: unknown): string | null {\n if (!isPlainObject(value) || value.output_default !== \"markdown\") {\n return null;\n }\n if (typeof value.view !== \"string\" || !Array.isArray(value.events) || !Array.isArray(value.days)) {\n return null;\n }\n const lines = [`# pm calendar (${value.view})`, \"\"];\n const summary = isPlainObject(value.summary) ? value.summary : {};\n lines.push(`- events: ${String(summary.events ?? 0)}`);\n lines.push(\"\");\n if (value.events.length === 0) {\n lines.push(\"No calendar events matched the selected filters.\");\n return `${lines.join(\"\\n\")}\\n`;\n }\n for (const event of value.events) {\n if (!isPlainObject(event)) {\n continue;\n }\n const kind = typeof event.kind === \"string\" ? event.kind : \"event\";\n const title = typeof event.item_title === \"string\" ? event.item_title : \"\";\n const itemId = typeof event.item_id === \"string\" ? event.item_id : \"\";\n const reminderText = typeof event.reminder_text === \"string\" && event.reminder_text.length > 0 ? ` ${event.reminder_text}` : \"\";\n lines.push(`- [${kind}] ${itemId} ${title}${reminderText}`.trim());\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function formatOutput(result: unknown, options: OutputOptions): string {\n const commandOverride = runActiveCommandOverride(result);\n const effectiveResult = commandOverride.result;\n setActiveCommandResult(effectiveResult);\n const format =\n options.json === true\n ? \"json\"\n : options.json === false\n ? \"toon\"\n : options.defaultOutputFormat === \"json\"\n ? \"json\"\n : \"toon\";\n const serviceOverride = runActiveServiceOverrideSync(\"output_format\", {\n command: options.command,\n args: options.commandArgs,\n command_options: options.commandOptions,\n global: { ...options },\n pm_root: options.pmRoot,\n format,\n options: { ...options },\n result: effectiveResult,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result.endsWith(\"\\n\") ? serviceOverride.result : `${serviceOverride.result}\\n`;\n }\n const outputResult = serviceOverride.handled ? serviceOverride.result : effectiveResult;\n if (format === \"toon\") {\n const markdownDefault = renderDefaultMarkdownResult(outputResult);\n if (markdownDefault !== null) {\n return markdownDefault;\n }\n }\n const rendererOverride = runActiveRendererOverride(format, outputResult);\n if (rendererOverride.rendered !== null) {\n return rendererOverride.rendered.endsWith(\"\\n\") ? rendererOverride.rendered : `${rendererOverride.rendered}\\n`;\n }\n if (format === \"json\") {\n return `${JSON.stringify(outputResult, null, 2)}\\n`;\n }\n const compactedToon = compactToonValue(outputResult);\n if (compactedToon === undefined) {\n return \"{}\\n\";\n }\n return `${renderToonValue(compactedToon, 0)}\\n`;\n}\n\nexport function printResult(result: unknown, options: OutputOptions): void {\n const rendered = formatOutput(result, options);\n if (options.quiet) {\n return;\n }\n writeStdout(rendered);\n}\n\nexport function printError(message: string): void {\n const override = runActiveServiceOverrideSync(\"error_format\", {\n message,\n });\n const rendered = override.handled && typeof override.result === \"string\" ? override.result : message;\n writeStderr(rendered.endsWith(\"\\n\") ? rendered : `${rendered}\\n`);\n}\n"],"names":[],"mappings":"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","debugId":"d005f4dc-ee7b-522d-823b-558840d3ccd6"}
@@ -24,6 +24,7 @@ export interface PmPackageManifest {
24
24
  package_json_path?: string;
25
25
  package_name?: string;
26
26
  package_version?: string;
27
+ package_private?: boolean;
27
28
  package_description?: string;
28
29
  package_keywords?: string[];
29
30
  package_homepage?: string;
@@ -1,6 +1,9 @@
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]="84dfbdeb-902c-58a1-a6c4-9411f5c2293e")}catch(e){}}();
1
3
  import fs from "node:fs/promises";
2
4
  import path from "node:path";
3
5
  import { pathExists } from "../fs/fs-utils.js";
6
+ import { isPathWithinDirectory } from "../fs/path-utils.js";
4
7
  import { EXIT_CODE } from "../shared/constants.js";
5
8
  import { PmCliError } from "../shared/errors.js";
6
9
  export const PM_PACKAGE_RESOURCE_KINDS = [
@@ -152,6 +155,7 @@ export async function readPmPackageManifest(packageRoot) {
152
155
  package_json_path: packageJsonPath,
153
156
  package_name: typeof packageJson.name === "string" ? packageJson.name : undefined,
154
157
  package_version: typeof packageJson.version === "string" ? packageJson.version : undefined,
158
+ package_private: packageJson.private === true,
155
159
  package_description: typeof packageJson.description === "string" ? packageJson.description : undefined,
156
160
  package_keywords: normalizeStringArray(packageJson.keywords),
157
161
  package_homepage: typeof packageJson.homepage === "string" ? packageJson.homepage : undefined,
@@ -162,13 +166,6 @@ export async function readPmPackageManifest(packageRoot) {
162
166
  catalog: normalizePackageCatalogMetadata(pmManifestRecord.catalog),
163
167
  };
164
168
  }
165
- function isPathWithinDirectory(directory, targetPath) {
166
- const relative = path.relative(directory, targetPath);
167
- if (relative.length === 0) {
168
- return true;
169
- }
170
- return !relative.startsWith("..") && !path.isAbsolute(relative);
171
- }
172
169
  async function listExtensionManifestDirectories(parentDirectory) {
173
170
  if (!(await pathExists(parentDirectory))) {
174
171
  return [];
@@ -218,4 +215,5 @@ export async function collectPackageExtensionDirectories(packageRoot) {
218
215
  }
219
216
  return [...discovered].sort((left, right) => left.localeCompare(right));
220
217
  }
221
- //# sourceMappingURL=manifest.js.map
218
+ //# sourceMappingURL=manifest.js.map
219
+ //# debugId=84dfbdeb-902c-58a1-a6c4-9411f5c2293e
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"/","sources":["core/packages/manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\n\nexport const PM_PACKAGE_RESOURCE_KINDS = [\n \"extensions\",\n \"docs\",\n \"examples\",\n] as const;\n\nexport type PmPackageResourceKind = (typeof PM_PACKAGE_RESOURCE_KINDS)[number];\n\nexport type PmPackageResourceMap = Partial<Record<PmPackageResourceKind, string[]>>;\n\nexport interface PmPackageCatalogLinkMap {\n docs?: string;\n npm?: string;\n repository?: string;\n report?: string;\n}\n\nexport interface PmPackageCatalogMediaMap {\n image?: string;\n video?: string;\n}\n\nexport interface PmPackageCatalogMetadata {\n display_name?: string;\n category?: string;\n summary?: string;\n links?: PmPackageCatalogLinkMap;\n media?: PmPackageCatalogMediaMap;\n tags?: string[];\n}\n\nexport interface PmPackageManifest {\n source: \"pm\" | \"convention\";\n package_json_path?: string;\n package_name?: string;\n package_version?: string;\n package_description?: string;\n package_keywords?: string[];\n package_homepage?: string;\n package_repository_url?: string;\n package_bugs_url?: string;\n aliases?: string[];\n resources: PmPackageResourceMap;\n catalog?: PmPackageCatalogMetadata;\n}\n\nexport const PM_PACKAGE_CONVENTIONAL_RESOURCE_ROOTS: Readonly<Record<PmPackageResourceKind, readonly string[]>> =\n Object.freeze({\n extensions: Object.freeze([\n \".agents/pm/extensions\",\n \"extensions\",\n \".custom/pm-extensions\",\n \".custom/pm-extension\",\n ]),\n docs: Object.freeze([\n \"docs\",\n \"documentation\",\n ]),\n examples: Object.freeze([\n \"examples\",\n \"docs/examples\",\n ]),\n });\n\nfunction isKnownPackageResourceKind(value: string): value is PmPackageResourceKind {\n return (PM_PACKAGE_RESOURCE_KINDS as readonly string[]).includes(value);\n}\n\nfunction normalizePackageResourceEntries(kind: PmPackageResourceKind, raw: unknown): string[] {\n if (raw === undefined || raw === null) {\n return [];\n }\n const entries = Array.isArray(raw) ? raw : [raw];\n const normalized: string[] = [];\n for (const entry of entries) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new PmCliError(`Package manifest field pm.${kind} must contain string paths.`, EXIT_CODE.USAGE);\n }\n normalized.push(entry.trim());\n }\n return [...new Set(normalized)].sort((left, right) => left.localeCompare(right));\n}\n\nfunction normalizePackageResourceMap(raw: unknown): PmPackageResourceMap {\n if (raw === undefined || raw === null) {\n return {};\n }\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new PmCliError(\"Package manifest field pm must be an object.\", EXIT_CODE.USAGE);\n }\n const resources: PmPackageResourceMap = {};\n const candidate = raw as Record<string, unknown>;\n for (const [key, value] of Object.entries(candidate)) {\n if (!isKnownPackageResourceKind(key)) {\n continue;\n }\n const entries = normalizePackageResourceEntries(key, value);\n if (entries.length > 0) {\n resources[key] = entries;\n }\n }\n return resources;\n}\n\nfunction readStringField(source: Record<string, unknown>, key: string): string | undefined {\n const value = source[key];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction normalizeStringArray(raw: unknown): string[] | undefined {\n if (!Array.isArray(raw)) {\n return undefined;\n }\n const values = raw\n .map((value) => typeof value === \"string\" ? value.trim() : \"\")\n .filter((value) => value.length > 0);\n return values.length > 0 ? [...new Set(values)].sort((left, right) => left.localeCompare(right)) : undefined;\n}\n\nfunction readUrlLikeField(raw: unknown): string | undefined {\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n return raw.trim();\n }\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n const value = (raw as Record<string, unknown>).url;\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n }\n return undefined;\n}\n\nfunction normalizeCatalogLinks(raw: unknown): PmPackageCatalogLinkMap | undefined {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return undefined;\n }\n const source = raw as Record<string, unknown>;\n const links: PmPackageCatalogLinkMap = {\n docs: readStringField(source, \"docs\"),\n npm: readStringField(source, \"npm\"),\n repository: readStringField(source, \"repository\"),\n report: readStringField(source, \"report\"),\n };\n return Object.values(links).some((value) => typeof value === \"string\") ? links : undefined;\n}\n\nfunction normalizeCatalogMedia(raw: unknown): PmPackageCatalogMediaMap | undefined {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return undefined;\n }\n const source = raw as Record<string, unknown>;\n const media: PmPackageCatalogMediaMap = {\n image: readStringField(source, \"image\"),\n video: readStringField(source, \"video\"),\n };\n return Object.values(media).some((value) => typeof value === \"string\") ? media : undefined;\n}\n\nfunction normalizePackageCatalogMetadata(raw: unknown): PmPackageCatalogMetadata | undefined {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return undefined;\n }\n const source = raw as Record<string, unknown>;\n const catalog: PmPackageCatalogMetadata = {\n display_name: readStringField(source, \"display_name\") ?? readStringField(source, \"displayName\"),\n category: readStringField(source, \"category\"),\n summary: readStringField(source, \"summary\"),\n links: normalizeCatalogLinks(source.links),\n media: normalizeCatalogMedia(source.media),\n tags: normalizeStringArray(source.tags),\n };\n return Object.values(catalog).some((value) => value !== undefined) ? catalog : undefined;\n}\n\nexport async function readPmPackageManifest(packageRoot: string): Promise<PmPackageManifest> {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (!(await pathExists(packageJsonPath))) {\n return {\n source: \"convention\",\n resources: {},\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.readFile(packageJsonPath, \"utf8\")) as unknown;\n } catch (error: unknown) {\n throw new PmCliError(\n `Failed to parse package manifest at \"${packageJsonPath}\": ${String(error)}`,\n EXIT_CODE.USAGE,\n );\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new PmCliError(`Package manifest at \"${packageJsonPath}\" must be a JSON object.`, EXIT_CODE.USAGE);\n }\n\n const packageJson = parsed as Record<string, unknown>;\n const pmManifest = packageJson.pm;\n const hasPmManifest = pmManifest !== undefined && pmManifest !== null;\n const pmManifestRecord = typeof pmManifest === \"object\" && pmManifest !== null && !Array.isArray(pmManifest)\n ? pmManifest as Record<string, unknown>\n : {};\n return {\n source: hasPmManifest ? \"pm\" : \"convention\",\n package_json_path: packageJsonPath,\n package_name: typeof packageJson.name === \"string\" ? packageJson.name : undefined,\n package_version: typeof packageJson.version === \"string\" ? packageJson.version : undefined,\n package_description: typeof packageJson.description === \"string\" ? packageJson.description : undefined,\n package_keywords: normalizeStringArray(packageJson.keywords),\n package_homepage: typeof packageJson.homepage === \"string\" ? packageJson.homepage : undefined,\n package_repository_url: readUrlLikeField(packageJson.repository),\n package_bugs_url: readUrlLikeField(packageJson.bugs),\n aliases: normalizeStringArray(pmManifestRecord.aliases),\n resources: normalizePackageResourceMap(pmManifest),\n catalog: normalizePackageCatalogMetadata(pmManifestRecord.catalog),\n };\n}\n\nfunction isPathWithinDirectory(directory: string, targetPath: string): boolean {\n const relative = path.relative(directory, targetPath);\n if (relative.length === 0) {\n return true;\n }\n return !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nasync function listExtensionManifestDirectories(parentDirectory: string): Promise<string[]> {\n if (!(await pathExists(parentDirectory))) {\n return [];\n }\n const entries = await fs.readdir(parentDirectory, { withFileTypes: true });\n const candidates: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const directory = path.join(parentDirectory, entry.name);\n if (await pathExists(path.join(directory, \"manifest.json\"))) {\n candidates.push(directory);\n }\n }\n return candidates.sort((left, right) => left.localeCompare(right));\n}\n\nexport async function collectPackageExtensionDirectories(packageRoot: string): Promise<string[]> {\n if (await pathExists(path.join(packageRoot, \"manifest.json\"))) {\n return [packageRoot];\n }\n\n const manifest = await readPmPackageManifest(packageRoot);\n const manifestEntries = manifest.resources.extensions ?? [];\n const discovered = new Set<string>();\n\n for (const entry of manifestEntries) {\n if (entry.includes(\"*\") || entry.startsWith(\"!\")) {\n throw new PmCliError(\n `Package extension entry \"${entry}\" uses a glob/exclusion pattern. pm package installs currently require concrete extension paths or directories.`,\n EXIT_CODE.USAGE,\n );\n }\n const absolute = path.resolve(packageRoot, entry);\n if (!isPathWithinDirectory(packageRoot, absolute)) {\n throw new PmCliError(`Package extension entry \"${entry}\" resolves outside package root.`, EXIT_CODE.USAGE);\n }\n if (await pathExists(path.join(absolute, \"manifest.json\"))) {\n discovered.add(absolute);\n continue;\n }\n for (const child of await listExtensionManifestDirectories(absolute)) {\n discovered.add(child);\n }\n }\n\n if (manifestEntries.length === 0) {\n for (const root of PM_PACKAGE_CONVENTIONAL_RESOURCE_ROOTS.extensions) {\n for (const child of await listExtensionManifestDirectories(path.join(packageRoot, root))) {\n discovered.add(child);\n }\n }\n }\n\n return [...discovered].sort((left, right) => left.localeCompare(right));\n}\n"]}
1
+ {"version":3,"file":"manifest.js","sources":["core/packages/manifest.ts"],"sourceRoot":"/","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../fs/fs-utils.js\";\nimport { isPathWithinDirectory } from \"../fs/path-utils.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\n\nexport const PM_PACKAGE_RESOURCE_KINDS = [\n \"extensions\",\n \"docs\",\n \"examples\",\n] as const;\n\nexport type PmPackageResourceKind = (typeof PM_PACKAGE_RESOURCE_KINDS)[number];\n\nexport type PmPackageResourceMap = Partial<Record<PmPackageResourceKind, string[]>>;\n\nexport interface PmPackageCatalogLinkMap {\n docs?: string;\n npm?: string;\n repository?: string;\n report?: string;\n}\n\nexport interface PmPackageCatalogMediaMap {\n image?: string;\n video?: string;\n}\n\nexport interface PmPackageCatalogMetadata {\n display_name?: string;\n category?: string;\n summary?: string;\n links?: PmPackageCatalogLinkMap;\n media?: PmPackageCatalogMediaMap;\n tags?: string[];\n}\n\nexport interface PmPackageManifest {\n source: \"pm\" | \"convention\";\n package_json_path?: string;\n package_name?: string;\n package_version?: string;\n package_private?: boolean;\n package_description?: string;\n package_keywords?: string[];\n package_homepage?: string;\n package_repository_url?: string;\n package_bugs_url?: string;\n aliases?: string[];\n resources: PmPackageResourceMap;\n catalog?: PmPackageCatalogMetadata;\n}\n\nexport const PM_PACKAGE_CONVENTIONAL_RESOURCE_ROOTS: Readonly<Record<PmPackageResourceKind, readonly string[]>> =\n Object.freeze({\n extensions: Object.freeze([\n \".agents/pm/extensions\",\n \"extensions\",\n \".custom/pm-extensions\",\n \".custom/pm-extension\",\n ]),\n docs: Object.freeze([\n \"docs\",\n \"documentation\",\n ]),\n examples: Object.freeze([\n \"examples\",\n \"docs/examples\",\n ]),\n });\n\nfunction isKnownPackageResourceKind(value: string): value is PmPackageResourceKind {\n return (PM_PACKAGE_RESOURCE_KINDS as readonly string[]).includes(value);\n}\n\nfunction normalizePackageResourceEntries(kind: PmPackageResourceKind, raw: unknown): string[] {\n if (raw === undefined || raw === null) {\n return [];\n }\n const entries = Array.isArray(raw) ? raw : [raw];\n const normalized: string[] = [];\n for (const entry of entries) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new PmCliError(`Package manifest field pm.${kind} must contain string paths.`, EXIT_CODE.USAGE);\n }\n normalized.push(entry.trim());\n }\n return [...new Set(normalized)].sort((left, right) => left.localeCompare(right));\n}\n\nfunction normalizePackageResourceMap(raw: unknown): PmPackageResourceMap {\n if (raw === undefined || raw === null) {\n return {};\n }\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new PmCliError(\"Package manifest field pm must be an object.\", EXIT_CODE.USAGE);\n }\n const resources: PmPackageResourceMap = {};\n const candidate = raw as Record<string, unknown>;\n for (const [key, value] of Object.entries(candidate)) {\n if (!isKnownPackageResourceKind(key)) {\n continue;\n }\n const entries = normalizePackageResourceEntries(key, value);\n if (entries.length > 0) {\n resources[key] = entries;\n }\n }\n return resources;\n}\n\nfunction readStringField(source: Record<string, unknown>, key: string): string | undefined {\n const value = source[key];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction normalizeStringArray(raw: unknown): string[] | undefined {\n if (!Array.isArray(raw)) {\n return undefined;\n }\n const values = raw\n .map((value) => typeof value === \"string\" ? value.trim() : \"\")\n .filter((value) => value.length > 0);\n return values.length > 0 ? [...new Set(values)].sort((left, right) => left.localeCompare(right)) : undefined;\n}\n\nfunction readUrlLikeField(raw: unknown): string | undefined {\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n return raw.trim();\n }\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n const value = (raw as Record<string, unknown>).url;\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n }\n return undefined;\n}\n\nfunction normalizeCatalogLinks(raw: unknown): PmPackageCatalogLinkMap | undefined {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return undefined;\n }\n const source = raw as Record<string, unknown>;\n const links: PmPackageCatalogLinkMap = {\n docs: readStringField(source, \"docs\"),\n npm: readStringField(source, \"npm\"),\n repository: readStringField(source, \"repository\"),\n report: readStringField(source, \"report\"),\n };\n return Object.values(links).some((value) => typeof value === \"string\") ? links : undefined;\n}\n\nfunction normalizeCatalogMedia(raw: unknown): PmPackageCatalogMediaMap | undefined {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return undefined;\n }\n const source = raw as Record<string, unknown>;\n const media: PmPackageCatalogMediaMap = {\n image: readStringField(source, \"image\"),\n video: readStringField(source, \"video\"),\n };\n return Object.values(media).some((value) => typeof value === \"string\") ? media : undefined;\n}\n\nfunction normalizePackageCatalogMetadata(raw: unknown): PmPackageCatalogMetadata | undefined {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return undefined;\n }\n const source = raw as Record<string, unknown>;\n const catalog: PmPackageCatalogMetadata = {\n display_name: readStringField(source, \"display_name\") ?? readStringField(source, \"displayName\"),\n category: readStringField(source, \"category\"),\n summary: readStringField(source, \"summary\"),\n links: normalizeCatalogLinks(source.links),\n media: normalizeCatalogMedia(source.media),\n tags: normalizeStringArray(source.tags),\n };\n return Object.values(catalog).some((value) => value !== undefined) ? catalog : undefined;\n}\n\nexport async function readPmPackageManifest(packageRoot: string): Promise<PmPackageManifest> {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (!(await pathExists(packageJsonPath))) {\n return {\n source: \"convention\",\n resources: {},\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.readFile(packageJsonPath, \"utf8\")) as unknown;\n } catch (error: unknown) {\n throw new PmCliError(\n `Failed to parse package manifest at \"${packageJsonPath}\": ${String(error)}`,\n EXIT_CODE.USAGE,\n );\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new PmCliError(`Package manifest at \"${packageJsonPath}\" must be a JSON object.`, EXIT_CODE.USAGE);\n }\n\n const packageJson = parsed as Record<string, unknown>;\n const pmManifest = packageJson.pm;\n const hasPmManifest = pmManifest !== undefined && pmManifest !== null;\n const pmManifestRecord = typeof pmManifest === \"object\" && pmManifest !== null && !Array.isArray(pmManifest)\n ? pmManifest as Record<string, unknown>\n : {};\n return {\n source: hasPmManifest ? \"pm\" : \"convention\",\n package_json_path: packageJsonPath,\n package_name: typeof packageJson.name === \"string\" ? packageJson.name : undefined,\n package_version: typeof packageJson.version === \"string\" ? packageJson.version : undefined,\n package_private: packageJson.private === true,\n package_description: typeof packageJson.description === \"string\" ? packageJson.description : undefined,\n package_keywords: normalizeStringArray(packageJson.keywords),\n package_homepage: typeof packageJson.homepage === \"string\" ? packageJson.homepage : undefined,\n package_repository_url: readUrlLikeField(packageJson.repository),\n package_bugs_url: readUrlLikeField(packageJson.bugs),\n aliases: normalizeStringArray(pmManifestRecord.aliases),\n resources: normalizePackageResourceMap(pmManifest),\n catalog: normalizePackageCatalogMetadata(pmManifestRecord.catalog),\n };\n}\n\nasync function listExtensionManifestDirectories(parentDirectory: string): Promise<string[]> {\n if (!(await pathExists(parentDirectory))) {\n return [];\n }\n const entries = await fs.readdir(parentDirectory, { withFileTypes: true });\n const candidates: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const directory = path.join(parentDirectory, entry.name);\n if (await pathExists(path.join(directory, \"manifest.json\"))) {\n candidates.push(directory);\n }\n }\n return candidates.sort((left, right) => left.localeCompare(right));\n}\n\nexport async function collectPackageExtensionDirectories(packageRoot: string): Promise<string[]> {\n if (await pathExists(path.join(packageRoot, \"manifest.json\"))) {\n return [packageRoot];\n }\n\n const manifest = await readPmPackageManifest(packageRoot);\n const manifestEntries = manifest.resources.extensions ?? [];\n const discovered = new Set<string>();\n\n for (const entry of manifestEntries) {\n if (entry.includes(\"*\") || entry.startsWith(\"!\")) {\n throw new PmCliError(\n `Package extension entry \"${entry}\" uses a glob/exclusion pattern. pm package installs currently require concrete extension paths or directories.`,\n EXIT_CODE.USAGE,\n );\n }\n const absolute = path.resolve(packageRoot, entry);\n if (!isPathWithinDirectory(packageRoot, absolute)) {\n throw new PmCliError(`Package extension entry \"${entry}\" resolves outside package root.`, EXIT_CODE.USAGE);\n }\n if (await pathExists(path.join(absolute, \"manifest.json\"))) {\n discovered.add(absolute);\n continue;\n }\n for (const child of await listExtensionManifestDirectories(absolute)) {\n discovered.add(child);\n }\n }\n\n if (manifestEntries.length === 0) {\n for (const root of PM_PACKAGE_CONVENTIONAL_RESOURCE_ROOTS.extensions) {\n for (const child of await listExtensionManifestDirectories(path.join(packageRoot, root))) {\n discovered.add(child);\n }\n }\n }\n\n return [...discovered].sort((left, right) => left.localeCompare(right));\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,YAAY;IACZ,MAAM;IACN,UAAU;CACF,CAAC;AA2CX,MAAM,CAAC,MAAM,sCAAsC,GACjD,MAAM,CAAC,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;QACxB,uBAAuB;QACvB,YAAY;QACZ,uBAAuB;QACvB,sBAAsB;KACvB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,MAAM;QACN,eAAe;KAChB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,UAAU;QACV,eAAe;KAChB,CAAC;CACH,CAAC,CAAC;AAEL,SAAS,0BAA0B,CAAC,KAAa;IAC/C,OAAQ,yBAA+C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,+BAA+B,CAAC,IAA2B,EAAE,GAAY;IAChF,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,UAAU,CAAC,6BAA6B,IAAI,6BAA6B,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACxG,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAY;IAC/C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,8CAA8C,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,SAAS,GAAyB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,GAA8B,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,+BAA+B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B,EAAE,GAAW;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,GAAG;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/G,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,KAAK,GAAI,GAA+B,CAAC,GAAG,CAAC;QACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAY;IACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,KAAK,GAA4B;QACrC,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC;QACrC,GAAG,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;QACnC,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC;QACjD,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC;KAC1C,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAY;IACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,KAAK,GAA6B;QACtC,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;QACvC,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;KACxC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,SAAS,+BAA+B,CAAC,GAAY;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,OAAO,GAA6B;QACxC,YAAY,EAAE,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC;QAC/F,QAAQ,EAAE,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC;QAC7C,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC;QAC3C,KAAK,EAAE,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1C,KAAK,EAAE,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1C,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC;KACxC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAY,CAAC;IAC7E,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAClB,wCAAwC,eAAe,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAC5E,SAAS,CAAC,KAAK,CAChB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,UAAU,CAAC,wBAAwB,eAAe,0BAA0B,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,WAAW,GAAG,MAAiC,CAAC;IACtD,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC;IACtE,MAAM,gBAAgB,GAAG,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1G,CAAC,CAAC,UAAqC;QACvC,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;QAC3C,iBAAiB,EAAE,eAAe;QAClC,YAAY,EAAE,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACjF,eAAe,EAAE,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC1F,eAAe,EAAE,WAAW,CAAC,OAAO,KAAK,IAAI;QAC7C,mBAAmB,EAAE,OAAO,WAAW,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QACtG,gBAAgB,EAAE,oBAAoB,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5D,gBAAgB,EAAE,OAAO,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC7F,sBAAsB,EAAE,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC;QAChE,gBAAgB,EAAE,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;QACpD,OAAO,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,OAAO,CAAC;QACvD,SAAS,EAAE,2BAA2B,CAAC,UAAU,CAAC;QAClD,OAAO,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,OAAO,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gCAAgC,CAAC,eAAuB;IACrE,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YAC5D,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,WAAmB;IAC1E,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,UAAU,CAClB,4BAA4B,KAAK,iHAAiH,EAClJ,SAAS,CAAC,KAAK,CAChB,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,UAAU,CAAC,4BAA4B,KAAK,kCAAkC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7G,CAAC;QACD,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,sCAAsC,CAAC,UAAU,EAAE,CAAC;YACrE,KAAK,MAAM,KAAK,IAAI,MAAM,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBACzF,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1E,CAAC","debugId":"84dfbdeb-902c-58a1-a6c4-9411f5c2293e"}
@@ -0,0 +1,3 @@
1
+ export declare function findPmPackageRootFromPath(startPath: string): string | undefined;
2
+ export declare function resolvePmPackageRootFromModule(metaUrl: string, fallbackRelativeSegments?: string[]): string;
3
+ export declare function resolveConfiguredPmPackageRoot(env?: NodeJS.ProcessEnv, envName?: string, metaUrl?: string, fallbackRelativeSegments?: string[]): string;
@@ -0,0 +1,51 @@
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]="20b7827b-6f96-518c-8df3-b699d41dec88")}catch(e){}}();
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const PM_CLI_PACKAGE_NAME = "@unbrained/pm-cli";
7
+ function packageJsonNamesPmCli(packageJsonPath) {
8
+ try {
9
+ const parsed = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
10
+ return parsed.name === PM_CLI_PACKAGE_NAME;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export function findPmPackageRootFromPath(startPath) {
17
+ let current = fs.existsSync(startPath) && fs.statSync(startPath).isDirectory()
18
+ ? path.resolve(startPath)
19
+ : path.dirname(path.resolve(startPath));
20
+ while (true) {
21
+ const packageJsonPath = path.join(current, "package.json");
22
+ if (fs.existsSync(packageJsonPath) && packageJsonNamesPmCli(packageJsonPath)) {
23
+ return current;
24
+ }
25
+ const parent = path.dirname(current);
26
+ if (parent === current) {
27
+ return undefined;
28
+ }
29
+ current = parent;
30
+ }
31
+ }
32
+ export function resolvePmPackageRootFromModule(metaUrl, fallbackRelativeSegments = []) {
33
+ const modulePath = fileURLToPath(metaUrl);
34
+ const discovered = findPmPackageRootFromPath(modulePath);
35
+ if (discovered) {
36
+ return discovered;
37
+ }
38
+ return path.resolve(path.dirname(modulePath), ...fallbackRelativeSegments);
39
+ }
40
+ export function resolveConfiguredPmPackageRoot(env = process.env, envName = "PM_CLI_PACKAGE_ROOT", metaUrl, fallbackRelativeSegments = []) {
41
+ const envRoot = env[envName];
42
+ if (typeof envRoot === "string" && envRoot.trim().length > 0) {
43
+ return path.resolve(envRoot.trim());
44
+ }
45
+ if (metaUrl) {
46
+ return resolvePmPackageRootFromModule(metaUrl, fallbackRelativeSegments);
47
+ }
48
+ return process.cwd();
49
+ }
50
+ //# sourceMappingURL=root.js.map
51
+ //# debugId=20b7827b-6f96-518c-8df3-b699d41dec88
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sources":["core/packages/root.ts"],"sourceRoot":"/","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PM_CLI_PACKAGE_NAME = \"@unbrained/pm-cli\";\n\nfunction packageJsonNamesPmCli(packageJsonPath: string): boolean {\n try {\n const parsed = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as { name?: unknown };\n return parsed.name === PM_CLI_PACKAGE_NAME;\n } catch {\n return false;\n }\n}\n\nexport function findPmPackageRootFromPath(startPath: string): string | undefined {\n let current = fs.existsSync(startPath) && fs.statSync(startPath).isDirectory()\n ? path.resolve(startPath)\n : path.dirname(path.resolve(startPath));\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n if (fs.existsSync(packageJsonPath) && packageJsonNamesPmCli(packageJsonPath)) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nexport function resolvePmPackageRootFromModule(metaUrl: string, fallbackRelativeSegments: string[] = []): string {\n const modulePath = fileURLToPath(metaUrl);\n const discovered = findPmPackageRootFromPath(modulePath);\n if (discovered) {\n return discovered;\n }\n return path.resolve(path.dirname(modulePath), ...fallbackRelativeSegments);\n}\n\nexport function resolveConfiguredPmPackageRoot(\n env: NodeJS.ProcessEnv = process.env,\n envName = \"PM_CLI_PACKAGE_ROOT\",\n metaUrl?: string,\n fallbackRelativeSegments: string[] = [],\n): string {\n const envRoot = env[envName];\n if (typeof envRoot === \"string\" && envRoot.trim().length > 0) {\n return path.resolve(envRoot.trim());\n }\n if (metaUrl) {\n return resolvePmPackageRootFromModule(metaUrl, fallbackRelativeSegments);\n }\n return process.cwd();\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEhD,SAAS,qBAAqB,CAAC,eAAuB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAuB,CAAC;QAC1F,OAAO,MAAM,CAAC,IAAI,KAAK,mBAAmB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,IAAI,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QAC5E,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1C,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,qBAAqB,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAe,EAAE,2BAAqC,EAAE;IACrG,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,wBAAwB,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAyB,OAAO,CAAC,GAAG,EACpC,OAAO,GAAG,qBAAqB,EAC/B,OAAgB,EAChB,2BAAqC,EAAE;IAEvC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,8BAA8B,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC","debugId":"20b7827b-6f96-518c-8df3-b699d41dec88"}
@@ -0,0 +1,85 @@
1
+ import type { ItemTypeDefinition } from "../../types/index.js";
2
+ export type { ItemTypeDefinition } from "../../types/index.js";
3
+ /**
4
+ * The shape persisted at `.agents/pm/schema/types.json`.
5
+ */
6
+ export interface ItemTypesFile {
7
+ definitions: ItemTypeDefinition[];
8
+ }
9
+ export interface NormalizedAddTypeInput {
10
+ name: string;
11
+ description?: string;
12
+ defaultStatus?: string;
13
+ folder?: string;
14
+ aliases: string[];
15
+ }
16
+ export interface RawAddTypeInput {
17
+ name: string | undefined;
18
+ description?: string;
19
+ defaultStatus?: string;
20
+ folder?: string;
21
+ aliases?: string[];
22
+ }
23
+ export interface UpsertItemTypeResult {
24
+ file: ItemTypesFile;
25
+ /** The definition as stored after the upsert (existing fields preserved). */
26
+ definition: ItemTypeDefinition;
27
+ /** True when an existing definition with the same (case-insensitive) name was replaced. */
28
+ replaced: boolean;
29
+ }
30
+ /**
31
+ * Returns the canonical built-in name when `name` collides (case-insensitively)
32
+ * with a reserved built-in item type, otherwise undefined.
33
+ */
34
+ export declare function matchBuiltinTypeName(name: string): string | undefined;
35
+ /**
36
+ * Escapes a value for safe interpolation inside a double-quoted shell string so
37
+ * suggested copy-pasteable commands stay well-formed for names containing
38
+ * `"`, `` ` ``, `$`, or `\`.
39
+ */
40
+ export declare function escapeForDoubleQuotes(value: string): string;
41
+ /**
42
+ * Validates and normalizes raw add-type CLI input. Throws a plain Error with a
43
+ * stable message when the name is missing/empty or collides with a built-in;
44
+ * the CLI layer maps these to PmCliError exit codes.
45
+ */
46
+ export declare function normalizeAddTypeInput(raw: RawAddTypeInput): NormalizedAddTypeInput;
47
+ /**
48
+ * Throws when the requested name or any alias collides (case-insensitively)
49
+ * with the canonical name or an alias of a DIFFERENT existing definition.
50
+ * Such collisions would make `pm create`/`pm update --type` resolve
51
+ * ambiguously (the runtime registry keys a single lowercase alias map), so
52
+ * they are rejected. Tokens belonging to the same-named definition being
53
+ * upserted are ignored, keeping re-runs idempotent.
54
+ */
55
+ export declare function assertAliasesAvailable(input: NormalizedAddTypeInput, existing: ItemTypesFile): void;
56
+ /**
57
+ * Coerces an arbitrary parsed value from types.json into an ItemTypesFile.
58
+ * Accepts the canonical `{ definitions: [...] }` shape, a bare array of
59
+ * definitions, or a nested `{ item_types: { definitions: [...] } }` form, and
60
+ * tolerates a missing/invalid file by returning an empty definitions list.
61
+ */
62
+ export declare function parseItemTypesFile(raw: string | null | undefined): ItemTypesFile;
63
+ /**
64
+ * Idempotent UPSERT of a custom item type into the parsed file. Matching is
65
+ * case-insensitive by name. When a definition already exists, fields supplied
66
+ * in `input` override the previous values; aliases are merged (deduped); other
67
+ * fields not addressed by add-type flags are preserved untouched.
68
+ */
69
+ export declare function upsertItemType(file: ItemTypesFile, input: NormalizedAddTypeInput): UpsertItemTypeResult;
70
+ /**
71
+ * Serializes the item types file with a trailing newline (matches the rest of
72
+ * the schema scaffold files written by pm).
73
+ */
74
+ export declare function serializeItemTypesFile(file: ItemTypesFile): string;
75
+ /**
76
+ * Appends a discoverable hint to the "Invalid type" error so agents learn that
77
+ * custom types exist and how to register one. Quotes are chosen so the printed
78
+ * line is copy-pasteable as a shell command.
79
+ */
80
+ export declare function buildInvalidTypeHint(name: string): string;
81
+ /**
82
+ * Builds the full invalid-type error message used by create/update: the
83
+ * existing "Invalid type ... Allowed: ..." line plus the discoverable hint.
84
+ */
85
+ export declare function buildInvalidTypeError(name: string, allowedTypes: readonly string[]): string;