@unbrained/pm-cli 2026.5.12 → 2026.5.18

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 (407) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/AGENTS.md +78 -457
  3. package/CHANGELOG.md +22 -0
  4. package/CONTRIBUTING.md +1 -0
  5. package/PRD.md +7 -28
  6. package/README.md +8 -14
  7. package/dist/cli/argv-utils.js +4 -1
  8. package/dist/cli/argv-utils.js.map +1 -1
  9. package/dist/cli/bootstrap-args.js +4 -1
  10. package/dist/cli/bootstrap-args.js.map +1 -1
  11. package/dist/cli/commander-usage.js +32 -1
  12. package/dist/cli/commander-usage.js.map +1 -1
  13. package/dist/cli/commands/activity.js +23 -5
  14. package/dist/cli/commands/activity.js.map +1 -1
  15. package/dist/cli/commands/aggregate.js +5 -2
  16. package/dist/cli/commands/aggregate.js.map +1 -1
  17. package/dist/cli/commands/append.js +4 -1
  18. package/dist/cli/commands/append.js.map +1 -1
  19. package/dist/cli/commands/calendar.js +9 -3
  20. package/dist/cli/commands/calendar.js.map +1 -1
  21. package/dist/cli/commands/claim.d.ts +3 -0
  22. package/dist/cli/commands/claim.js +19 -3
  23. package/dist/cli/commands/claim.js.map +1 -1
  24. package/dist/cli/commands/close.js +4 -1
  25. package/dist/cli/commands/close.js.map +1 -1
  26. package/dist/cli/commands/comments-audit.js +4 -1
  27. package/dist/cli/commands/comments-audit.js.map +1 -1
  28. package/dist/cli/commands/comments.js +4 -1
  29. package/dist/cli/commands/comments.js.map +1 -1
  30. package/dist/cli/commands/completion.js +98 -2
  31. package/dist/cli/commands/completion.js.map +1 -1
  32. package/dist/cli/commands/config.js +4 -1
  33. package/dist/cli/commands/config.js.map +1 -1
  34. package/dist/cli/commands/context.js +19 -5
  35. package/dist/cli/commands/context.js.map +1 -1
  36. package/dist/cli/commands/contracts.d.ts +9 -0
  37. package/dist/cli/commands/contracts.js +205 -49
  38. package/dist/cli/commands/contracts.js.map +1 -1
  39. package/dist/cli/commands/create.js +88 -9
  40. package/dist/cli/commands/create.js.map +1 -1
  41. package/dist/cli/commands/dedupe-audit.js +4 -1
  42. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  43. package/dist/cli/commands/delete.js +4 -1
  44. package/dist/cli/commands/delete.js.map +1 -1
  45. package/dist/cli/commands/deps.js +4 -1
  46. package/dist/cli/commands/deps.js.map +1 -1
  47. package/dist/cli/commands/docs.js +4 -1
  48. package/dist/cli/commands/docs.js.map +1 -1
  49. package/dist/cli/commands/extension.d.ts +7 -2
  50. package/dist/cli/commands/extension.js +360 -64
  51. package/dist/cli/commands/extension.js.map +1 -1
  52. package/dist/cli/commands/files.js +4 -1
  53. package/dist/cli/commands/files.js.map +1 -1
  54. package/dist/cli/commands/gc.js +4 -1
  55. package/dist/cli/commands/gc.js.map +1 -1
  56. package/dist/cli/commands/get.d.ts +7 -3
  57. package/dist/cli/commands/get.js +91 -18
  58. package/dist/cli/commands/get.js.map +1 -1
  59. package/dist/cli/commands/guide.js +6 -8
  60. package/dist/cli/commands/guide.js.map +1 -1
  61. package/dist/cli/commands/health.d.ts +4 -0
  62. package/dist/cli/commands/health.js +31 -8
  63. package/dist/cli/commands/health.js.map +1 -1
  64. package/dist/cli/commands/history-redact.d.ts +42 -0
  65. package/dist/cli/commands/history-redact.js +559 -0
  66. package/dist/cli/commands/history-redact.js.map +1 -0
  67. package/dist/cli/commands/history.d.ts +4 -0
  68. package/dist/cli/commands/history.js +14 -3
  69. package/dist/cli/commands/history.js.map +1 -1
  70. package/dist/cli/commands/index.d.ts +2 -8
  71. package/dist/cli/commands/index.js +6 -9
  72. package/dist/cli/commands/index.js.map +1 -1
  73. package/dist/cli/commands/init-agent-guidance.d.ts +31 -0
  74. package/dist/cli/commands/init-agent-guidance.js +336 -0
  75. package/dist/cli/commands/init-agent-guidance.js.map +1 -0
  76. package/dist/cli/commands/init.d.ts +14 -0
  77. package/dist/cli/commands/init.js +75 -1
  78. package/dist/cli/commands/init.js.map +1 -1
  79. package/dist/cli/commands/learnings.js +4 -1
  80. package/dist/cli/commands/learnings.js.map +1 -1
  81. package/dist/cli/commands/list.d.ts +1 -0
  82. package/dist/cli/commands/list.js +42 -18
  83. package/dist/cli/commands/list.js.map +1 -1
  84. package/dist/cli/commands/metadata-normalizers.js +4 -1
  85. package/dist/cli/commands/metadata-normalizers.js.map +1 -1
  86. package/dist/cli/commands/normalize.js +4 -1
  87. package/dist/cli/commands/normalize.js.map +1 -1
  88. package/dist/cli/commands/notes.js +4 -1
  89. package/dist/cli/commands/notes.js.map +1 -1
  90. package/dist/cli/commands/plan.d.ts +118 -0
  91. package/dist/cli/commands/plan.js +975 -0
  92. package/dist/cli/commands/plan.js.map +1 -0
  93. package/dist/cli/commands/reindex.d.ts +8 -0
  94. package/dist/cli/commands/reindex.js +100 -24
  95. package/dist/cli/commands/reindex.js.map +1 -1
  96. package/dist/cli/commands/restore.js +4 -1
  97. package/dist/cli/commands/restore.js.map +1 -1
  98. package/dist/cli/commands/search.js +58 -27
  99. package/dist/cli/commands/search.js.map +1 -1
  100. package/dist/cli/commands/stats.js +4 -1
  101. package/dist/cli/commands/stats.js.map +1 -1
  102. package/dist/cli/commands/templates.js +4 -1
  103. package/dist/cli/commands/templates.js.map +1 -1
  104. package/dist/cli/commands/test-all.js +4 -1
  105. package/dist/cli/commands/test-all.js.map +1 -1
  106. package/dist/cli/commands/test-runs.js +4 -1
  107. package/dist/cli/commands/test-runs.js.map +1 -1
  108. package/dist/cli/commands/test.js +4 -1
  109. package/dist/cli/commands/test.js.map +1 -1
  110. package/dist/cli/commands/update-many.js +4 -1
  111. package/dist/cli/commands/update-many.js.map +1 -1
  112. package/dist/cli/commands/update.js +114 -71
  113. package/dist/cli/commands/update.js.map +1 -1
  114. package/dist/cli/commands/upgrade.js +6 -3
  115. package/dist/cli/commands/upgrade.js.map +1 -1
  116. package/dist/cli/commands/validate.js +32 -4
  117. package/dist/cli/commands/validate.js.map +1 -1
  118. package/dist/cli/error-guidance.js +5 -2
  119. package/dist/cli/error-guidance.js.map +1 -1
  120. package/dist/cli/extension-command-help.js +4 -1
  121. package/dist/cli/extension-command-help.js.map +1 -1
  122. package/dist/cli/extension-command-options.js +4 -1
  123. package/dist/cli/extension-command-options.js.map +1 -1
  124. package/dist/cli/guide-topics.js +4 -1
  125. package/dist/cli/guide-topics.js.map +1 -1
  126. package/dist/cli/help-content.js +52 -33
  127. package/dist/cli/help-content.js.map +1 -1
  128. package/dist/cli/help-json-payload.js +4 -1
  129. package/dist/cli/help-json-payload.js.map +1 -1
  130. package/dist/cli/main.js +276 -32
  131. package/dist/cli/main.js.map +1 -1
  132. package/dist/cli/migration-gates.js +4 -1
  133. package/dist/cli/migration-gates.js.map +1 -1
  134. package/dist/cli/register-list-query.js +55 -150
  135. package/dist/cli/register-list-query.js.map +1 -1
  136. package/dist/cli/register-mutation.js +277 -261
  137. package/dist/cli/register-mutation.js.map +1 -1
  138. package/dist/cli/register-operations.js +62 -199
  139. package/dist/cli/register-operations.js.map +1 -1
  140. package/dist/cli/register-setup.js +55 -146
  141. package/dist/cli/register-setup.js.map +1 -1
  142. package/dist/cli/registration-helpers.d.ts +2 -2
  143. package/dist/cli/registration-helpers.js +11 -21
  144. package/dist/cli/registration-helpers.js.map +1 -1
  145. package/dist/cli/shared-parsers.js +4 -1
  146. package/dist/cli/shared-parsers.js.map +1 -1
  147. package/dist/cli/telemetry-flush.js +4 -1
  148. package/dist/cli/telemetry-flush.js.map +1 -1
  149. package/dist/cli.js +45 -3
  150. package/dist/cli.js.map +1 -1
  151. package/dist/core/extensions/extension-types.js +4 -1
  152. package/dist/core/extensions/extension-types.js.map +1 -1
  153. package/dist/core/extensions/index.js +4 -1
  154. package/dist/core/extensions/index.js.map +1 -1
  155. package/dist/core/extensions/item-fields.js +4 -1
  156. package/dist/core/extensions/item-fields.js.map +1 -1
  157. package/dist/core/extensions/loader.js +84 -54
  158. package/dist/core/extensions/loader.js.map +1 -1
  159. package/dist/core/extensions/runtime-registrations.js +4 -1
  160. package/dist/core/extensions/runtime-registrations.js.map +1 -1
  161. package/dist/core/fs/fs-utils.js +4 -1
  162. package/dist/core/fs/fs-utils.js.map +1 -1
  163. package/dist/core/fs/index.js +4 -1
  164. package/dist/core/fs/index.js.map +1 -1
  165. package/dist/core/history/history-stream-policy.js +4 -1
  166. package/dist/core/history/history-stream-policy.js.map +1 -1
  167. package/dist/core/history/history.js +4 -1
  168. package/dist/core/history/history.js.map +1 -1
  169. package/dist/core/history/index.js +4 -1
  170. package/dist/core/history/index.js.map +1 -1
  171. package/dist/core/item/id.js +4 -1
  172. package/dist/core/item/id.js.map +1 -1
  173. package/dist/core/item/index.js +4 -1
  174. package/dist/core/item/index.js.map +1 -1
  175. package/dist/core/item/item-format.js +241 -2
  176. package/dist/core/item/item-format.js.map +1 -1
  177. package/dist/core/item/parent-reference-policy.js +4 -1
  178. package/dist/core/item/parent-reference-policy.js.map +1 -1
  179. package/dist/core/item/parse.js +33 -3
  180. package/dist/core/item/parse.js.map +1 -1
  181. package/dist/core/item/sprint-release-format.js +4 -1
  182. package/dist/core/item/sprint-release-format.js.map +1 -1
  183. package/dist/core/item/status.js +4 -1
  184. package/dist/core/item/status.js.map +1 -1
  185. package/dist/core/item/type-registry.js +4 -1
  186. package/dist/core/item/type-registry.js.map +1 -1
  187. package/dist/core/lock/index.js +4 -1
  188. package/dist/core/lock/index.js.map +1 -1
  189. package/dist/core/lock/lock.js +4 -1
  190. package/dist/core/lock/lock.js.map +1 -1
  191. package/dist/core/output/command-aware.js +4 -1
  192. package/dist/core/output/command-aware.js.map +1 -1
  193. package/dist/core/output/output.d.ts +4 -0
  194. package/dist/core/output/output.js +47 -6
  195. package/dist/core/output/output.js.map +1 -1
  196. package/dist/core/packages/manifest.d.ts +27 -1
  197. package/dist/core/packages/manifest.js +87 -1
  198. package/dist/core/packages/manifest.js.map +1 -1
  199. package/dist/core/packages/root.d.ts +3 -0
  200. package/dist/core/packages/root.js +51 -0
  201. package/dist/core/packages/root.js.map +1 -0
  202. package/dist/core/schema/runtime-field-filters.js +4 -1
  203. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  204. package/dist/core/schema/runtime-field-values.js +4 -1
  205. package/dist/core/schema/runtime-field-values.js.map +1 -1
  206. package/dist/core/schema/runtime-schema.js +4 -1
  207. package/dist/core/schema/runtime-schema.js.map +1 -1
  208. package/dist/core/search/cache.js +7 -2
  209. package/dist/core/search/cache.js.map +1 -1
  210. package/dist/core/search/corpus.d.ts +2 -0
  211. package/dist/core/search/corpus.js +77 -2
  212. package/dist/core/search/corpus.js.map +1 -1
  213. package/dist/core/search/embedding-batches.d.ts +13 -1
  214. package/dist/core/search/embedding-batches.js +40 -8
  215. package/dist/core/search/embedding-batches.js.map +1 -1
  216. package/dist/core/search/http-client.js +4 -1
  217. package/dist/core/search/http-client.js.map +1 -1
  218. package/dist/core/search/providers.js +4 -1
  219. package/dist/core/search/providers.js.map +1 -1
  220. package/dist/core/search/semantic-defaults.js +11 -2
  221. package/dist/core/search/semantic-defaults.js.map +1 -1
  222. package/dist/core/search/vector-stores.js +4 -1
  223. package/dist/core/search/vector-stores.js.map +1 -1
  224. package/dist/core/sentry/helpers.js +4 -1
  225. package/dist/core/sentry/helpers.js.map +1 -1
  226. package/dist/core/sentry/instrument.js +10 -13
  227. package/dist/core/sentry/instrument.js.map +1 -1
  228. package/dist/core/shared/command-types.js +4 -1
  229. package/dist/core/shared/command-types.js.map +1 -1
  230. package/dist/core/shared/conflict-markers.js +4 -1
  231. package/dist/core/shared/conflict-markers.js.map +1 -1
  232. package/dist/core/shared/constants.d.ts +2 -2
  233. package/dist/core/shared/constants.js +24 -1
  234. package/dist/core/shared/constants.js.map +1 -1
  235. package/dist/core/shared/errors.js +4 -1
  236. package/dist/core/shared/errors.js.map +1 -1
  237. package/dist/core/shared/index.js +4 -1
  238. package/dist/core/shared/index.js.map +1 -1
  239. package/dist/core/shared/levenshtein.js +4 -1
  240. package/dist/core/shared/levenshtein.js.map +1 -1
  241. package/dist/core/shared/primitives.js +4 -1
  242. package/dist/core/shared/primitives.js.map +1 -1
  243. package/dist/core/shared/serialization.js +4 -1
  244. package/dist/core/shared/serialization.js.map +1 -1
  245. package/dist/core/shared/text-normalization.js +4 -1
  246. package/dist/core/shared/text-normalization.js.map +1 -1
  247. package/dist/core/shared/time.js +4 -1
  248. package/dist/core/shared/time.js.map +1 -1
  249. package/dist/core/store/front-matter-cache.d.ts +8 -1
  250. package/dist/core/store/front-matter-cache.js +28 -14
  251. package/dist/core/store/front-matter-cache.js.map +1 -1
  252. package/dist/core/store/index.js +4 -1
  253. package/dist/core/store/index.js.map +1 -1
  254. package/dist/core/store/item-format-migration.js +4 -1
  255. package/dist/core/store/item-format-migration.js.map +1 -1
  256. package/dist/core/store/item-store.d.ts +2 -0
  257. package/dist/core/store/item-store.js +66 -3
  258. package/dist/core/store/item-store.js.map +1 -1
  259. package/dist/core/store/paths.js +4 -1
  260. package/dist/core/store/paths.js.map +1 -1
  261. package/dist/core/store/settings.js +39 -1
  262. package/dist/core/store/settings.js.map +1 -1
  263. package/dist/core/telemetry/consent.js +4 -1
  264. package/dist/core/telemetry/consent.js.map +1 -1
  265. package/dist/core/telemetry/observability.d.ts +1 -1
  266. package/dist/core/telemetry/observability.js +11 -2
  267. package/dist/core/telemetry/observability.js.map +1 -1
  268. package/dist/core/telemetry/runtime.js +31 -5
  269. package/dist/core/telemetry/runtime.js.map +1 -1
  270. package/dist/core/test/background-runs.js +4 -1
  271. package/dist/core/test/background-runs.js.map +1 -1
  272. package/dist/core/test/item-test-run-tracking.js +4 -1
  273. package/dist/core/test/item-test-run-tracking.js.map +1 -1
  274. package/dist/mcp/server.d.ts +8 -0
  275. package/dist/mcp/server.js +212 -53
  276. package/dist/mcp/server.js.map +1 -1
  277. package/dist/sdk/cli-contracts/commander-mutation-options.d.ts +7 -0
  278. package/dist/sdk/cli-contracts/commander-mutation-options.js +484 -0
  279. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -0
  280. package/dist/sdk/cli-contracts/commander-types.d.ts +21 -0
  281. package/dist/sdk/cli-contracts/commander-types.js +95 -0
  282. package/dist/sdk/cli-contracts/commander-types.js.map +1 -0
  283. package/dist/sdk/cli-contracts.d.ts +10 -17
  284. package/dist/sdk/cli-contracts.js +232 -282
  285. package/dist/sdk/cli-contracts.js.map +1 -1
  286. package/dist/sdk/index.d.ts +2 -1
  287. package/dist/sdk/index.js +5 -1
  288. package/dist/sdk/index.js.map +1 -1
  289. package/dist/sdk/runtime.d.ts +29 -0
  290. package/dist/sdk/runtime.js +31 -0
  291. package/dist/sdk/runtime.js.map +1 -0
  292. package/dist/types/index.js +4 -1
  293. package/dist/types/index.js.map +1 -1
  294. package/dist/types.d.ts +86 -2
  295. package/dist/types.js +34 -1
  296. package/dist/types.js.map +1 -1
  297. package/docs/AGENT_GUIDE.md +16 -6
  298. package/docs/CLAUDE_CODE_PLUGIN.md +10 -10
  299. package/docs/CODEX_PLUGIN.md +2 -2
  300. package/docs/COMMANDS.md +83 -8
  301. package/docs/CONFIGURATION.md +4 -1
  302. package/docs/EXTENSIONS.md +176 -807
  303. package/docs/QUICKSTART.md +12 -5
  304. package/docs/README.md +7 -6
  305. package/docs/RELEASING.md +6 -4
  306. package/docs/SDK.md +78 -441
  307. package/docs/TESTING.md +2 -2
  308. package/marketplace.json +3 -3
  309. package/package.json +7 -4
  310. package/packages/pm-beads/extensions/beads/index.js +90 -101
  311. package/packages/pm-beads/extensions/beads/index.ts +2 -2
  312. package/packages/pm-beads/extensions/beads/runtime.js +2 -17
  313. package/packages/pm-beads/extensions/beads/runtime.ts +41 -18
  314. package/packages/pm-beads/package.json +34 -1
  315. package/packages/pm-calendar/README.md +13 -0
  316. package/packages/pm-calendar/extensions/calendar/index.js +56 -0
  317. package/packages/pm-calendar/extensions/calendar/index.ts +62 -0
  318. package/packages/pm-calendar/extensions/calendar/manifest.json +7 -0
  319. package/packages/pm-calendar/extensions/calendar/runtime.js +114 -0
  320. package/packages/pm-calendar/extensions/calendar/runtime.ts +123 -0
  321. package/packages/pm-calendar/package.json +51 -0
  322. package/packages/pm-governance-audit/README.md +23 -0
  323. package/packages/pm-governance-audit/extensions/governance-audit/index.js +117 -0
  324. package/packages/pm-governance-audit/extensions/governance-audit/index.ts +118 -0
  325. package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +7 -0
  326. package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +159 -0
  327. package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +176 -0
  328. package/packages/pm-governance-audit/package.json +52 -0
  329. package/packages/pm-guide-shell/README.md +23 -0
  330. package/packages/pm-guide-shell/extensions/guide-shell/index.js +76 -0
  331. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +81 -0
  332. package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +7 -0
  333. package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +263 -0
  334. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +327 -0
  335. package/packages/pm-guide-shell/package.json +52 -0
  336. package/packages/pm-linked-test-adapters/README.md +24 -0
  337. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.js +101 -0
  338. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +102 -0
  339. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +7 -0
  340. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +142 -0
  341. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +173 -0
  342. package/packages/pm-linked-test-adapters/package.json +53 -0
  343. package/packages/pm-search-advanced/README.md +27 -0
  344. package/packages/pm-search-advanced/extensions/search-advanced/index.js +93 -0
  345. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +94 -0
  346. package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +7 -0
  347. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +120 -0
  348. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +144 -0
  349. package/packages/pm-search-advanced/package.json +54 -0
  350. package/packages/pm-templates/README.md +20 -0
  351. package/packages/pm-templates/extensions/templates/index.js +101 -0
  352. package/packages/pm-templates/extensions/templates/index.ts +109 -0
  353. package/packages/pm-templates/extensions/templates/manifest.json +7 -0
  354. package/packages/pm-templates/extensions/templates/runtime.js +226 -0
  355. package/packages/pm-templates/extensions/templates/runtime.ts +283 -0
  356. package/packages/pm-templates/package.json +50 -0
  357. package/packages/pm-todos/extensions/todos/index.js +105 -116
  358. package/packages/pm-todos/extensions/todos/index.ts +3 -2
  359. package/packages/pm-todos/extensions/todos/runtime.js +2 -17
  360. package/packages/pm-todos/extensions/todos/runtime.ts +40 -18
  361. package/packages/pm-todos/package.json +35 -1
  362. package/plugins/{pm-cli-claude → pm-claude}/.claude-plugin/plugin.json +2 -2
  363. package/plugins/{pm-cli-claude → pm-claude}/.mcp.json +1 -1
  364. package/plugins/{pm-cli-claude → pm-claude}/README.md +4 -4
  365. package/plugins/{pm-cli-claude → pm-claude}/agents/pm-coordinator.md +1 -1
  366. package/plugins/{pm-cli-claude → pm-claude}/commands/pm-init.md +10 -1
  367. package/plugins/{pm-cli-claude → pm-claude}/commands/pm-planner.md +18 -0
  368. package/plugins/{pm-cli-claude → pm-claude}/scripts/pm-mcp-server.mjs +4 -2
  369. package/plugins/{pm-cli-claude → pm-claude}/skills/pm-planner/SKILL.md +46 -1
  370. package/plugins/{pm-cli-codex → pm-codex}/.codex-plugin/plugin.json +3 -3
  371. package/plugins/{pm-cli-codex → pm-codex}/.mcp.json +1 -1
  372. package/plugins/{pm-cli-codex → pm-codex}/README.md +7 -4
  373. package/plugins/{pm-cli-codex → pm-codex}/scripts/pm-mcp-server.mjs +4 -2
  374. package/plugins/pm-codex/skills/pm-native/SKILL.md +81 -0
  375. package/scripts/finalize-build.mjs +28 -0
  376. package/scripts/prepare-build-cache.mjs +37 -0
  377. package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +0 -57
  378. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-delivery-chain.md +0 -0
  379. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-triage-agent.md +0 -0
  380. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-verification-agent.md +0 -0
  381. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-audit.md +0 -0
  382. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-calendar.md +0 -0
  383. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-close-task.md +0 -0
  384. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-developer.md +0 -0
  385. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-list.md +0 -0
  386. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-new.md +0 -0
  387. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-release.md +0 -0
  388. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-search.md +0 -0
  389. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-start-task.md +0 -0
  390. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-status.md +0 -0
  391. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-triage.md +0 -0
  392. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-workflow.md +0 -0
  393. /package/plugins/{pm-cli-claude → pm-claude}/hooks/hooks.json +0 -0
  394. /package/plugins/{pm-cli-claude → pm-claude}/hooks/session-start.mjs +0 -0
  395. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-audit/SKILL.md +0 -0
  396. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-developer/SKILL.md +0 -0
  397. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-release/SKILL.md +0 -0
  398. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-workflow/SKILL.md +0 -0
  399. /package/plugins/{pm-cli-codex → pm-codex}/assets/pm-cli-small.svg +0 -0
  400. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-audit.md +0 -0
  401. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-close-task.md +0 -0
  402. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-start-task.md +0 -0
  403. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/SKILL.md +0 -0
  404. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/agents/openai.yaml +0 -0
  405. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-native/agents/openai.yaml +0 -0
  406. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/SKILL.md +0 -0
  407. /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]="499323d3-24fc-5cd7-b97a-b27a0971ba12")}catch(e){}}();
