@unbrained/pm-cli 2026.5.18 → 2026.5.27

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 (369) hide show
  1. package/CHANGELOG.md +953 -472
  2. package/README.md +4 -11
  3. package/dist/cli/bootstrap-args.d.ts +18 -1
  4. package/dist/cli/bootstrap-args.js +143 -3
  5. package/dist/cli/bootstrap-args.js.map +1 -1
  6. package/dist/cli/commander-usage.js +147 -10
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/annotation-command.d.ts +49 -0
  9. package/dist/cli/commands/annotation-command.js +135 -0
  10. package/dist/cli/commands/annotation-command.js.map +1 -0
  11. package/dist/cli/commands/append.js +5 -8
  12. package/dist/cli/commands/append.js.map +1 -1
  13. package/dist/cli/commands/calendar.js +3 -6
  14. package/dist/cli/commands/calendar.js.map +1 -1
  15. package/dist/cli/commands/claim.js +15 -24
  16. package/dist/cli/commands/claim.js.map +1 -1
  17. package/dist/cli/commands/close.js +63 -10
  18. package/dist/cli/commands/close.js.map +1 -1
  19. package/dist/cli/commands/comments.d.ts +5 -0
  20. package/dist/cli/commands/comments.js +27 -117
  21. package/dist/cli/commands/comments.js.map +1 -1
  22. package/dist/cli/commands/completion.d.ts +2 -2
  23. package/dist/cli/commands/completion.js +203 -63
  24. package/dist/cli/commands/completion.js.map +1 -1
  25. package/dist/cli/commands/config.d.ts +1 -1
  26. package/dist/cli/commands/config.js +82 -4
  27. package/dist/cli/commands/config.js.map +1 -1
  28. package/dist/cli/commands/context.js +4 -10
  29. package/dist/cli/commands/context.js.map +1 -1
  30. package/dist/cli/commands/contracts.js +168 -36
  31. package/dist/cli/commands/contracts.js.map +1 -1
  32. package/dist/cli/commands/create.js +53 -313
  33. package/dist/cli/commands/create.js.map +1 -1
  34. package/dist/cli/commands/dedupe-audit.js +7 -4
  35. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  36. package/dist/cli/commands/delete.d.ts +3 -0
  37. package/dist/cli/commands/delete.js +11 -9
  38. package/dist/cli/commands/delete.js.map +1 -1
  39. package/dist/cli/commands/docs.d.ts +2 -12
  40. package/dist/cli/commands/docs.js +8 -316
  41. package/dist/cli/commands/docs.js.map +1 -1
  42. package/dist/cli/commands/event-validation-messages.d.ts +3 -0
  43. package/dist/cli/commands/event-validation-messages.js +44 -0
  44. package/dist/cli/commands/event-validation-messages.js.map +1 -0
  45. package/dist/cli/commands/extension/bundled-catalog.d.ts +14 -0
  46. package/dist/cli/commands/extension/bundled-catalog.js +268 -0
  47. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -0
  48. package/dist/cli/commands/extension/doctor.d.ts +31 -0
  49. package/dist/cli/commands/extension/doctor.js +345 -0
  50. package/dist/cli/commands/extension/doctor.js.map +1 -0
  51. package/dist/cli/commands/extension/install-sources.d.ts +37 -0
  52. package/dist/cli/commands/extension/install-sources.js +384 -0
  53. package/dist/cli/commands/extension/install-sources.js.map +1 -0
  54. package/dist/cli/commands/extension/managed-state.d.ts +48 -0
  55. package/dist/cli/commands/extension/managed-state.js +172 -0
  56. package/dist/cli/commands/extension/managed-state.js.map +1 -0
  57. package/dist/cli/commands/extension/scaffold.d.ts +14 -0
  58. package/dist/cli/commands/extension/scaffold.js +169 -0
  59. package/dist/cli/commands/extension/scaffold.js.map +1 -0
  60. package/dist/cli/commands/extension/shared.d.ts +14 -0
  61. package/dist/cli/commands/extension/shared.js +106 -0
  62. package/dist/cli/commands/extension/shared.js.map +1 -0
  63. package/dist/cli/commands/extension.d.ts +37 -68
  64. package/dist/cli/commands/extension.js +157 -1319
  65. package/dist/cli/commands/extension.js.map +1 -1
  66. package/dist/cli/commands/files.d.ts +1 -12
  67. package/dist/cli/commands/files.js +14 -318
  68. package/dist/cli/commands/files.js.map +1 -1
  69. package/dist/cli/commands/gc.js +17 -4
  70. package/dist/cli/commands/gc.js.map +1 -1
  71. package/dist/cli/commands/get.d.ts +3 -2
  72. package/dist/cli/commands/get.js +52 -9
  73. package/dist/cli/commands/get.js.map +1 -1
  74. package/dist/cli/commands/health.d.ts +10 -0
  75. package/dist/cli/commands/health.js +269 -76
  76. package/dist/cli/commands/health.js.map +1 -1
  77. package/dist/cli/commands/history-redact.d.ts +8 -0
  78. package/dist/cli/commands/history-redact.js +35 -113
  79. package/dist/cli/commands/history-redact.js.map +1 -1
  80. package/dist/cli/commands/history-repair.d.ts +33 -0
  81. package/dist/cli/commands/history-repair.js +172 -0
  82. package/dist/cli/commands/history-repair.js.map +1 -0
  83. package/dist/cli/commands/history.d.ts +4 -4
  84. package/dist/cli/commands/history.js +10 -88
  85. package/dist/cli/commands/history.js.map +1 -1
  86. package/dist/cli/commands/index.d.ts +3 -1
  87. package/dist/cli/commands/index.js +5 -3
  88. package/dist/cli/commands/index.js.map +1 -1
  89. package/dist/cli/commands/init.d.ts +28 -0
  90. package/dist/cli/commands/init.js +23 -2
  91. package/dist/cli/commands/init.js.map +1 -1
  92. package/dist/cli/commands/learnings.js +20 -119
  93. package/dist/cli/commands/learnings.js.map +1 -1
  94. package/dist/cli/commands/legacy-none-tokens.d.ts +3 -0
  95. package/dist/cli/commands/legacy-none-tokens.js +39 -0
  96. package/dist/cli/commands/legacy-none-tokens.js.map +1 -0
  97. package/dist/cli/commands/linked-artifacts.d.ts +96 -0
  98. package/dist/cli/commands/linked-artifacts.js +335 -0
  99. package/dist/cli/commands/linked-artifacts.js.map +1 -0
  100. package/dist/cli/commands/linked-test-entry.d.ts +3 -0
  101. package/dist/cli/commands/linked-test-entry.js +62 -0
  102. package/dist/cli/commands/linked-test-entry.js.map +1 -0
  103. package/dist/cli/commands/linked-test-parsers.d.ts +28 -0
  104. package/dist/cli/commands/linked-test-parsers.js +192 -0
  105. package/dist/cli/commands/linked-test-parsers.js.map +1 -0
  106. package/dist/cli/commands/list.js +49 -24
  107. package/dist/cli/commands/list.js.map +1 -1
  108. package/dist/cli/commands/normalize.js +4 -3
  109. package/dist/cli/commands/normalize.js.map +1 -1
  110. package/dist/cli/commands/notes.js +20 -119
  111. package/dist/cli/commands/notes.js.map +1 -1
  112. package/dist/cli/commands/plan.d.ts +3 -0
  113. package/dist/cli/commands/plan.js +184 -22
  114. package/dist/cli/commands/plan.js.map +1 -1
  115. package/dist/cli/commands/recurrence-parsers.d.ts +26 -0
  116. package/dist/cli/commands/recurrence-parsers.js +98 -0
  117. package/dist/cli/commands/recurrence-parsers.js.map +1 -0
  118. package/dist/cli/commands/restore.js +24 -56
  119. package/dist/cli/commands/restore.js.map +1 -1
  120. package/dist/cli/commands/schema.d.ts +31 -0
  121. package/dist/cli/commands/schema.js +98 -0
  122. package/dist/cli/commands/schema.js.map +1 -0
  123. package/dist/cli/commands/search.js +154 -42
  124. package/dist/cli/commands/search.js.map +1 -1
  125. package/dist/cli/commands/templates.d.ts +4 -0
  126. package/dist/cli/commands/templates.js +89 -17
  127. package/dist/cli/commands/templates.js.map +1 -1
  128. package/dist/cli/commands/test/linked-command-detection.d.ts +37 -0
  129. package/dist/cli/commands/test/linked-command-detection.js +200 -0
  130. package/dist/cli/commands/test/linked-command-detection.js.map +1 -0
  131. package/dist/cli/commands/test-all.js +4 -8
  132. package/dist/cli/commands/test-all.js.map +1 -1
  133. package/dist/cli/commands/test.d.ts +2 -2
  134. package/dist/cli/commands/test.js +12 -357
  135. package/dist/cli/commands/test.js.map +1 -1
  136. package/dist/cli/commands/update-many.js +6 -9
  137. package/dist/cli/commands/update-many.js.map +1 -1
  138. package/dist/cli/commands/update.js +167 -401
  139. package/dist/cli/commands/update.js.map +1 -1
  140. package/dist/cli/commands/validate.d.ts +3 -1
  141. package/dist/cli/commands/validate.js +23 -71
  142. package/dist/cli/commands/validate.js.map +1 -1
  143. package/dist/cli/error-guidance.d.ts +1 -0
  144. package/dist/cli/error-guidance.js +100 -6
  145. package/dist/cli/error-guidance.js.map +1 -1
  146. package/dist/cli/extension-command-help.d.ts +0 -1
  147. package/dist/cli/extension-command-help.js +2 -13
  148. package/dist/cli/extension-command-help.js.map +1 -1
  149. package/dist/cli/extension-command-options.d.ts +1 -0
  150. package/dist/cli/extension-command-options.js +106 -7
  151. package/dist/cli/extension-command-options.js.map +1 -1
  152. package/dist/cli/help-content.d.ts +0 -1
  153. package/dist/cli/help-content.js +13 -9
  154. package/dist/cli/help-content.js.map +1 -1
  155. package/dist/cli/help-json-payload.d.ts +1 -0
  156. package/dist/cli/help-json-payload.js +33 -3
  157. package/dist/cli/help-json-payload.js.map +1 -1
  158. package/dist/cli/main.d.ts +11 -0
  159. package/dist/cli/main.js +109 -55
  160. package/dist/cli/main.js.map +1 -1
  161. package/dist/cli/register-list-query.d.ts +5 -2
  162. package/dist/cli/register-list-query.js +254 -192
  163. package/dist/cli/register-list-query.js.map +1 -1
  164. package/dist/cli/register-mutation.d.ts +1 -1
  165. package/dist/cli/register-mutation.js +247 -64
  166. package/dist/cli/register-mutation.js.map +1 -1
  167. package/dist/cli/register-operations.js +17 -12
  168. package/dist/cli/register-operations.js.map +1 -1
  169. package/dist/cli/register-setup.js +33 -16
  170. package/dist/cli/register-setup.js.map +1 -1
  171. package/dist/cli/registration-helpers.d.ts +0 -2
  172. package/dist/cli/registration-helpers.js +14 -40
  173. package/dist/cli/registration-helpers.js.map +1 -1
  174. package/dist/cli.js +25 -4
  175. package/dist/cli.js.map +1 -1
  176. package/dist/core/config/positional-value.d.ts +44 -0
  177. package/dist/core/config/positional-value.js +109 -0
  178. package/dist/core/config/positional-value.js.map +1 -0
  179. package/dist/core/extensions/extension-capability-aliases.d.ts +14 -0
  180. package/dist/core/extensions/extension-capability-aliases.js +159 -0
  181. package/dist/core/extensions/extension-capability-aliases.js.map +1 -0
  182. package/dist/core/extensions/extension-hook-runtime.d.ts +13 -0
  183. package/dist/core/extensions/extension-hook-runtime.js +414 -0
  184. package/dist/core/extensions/extension-hook-runtime.js.map +1 -0
  185. package/dist/core/extensions/extension-policy.d.ts +69 -0
  186. package/dist/core/extensions/extension-policy.js +481 -0
  187. package/dist/core/extensions/extension-policy.js.map +1 -0
  188. package/dist/core/extensions/extension-registries.d.ts +8 -0
  189. package/dist/core/extensions/extension-registries.js +52 -0
  190. package/dist/core/extensions/extension-registries.js.map +1 -0
  191. package/dist/core/extensions/extension-runtime-helpers.d.ts +6 -0
  192. package/dist/core/extensions/extension-runtime-helpers.js +29 -0
  193. package/dist/core/extensions/extension-runtime-helpers.js.map +1 -0
  194. package/dist/core/extensions/extension-types.d.ts +13 -39
  195. package/dist/core/extensions/extension-types.js +34 -2
  196. package/dist/core/extensions/extension-types.js.map +1 -1
  197. package/dist/core/extensions/index.d.ts +7 -1
  198. package/dist/core/extensions/index.js +11 -14
  199. package/dist/core/extensions/index.js.map +1 -1
  200. package/dist/core/extensions/loader.d.ts +4 -22
  201. package/dist/core/extensions/loader.js +23 -1146
  202. package/dist/core/extensions/loader.js.map +1 -1
  203. package/dist/core/fs/path-utils.d.ts +1 -0
  204. package/dist/core/fs/path-utils.js +12 -0
  205. package/dist/core/fs/path-utils.js.map +1 -0
  206. package/dist/core/history/drift-scan.d.ts +22 -0
  207. package/dist/core/history/drift-scan.js +149 -0
  208. package/dist/core/history/drift-scan.js.map +1 -0
  209. package/dist/core/history/history-rewrite.d.ts +43 -0
  210. package/dist/core/history/history-rewrite.js +48 -0
  211. package/dist/core/history/history-rewrite.js.map +1 -0
  212. package/dist/core/history/history.js +5 -4
  213. package/dist/core/history/history.js.map +1 -1
  214. package/dist/core/history/replay.d.ts +82 -0
  215. package/dist/core/history/replay.js +250 -0
  216. package/dist/core/history/replay.js.map +1 -0
  217. package/dist/core/item/item-format.js +11 -8
  218. package/dist/core/item/item-format.js.map +1 -1
  219. package/dist/core/item/item-record.d.ts +19 -0
  220. package/dist/core/item/item-record.js +24 -0
  221. package/dist/core/item/item-record.js.map +1 -0
  222. package/dist/core/item/item-type-definition.d.ts +52 -0
  223. package/dist/core/item/item-type-definition.js +123 -0
  224. package/dist/core/item/item-type-definition.js.map +1 -0
  225. package/dist/core/item/parse.js +3 -2
  226. package/dist/core/item/parse.js.map +1 -1
  227. package/dist/core/item/priority.d.ts +23 -0
  228. package/dist/core/item/priority.js +55 -0
  229. package/dist/core/item/priority.js.map +1 -0
  230. package/dist/core/item/status.d.ts +14 -1
  231. package/dist/core/item/status.js +22 -2
  232. package/dist/core/item/status.js.map +1 -1
  233. package/dist/core/item/toon-decode.d.ts +19 -0
  234. package/dist/core/item/toon-decode.js +69 -0
  235. package/dist/core/item/toon-decode.js.map +1 -0
  236. package/dist/core/item/type-registry.js +13 -84
  237. package/dist/core/item/type-registry.js.map +1 -1
  238. package/dist/core/output/mutation-projection.d.ts +31 -0
  239. package/dist/core/output/mutation-projection.js +103 -0
  240. package/dist/core/output/mutation-projection.js.map +1 -0
  241. package/dist/core/output/output.d.ts +2 -0
  242. package/dist/core/output/output.js +5 -3
  243. package/dist/core/output/output.js.map +1 -1
  244. package/dist/core/packages/manifest.js +3 -9
  245. package/dist/core/packages/manifest.js.map +1 -1
  246. package/dist/core/schema/item-types-file.d.ts +85 -0
  247. package/dist/core/schema/item-types-file.js +243 -0
  248. package/dist/core/schema/item-types-file.js.map +1 -0
  249. package/dist/core/schema/runtime-schema.d.ts +2 -1
  250. package/dist/core/schema/runtime-schema.js +17 -45
  251. package/dist/core/schema/runtime-schema.js.map +1 -1
  252. package/dist/core/search/semantic-defaults.js +3 -3
  253. package/dist/core/search/semantic-defaults.js.map +1 -1
  254. package/dist/core/search/vector-stores.js +46 -9
  255. package/dist/core/search/vector-stores.js.map +1 -1
  256. package/dist/core/sentry/helpers.d.ts +1 -1
  257. package/dist/core/sentry/helpers.js +20 -3
  258. package/dist/core/sentry/helpers.js.map +1 -1
  259. package/dist/core/shared/author.d.ts +1 -0
  260. package/dist/core/shared/author.js +9 -0
  261. package/dist/core/shared/author.js.map +1 -0
  262. package/dist/core/shared/command-types.d.ts +1 -0
  263. package/dist/core/shared/command-types.js +2 -2
  264. package/dist/core/shared/command-types.js.map +1 -1
  265. package/dist/core/shared/constants.d.ts +10 -1
  266. package/dist/core/shared/constants.js +56 -58
  267. package/dist/core/shared/constants.js.map +1 -1
  268. package/dist/core/shared/lazy-module.d.ts +1 -0
  269. package/dist/core/shared/lazy-module.js +11 -0
  270. package/dist/core/shared/lazy-module.js.map +1 -0
  271. package/dist/core/shared/option-alias-visibility.d.ts +44 -0
  272. package/dist/core/shared/option-alias-visibility.js +76 -0
  273. package/dist/core/shared/option-alias-visibility.js.map +1 -0
  274. package/dist/core/shared/primitives.d.ts +23 -0
  275. package/dist/core/shared/primitives.js +39 -2
  276. package/dist/core/shared/primitives.js.map +1 -1
  277. package/dist/core/shared/text-normalization.d.ts +0 -1
  278. package/dist/core/shared/text-normalization.js +2 -5
  279. package/dist/core/shared/text-normalization.js.map +1 -1
  280. package/dist/core/store/front-matter-cache.d.ts +16 -2
  281. package/dist/core/store/front-matter-cache.js +99 -33
  282. package/dist/core/store/front-matter-cache.js.map +1 -1
  283. package/dist/core/store/item-store.d.ts +2 -0
  284. package/dist/core/store/item-store.js +76 -110
  285. package/dist/core/store/item-store.js.map +1 -1
  286. package/dist/core/store/settings-validator.d.ts +106 -0
  287. package/dist/core/store/settings-validator.js +279 -0
  288. package/dist/core/store/settings-validator.js.map +1 -0
  289. package/dist/core/store/settings.js +6 -343
  290. package/dist/core/store/settings.js.map +1 -1
  291. package/dist/core/telemetry/runtime.js +5 -3
  292. package/dist/core/telemetry/runtime.js.map +1 -1
  293. package/dist/mcp/server.js +138 -39
  294. package/dist/mcp/server.js.map +1 -1
  295. package/dist/sdk/cli-contracts/enum-contracts.d.ts +20 -0
  296. package/dist/sdk/cli-contracts/enum-contracts.js +156 -0
  297. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -0
  298. package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +14 -0
  299. package/dist/sdk/cli-contracts/tool-option-contracts.js +243 -0
  300. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -0
  301. package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +11 -0
  302. package/dist/sdk/cli-contracts/tool-parameter-tables.js +901 -0
  303. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -0
  304. package/dist/sdk/cli-contracts.d.ts +18 -33
  305. package/dist/sdk/cli-contracts.js +96 -1238
  306. package/dist/sdk/cli-contracts.js.map +1 -1
  307. package/dist/sdk/package-import-adapters.d.ts +74 -0
  308. package/dist/sdk/package-import-adapters.js +186 -0
  309. package/dist/sdk/package-import-adapters.js.map +1 -0
  310. package/dist/sdk/package-runtime-options.d.ts +26 -0
  311. package/dist/sdk/package-runtime-options.js +71 -0
  312. package/dist/sdk/package-runtime-options.js.map +1 -0
  313. package/dist/sdk/runtime.d.ts +27 -1
  314. package/dist/sdk/runtime.js +48 -3
  315. package/dist/sdk/runtime.js.map +1 -1
  316. package/dist/types.d.ts +6 -0
  317. package/dist/types.js +10 -2
  318. package/dist/types.js.map +1 -1
  319. package/docs/AGENT_GUIDE.md +13 -11
  320. package/docs/ARCHITECTURE.md +1 -1
  321. package/docs/CLAUDE_CODE_PLUGIN.md +5 -28
  322. package/docs/CODEX_PLUGIN.md +5 -5
  323. package/docs/COMMANDS.md +58 -9
  324. package/docs/CONFIGURATION.md +16 -1
  325. package/docs/EXTENSIONS.md +4 -63
  326. package/docs/RELEASING.md +12 -8
  327. package/docs/SDK.md +11 -2
  328. package/marketplace.json +7 -3
  329. package/package.json +18 -14
  330. package/packages/pm-beads/extensions/beads/index.js +2 -49
  331. package/packages/pm-beads/extensions/beads/index.ts +2 -54
  332. package/packages/pm-beads/extensions/beads/runtime-loader.js +86 -0
  333. package/packages/pm-beads/extensions/beads/runtime-loader.ts +88 -0
  334. package/packages/pm-beads/extensions/beads/runtime.js +26 -115
  335. package/packages/pm-beads/extensions/beads/runtime.ts +33 -132
  336. package/packages/pm-calendar/README.md +3 -1
  337. package/packages/pm-calendar/extensions/calendar/index.js +66 -2
  338. package/packages/pm-calendar/extensions/calendar/index.ts +71 -2
  339. package/packages/pm-calendar/extensions/calendar/runtime.js +1 -0
  340. package/packages/pm-calendar/extensions/calendar/runtime.ts +1 -0
  341. package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +14 -41
  342. package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +25 -41
  343. package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +10 -50
  344. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +17 -50
  345. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +8 -40
  346. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +10 -40
  347. package/packages/pm-search-advanced/README.md +8 -0
  348. package/packages/pm-search-advanced/extensions/search-advanced/index.js +75 -1
  349. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
  350. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +58 -33
  351. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +60 -33
  352. package/packages/pm-templates/extensions/templates/runtime.js +11 -202
  353. package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
  354. package/packages/pm-todos/extensions/todos/index.js +3 -50
  355. package/packages/pm-todos/extensions/todos/index.ts +3 -55
  356. package/packages/pm-todos/extensions/todos/runtime-loader.js +86 -0
  357. package/packages/pm-todos/extensions/todos/runtime-loader.ts +88 -0
  358. package/packages/pm-todos/extensions/todos/runtime.js +24 -117
  359. package/packages/pm-todos/extensions/todos/runtime.ts +32 -129
  360. package/plugins/pm-claude/README.md +2 -2
  361. package/plugins/pm-claude/commands/pm-planner.md +1 -15
  362. package/plugins/pm-claude/scripts/pm-mcp-server.mjs +5 -2
  363. package/plugins/pm-claude/skills/pm-planner/SKILL.md +3 -21
  364. package/plugins/pm-codex/scripts/pm-mcp-server.mjs +15 -6
  365. package/plugins/pm-codex/skills/pm-native/SKILL.md +1 -13
  366. package/PRD.md +0 -1734
  367. package/dist/core/output/command-aware.d.ts +0 -1
  368. package/dist/core/output/command-aware.js +0 -397
  369. package/dist/core/output/command-aware.js.map +0 -1