1
3
  import { execFile } from "node:child_process";
2
4
  import fs from "node:fs/promises";
3
5
  import os from "node:os";
@@ -7,7 +9,8 @@ import { promisify } from "node:util";
7
9
  import { activateExtensions, loadExtensions, nextExtensionReloadToken } from "../../core/extensions/index.js";
8
10
  import { EXTENSION_CAPABILITY_CONTRACT, KNOWN_EXTENSION_CAPABILITIES, parseLegacyExtensionCapabilityAliasWarning, parseUnknownExtensionCapabilityWarning, resolveExtensionRoots, } from "../../core/extensions/loader.js";
9
11
  import { pathExists } from "../../core/fs/fs-utils.js";
10
- import { collectPackageExtensionDirectories } from "../../core/packages/manifest.js";
12
+ import { PM_PACKAGE_RESOURCE_KINDS, collectPackageExtensionDirectories, readPmPackageManifest, } from "../../core/packages/manifest.js";
13
+ import { resolvePmPackageRootFromModule } from "../../core/packages/root.js";
11
14
  import { EXIT_CODE } from "../../core/shared/constants.js";
12
15
  import { PmCliError } from "../../core/shared/errors.js";
13
16
  import { nowIso } from "../../core/shared/time.js";
@@ -18,7 +21,7 @@ const DEFAULT_EXTENSION_PRIORITY = 100;
18
21
  const MANAGED_EXTENSION_STATE_FILENAME = ".managed-extensions.json";
19
22
  const MANAGED_EXTENSION_STATE_VERSION = 1;
20
23
  const PM_PACKAGE_ROOT_ENV = "PM_CLI_PACKAGE_ROOT";
21
- const BUNDLED_PACKAGE_ALIASES = {
24
+ const LEGACY_BUNDLED_PACKAGE_ALIASES = {
22
25
  beads: {
23
26
  package_directory: "pm-beads",
24
27
  legacy_extension_directory: "beads",
@@ -35,21 +38,20 @@ function resolvePackageRootCandidates() {
35
38
  if (typeof envRoot === "string" && envRoot.trim().length > 0) {
36
39
  candidates.push(path.resolve(envRoot.trim()));
37
40
  }
38
- const moduleRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../..");
39
- candidates.push(moduleRoot);
41
+ candidates.push(resolvePmPackageRootFromModule(import.meta.url, ["../../.."]));
40
42
  return [...new Set(candidates)];
41
43
  }
42
44
  async function resolveBundledExtensionAliasSource(input) {
43
45
  const normalized = input.trim().toLowerCase();
44
- const alias = BUNDLED_PACKAGE_ALIASES[normalized];
46
+ const packageRoot = await resolveBundledPackageRoot(normalized);
47
+ if (packageRoot) {
48
+ return packageRoot;
49
+ }
50
+ const alias = LEGACY_BUNDLED_PACKAGE_ALIASES[normalized];
45
51
  if (!alias) {
46
52
  return null;
47
53
  }
48
54
  for (const packageRoot of resolvePackageRootCandidates()) {
49
- const packagePath = path.join(packageRoot, "packages", alias.package_directory);
50
- if (await pathExists(path.join(packagePath, "package.json"))) {
51
- return packagePath;
52
- }
53
55
  const legacyExtensionPath = path.join(packageRoot, ".agents", "pm", "extensions", alias.legacy_extension_directory);
54
56
  if (await pathExists(path.join(legacyExtensionPath, "manifest.json"))) {
55
57
  return legacyExtensionPath;
@@ -60,8 +62,67 @@ async function resolveBundledExtensionAliasSource(input) {
60
62
  function isBundledPackageInstallAllTarget(input) {
61
63
  return BUNDLED_PACKAGE_INSTALL_ALL_TARGETS.has(input.trim().toLowerCase());
62
64
  }
63
- function listBundledPackageAliases() {
64
- return Object.keys(BUNDLED_PACKAGE_ALIASES).sort((left, right) => left.localeCompare(right));
65
+ function derivePackageAlias(packageDirectory) {
66
+ return packageDirectory.replace(/^pm-/i, "").trim().toLowerCase();
67
+ }
68
+ async function collectBundledPackageEntries() {
69
+ const entriesByAlias = new Map();
70
+ for (const packageRoot of resolvePackageRootCandidates()) {
71
+ const packagesRoot = path.join(packageRoot, "packages");
72
+ if (!(await pathExists(packagesRoot))) {
73
+ continue;
74
+ }
75
+ const entries = await fs.readdir(packagesRoot, { withFileTypes: true });
76
+ for (const entry of entries) {
77
+ if (!entry.isDirectory() || !entry.name.startsWith("pm-")) {
78
+ continue;
79
+ }
80
+ const candidateRoot = path.join(packagesRoot, entry.name);
81
+ if (!(await pathExists(path.join(candidateRoot, "package.json")))) {
82
+ continue;
83
+ }
84
+ const manifest = await readPmPackageManifest(candidateRoot);
85
+ const aliases = manifest.aliases && manifest.aliases.length > 0
86
+ ? manifest.aliases
87
+ : [derivePackageAlias(entry.name)];
88
+ for (const alias of aliases) {
89
+ const normalizedAlias = alias.trim().toLowerCase();
90
+ if (normalizedAlias.length === 0 || entriesByAlias.has(normalizedAlias)) {
91
+ continue;
92
+ }
93
+ entriesByAlias.set(normalizedAlias, {
94
+ alias: normalizedAlias,
95
+ package_directory: entry.name,
96
+ package_root: candidateRoot,
97
+ });
98
+ }
99
+ }
100
+ }
101
+ for (const [alias, legacy] of Object.entries(LEGACY_BUNDLED_PACKAGE_ALIASES)) {
102
+ if (entriesByAlias.has(alias)) {
103
+ continue;
104
+ }
105
+ for (const packageRoot of resolvePackageRootCandidates()) {
106
+ const packagePath = path.join(packageRoot, "packages", legacy.package_directory);
107
+ if (await pathExists(path.join(packagePath, "package.json"))) {
108
+ entriesByAlias.set(alias, {
109
+ alias,
110
+ package_directory: legacy.package_directory,
111
+ package_root: packagePath,
112
+ });
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ return [...entriesByAlias.values()].sort((left, right) => left.alias.localeCompare(right.alias));
118
+ }
119
+ async function listBundledPackageAliases() {
120
+ return (await collectBundledPackageEntries()).map((entry) => entry.alias);
121
+ }
122
+ async function resolveBundledPackageRoot(alias) {
123
+ const normalized = alias.trim().toLowerCase();
124
+ const entry = (await collectBundledPackageEntries()).find((candidate) => candidate.alias === normalized);
125
+ return entry?.package_root ?? null;
65
126
  }
66
127
  function normalizeStringList(values) {
67
128
  return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
@@ -291,7 +352,7 @@ function normalizeManagedState(raw) {
291
352
  continue;
292
353
  }
293
354
  const source = entry.source;
294
- if ((source.kind !== "local" && source.kind !== "github" && source.kind !== "npm") ||
355
+ if ((source.kind !== "local" && source.kind !== "github" && source.kind !== "npm" && source.kind !== "builtin") ||
295
356
  typeof source.input !== "string" ||
296
357
  typeof source.location !== "string") {
297
358
  continue;
@@ -309,6 +370,7 @@ function normalizeManagedState(raw) {
309
370
  kind: source.kind,
310
371
  input: source.input,
311
372
  location: source.location,
373
+ name: typeof source.name === "string" ? source.name : undefined,
312
374
  package: typeof source.package === "string" ? source.package : undefined,
313
375
  version: typeof source.version === "string" ? source.version : undefined,
314
376
  repository: typeof source.repository === "string" ? source.repository : undefined,
@@ -477,6 +539,7 @@ function resolveAction(target, options) {
477
539
  options.manage ? "manage" : null,
478
540
  options.reload ? "reload" : null,
479
541
  options.doctor ? "doctor" : null,
542
+ options.catalog ? "catalog" : null,
480
543
  options.init ? "init" : null,
481
544
  options.scaffold ? "init" : null,
482
545
  options.adopt ? "adopt" : null,
@@ -491,10 +554,25 @@ function resolveAction(target, options) {
491
554
  if (typeof target === "string" && target.trim().toLowerCase() === "reload") {
492
555
  return "reload";
493
556
  }
557
+ if (typeof target === "string" && target.trim().toLowerCase() === "catalog") {
558
+ return "catalog";
559
+ }
494
560
  if (typeof target === "string" && (target.trim().toLowerCase() === "init" || target.trim().toLowerCase() === "scaffold")) {
495
561
  return "init";
496
562
  }
497
- throw new PmCliError("One action flag is required. Use one of: --install, --uninstall, --explore, --manage, --reload, --doctor, --init/--scaffold, --adopt, --adopt-all, --activate, --deactivate.", EXIT_CODE.USAGE);
563
+ if (typeof target === "string" && target.trim().toLowerCase() === "explore") {
564
+ return "explore";
565
+ }
566
+ if (typeof target === "string" && target.trim().toLowerCase() === "manage") {
567
+ return "manage";
568
+ }
569
+ if (typeof target === "string" && (target.trim().toLowerCase() === "list" || target.trim() === "")) {
570
+ return "explore";
571
+ }
572
+ if (target === undefined) {
573
+ return "explore";
574
+ }
575
+ throw new PmCliError("One action flag is required. Use one of: --install, --uninstall, --explore, --manage, --reload, --doctor, --catalog, --init/--scaffold, --adopt, --adopt-all, --activate, --deactivate. Bare `pm package` and `pm extension` default to --explore.", EXIT_CODE.USAGE);
498
576
  }
499
577
  if (selected.length > 1) {
500
578
  throw new PmCliError("Extension action flags are mutually exclusive.", EXIT_CODE.USAGE);
@@ -509,6 +587,85 @@ function resolveScope(options) {
509
587
  }
510
588
  return global ? "global" : "project";
511
589
  }
590
+ async function buildBundledPackageCatalog(scope, global) {
591
+ const roots = resolveExtensionRoots(resolvePmRoot(process.cwd(), global.path), process.cwd());
592
+ const selectedRoot = scope === "global" ? roots.global : roots.project;
593
+ const managedStateRead = await readManagedExtensionState(selectedRoot);
594
+ const installedLocations = new Set(managedStateRead.state.entries
595
+ .filter((entry) => entry.scope === scope)
596
+ .filter((entry) => entry.source.kind !== "builtin")
597
+ .map((entry) => path.resolve(entry.source.location)));
598
+ const installedBuiltinAliases = new Set(managedStateRead.state.entries
599
+ .filter((entry) => entry.scope === scope && entry.source.kind === "builtin")
600
+ .flatMap((entry) => [entry.source.name, entry.source.input, entry.source.location])
601
+ .filter((value) => typeof value === "string" && value.trim().length > 0)
602
+ .map((value) => value.trim().toLowerCase()));
603
+ const packages = [];
604
+ for (const alias of await listBundledPackageAliases()) {
605
+ const packageRoot = await resolveBundledPackageRoot(alias);
606
+ const installScopeFlag = scope === "global" ? "--global" : "--project";
607
+ if (!packageRoot) {
608
+ packages.push({
609
+ alias,
610
+ bundled: true,
611
+ available: false,
612
+ installed: false,
613
+ install_target: alias,
614
+ install_command: `pm install ${alias} ${installScopeFlag}`,
615
+ });
616
+ continue;
617
+ }
618
+ const manifest = await readPmPackageManifest(packageRoot);
619
+ const repository = manifest.catalog?.links?.repository ?? manifest.package_repository_url;
620
+ const report = manifest.catalog?.links?.report ?? manifest.package_bugs_url;
621
+ const docs = manifest.catalog?.links?.docs ?? manifest.package_homepage;
622
+ const npm = manifest.catalog?.links?.npm ??
623
+ (manifest.package_name && manifest.package_private !== true
624
+ ? `https://www.npmjs.com/package/${encodeURIComponent(manifest.package_name)}`
625
+ : undefined);
626
+ const metadataOnlyResources = Object.fromEntries(PM_PACKAGE_RESOURCE_KINDS
627
+ .filter((resourceKind) => resourceKind !== "extensions")
628
+ .map((resourceKind) => [resourceKind, manifest.resources[resourceKind] ?? []])
629
+ .filter(([, entries]) => Array.isArray(entries) && entries.length > 0));
630
+ packages.push({
631
+ alias,
632
+ bundled: true,
633
+ available: true,
634
+ installed: installedBuiltinAliases.has(alias) || installedLocations.has(path.resolve(packageRoot)),
635
+ install_target: alias,
636
+ install_command: `pm install ${alias} ${installScopeFlag}`,
637
+ package_root: packageRoot,
638
+ package_name: manifest.package_name,
639
+ package_version: manifest.package_version,
640
+ description: manifest.catalog?.summary ?? manifest.package_description,
641
+ keywords: manifest.package_keywords ?? [],
642
+ resources: manifest.resources,
643
+ installable_resources: {
644
+ extensions: manifest.resources.extensions ?? [],
645
+ },
646
+ metadata_only_resources: metadataOnlyResources,
647
+ catalog: {
648
+ display_name: manifest.catalog?.display_name,
649
+ category: manifest.catalog?.category,
650
+ tags: manifest.catalog?.tags ?? manifest.package_keywords ?? [],
651
+ links: {
652
+ docs,
653
+ npm,
654
+ repository,
655
+ report,
656
+ },
657
+ media: manifest.catalog?.media,
658
+ },
659
+ });
660
+ }
661
+ return {
662
+ total: packages.length,
663
+ scope,
664
+ installable_resource_kinds: ["extensions"],
665
+ metadata_only_resource_kinds: PM_PACKAGE_RESOURCE_KINDS.filter((resourceKind) => resourceKind !== "extensions"),
666
+ packages,
667
+ };
668
+ }
512
669
  function parseGithubPathSpec(pathSpec, input, refOverride) {
513
670
  const segments = pathSpec
514
671
  .split("/")
@@ -735,7 +892,7 @@ async function resolvePackageExtensionDirectory(packageRoot, sourceLabel) {
735
892
  .sort((left, right) => left.localeCompare(right));
736
893
  throw new PmCliError(`Package source "${sourceLabel}" contains multiple extension manifests. Provide an explicit extension path. Candidates: ${choices.join(", ")}`, EXIT_CODE.USAGE);
737
894
  }
738
- throw new PmCliError(`Unable to locate a pm extension manifest in package source "${sourceLabel}". Add package.json pm.extensions or an extensions/ directory.`, EXIT_CODE.USAGE);
895
+ throw new PmCliError(`Unable to locate a pm extension manifest in package source "${sourceLabel}". Package installs currently activate only extension resources, so add package.json pm.extensions or an extensions/ directory. Metadata-only resources like pm.docs/pm.examples are catalog metadata and do not activate commands.`, EXIT_CODE.USAGE);
739
896
  }
740
897
  async function resolveGithubSourceDirectory(cloneDirectory, source) {
741
898
  const candidatePaths = [];
@@ -762,11 +919,14 @@ async function resolveGithubSourceDirectory(cloneDirectory, source) {
762
919
  }
763
920
  async function resolveInstallSource(source) {
764
921
  if (source.kind === "local") {
765
- if (!(await pathExists(source.absolute_path))) {
922
+ let localStats;
923
+ try {
924
+ localStats = await fs.stat(source.absolute_path);
925
+ }
926
+ catch {
766
927
  throw new PmCliError(`Local extension source does not exist: "${source.absolute_path}".`, EXIT_CODE.NOT_FOUND);
767
928
  }
768
- const stats = await fs.stat(source.absolute_path);
769
- if (!stats.isDirectory()) {
929
+ if (!localStats.isDirectory()) {
770
930
  throw new PmCliError(`Local extension source must be a directory: "${source.absolute_path}".`, EXIT_CODE.USAGE);
771
931
  }
772
932
  const directory = await resolvePackageExtensionDirectory(source.absolute_path, source.input);
@@ -966,20 +1126,66 @@ function applyDoctorRuntimeActivationState(extensions, loadResult, activationRes
966
1126
  const loadedNames = new Set(loadResult.loaded.map((entry) => normalizeExtensionNameForMatch(entry.name)));
967
1127
  const loadFailedNames = new Set(loadResult.failed.map((entry) => normalizeExtensionNameForMatch(entry.name)));
968
1128
  const activationFailedNames = new Set(activationResult.failed.map((entry) => normalizeExtensionNameForMatch(entry.name)));
1129
+ const commandPathsByExtension = new Map();
1130
+ const actionPathsByExtension = new Map();
1131
+ const addCommandPath = (extensionName, commandPath) => {
1132
+ const normalizedName = normalizeExtensionNameForMatch(extensionName);
1133
+ const normalizedCommandPath = commandPath.trim();
1134
+ if (normalizedName.length === 0 || normalizedCommandPath.length === 0) {
1135
+ return;
1136
+ }
1137
+ const existing = commandPathsByExtension.get(normalizedName) ?? new Set();
1138
+ existing.add(normalizedCommandPath);
1139
+ commandPathsByExtension.set(normalizedName, existing);
1140
+ };
1141
+ const addActionPath = (extensionName, actionPath) => {
1142
+ const normalizedName = normalizeExtensionNameForMatch(extensionName);
1143
+ const normalizedActionPath = actionPath.trim();
1144
+ if (normalizedName.length === 0 || normalizedActionPath.length === 0) {
1145
+ return;
1146
+ }
1147
+ const existing = actionPathsByExtension.get(normalizedName) ?? new Set();
1148
+ existing.add(normalizedActionPath);
1149
+ actionPathsByExtension.set(normalizedName, existing);
1150
+ };
1151
+ for (const registration of activationResult.registrations.commands) {
1152
+ addCommandPath(registration.name, registration.command);
1153
+ addActionPath(registration.name, registration.action);
1154
+ }
1155
+ for (const handler of activationResult.commands.handlers) {
1156
+ addCommandPath(handler.name, handler.command);
1157
+ }
1158
+ for (const override of activationResult.commands.overrides) {
1159
+ addCommandPath(override.name, override.command);
1160
+ }
1161
+ const sortedPaths = (values) => {
1162
+ if (!values || values.size === 0) {
1163
+ return undefined;
1164
+ }
1165
+ return [...values].sort((left, right) => left.localeCompare(right));
1166
+ };
969
1167
  return extensions.map((entry) => {
1168
+ const normalizedName = normalizeExtensionNameForMatch(entry.name);
1169
+ const commandPaths = sortedPaths(commandPathsByExtension.get(normalizedName));
1170
+ const actionPaths = sortedPaths(actionPathsByExtension.get(normalizedName));
1171
+ const runtimeMetadata = {
1172
+ ...(commandPaths ? { command_paths: commandPaths } : {}),
1173
+ ...(actionPaths ? { action_paths: actionPaths } : {}),
1174
+ };
970
1175
  if (!entry.enabled) {
971
1176
  return {
972
1177
  ...entry,
973
1178
  runtime_active: false,
974
1179
  activation_status: "not_loaded",
1180
+ ...runtimeMetadata,
975
1181
  };
976
1182
  }
977
- const normalizedName = normalizeExtensionNameForMatch(entry.name);
978
1183
  if (loadFailedNames.has(normalizedName) || activationFailedNames.has(normalizedName)) {
979
1184
  return {
980
1185
  ...entry,
981
1186
  runtime_active: false,
982
1187
  activation_status: "failed",
1188
+ ...runtimeMetadata,
983
1189
  };
984
1190
  }
985
1191
  if (loadedNames.has(normalizedName)) {
@@ -987,12 +1193,14 @@ function applyDoctorRuntimeActivationState(extensions, loadResult, activationRes
987
1193
  ...entry,
988
1194
  runtime_active: true,
989
1195
  activation_status: "ok",
1196
+ ...runtimeMetadata,
990
1197
  };
991
1198
  }
992
1199
  return {
993
1200
  ...entry,
994
1201
  runtime_active: false,
995
1202
  activation_status: "not_loaded",
1203
+ ...runtimeMetadata,
996
1204
  };
997
1205
  });
998
1206
  }
@@ -1127,13 +1335,17 @@ function requireTarget(target, action) {
1127
1335
  const normalized = target?.trim();
1128
1336
  if (!normalized) {
1129
1337
  if (action === "init") {
1130
- throw new PmCliError('Action "init" requires a scaffold target path (for example: pm extension --init ./my-extension or pm extension init ./my-extension).', EXIT_CODE.USAGE);
1338
+ throw new PmCliError('Action "init" requires a scaffold target path (for example: pm package init ./my-package or pm extension init ./my-extension).', EXIT_CODE.USAGE);
1131
1339
  }
1132
1340
  throw new PmCliError(`Action "${action}" requires an extension name or source target argument.`, EXIT_CODE.USAGE);
1133
1341
  }
1134
1342
  return normalized;
1135
1343
  }
1136
- function buildStarterExtensionScaffoldFiles(extensionName, commandName) {
1344
+ function lifecycleFlagCommand(options, action) {
1345
+ return options.vocabulary === "package" ? `pm package ${action}` : `pm extension --${action}`;
1346
+ }
1347
+ function buildStarterExtensionScaffoldFiles(extensionName, commandName, vocabulary) {
1348
+ const packageName = `pm-${extensionName}`;
1137
1349
  const manifest = `${JSON.stringify({
1138
1350
  name: extensionName,
1139
1351
  version: "0.1.0",
@@ -1159,10 +1371,63 @@ function buildStarterExtensionScaffoldFiles(extensionName, commandName) {
1159
1371
  "};",
1160
1372
  "",
1161
1373
  ].join("\n");
1374
+ if (vocabulary === "package") {
1375
+ const packageJson = `${JSON.stringify({
1376
+ name: packageName,
1377
+ version: "0.1.0",
1378
+ private: true,
1379
+ type: "module",
1380
+ keywords: ["pm-package"],
1381
+ peerDependencies: {
1382
+ "@unbrained/pm-cli": "*",
1383
+ },
1384
+ pm: {
1385
+ aliases: [extensionName],
1386
+ extensions: [`extensions/${extensionName}`],
1387
+ docs: ["README.md"],
1388
+ examples: ["README.md"],
1389
+ catalog: {
1390
+ display_name: extensionName,
1391
+ category: "workflow",
1392
+ summary: "Starter pm package scaffold.",
1393
+ tags: ["starter"],
1394
+ },
1395
+ },
1396
+ }, null, 2)}\n`;
1397
+ const packageReadme = [
1398
+ `# ${packageName}`,
1399
+ "",
1400
+ "Generated by `pm package init`.",
1401
+ "",
1402
+ "## Included Files",
1403
+ "- `package.json`: package metadata and `pm` resource manifest.",
1404
+ `- \`extensions/${extensionName}/manifest.json\`: extension metadata and capabilities.`,
1405
+ `- \`extensions/${extensionName}/index.js\`: starter command registration using the \`commands\` capability.`,
1406
+ "",
1407
+ "## Quick Start",
1408
+ "```bash",
1409
+ "pm install --project <package-path>",
1410
+ `pm ${commandName}`,
1411
+ "pm package doctor --project --detail summary",
1412
+ "```",
1413
+ "",
1414
+ "## Notes",
1415
+ "- Keep package metadata in `package.json` and runtime behavior under `extensions/`.",
1416
+ "- Add capabilities to the extension manifest only when the entrypoint uses the matching SDK API.",
1417
+ "- Use `@unbrained/pm-cli/sdk` as the public SDK import for richer package runtimes.",
1418
+ "",
1419
+ ].join("\n");
1420
+ return {
1421
+ "package.json": packageJson,
1422
+ [`extensions/${extensionName}/manifest.json`]: manifest,
1423
+ [`extensions/${extensionName}/index.js`]: entrypoint,
1424
+ "README.md": packageReadme,
1425
+ };
1426
+ }
1162
1427
  const readme = [
1163
1428
  `# ${extensionName}`,
1164
1429
  "",
1165
- "Generated by `pm extension --init`.",
1430
+ "Generated by `pm extension init`.",
1166
1431
  "",
1167
1432
  "## Included Files",
1168
1433
  "- `manifest.json`: extension metadata and capabilities.",
@@ -1186,12 +1451,12 @@ function buildStarterExtensionScaffoldFiles(extensionName, commandName) {
1186
1451
  "README.md": readme,
1187
1452
  };
1188
1453
  }
1189
- async function scaffoldExtensionProject(target) {
1454
+ async function scaffoldExtensionProject(target, vocabulary = "extension") {
1190
1455
  const normalizedTarget = target.trim();
1191
1456
  const targetPath = path.resolve(process.cwd(), normalizedTarget);
1192
1457
  const extensionName = normalizeManagedDirectoryName(path.basename(targetPath));
1193
1458
  const commandName = `${extensionName} ping`;
1194
- const scaffoldFiles = buildStarterExtensionScaffoldFiles(extensionName, commandName);
1459
+ const scaffoldFiles = buildStarterExtensionScaffoldFiles(extensionName, commandName, vocabulary);
1195
1460
  let createdDirectory = false;
1196
1461
  if (await pathExists(targetPath)) {
1197
1462
  const existingTargetStats = await fs.stat(targetPath);
@@ -1206,6 +1471,7 @@ async function scaffoldExtensionProject(target) {
1206
1471
  const files = [];
1207
1472
  for (const [relativePath, content] of Object.entries(scaffoldFiles)) {
1208
1473
  const absolutePath = path.join(targetPath, relativePath);
1474
+ await fs.mkdir(path.dirname(absolutePath), { recursive: true });
1209
1475
  if (await pathExists(absolutePath)) {
1210
1476
  const existingContent = await fs.readFile(absolutePath, "utf8");
1211
1477
  if (existingContent !== content) {
@@ -1248,7 +1514,7 @@ function classifyDoctorLoadFailureWarnings(loadFailures) {
1248
1514
  }
1249
1515
  return [...new Set(warnings)].sort((left, right) => left.localeCompare(right));
1250
1516
  }
1251
- function buildExtensionTriageSummary(scope, warnings, extensions) {
1517
+ function buildExtensionTriageSummary(scope, warnings, extensions, options = {}) {
1252
1518
  const normalizedWarnings = [...new Set(warnings)].sort((left, right) => left.localeCompare(right));
1253
1519
  const managedTotal = extensions.filter((entry) => entry.managed).length;
1254
1520
  const enabledTotal = extensions.filter((entry) => entry.enabled).length;
@@ -1288,7 +1554,7 @@ function buildExtensionTriageSummary(scope, warnings, extensions) {
1288
1554
  const remediation = [];
1289
1555
  if (normalizedWarnings.length > 0) {
1290
1556
  if (normalizedWarnings.some((warning) => warning.startsWith("extension_manifest_"))) {
1291
- remediation.push(`Run pm extension --explore ${scopeFlag} to inspect discovered manifests and directories.`);
1557
+ remediation.push(`Run ${lifecycleFlagCommand(options, "explore")} ${scopeFlag} to inspect discovered manifests and directories.`);
1292
1558
  }
1293
1559
  if (normalizedWarnings.some((warning) => warning.startsWith("extension_capability_unknown:"))) {
1294
1560
  remediation.push(`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. ` +
@@ -1304,14 +1570,14 @@ function buildExtensionTriageSummary(scope, warnings, extensions) {
1304
1570
  }
1305
1571
  if (normalizedWarnings.some((warning) => warning.startsWith("extension_load_failed_sdk_dependency_missing:"))) {
1306
1572
  remediation.push(`Detected extension load failures caused by missing SDK dependency resolution. ` +
1307
- `Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running pm extension --doctor ${scopeFlag}.`);
1573
+ `Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running ${lifecycleFlagCommand(options, "doctor")} ${scopeFlag}.`);
1308
1574
  }
1309
1575
  if (normalizedWarnings.some((warning) => warning.startsWith("extension_load_failed_module_mode_mismatch:"))) {
1310
1576
  remediation.push(`Detected extension module-mode mismatches. For ESM-based extension entries/imports, set package.json "type": "module" ` +
1311
- `or use an explicit .mjs entry and rerun pm extension --doctor ${scopeFlag}.`);
1577
+ `or use an explicit .mjs entry and rerun ${lifecycleFlagCommand(options, "doctor")} ${scopeFlag}.`);
1312
1578
  }
1313
1579
  if (updateCheckFailedTotal > 0) {
1314
- remediation.push(`Run pm extension --manage ${scopeFlag} after validating network and repository access.`);
1580
+ remediation.push(`Run ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} after validating network and repository access.`);
1315
1581
  }
1316
1582
  if (normalizedWarnings.some((warning) => warning.startsWith("extension_manager_state_"))) {
1317
1583
  remediation.push(`Review and repair ${scope} managed extension state file if schema/read warnings persist.`);
@@ -1321,19 +1587,19 @@ function buildExtensionTriageSummary(scope, warnings, extensions) {
1321
1587
  }
1322
1588
  }
1323
1589
  if (updateHealthPartial) {
1324
- remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via pm extension --manage ${scopeFlag} --fix-managed-state (or pm extension --adopt-all ${scopeFlag}, pm extension --adopt <name> ${scopeFlag}, or reinstall via pm extension --install ${scopeFlag} <source>).`);
1590
+ remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} --fix-managed-state (or ${lifecycleFlagCommand(options, "adopt-all")} ${scopeFlag}, ${lifecycleFlagCommand(options, "adopt")} <name> ${scopeFlag}, or reinstall via ${lifecycleFlagCommand(options, "install")} ${scopeFlag} <source>).`);
1325
1591
  }
1326
1592
  else if (skippedUnmanagedTotal > 0) {
1327
- remediation.push(`Loaded unmanaged extensions are currently treated as informational. Use pm extension --manage ${scopeFlag} --fix-managed-state to adopt them for update checks.`);
1593
+ remediation.push(`Loaded unmanaged extensions are currently treated as informational. Use ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} --fix-managed-state to adopt them for update checks.`);
1328
1594
  }
1329
1595
  if (skippedNonGithubTotal > 0) {
1330
1596
  remediation.push(`Non-GitHub managed extensions are skipped by update checks. Use doctor output for non-update diagnostics.`);
1331
1597
  }
1332
1598
  if (updateAvailableTotal > 0) {
1333
- remediation.push(`Update available managed extensions via pm extension --install ${scopeFlag} <source>.`);
1599
+ remediation.push(`Update available managed extensions via ${lifecycleFlagCommand(options, "install")} ${scopeFlag} <source>.`);
1334
1600
  }
1335
1601
  if (remediation.length === 0) {
1336
- remediation.push(`No immediate action required. Re-run pm extension --manage ${scopeFlag} after extension changes.`);
1602
+ remediation.push(`No immediate action required. Re-run ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} after extension changes.`);
1337
1603
  }
1338
1604
  return {
1339
1605
  status: effectiveWarnings.length === 0 ? "ok" : "warn",
@@ -1485,6 +1751,9 @@ export async function runExtension(target, options, global) {
1485
1751
  if (action === "reload" && normalizedInput === "reload") {
1486
1752
  return undefined;
1487
1753
  }
1754
+ if (action === "catalog" && normalizedInput === "catalog") {
1755
+ return undefined;
1756
+ }
1488
1757
  const inferredInitAlias = action === "init" &&
1489
1758
  options.init !== true &&
1490
1759
  options.scaffold !== true &&
@@ -1516,7 +1785,7 @@ export async function runExtension(target, options, global) {
1516
1785
  throw new PmCliError('Action "init" does not accept --gh/--github/--ref options.', EXIT_CODE.USAGE);
1517
1786
  }
1518
1787
  const scaffoldTarget = requireTarget(normalizedTarget, action);
1519
- const scaffold = await scaffoldExtensionProject(scaffoldTarget);
1788
+ const scaffold = await scaffoldExtensionProject(scaffoldTarget, options.vocabulary ?? "extension");
1520
1789
  const quotedTargetPath = JSON.stringify(scaffold.target_path);
1521
1790
  return withResult({
1522
1791
  scaffolded: scaffold.created_directory || scaffold.files.some((entry) => entry.status === "created"),
@@ -1528,9 +1797,9 @@ export async function runExtension(target, options, global) {
1528
1797
  created_directory: scaffold.created_directory,
1529
1798
  files: scaffold.files,
1530
1799
  next_steps: [
1531
- `Install the scaffold: pm extension --install --project ${quotedTargetPath}`,
1800
+ `Install the scaffold: ${options.vocabulary === "package" ? "pm install --project" : "pm extension --install --project"} ${quotedTargetPath}`,
1532
1801
  `Smoke-test command path: pm ${scaffold.command_name}`,
1533
- "Run extension diagnostics: pm extension --doctor --project --detail summary",
1802
+ `Run diagnostics: ${options.vocabulary === "package" ? "pm package doctor" : "pm extension --doctor"} --project --detail summary`,
1534
1803
  ],
1535
1804
  });
1536
1805
  }
@@ -1582,6 +1851,12 @@ export async function runExtension(target, options, global) {
1582
1851
  }
1583
1852
  return withResult(details);
1584
1853
  }
1854
+ if (action === "catalog") {
1855
+ if (typeof normalizedTarget === "string" && normalizedTarget.length > 0 && normalizedTarget !== "catalog") {
1856
+ throw new PmCliError('Action "catalog" does not accept a package target.', EXIT_CODE.USAGE);
1857
+ }
1858
+ return withResult(await buildBundledPackageCatalog(scope, global));
1859
+ }
1585
1860
  if (action === "install") {
1586
1861
  const githubOption = resolveGithubOption(options);
1587
1862
  const explicitSourceInput = githubOption ?? requireTarget(normalizedTarget, action);
@@ -1589,7 +1864,7 @@ export async function runExtension(target, options, global) {
1589
1864
  if (typeof options.ref === "string" && options.ref.trim().length > 0) {
1590
1865
  throw new PmCliError('Action "install all" does not accept --ref.', EXIT_CODE.USAGE);
1591
1866
  }
1592
- const aliases = listBundledPackageAliases();
1867
+ const aliases = await listBundledPackageAliases();
1593
1868
  const packages = [];
1594
1869
  for (const alias of aliases) {
1595
1870
  packages.push({
@@ -1616,6 +1891,7 @@ export async function runExtension(target, options, global) {
1616
1891
  });
1617
1892
  }
1618
1893
  const bundledAliasSource = typeof githubOption === "string" ? null : await resolveBundledExtensionAliasSource(explicitSourceInput);
1894
+ const bundledAliasName = bundledAliasSource === null ? null : explicitSourceInput.trim().toLowerCase();
1619
1895
  const sourceInput = bundledAliasSource ?? explicitSourceInput;
1620
1896
  const installSource = parseExtensionInstallSource(sourceInput, {
1621
1897
  forceGithub: typeof githubOption === "string",
@@ -1638,31 +1914,38 @@ export async function runExtension(target, options, global) {
1638
1914
  }
1639
1915
  await fs.cp(validated.directory, destinationDirectory, { recursive: true, force: true });
1640
1916
  }
1641
- const sourceRecord = installSource.kind === "local"
1917
+ const sourceRecord = bundledAliasName
1642
1918
  ? {
1643
- kind: "local",
1644
- input: installSource.input,
1645
- location: installSource.absolute_path,
1919
+ kind: "builtin",
1920
+ input: bundledAliasName,
1921
+ location: bundledAliasName,
1922
+ name: bundledAliasName,
1646
1923
  }
1647
- : installSource.kind === "npm"
1924
+ : installSource.kind === "local"
1648
1925
  ? {
1649
- kind: "npm",
1926
+ kind: "local",
1650
1927
  input: installSource.input,
1651
- location: resolvedSource.resolved_subpath ?? ".",
1652
- package: resolvedSource.npm_package,
1653
- version: resolvedSource.npm_version,
1928
+ location: installSource.absolute_path,
1654
1929
  }
1655
- : {
1656
- kind: "github",
1657
- input: installSource.input,
1658
- location: resolvedSource.resolved_subpath ?? installSource.subpath ?? ".",
1659
- repository: installSource.repository,
1660
- owner: installSource.owner,
1661
- repo: installSource.repo,
1662
- ref: installSource.ref,
1663
- subpath: resolvedSource.resolved_subpath ?? installSource.subpath,
1664
- commit: resolvedSource.commit,
1665
- };
1930
+ : installSource.kind === "npm"
1931
+ ? {
1932
+ kind: "npm",
1933
+ input: installSource.input,
1934
+ location: resolvedSource.resolved_subpath ?? ".",
1935
+ package: resolvedSource.npm_package,
1936
+ version: resolvedSource.npm_version,
1937
+ }
1938
+ : {
1939
+ kind: "github",
1940
+ input: installSource.input,
1941
+ location: resolvedSource.resolved_subpath ?? installSource.subpath ?? ".",
1942
+ repository: installSource.repository,
1943
+ owner: installSource.owner,
1944
+ repo: installSource.repo,
1945
+ ref: installSource.ref,
1946
+ subpath: resolvedSource.resolved_subpath ?? installSource.subpath,
1947
+ commit: resolvedSource.commit,
1948
+ };
1666
1949
  const now = nowIso();
1667
1950
  const existingManagedEntry = managedStateRead.state.entries.find((entry) => normalizeExtensionNameForMatch(entry.name) === normalizeExtensionNameForMatch(validated.manifest.name));
1668
1951
  const managedState = upsertManagedEntry(managedStateRead.state, {
@@ -1719,7 +2002,7 @@ export async function runExtension(target, options, global) {
1719
2002
  const adoption = await adoptUnmanagedExtensions(resolvedRoots.selected_root, scope, installed.extensions, managedStateRead.state);
1720
2003
  const refreshedInstalled = await listInstalledExtensions(resolvedRoots.selected_root, scope, settings, adoption.state);
1721
2004
  warnings.push(...refreshedInstalled.warnings);
1722
- const triage = buildExtensionTriageSummary(scope, warnings, refreshedInstalled.extensions);
2005
+ const triage = buildExtensionTriageSummary(scope, warnings, refreshedInstalled.extensions, options);
1723
2006
  warnings.push(...triage.warnings);
1724
2007
  const adoptedDetails = adoption.adopted_entries.map((entry) => {
1725
2008
  const refreshedEntry = refreshedInstalled.extensions.find((candidate) => normalizeExtensionNameForMatch(candidate.name) === normalizeExtensionNameForMatch(entry.name) &&
@@ -1926,7 +2209,7 @@ export async function runExtension(target, options, global) {
1926
2209
  .filter((entry) => entry.update_check_status === "failed")
1927
2210
  .map((entry) => `extension_update_check_failed:${entry.name}`);
1928
2211
  warnings.push(...updateCheckWarnings);
1929
- const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions);
2212
+ const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions, options);
1930
2213
  warnings.push(...triage.warnings);
1931
2214
  const normalizedWarnings = [...triage.warnings];
1932
2215
  const policySummary = {
@@ -1956,10 +2239,18 @@ export async function runExtension(target, options, global) {
1956
2239
  ...new Set([
1957
2240
  ...triage.remediation,
1958
2241
  ...(loadResult.failed.length > 0
1959
- ? ["Run pm extension --explore --project and pm extension --explore --global to inspect load failures."]
2242
+ ? [
2243
+ options.vocabulary === "package"
2244
+ ? "Run pm package explore --project and pm package explore --global to inspect load failures."
2245
+ : "Run pm extension --explore --project and pm extension --explore --global to inspect load failures.",
2246
+ ]
1960
2247
  : []),
1961
2248
  ...(activationResult.failed.length > 0
1962
- ? ["Review activation failures in pm extension --doctor --detail deep output."]
2249
+ ? [
2250
+ options.vocabulary === "package"
2251
+ ? "Review activation failures in pm package doctor --detail deep output."
2252
+ : "Review activation failures in pm extension --doctor --detail deep output.",
2253
+ ]
1963
2254
  : []),
1964
2255
  ...(managedStateFix && managedStateFix.adopted_entries.length > 0
1965
2256
  ? [`Managed-state fix adopted ${managedStateFix.adopted_entries.length} extension(s).`]
@@ -2136,7 +2427,7 @@ export async function runExtension(target, options, global) {
2136
2427
  }
2137
2428
  let runtimeProbeSummary;
2138
2429
  let runtimeInstalledExtensions = refreshedInstalled.extensions;
2139
- if (action === "manage" && options.runtimeProbe === true) {
2430
+ if (action === "explore" || options.runtimeProbe === true) {
2140
2431
  const loadResult = await loadExtensions({
2141
2432
  pmRoot: resolvedRoots.pm_root,
2142
2433
  settings,
@@ -2153,6 +2444,7 @@ export async function runExtension(target, options, global) {
2153
2444
  runtimeProbeSummary = {
2154
2445
  requested: true,
2155
2446
  executed: true,
2447
+ reason: action === "explore" ? "explore_defaults_to_runtime_probe" : "runtime_probe_requested",
2156
2448
  load_failure_count: loadResult.failed.length,
2157
2449
  activation_failure_count: activationResult.failed.length,
2158
2450
  warning_count: [...new Set([...loadResult.warnings, ...activationResult.warnings])].length,
@@ -2161,11 +2453,11 @@ export async function runExtension(target, options, global) {
2161
2453
  }
2162
2454
  else if (action === "manage") {
2163
2455
  runtimeProbeSummary = {
2164
- requested: options.runtimeProbe === true,
2456
+ requested: false,
2165
2457
  executed: false,
2166
2458
  };
2167
2459
  }
2168
- const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions);
2460
+ const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions, options);
2169
2461
  warnings.push(...triage.warnings);
2170
2462
  const details = {
2171
2463
  total: runtimeInstalledExtensions.length,
@@ -2176,6 +2468,9 @@ export async function runExtension(target, options, global) {
2176
2468
  triage,
2177
2469
  policy: configuredPolicy,
2178
2470
  };
2471
+ if (action === "explore") {
2472
+ details.runtime_probe = runtimeProbeSummary;
2473
+ }
2179
2474
  if (action === "manage") {
2180
2475
  details.runtime_probe = runtimeProbeSummary;
2181
2476
  details.managed_state_fix =
@@ -2199,4 +2494,5 @@ export async function runExtension(target, options, global) {
2199
2494
  }
2200
2495
  throw new PmCliError(`Unsupported extension action "${action}".`, EXIT_CODE.USAGE);
2201
2496
  }
2202
- //# sourceMappingURL=extension.js.map
2497
+ //# sourceMappingURL=extension.js.map
2498
+ //# debugId=499323d3-24fc-5cd7-b97a-b27a0971ba12