@@ -1,5 +1,5 @@
1
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]="dc5fb278-5d8c-539d-9059-22e92c20ae1f")}catch(e){}}();
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]="ecb69cb1-7778-555a-92fd-ebbc7d42f47e")}catch(e){}}();
3
3
  import { spawn } from "node:child_process";
4
4
  import { cp, mkdir, mkdtemp, readdir, rm } from "node:fs/promises";
5
5
  import { tmpdir } from "node:os";
@@ -16,14 +16,13 @@ import { getSettingsPath, ITEM_FILE_EXTENSIONS, resolveGlobalPmRoot, resolvePmRo
16
16
  import { readSettings } from "../../core/store/settings.js";
17
17
  import { appendTrackedTestRunSummary } from "../../core/test/item-test-run-tracking.js";
18
18
  import { runInit } from "./init.js";
19
+ import { looksLikeStructuredLinkedTestEntry, normalizeStructuredLinkedTestEntry } from "./linked-test-entry.js";
20
+ import { LINKED_TEST_PM_CONTEXT_MODE_VALUES as PM_CONTEXT_MODE_VALUES, LINKED_TEST_PROTECTED_ENV_KEYS, parseLinkedTestAssertionEqualsMap, parseLinkedTestAssertionGteMap, parseLinkedTestBoolean as parseLinkedTestBooleanValue, parseLinkedTestContextMode as parseLinkedTestContextModeValue, parseLinkedTestEnvClear as parseLinkedTestEnvClearValue, parseLinkedTestEnvSet as parseLinkedTestEnvSetValue, parseLinkedTestMinLines, parseLinkedTestRegexList, parseLinkedTestStringList, } from "./linked-test-parsers.js";
19
21
  import { SCOPE_VALUES } from "../../types/index.js";
20
22
  const TEST_OUTPUT_MAX_BUFFER_BYTES = 20 * 1024 * 1024;
21
23
  const DEFAULT_LINKED_TEST_TIMEOUT_FORCE_KILL_DELAY_MS = 3000;
22
24
  const DEFAULT_LINKED_TEST_HEARTBEAT_INTERVAL_MS = 10000;
23
25
  const MAX_LINKED_TEST_COMMAND_LABEL_LENGTH = 120;
24
- const LINKED_TEST_PROTECTED_ENV_KEYS = new Set(["PM_PATH", "PM_GLOBAL_PATH", "FORCE_COLOR"]);
25
- const LINKED_TEST_ENV_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
26
- const PM_CONTEXT_MODE_VALUES = ["schema", "tracker", "auto"];
27
26
  const LINKED_TEST_TRACKER_DIRS_TO_SKIP = new Set(["locks", "extensions", "runtime"]);
28
27
  const LINKED_TEST_ITEM_COUNT_DIRS_TO_SKIP = new Set(["history", "index", "search", "extensions", "locks", "runtime"]);
29
28
  const LINKED_TEST_INFRA_COLLISION_PATTERNS = [
@@ -154,165 +153,6 @@ function ensureScope(raw) {
154
153
  }
155
154
  return value;
156
155
  }
157
- function parseLinkedTestBooleanValue(raw, optionName, fieldLabel) {
158
- if (!raw || raw.trim().length === 0) {
159
- return undefined;
160
- }
161
- const normalized = raw.trim().toLowerCase();
162
- if (normalized === "true" || normalized === "1" || normalized === "yes") {
163
- return true;
164
- }
165
- if (normalized === "false" || normalized === "0" || normalized === "no") {
166
- return false;
167
- }
168
- throw new PmCliError(`${optionName} ${fieldLabel} must be one of true|false|1|0|yes|no`, EXIT_CODE.USAGE);
169
- }
170
- function parseLinkedTestEnvSetValue(raw, optionName) {
171
- if (!raw || raw.trim().length === 0) {
172
- return undefined;
173
- }
174
- const assignments = raw
175
- .split(/[;\n]/)
176
- .map((entry) => entry.trim())
177
- .filter((entry) => entry.length > 0);
178
- if (assignments.length === 0) {
179
- throw new PmCliError(`${optionName} env_set must include at least one KEY=VALUE assignment`, EXIT_CODE.USAGE);
180
- }
181
- const envSet = {};
182
- for (const assignment of assignments) {
183
- const separatorIndex = assignment.indexOf("=");
184
- if (separatorIndex <= 0) {
185
- throw new PmCliError(`${optionName} env_set entries must use KEY=VALUE and be separated by semicolons. Example: env_set=PORT=0;PLAYWRIGHT_BASE_URL=http://127.0.0.1:4173`, EXIT_CODE.USAGE);
186
- }
187
- const key = assignment.slice(0, separatorIndex).trim();
188
- const value = assignment.slice(separatorIndex + 1);
189
- if (!LINKED_TEST_ENV_NAME_PATTERN.test(key)) {
190
- throw new PmCliError(`${optionName} env_set key "${key}" is invalid`, EXIT_CODE.USAGE);
191
- }
192
- if (LINKED_TEST_PROTECTED_ENV_KEYS.has(key.toUpperCase())) {
193
- throw new PmCliError(`${optionName} env_set key "${key}" is reserved for sandbox safety`, EXIT_CODE.USAGE);
194
- }
195
- envSet[key] = value;
196
- }
197
- return Object.keys(envSet).length > 0 ? envSet : undefined;
198
- }
199
- function parseLinkedTestEnvClearValue(raw, optionName) {
200
- if (!raw || raw.trim().length === 0) {
201
- return undefined;
202
- }
203
- const values = [...new Set(raw.split(/[;,\n]/).map((entry) => entry.trim()).filter((entry) => entry.length > 0))];
204
- if (values.length === 0) {
205
- throw new PmCliError(`${optionName} env_clear must include at least one environment variable name`, EXIT_CODE.USAGE);
206
- }
207
- for (const key of values) {
208
- if (!LINKED_TEST_ENV_NAME_PATTERN.test(key)) {
209
- throw new PmCliError(`${optionName} env_clear key "${key}" is invalid`, EXIT_CODE.USAGE);
210
- }
211
- if (LINKED_TEST_PROTECTED_ENV_KEYS.has(key.toUpperCase())) {
212
- throw new PmCliError(`${optionName} env_clear key "${key}" is reserved for sandbox safety`, EXIT_CODE.USAGE);
213
- }
214
- }
215
- return values;
216
- }
217
- function parseLinkedTestStringList(raw) {
218
- if (!raw || raw.trim().length === 0) {
219
- return undefined;
220
- }
221
- const values = [...new Set(raw.split(/[;\n]/).map((entry) => entry.trim()).filter((entry) => entry.length > 0))];
222
- return values.length > 0 ? values : undefined;
223
- }
224
- function parseLinkedTestRegexList(raw, optionName, fieldLabel) {
225
- const values = parseLinkedTestStringList(raw);
226
- if (!values || values.length === 0) {
227
- return undefined;
228
- }
229
- for (const pattern of values) {
230
- try {
231
- // Validate syntax when linked-test metadata is added.
232
- new RegExp(pattern, "m");
233
- }
234
- catch (error) {
235
- throw new PmCliError(`${optionName} ${fieldLabel} includes invalid regex "${pattern}": ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.USAGE);
236
- }
237
- }
238
- return values;
239
- }
240
- function parseLinkedTestMinLines(raw, optionName) {
241
- if (!raw || raw.trim().length === 0) {
242
- return undefined;
243
- }
244
- const parsed = parseOptionalNumber(raw, "assert_stdout_min_lines");
245
- if (!Number.isInteger(parsed) || parsed < 0) {
246
- throw new PmCliError(`${optionName} assert_stdout_min_lines must be an integer >= 0`, EXIT_CODE.USAGE);
247
- }
248
- return parsed;
249
- }
250
- function parseLinkedTestAssertionEqualsMap(raw, optionName) {
251
- if (!raw || raw.trim().length === 0) {
252
- return undefined;
253
- }
254
- const assignments = raw
255
- .split(/[;\n]/)
256
- .map((entry) => entry.trim())
257
- .filter((entry) => entry.length > 0);
258
- if (assignments.length === 0) {
259
- throw new PmCliError(`${optionName} assert_json_field_equals must include at least one path=value assignment`, EXIT_CODE.USAGE);
260
- }
261
- const values = {};
262
- for (const assignment of assignments) {
263
- const separatorIndex = assignment.indexOf("=");
264
- if (separatorIndex <= 0) {
265
- throw new PmCliError(`${optionName} assert_json_field_equals entries must use path=value and be separated by semicolons`, EXIT_CODE.USAGE);
266
- }
267
- const key = assignment.slice(0, separatorIndex).trim();
268
- const value = assignment.slice(separatorIndex + 1).trim();
269
- if (key.length === 0 || value.length === 0) {
270
- throw new PmCliError(`${optionName} assert_json_field_equals entries must include non-empty path and value`, EXIT_CODE.USAGE);
271
- }
272
- values[key] = value;
273
- }
274
- return Object.keys(values).length > 0 ? values : undefined;
275
- }
276
- function parseLinkedTestAssertionGteMap(raw, optionName) {
277
- if (!raw || raw.trim().length === 0) {
278
- return undefined;
279
- }
280
- const assignments = raw
281
- .split(/[;\n]/)
282
- .map((entry) => entry.trim())
283
- .filter((entry) => entry.length > 0);
284
- if (assignments.length === 0) {
285
- throw new PmCliError(`${optionName} assert_json_field_gte must include at least one path=value assignment`, EXIT_CODE.USAGE);
286
- }
287
- const values = {};
288
- for (const assignment of assignments) {
289
- const separatorIndex = assignment.indexOf("=");
290
- if (separatorIndex <= 0) {
291
- throw new PmCliError(`${optionName} assert_json_field_gte entries must use path=value and be separated by semicolons`, EXIT_CODE.USAGE);
292
- }
293
- const key = assignment.slice(0, separatorIndex).trim();
294
- const valueRaw = assignment.slice(separatorIndex + 1).trim();
295
- if (key.length === 0 || valueRaw.length === 0) {
296
- throw new PmCliError(`${optionName} assert_json_field_gte entries must include non-empty path and value`, EXIT_CODE.USAGE);
297
- }
298
- const value = Number.parseFloat(valueRaw);
299
- if (!Number.isFinite(value)) {
300
- throw new PmCliError(`${optionName} assert_json_field_gte value for "${key}" must be numeric`, EXIT_CODE.USAGE);
301
- }
302
- values[key] = value;
303
- }
304
- return Object.keys(values).length > 0 ? values : undefined;
305
- }
306
- function parseLinkedTestContextModeValue(raw, optionName) {
307
- if (!raw || raw.trim().length === 0) {
308
- return undefined;
309
- }
310
- const normalized = raw.trim().toLowerCase();
311
- if (PM_CONTEXT_MODE_VALUES.includes(normalized)) {
312
- return normalized;
313
- }
314
- throw new PmCliError(`${optionName} pm_context_mode must be one of: ${PM_CONTEXT_MODE_VALUES.join(", ")}`, EXIT_CODE.USAGE);
315
- }
316
156
  function parsePmContextMode(raw) {
317
157
  if (!raw) {
318
158
  return "schema";
@@ -390,191 +230,10 @@ function mergeEnvClearDirectives(entries, optionName) {
390
230
  }
391
231
  return [...new Set(values)];
392
232
  }
393
- const PM_GLOBAL_FLAGS_WITH_VALUE = new Set(["--path"]);
394
- const NPX_FLAGS_WITH_VALUE = new Set(["-p", "--package", "-c", "--call"]);
395
- const PNPM_GLOBAL_FLAGS_WITH_VALUE = new Set([
396
- "-c",
397
- "-C",
398
- "--config",
399
- "--dir",
400
- "--filter",
401
- "--workspace-dir",
402
- ]);
403
- const NPM_GLOBAL_FLAGS_WITH_VALUE = new Set(["-C", "--prefix", "--userconfig", "--cache"]);
404
- const YARN_GLOBAL_FLAGS_WITH_VALUE = new Set(["--cwd"]);
405
- const BUN_GLOBAL_FLAGS_WITH_VALUE = new Set(["--cwd"]);
406
- const NPM_EXEC_SUBCOMMANDS = new Set(["exec", "x"]);
407
- const SCRIPT_RUN_SUBCOMMANDS = new Set(["run", "run-script"]);
408
- const SCRIPT_RUN_FLAGS_WITH_VALUE = new Set(["-C", "--dir", "--cwd", "-w", "--workspace", "--filter"]);
409
- function splitNormalizedCommandSegments(normalizedCommand) {
410
- return normalizedCommand
411
- .split(/&&|\|\||\||;/)
412
- .map((segment) => segment.trim())
413
- .filter((segment) => segment.length > 0);
414
- }
415
- function stripLeadingEnvAssignments(tokens) {
416
- let start = 0;
417
- if (tokens[start] === "env") {
418
- start += 1;
419
- }
420
- while (start < tokens.length) {
421
- const token = tokens[start];
422
- if (/^(?:[a-z_][a-z0-9_]*|\$env:[a-z_][a-z0-9_]*)=.*/.test(token)) {
423
- start += 1;
424
- continue;
425
- }
426
- break;
427
- }
428
- return tokens.slice(start);
429
- }
430
- function firstPmSubcommand(args) {
431
- let index = 0;
432
- while (index < args.length) {
433
- const token = args[index];
434
- if (token === "--") {
435
- index += 1;
436
- continue;
437
- }
438
- if (token.startsWith("-")) {
439
- if (PM_GLOBAL_FLAGS_WITH_VALUE.has(token)) {
440
- index += 2;
441
- continue;
442
- }
443
- index += 1;
444
- continue;
445
- }
446
- return token;
447
- }
448
- return undefined;
449
- }
450
- function isPmExecutableToken(token) {
451
- return token === "pm" || token.endsWith("/pm") || token.endsWith("/pm.cmd") || token.endsWith("/pm.exe");
452
- }
453
- function normalizePackageSpecifier(token) {
454
- const trimmed = token.trim();
455
- if (!trimmed.startsWith("@")) {
456
- const versionSeparator = trimmed.indexOf("@");
457
- return versionSeparator === -1 ? trimmed : trimmed.slice(0, versionSeparator);
458
- }
459
- const scopeSeparator = trimmed.indexOf("/");
460
- if (scopeSeparator === -1) {
461
- return trimmed;
462
- }
463
- const versionSeparator = trimmed.indexOf("@", scopeSeparator + 1);
464
- return versionSeparator === -1 ? trimmed : trimmed.slice(0, versionSeparator);
465
- }
466
- function isPmCliPackageToken(token) {
467
- const normalizedSpecifier = normalizePackageSpecifier(token);
468
- return (normalizedSpecifier === "pm-cli" ||
469
- normalizedSpecifier.endsWith("/pm-cli") ||
470
- token === "pm-cli" ||
471
- token.endsWith("/pm-cli"));
472
- }
473
- function isPmCliScriptToken(token) {
474
- return token === "dist/cli.js" || token === "./dist/cli.js" || token.endsWith("/dist/cli.js");
475
- }
476
- function parseNpxCommand(tokens) {
477
- let index = 0;
478
- while (index < tokens.length) {
479
- const token = tokens[index];
480
- if (token === "--") {
481
- index += 1;
482
- break;
483
- }
484
- if (!token.startsWith("-")) {
485
- break;
486
- }
487
- if (token.includes("=")) {
488
- index += 1;
489
- continue;
490
- }
491
- if (NPX_FLAGS_WITH_VALUE.has(token)) {
492
- index += 2;
493
- continue;
494
- }
495
- index += 1;
496
- }
497
- const command = tokens[index];
498
- if (!command) {
499
- return null;
500
- }
501
- return {
502
- command,
503
- args: tokens.slice(index + 1),
504
- };
505
- }
506
- function parseLauncherSubcommand(tokens, flagsWithValue) {
507
- let index = 0;
508
- while (index < tokens.length) {
509
- const token = tokens[index];
510
- if (token === "--") {
511
- index += 1;
512
- continue;
513
- }
514
- if (token.startsWith("-")) {
515
- if (token.includes("=")) {
516
- index += 1;
517
- continue;
518
- }
519
- if (flagsWithValue.has(token)) {
520
- index += 2;
521
- continue;
522
- }
523
- index += 1;
524
- continue;
525
- }
526
- return {
527
- subcommand: token,
528
- args: tokens.slice(index + 1),
529
- };
530
- }
531
- return null;
532
- }
533
- function parsePnpmDlxCommand(tokens) {
534
- const parsed = parseLauncherSubcommand(tokens, PNPM_GLOBAL_FLAGS_WITH_VALUE);
535
- if (parsed?.subcommand !== "dlx") {
536
- return null;
537
- }
538
- return parseNpxCommand(parsed.args);
539
- }
540
- function parseNpmExecCommand(tokens) {
541
- const parsed = parseLauncherSubcommand(tokens, NPM_GLOBAL_FLAGS_WITH_VALUE);
542
- if (!parsed || !NPM_EXEC_SUBCOMMANDS.has(parsed.subcommand)) {
543
- return null;
544
- }
545
- return parseNpxCommand(parsed.args);
546
- }
547
- function resolvePmSubcommandContext(args) {
548
- let index = 0;
549
- while (index < args.length) {
550
- const token = args[index];
551
- if (token === "--") {
552
- index += 1;
553
- continue;
554
- }
555
- if (token.startsWith("-")) {
556
- if (PM_GLOBAL_FLAGS_WITH_VALUE.has(token)) {
557
- index += 2;
558
- continue;
559
- }
560
- index += 1;
561
- continue;
562
- }
563
- return {
564
- subcommand: token,
565
- remaining: args.slice(index + 1),
566
- };
567
- }
568
- return null;
569
- }
570
- function firstPositionalToken(tokens) {
571
- for (const token of tokens) {
572
- if (!token.startsWith("-")) {
573
- return token;
574
- }
575
- }
576
- return undefined;
577
- }
233
+ // Linked-test command detection helpers + constants live in a sibling leaf
234
+ // module to keep this command file under the per-file LOC budget. Re-exported
235
+ // here so no consumer outside this file changes.
236
+ import { BUN_GLOBAL_FLAGS_WITH_VALUE, NPM_GLOBAL_FLAGS_WITH_VALUE, PNPM_GLOBAL_FLAGS_WITH_VALUE, SCRIPT_RUN_FLAGS_WITH_VALUE, SCRIPT_RUN_SUBCOMMANDS, YARN_GLOBAL_FLAGS_WITH_VALUE, firstPmSubcommand, firstPositionalToken, isPmCliPackageToken, isPmCliScriptToken, isPmExecutableToken, parseLauncherSubcommand, parseNpmExecCommand, parseNpxCommand, parsePnpmDlxCommand, resolvePmSubcommandContext, splitNormalizedCommandSegments, stripLeadingEnvAssignments, } from "./test/linked-command-detection.js";
578
237
  function looksLikePrefixedItemId(token, idPrefix) {
579
238
  const normalizedPrefix = idPrefix.trim().toLowerCase().replace(/-+$/, "");
580
239
  if (normalizedPrefix.length === 0) {
@@ -789,18 +448,14 @@ function getRuntimeSafetySkipReason(command) {
789
448
  return undefined;
790
449
  return 'Linked test command skipped: Linked test commands must not invoke "pm test-all"; this creates recursive orchestration.';
791
450
  }
792
- function looksLikeStructuredLinkedTestEntry(raw) {
793
- if (raw.startsWith("```") || raw.includes("\n")) {
794
- return true;
795
- }
796
- return /^(?:[-*+]\s+)?(?:command|path|scope|timeout|timeout_seconds|pm_context_mode|env_set|env_clear|shared_host_safe|assert_stdout_contains|assert_stdout_regex|assert_stderr_contains|assert_stderr_regex|assert_stdout_min_lines|assert_json_field_equals|assert_json_field_gte|note)\s*[:=]/i.test(raw);
797
- }
798
451
  function parseAddEntries(raw) {
799
452
  if (!raw)
800
453
  return [];
801
454
  return raw.map((entry) => {
802
455
  const trimmed = entry.trim();
803
- const kv = looksLikeStructuredLinkedTestEntry(trimmed) ? parseCsvKv(entry, "--add") : { command: trimmed };
456
+ const kv = looksLikeStructuredLinkedTestEntry(trimmed)
457
+ ? normalizeStructuredLinkedTestEntry(parseCsvKv(entry, "--add"), "--add")
458
+ : { command: trimmed };
804
459
  const command = kv.command?.trim() || undefined;
805
460
  const filePath = kv.path?.trim() || undefined;
806
461
  if (!command) {
@@ -1668,7 +1323,7 @@ export async function runLinkedTests(tests, defaultTimeoutSeconds, options) {
1668
1323
  }
1669
1324
  }
1670
1325
  finally {
1671
- await rm(sandboxRoot, { recursive: true, force: true });
1326
+ await rm(sandboxRoot, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
1672
1327
  }
1673
1328
  return results;
1674
1329
  }
@@ -1827,4 +1482,4 @@ export async function runTest(id, options, global) {
1827
1482
  };
1828
1483
  }
1829
1484
  //# sourceMappingURL=test.js.map
1830
- //# debugId=dc5fb278-5d8c-539d-9059-22e92c20ae1f
1485
+ //# debugId=ecb69cb1-7778-555a-92fd-ebbc7d42f47e