@unbrained/pm-cli 2026.5.14 → 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 (361) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/AGENTS.md +78 -457
  3. package/CHANGELOG.md +11 -0
  4. package/CONTRIBUTING.md +1 -0
  5. package/README.md +6 -5
  6. package/dist/cli/argv-utils.js +4 -1
  7. package/dist/cli/argv-utils.js.map +1 -1
  8. package/dist/cli/bootstrap-args.js +4 -1
  9. package/dist/cli/bootstrap-args.js.map +1 -1
  10. package/dist/cli/commander-usage.js +5 -1
  11. package/dist/cli/commander-usage.js.map +1 -1
  12. package/dist/cli/commands/activity.js +4 -1
  13. package/dist/cli/commands/activity.js.map +1 -1
  14. package/dist/cli/commands/aggregate.js +5 -2
  15. package/dist/cli/commands/aggregate.js.map +1 -1
  16. package/dist/cli/commands/append.js +4 -1
  17. package/dist/cli/commands/append.js.map +1 -1
  18. package/dist/cli/commands/calendar.js +4 -1
  19. package/dist/cli/commands/calendar.js.map +1 -1
  20. package/dist/cli/commands/claim.d.ts +3 -0
  21. package/dist/cli/commands/claim.js +19 -3
  22. package/dist/cli/commands/claim.js.map +1 -1
  23. package/dist/cli/commands/close.js +4 -1
  24. package/dist/cli/commands/close.js.map +1 -1
  25. package/dist/cli/commands/comments-audit.js +4 -1
  26. package/dist/cli/commands/comments-audit.js.map +1 -1
  27. package/dist/cli/commands/comments.js +4 -1
  28. package/dist/cli/commands/comments.js.map +1 -1
  29. package/dist/cli/commands/completion.js +98 -2
  30. package/dist/cli/commands/completion.js.map +1 -1
  31. package/dist/cli/commands/config.js +4 -1
  32. package/dist/cli/commands/config.js.map +1 -1
  33. package/dist/cli/commands/context.js +19 -5
  34. package/dist/cli/commands/context.js.map +1 -1
  35. package/dist/cli/commands/contracts.d.ts +9 -0
  36. package/dist/cli/commands/contracts.js +152 -34
  37. package/dist/cli/commands/contracts.js.map +1 -1
  38. package/dist/cli/commands/create.js +30 -6
  39. package/dist/cli/commands/create.js.map +1 -1
  40. package/dist/cli/commands/dedupe-audit.js +4 -1
  41. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  42. package/dist/cli/commands/delete.js +4 -1
  43. package/dist/cli/commands/delete.js.map +1 -1
  44. package/dist/cli/commands/deps.js +4 -1
  45. package/dist/cli/commands/deps.js.map +1 -1
  46. package/dist/cli/commands/docs.js +4 -1
  47. package/dist/cli/commands/docs.js.map +1 -1
  48. package/dist/cli/commands/extension.d.ts +2 -1
  49. package/dist/cli/commands/extension.js +123 -33
  50. package/dist/cli/commands/extension.js.map +1 -1
  51. package/dist/cli/commands/files.js +4 -1
  52. package/dist/cli/commands/files.js.map +1 -1
  53. package/dist/cli/commands/gc.js +4 -1
  54. package/dist/cli/commands/gc.js.map +1 -1
  55. package/dist/cli/commands/get.d.ts +7 -3
  56. package/dist/cli/commands/get.js +91 -18
  57. package/dist/cli/commands/get.js.map +1 -1
  58. package/dist/cli/commands/guide.js +6 -8
  59. package/dist/cli/commands/guide.js.map +1 -1
  60. package/dist/cli/commands/health.d.ts +4 -0
  61. package/dist/cli/commands/health.js +31 -8
  62. package/dist/cli/commands/health.js.map +1 -1
  63. package/dist/cli/commands/history-redact.d.ts +42 -0
  64. package/dist/cli/commands/history-redact.js +559 -0
  65. package/dist/cli/commands/history-redact.js.map +1 -0
  66. package/dist/cli/commands/history.d.ts +4 -0
  67. package/dist/cli/commands/history.js +14 -3
  68. package/dist/cli/commands/history.js.map +1 -1
  69. package/dist/cli/commands/index.d.ts +2 -0
  70. package/dist/cli/commands/index.js +6 -1
  71. package/dist/cli/commands/index.js.map +1 -1
  72. package/dist/cli/commands/init-agent-guidance.d.ts +31 -0
  73. package/dist/cli/commands/init-agent-guidance.js +336 -0
  74. package/dist/cli/commands/init-agent-guidance.js.map +1 -0
  75. package/dist/cli/commands/init.d.ts +14 -0
  76. package/dist/cli/commands/init.js +75 -1
  77. package/dist/cli/commands/init.js.map +1 -1
  78. package/dist/cli/commands/learnings.js +4 -1
  79. package/dist/cli/commands/learnings.js.map +1 -1
  80. package/dist/cli/commands/list.d.ts +1 -0
  81. package/dist/cli/commands/list.js +42 -18
  82. package/dist/cli/commands/list.js.map +1 -1
  83. package/dist/cli/commands/metadata-normalizers.js +4 -1
  84. package/dist/cli/commands/metadata-normalizers.js.map +1 -1
  85. package/dist/cli/commands/normalize.js +4 -1
  86. package/dist/cli/commands/normalize.js.map +1 -1
  87. package/dist/cli/commands/notes.js +4 -1
  88. package/dist/cli/commands/notes.js.map +1 -1
  89. package/dist/cli/commands/plan.d.ts +118 -0
  90. package/dist/cli/commands/plan.js +975 -0
  91. package/dist/cli/commands/plan.js.map +1 -0
  92. package/dist/cli/commands/reindex.js +4 -1
  93. package/dist/cli/commands/reindex.js.map +1 -1
  94. package/dist/cli/commands/restore.js +4 -1
  95. package/dist/cli/commands/restore.js.map +1 -1
  96. package/dist/cli/commands/search.js +7 -2
  97. package/dist/cli/commands/search.js.map +1 -1
  98. package/dist/cli/commands/stats.js +4 -1
  99. package/dist/cli/commands/stats.js.map +1 -1
  100. package/dist/cli/commands/templates.js +4 -1
  101. package/dist/cli/commands/templates.js.map +1 -1
  102. package/dist/cli/commands/test-all.js +4 -1
  103. package/dist/cli/commands/test-all.js.map +1 -1
  104. package/dist/cli/commands/test-runs.js +4 -1
  105. package/dist/cli/commands/test-runs.js.map +1 -1
  106. package/dist/cli/commands/test.js +4 -1
  107. package/dist/cli/commands/test.js.map +1 -1
  108. package/dist/cli/commands/update-many.js +4 -1
  109. package/dist/cli/commands/update-many.js.map +1 -1
  110. package/dist/cli/commands/update.js +114 -71
  111. package/dist/cli/commands/update.js.map +1 -1
  112. package/dist/cli/commands/upgrade.js +6 -3
  113. package/dist/cli/commands/upgrade.js.map +1 -1
  114. package/dist/cli/commands/validate.js +32 -4
  115. package/dist/cli/commands/validate.js.map +1 -1
  116. package/dist/cli/error-guidance.js +5 -2
  117. package/dist/cli/error-guidance.js.map +1 -1
  118. package/dist/cli/extension-command-help.js +4 -1
  119. package/dist/cli/extension-command-help.js.map +1 -1
  120. package/dist/cli/extension-command-options.js +4 -1
  121. package/dist/cli/extension-command-options.js.map +1 -1
  122. package/dist/cli/guide-topics.js +4 -1
  123. package/dist/cli/guide-topics.js.map +1 -1
  124. package/dist/cli/help-content.js +35 -15
  125. package/dist/cli/help-content.js.map +1 -1
  126. package/dist/cli/help-json-payload.js +4 -1
  127. package/dist/cli/help-json-payload.js.map +1 -1
  128. package/dist/cli/main.js +203 -25
  129. package/dist/cli/main.js.map +1 -1
  130. package/dist/cli/migration-gates.js +4 -1
  131. package/dist/cli/migration-gates.js.map +1 -1
  132. package/dist/cli/register-list-query.js +37 -14
  133. package/dist/cli/register-list-query.js.map +1 -1
  134. package/dist/cli/register-mutation.js +228 -4
  135. package/dist/cli/register-mutation.js.map +1 -1
  136. package/dist/cli/register-operations.js +33 -1
  137. package/dist/cli/register-operations.js.map +1 -1
  138. package/dist/cli/register-setup.js +23 -13
  139. package/dist/cli/register-setup.js.map +1 -1
  140. package/dist/cli/registration-helpers.js +10 -2
  141. package/dist/cli/registration-helpers.js.map +1 -1
  142. package/dist/cli/shared-parsers.js +4 -1
  143. package/dist/cli/shared-parsers.js.map +1 -1
  144. package/dist/cli/telemetry-flush.js +4 -1
  145. package/dist/cli/telemetry-flush.js.map +1 -1
  146. package/dist/cli.js +45 -3
  147. package/dist/cli.js.map +1 -1
  148. package/dist/core/extensions/extension-types.js +4 -1
  149. package/dist/core/extensions/extension-types.js.map +1 -1
  150. package/dist/core/extensions/index.js +4 -1
  151. package/dist/core/extensions/index.js.map +1 -1
  152. package/dist/core/extensions/item-fields.js +4 -1
  153. package/dist/core/extensions/item-fields.js.map +1 -1
  154. package/dist/core/extensions/loader.js +77 -53
  155. package/dist/core/extensions/loader.js.map +1 -1
  156. package/dist/core/extensions/runtime-registrations.js +4 -1
  157. package/dist/core/extensions/runtime-registrations.js.map +1 -1
  158. package/dist/core/fs/fs-utils.js +4 -1
  159. package/dist/core/fs/fs-utils.js.map +1 -1
  160. package/dist/core/fs/index.js +4 -1
  161. package/dist/core/fs/index.js.map +1 -1
  162. package/dist/core/history/history-stream-policy.js +4 -1
  163. package/dist/core/history/history-stream-policy.js.map +1 -1
  164. package/dist/core/history/history.js +4 -1
  165. package/dist/core/history/history.js.map +1 -1
  166. package/dist/core/history/index.js +4 -1
  167. package/dist/core/history/index.js.map +1 -1
  168. package/dist/core/item/id.js +4 -1
  169. package/dist/core/item/id.js.map +1 -1
  170. package/dist/core/item/index.js +4 -1
  171. package/dist/core/item/index.js.map +1 -1
  172. package/dist/core/item/item-format.js +241 -2
  173. package/dist/core/item/item-format.js.map +1 -1
  174. package/dist/core/item/parent-reference-policy.js +4 -1
  175. package/dist/core/item/parent-reference-policy.js.map +1 -1
  176. package/dist/core/item/parse.js +33 -3
  177. package/dist/core/item/parse.js.map +1 -1
  178. package/dist/core/item/sprint-release-format.js +4 -1
  179. package/dist/core/item/sprint-release-format.js.map +1 -1
  180. package/dist/core/item/status.js +4 -1
  181. package/dist/core/item/status.js.map +1 -1
  182. package/dist/core/item/type-registry.js +4 -1
  183. package/dist/core/item/type-registry.js.map +1 -1
  184. package/dist/core/lock/index.js +4 -1
  185. package/dist/core/lock/index.js.map +1 -1
  186. package/dist/core/lock/lock.js +4 -1
  187. package/dist/core/lock/lock.js.map +1 -1
  188. package/dist/core/output/command-aware.js +4 -1
  189. package/dist/core/output/command-aware.js.map +1 -1
  190. package/dist/core/output/output.d.ts +4 -0
  191. package/dist/core/output/output.js +47 -6
  192. package/dist/core/output/output.js.map +1 -1
  193. package/dist/core/packages/manifest.d.ts +1 -0
  194. package/dist/core/packages/manifest.js +5 -1
  195. package/dist/core/packages/manifest.js.map +1 -1
  196. package/dist/core/packages/root.d.ts +3 -0
  197. package/dist/core/packages/root.js +51 -0
  198. package/dist/core/packages/root.js.map +1 -0
  199. package/dist/core/schema/runtime-field-filters.js +4 -1
  200. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  201. package/dist/core/schema/runtime-field-values.js +4 -1
  202. package/dist/core/schema/runtime-field-values.js.map +1 -1
  203. package/dist/core/schema/runtime-schema.js +4 -1
  204. package/dist/core/schema/runtime-schema.js.map +1 -1
  205. package/dist/core/search/cache.js +7 -2
  206. package/dist/core/search/cache.js.map +1 -1
  207. package/dist/core/search/corpus.d.ts +2 -0
  208. package/dist/core/search/corpus.js +77 -2
  209. package/dist/core/search/corpus.js.map +1 -1
  210. package/dist/core/search/embedding-batches.js +21 -7
  211. package/dist/core/search/embedding-batches.js.map +1 -1
  212. package/dist/core/search/http-client.js +4 -1
  213. package/dist/core/search/http-client.js.map +1 -1
  214. package/dist/core/search/providers.js +4 -1
  215. package/dist/core/search/providers.js.map +1 -1
  216. package/dist/core/search/semantic-defaults.js +11 -2
  217. package/dist/core/search/semantic-defaults.js.map +1 -1
  218. package/dist/core/search/vector-stores.js +4 -1
  219. package/dist/core/search/vector-stores.js.map +1 -1
  220. package/dist/core/sentry/helpers.js +4 -1
  221. package/dist/core/sentry/helpers.js.map +1 -1
  222. package/dist/core/sentry/instrument.js +10 -13
  223. package/dist/core/sentry/instrument.js.map +1 -1
  224. package/dist/core/shared/command-types.js +4 -1
  225. package/dist/core/shared/command-types.js.map +1 -1
  226. package/dist/core/shared/conflict-markers.js +4 -1
  227. package/dist/core/shared/conflict-markers.js.map +1 -1
  228. package/dist/core/shared/constants.d.ts +2 -2
  229. package/dist/core/shared/constants.js +24 -1
  230. package/dist/core/shared/constants.js.map +1 -1
  231. package/dist/core/shared/errors.js +4 -1
  232. package/dist/core/shared/errors.js.map +1 -1
  233. package/dist/core/shared/index.js +4 -1
  234. package/dist/core/shared/index.js.map +1 -1
  235. package/dist/core/shared/levenshtein.js +4 -1
  236. package/dist/core/shared/levenshtein.js.map +1 -1
  237. package/dist/core/shared/primitives.js +4 -1
  238. package/dist/core/shared/primitives.js.map +1 -1
  239. package/dist/core/shared/serialization.js +4 -1
  240. package/dist/core/shared/serialization.js.map +1 -1
  241. package/dist/core/shared/text-normalization.js +4 -1
  242. package/dist/core/shared/text-normalization.js.map +1 -1
  243. package/dist/core/shared/time.js +4 -1
  244. package/dist/core/shared/time.js.map +1 -1
  245. package/dist/core/store/front-matter-cache.js +8 -3
  246. package/dist/core/store/front-matter-cache.js.map +1 -1
  247. package/dist/core/store/index.js +4 -1
  248. package/dist/core/store/index.js.map +1 -1
  249. package/dist/core/store/item-format-migration.js +4 -1
  250. package/dist/core/store/item-format-migration.js.map +1 -1
  251. package/dist/core/store/item-store.d.ts +2 -0
  252. package/dist/core/store/item-store.js +66 -3
  253. package/dist/core/store/item-store.js.map +1 -1
  254. package/dist/core/store/paths.js +4 -1
  255. package/dist/core/store/paths.js.map +1 -1
  256. package/dist/core/store/settings.js +39 -1
  257. package/dist/core/store/settings.js.map +1 -1
  258. package/dist/core/telemetry/consent.js +4 -1
  259. package/dist/core/telemetry/consent.js.map +1 -1
  260. package/dist/core/telemetry/observability.d.ts +1 -1
  261. package/dist/core/telemetry/observability.js +11 -2
  262. package/dist/core/telemetry/observability.js.map +1 -1
  263. package/dist/core/telemetry/runtime.js +31 -5
  264. package/dist/core/telemetry/runtime.js.map +1 -1
  265. package/dist/core/test/background-runs.js +4 -1
  266. package/dist/core/test/background-runs.js.map +1 -1
  267. package/dist/core/test/item-test-run-tracking.js +4 -1
  268. package/dist/core/test/item-test-run-tracking.js.map +1 -1
  269. package/dist/mcp/server.js +123 -14
  270. package/dist/mcp/server.js.map +1 -1
  271. package/dist/sdk/cli-contracts/commander-mutation-options.js +10 -3
  272. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -1
  273. package/dist/sdk/cli-contracts/commander-types.js +4 -1
  274. package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
  275. package/dist/sdk/cli-contracts.d.ts +6 -2
  276. package/dist/sdk/cli-contracts.js +213 -20
  277. package/dist/sdk/cli-contracts.js.map +1 -1
  278. package/dist/sdk/index.js +4 -1
  279. package/dist/sdk/index.js.map +1 -1
  280. package/dist/sdk/runtime.js +4 -1
  281. package/dist/sdk/runtime.js.map +1 -1
  282. package/dist/types/index.js +4 -1
  283. package/dist/types/index.js.map +1 -1
  284. package/dist/types.d.ts +86 -2
  285. package/dist/types.js +34 -1
  286. package/dist/types.js.map +1 -1
  287. package/docs/AGENT_GUIDE.md +16 -6
  288. package/docs/CLAUDE_CODE_PLUGIN.md +10 -10
  289. package/docs/CODEX_PLUGIN.md +2 -2
  290. package/docs/COMMANDS.md +80 -8
  291. package/docs/CONFIGURATION.md +4 -1
  292. package/docs/EXTENSIONS.md +158 -814
  293. package/docs/QUICKSTART.md +11 -5
  294. package/docs/README.md +7 -6
  295. package/docs/RELEASING.md +2 -2
  296. package/docs/TESTING.md +2 -2
  297. package/marketplace.json +3 -3
  298. package/package.json +4 -2
  299. package/packages/pm-beads/package.json +1 -1
  300. package/packages/pm-calendar/README.md +1 -1
  301. package/packages/pm-calendar/extensions/calendar/index.js +1 -1
  302. package/packages/pm-calendar/extensions/calendar/index.ts +1 -1
  303. package/packages/pm-calendar/extensions/calendar/runtime.js +26 -7
  304. package/packages/pm-calendar/extensions/calendar/runtime.ts +26 -7
  305. package/packages/pm-calendar/package.json +1 -1
  306. package/packages/pm-governance-audit/package.json +1 -1
  307. package/packages/pm-guide-shell/extensions/guide-shell/index.js +1 -1
  308. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +1 -1
  309. package/packages/pm-guide-shell/package.json +1 -1
  310. package/packages/pm-linked-test-adapters/package.json +1 -1
  311. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +1 -1
  312. package/packages/pm-search-advanced/package.json +1 -1
  313. package/packages/pm-templates/README.md +1 -1
  314. package/packages/pm-templates/package.json +1 -1
  315. package/packages/pm-todos/package.json +1 -1
  316. package/plugins/{pm-cli-claude → pm-claude}/.claude-plugin/plugin.json +2 -2
  317. package/plugins/{pm-cli-claude → pm-claude}/.mcp.json +1 -1
  318. package/plugins/{pm-cli-claude → pm-claude}/README.md +4 -4
  319. package/plugins/{pm-cli-claude → pm-claude}/agents/pm-coordinator.md +1 -1
  320. package/plugins/{pm-cli-claude → pm-claude}/commands/pm-init.md +10 -1
  321. package/plugins/{pm-cli-claude → pm-claude}/commands/pm-planner.md +18 -0
  322. package/plugins/{pm-cli-claude → pm-claude}/skills/pm-planner/SKILL.md +46 -1
  323. package/plugins/{pm-cli-codex → pm-codex}/.codex-plugin/plugin.json +3 -3
  324. package/plugins/{pm-cli-codex → pm-codex}/.mcp.json +1 -1
  325. package/plugins/{pm-cli-codex → pm-codex}/README.md +7 -4
  326. package/plugins/pm-codex/skills/pm-native/SKILL.md +81 -0
  327. package/scripts/finalize-build.mjs +28 -0
  328. package/scripts/prepare-build-cache.mjs +37 -0
  329. package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +0 -57
  330. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-delivery-chain.md +0 -0
  331. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-triage-agent.md +0 -0
  332. /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-verification-agent.md +0 -0
  333. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-audit.md +0 -0
  334. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-calendar.md +0 -0
  335. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-close-task.md +0 -0
  336. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-developer.md +0 -0
  337. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-list.md +0 -0
  338. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-new.md +0 -0
  339. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-release.md +0 -0
  340. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-search.md +0 -0
  341. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-start-task.md +0 -0
  342. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-status.md +0 -0
  343. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-triage.md +0 -0
  344. /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-workflow.md +0 -0
  345. /package/plugins/{pm-cli-claude → pm-claude}/hooks/hooks.json +0 -0
  346. /package/plugins/{pm-cli-claude → pm-claude}/hooks/session-start.mjs +0 -0
  347. /package/plugins/{pm-cli-claude → pm-claude}/scripts/pm-mcp-server.mjs +0 -0
  348. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-audit/SKILL.md +0 -0
  349. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-developer/SKILL.md +0 -0
  350. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-release/SKILL.md +0 -0
  351. /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-workflow/SKILL.md +0 -0
  352. /package/plugins/{pm-cli-codex → pm-codex}/assets/pm-cli-small.svg +0 -0
  353. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-audit.md +0 -0
  354. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-close-task.md +0 -0
  355. /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-start-task.md +0 -0
  356. /package/plugins/{pm-cli-codex → pm-codex}/scripts/pm-mcp-server.mjs +0 -0
  357. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/SKILL.md +0 -0
  358. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/agents/openai.yaml +0 -0
  359. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-native/agents/openai.yaml +0 -0
  360. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/SKILL.md +0 -0
  361. /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/agents/openai.yaml +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"background-runs.js","sourceRoot":"/","sources":["core/test/background-runs.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport { ensureDir, pathExists, readFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport {\n getTestRunRecordPath,\n getTestRunResultPath,\n getTestRunStderrPath,\n getTestRunStdoutPath,\n getTestRunsPath,\n getTestRunsRecordsPath,\n getTestRunsResultsPath,\n getTestRunsStderrPath,\n getTestRunsStdoutPath,\n} from \"../store/paths.js\";\n\nconst BACKGROUND_RUN_ACTIVE_STATUSES = new Set<BackgroundTestRunStatus>([\"queued\", \"running\"]);\nconst BACKGROUND_RUN_TERMINAL_STATUSES = new Set<BackgroundTestRunStatus>([\"passed\", \"failed\", \"stopped\", \"canceled\"]);\nconst DEFAULT_BACKGROUND_RUN_RESOURCE_SNAPSHOT_INTERVAL_MS = 3000;\nconst DEFAULT_BACKGROUND_RUN_FORCE_KILL_DELAY_MS = 3000;\nconst DEFAULT_BACKGROUND_RUN_HEARTBEAT_STALE_MS = 30000;\nconst DEFAULT_BACKGROUND_RUN_LOG_TAIL_LINES = 100;\nconst PROC_STAT_TICKS_PER_SECOND = 100;\n\nexport type BackgroundTestRunKind = \"test\" | \"test-all\";\n\nexport type BackgroundTestRunStatus = \"queued\" | \"running\" | \"passed\" | \"failed\" | \"stopped\" | \"canceled\";\n\nexport type BackgroundLogStream = \"stdout\" | \"stderr\" | \"both\";\n\nexport interface BackgroundRunProgress {\n phase: \"queued\" | \"running\" | \"stopping\" | \"finished\";\n message?: string;\n linked_test_index?: number;\n linked_test_total?: number;\n elapsed_ms?: number;\n heartbeat_at?: string;\n}\n\nexport interface BackgroundRunResourceSnapshot {\n recorded_at: string;\n rss_bytes?: number;\n cpu_user_seconds?: number;\n cpu_system_seconds?: number;\n uptime_seconds?: number;\n}\n\nexport interface BackgroundRunSummary {\n items?: number;\n linked_tests?: number;\n passed: number;\n failed: number;\n skipped: number;\n fail_on_skipped_triggered?: boolean;\n}\n\nexport interface BackgroundTestRunRecord {\n id: string;\n kind: BackgroundTestRunKind;\n status: BackgroundTestRunStatus;\n created_at: string;\n started_at?: string;\n finished_at?: string;\n updated_at: string;\n requested_by: string;\n fingerprint: string;\n command_args: string[];\n command_label: string;\n pm_root: string;\n global_pm_root: string;\n target_id?: string;\n status_filter?: string;\n attempt: number;\n resumed_from?: string;\n resumed_by?: string;\n worker_pid?: number;\n child_pid?: number;\n exit_code?: number;\n signal?: string;\n stdout_path: string;\n stderr_path: string;\n result_path: string;\n progress?: BackgroundRunProgress;\n resource?: BackgroundRunResourceSnapshot;\n summary?: BackgroundRunSummary;\n stop_requested_at?: string;\n duplicate_of?: string;\n error?: string;\n}\n\nexport interface StartBackgroundTestRunOptions {\n pmRoot: string;\n globalPmRoot: string;\n kind: BackgroundTestRunKind;\n commandArgs: string[];\n requestedBy: string;\n targetId?: string;\n statusFilter?: string;\n resumedFrom?: string;\n resumedBy?: string;\n attempt?: number;\n}\n\nexport interface StartBackgroundTestRunResult {\n started: boolean;\n run: BackgroundTestRunRecord;\n duplicate_of?: string;\n}\n\nexport interface SpawnBackgroundTestRunWorkerOptions {\n pmRoot: string;\n runId: string;\n noExtensions?: boolean;\n}\n\nexport interface StopBackgroundTestRunResult {\n run: BackgroundTestRunRecord;\n signal_sent: \"SIGTERM\" | \"SIGKILL\" | \"none\";\n}\n\nexport interface ListBackgroundTestRunOptions {\n status?: BackgroundTestRunStatus;\n limit?: number;\n}\n\nexport interface BackgroundRunHealth {\n state: \"healthy\" | \"stale\" | \"inactive\";\n last_heartbeat_at?: string;\n heartbeat_lag_ms?: number;\n worker_alive: boolean;\n child_alive: boolean;\n}\n\nexport interface BackgroundRunStatusView {\n run: BackgroundTestRunRecord;\n health: BackgroundRunHealth;\n}\n\nexport interface BackgroundRunLogsResult {\n run: BackgroundTestRunRecord;\n stream: BackgroundLogStream;\n tail: number;\n stdout: string[];\n stderr: string[];\n}\n\ninterface WorkerEvaluationResult {\n summary: BackgroundRunSummary;\n parsedResult: unknown | null;\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction normalizeCommandArgs(args: string[]): string[] {\n return args.map((entry) => entry.trim()).filter((entry) => entry.length > 0);\n}\n\nfunction summarizeCommandLabel(args: string[]): string {\n const joined = args.join(\" \").replaceAll(/\\s+/g, \" \").trim();\n if (joined.length <= 180) {\n return joined;\n }\n return `${joined.slice(0, 177)}...`;\n}\n\nfunction buildRunId(): string {\n const timePart = Date.now().toString(36);\n const randomPart = randomBytes(3).toString(\"hex\");\n return `tr-${timePart}-${randomPart}`;\n}\n\nexport function buildBackgroundTestRunFingerprint(kind: BackgroundTestRunKind, commandArgs: string[], pmRoot: string): string {\n const payload = {\n kind,\n command: normalizeCommandArgs(commandArgs),\n pm_root: path.resolve(pmRoot),\n };\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n}\n\nfunction isPidRunning(pid: number | undefined): boolean {\n if (!Number.isInteger(pid) || !pid || pid <= 0) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (error: unknown) {\n const code = typeof error === \"object\" && error !== null && \"code\" in error ? (error as { code?: string }).code : undefined;\n return code === \"EPERM\";\n }\n}\n\nasync function ensureBackgroundRunStorage(pmRoot: string): Promise<void> {\n await ensureDir(getTestRunsPath(pmRoot));\n await ensureDir(getTestRunsRecordsPath(pmRoot));\n await ensureDir(getTestRunsStdoutPath(pmRoot));\n await ensureDir(getTestRunsStderrPath(pmRoot));\n await ensureDir(getTestRunsResultsPath(pmRoot));\n}\n\nasync function parseBackgroundRunRecord(raw: string, recordPath: string): Promise<BackgroundTestRunRecord> {\n try {\n const parsed = JSON.parse(raw) as BackgroundTestRunRecord;\n if (!parsed || typeof parsed !== \"object\" || typeof parsed.id !== \"string\") {\n throw new Error(\"invalid run record payload\");\n }\n return parsed;\n } catch (error: unknown) {\n throw new PmCliError(\n `Failed to parse background test run record at ${recordPath}: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\nasync function writeBackgroundRunRecord(pmRoot: string, record: BackgroundTestRunRecord): Promise<void> {\n const next: BackgroundTestRunRecord = {\n ...record,\n updated_at: nowIso(),\n };\n await writeFileAtomic(getTestRunRecordPath(pmRoot, record.id), `${JSON.stringify(next, null, 2)}\\n`);\n}\n\nexport async function readBackgroundTestRunRecord(pmRoot: string, runId: string): Promise<BackgroundTestRunRecord | null> {\n const recordPath = getTestRunRecordPath(pmRoot, runId);\n const raw = await readFileIfExists(recordPath);\n if (!raw) {\n return null;\n }\n return parseBackgroundRunRecord(raw, recordPath);\n}\n\nasync function listBackgroundRunRecordPaths(pmRoot: string): Promise<string[]> {\n const recordsRoot = getTestRunsRecordsPath(pmRoot);\n if (!(await pathExists(recordsRoot))) {\n return [];\n }\n const entries = await fs.readdir(recordsRoot, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => path.join(recordsRoot, entry.name))\n .sort((left, right) => right.localeCompare(left));\n}\n\nasync function readLinuxRssBytes(pid: number): Promise<number | undefined> {\n if (process.platform !== \"linux\") {\n return undefined;\n }\n try {\n const raw = await fs.readFile(`/proc/${pid}/status`, \"utf8\");\n const match = raw.match(/^VmRSS:\\s+(\\d+)\\s+kB$/m);\n if (!match) {\n return undefined;\n }\n const value = Number.parseInt(match[1] ?? \"\", 10);\n if (!Number.isFinite(value)) {\n return undefined;\n }\n return value * 1024;\n } catch {\n return undefined;\n }\n}\n\nasync function readLinuxCpuSeconds(\n pid: number,\n): Promise<{ cpu_user_seconds?: number; cpu_system_seconds?: number }> {\n if (process.platform !== \"linux\") {\n return {};\n }\n try {\n const raw = await fs.readFile(`/proc/${pid}/stat`, \"utf8\");\n const closeParenIndex = raw.lastIndexOf(\")\");\n if (closeParenIndex < 0) {\n return {};\n }\n const remainder = raw.slice(closeParenIndex + 2).trim();\n const parts = remainder.split(/\\s+/);\n const utimeTicks = Number.parseInt(parts[11] ?? \"\", 10);\n const stimeTicks = Number.parseInt(parts[12] ?? \"\", 10);\n if (!Number.isFinite(utimeTicks) || !Number.isFinite(stimeTicks)) {\n return {};\n }\n return {\n cpu_user_seconds: utimeTicks / PROC_STAT_TICKS_PER_SECOND,\n cpu_system_seconds: stimeTicks / PROC_STAT_TICKS_PER_SECOND,\n };\n } catch {\n return {};\n }\n}\n\nasync function buildResourceSnapshot(record: BackgroundTestRunRecord): Promise<BackgroundRunResourceSnapshot | undefined> {\n const pid = record.child_pid ?? record.worker_pid;\n if (!isPidRunning(pid)) {\n return undefined;\n }\n const rssBytes = await readLinuxRssBytes(pid as number);\n const cpu = await readLinuxCpuSeconds(pid as number);\n const startedAtMs = record.started_at ? Date.parse(record.started_at) : Number.NaN;\n const uptimeSeconds = Number.isFinite(startedAtMs) ? Math.max(0, (nowMs() - startedAtMs) / 1000) : undefined;\n return {\n recorded_at: nowIso(),\n rss_bytes: rssBytes,\n cpu_user_seconds: cpu.cpu_user_seconds,\n cpu_system_seconds: cpu.cpu_system_seconds,\n uptime_seconds: uptimeSeconds,\n };\n}\n\nfunction readCount(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nfunction evaluateWorkerResult(kind: BackgroundTestRunKind, payload: unknown): WorkerEvaluationResult {\n if (!payload || typeof payload !== \"object\") {\n return {\n summary: {\n passed: 0,\n failed: 1,\n skipped: 0,\n },\n parsedResult: null,\n };\n }\n const record = payload as Record<string, unknown>;\n if (kind === \"test-all\") {\n const totals = (record.totals ?? {}) as Record<string, unknown>;\n return {\n summary: {\n items: typeof totals.items === \"number\" ? totals.items : undefined,\n linked_tests: typeof totals.linked_tests === \"number\" ? totals.linked_tests : undefined,\n passed: readCount(totals.passed),\n failed: readCount(totals.failed),\n skipped: readCount(totals.skipped),\n fail_on_skipped_triggered: record.fail_on_skipped_triggered === true ? true : undefined,\n },\n parsedResult: payload,\n };\n }\n const runResults = Array.isArray(record.run_results) ? record.run_results : [];\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n for (const entry of runResults) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const status = (entry as { status?: unknown }).status;\n if (status === \"passed\") {\n passed += 1;\n continue;\n }\n if (status === \"failed\") {\n failed += 1;\n continue;\n }\n skipped += 1;\n }\n return {\n summary: {\n passed,\n failed,\n skipped,\n fail_on_skipped_triggered: record.fail_on_skipped_triggered === true ? true : undefined,\n },\n parsedResult: payload,\n };\n}\n\nfunction parseProgressLine(stderrLine: string): Partial<BackgroundRunProgress> | null {\n const line = stderrLine.trim();\n if (line.length === 0) {\n return null;\n }\n const match = line.match(/\\[pm test\\]\\s+linked-test\\s+(\\d+)\\/(\\d+)\\s+(start|running|end)(?:.*elapsed_ms=(\\d+))?/i);\n if (!match) {\n return null;\n }\n const index = Number.parseInt(match[1] ?? \"\", 10);\n const total = Number.parseInt(match[2] ?? \"\", 10);\n const elapsed = match[4] ? Number.parseInt(match[4], 10) : undefined;\n return {\n linked_test_index: Number.isFinite(index) ? index : undefined,\n linked_test_total: Number.isFinite(total) ? total : undefined,\n elapsed_ms: Number.isFinite(elapsed) ? elapsed : undefined,\n heartbeat_at: nowIso(),\n phase: match[3]?.toLowerCase() === \"end\" ? \"finished\" : \"running\",\n };\n}\n\nfunction splitLines(value: string): string[] {\n return value\n .split(/\\r?\\n/)\n .map((entry) => entry.trimEnd())\n .filter((entry) => entry.length > 0);\n}\n\nfunction tailLines(value: string, limit: number): string[] {\n if (limit <= 0) {\n return [];\n }\n const lines = splitLines(value);\n if (lines.length <= limit) {\n return lines;\n }\n return lines.slice(lines.length - limit);\n}\n\nasync function resolveBackgroundCliEntry(cwd: string): Promise<string> {\n const configured = process.env.PM_BACKGROUND_CLI_ENTRY?.trim();\n if (configured && configured.length > 0) {\n const resolvedConfigured = path.resolve(cwd, configured);\n if (await pathExists(resolvedConfigured)) {\n return resolvedConfigured;\n }\n }\n const distEntry = path.resolve(cwd, \"dist\", \"cli.js\");\n if (await pathExists(distEntry)) {\n return distEntry;\n }\n const argvEntry = process.argv[1]?.trim();\n if (argvEntry && argvEntry.length > 0) {\n const resolvedArgvEntry = path.resolve(cwd, argvEntry);\n if (await pathExists(resolvedArgvEntry)) {\n return resolvedArgvEntry;\n }\n }\n throw new PmCliError(\n \"Unable to resolve a CLI entrypoint for background test runs. Build the project or set PM_BACKGROUND_CLI_ENTRY.\",\n EXIT_CODE.GENERIC_FAILURE,\n );\n}\n\nasync function refreshRunIfStale(pmRoot: string, record: BackgroundTestRunRecord): Promise<BackgroundTestRunRecord> {\n if (!BACKGROUND_RUN_ACTIVE_STATUSES.has(record.status)) {\n return record;\n }\n const workerAlive = isPidRunning(record.worker_pid);\n if (workerAlive) {\n return record;\n }\n if (record.finished_at) {\n return record;\n }\n const next: BackgroundTestRunRecord = {\n ...record,\n status: \"failed\",\n finished_at: nowIso(),\n error: record.error ?? \"Background test run worker exited before writing terminal status.\",\n };\n await writeBackgroundRunRecord(pmRoot, next);\n return next;\n}\n\nexport async function startBackgroundTestRun(options: StartBackgroundTestRunOptions): Promise<StartBackgroundTestRunResult> {\n await ensureBackgroundRunStorage(options.pmRoot);\n const normalizedArgs = normalizeCommandArgs(options.commandArgs);\n if (normalizedArgs.length === 0) {\n throw new PmCliError(\"Background test run requires command arguments.\", EXIT_CODE.USAGE);\n }\n const fingerprint = buildBackgroundTestRunFingerprint(options.kind, normalizedArgs, options.pmRoot);\n const existingRuns = await listBackgroundTestRuns(options.pmRoot, {});\n for (const existing of existingRuns) {\n const refreshed = await refreshRunIfStale(options.pmRoot, existing);\n if (refreshed.fingerprint !== fingerprint) {\n continue;\n }\n if (!BACKGROUND_RUN_ACTIVE_STATUSES.has(refreshed.status)) {\n continue;\n }\n if (!isPidRunning(refreshed.worker_pid)) {\n continue;\n }\n return {\n started: false,\n run: {\n ...refreshed,\n duplicate_of: refreshed.id,\n },\n duplicate_of: refreshed.id,\n };\n }\n\n const runId = buildRunId();\n const createdAt = nowIso();\n const stdoutPath = getTestRunStdoutPath(options.pmRoot, runId);\n const stderrPath = getTestRunStderrPath(options.pmRoot, runId);\n const resultPath = getTestRunResultPath(options.pmRoot, runId);\n await fs.writeFile(stdoutPath, \"\", \"utf8\");\n await fs.writeFile(stderrPath, \"\", \"utf8\");\n const record: BackgroundTestRunRecord = {\n id: runId,\n kind: options.kind,\n status: \"queued\",\n created_at: createdAt,\n updated_at: createdAt,\n requested_by: options.requestedBy,\n fingerprint,\n command_args: normalizedArgs,\n command_label: summarizeCommandLabel(normalizedArgs),\n pm_root: options.pmRoot,\n global_pm_root: options.globalPmRoot,\n target_id: options.targetId,\n status_filter: options.statusFilter,\n attempt: typeof options.attempt === \"number\" && Number.isFinite(options.attempt) && options.attempt >= 1\n ? Math.floor(options.attempt)\n : 1,\n resumed_from: options.resumedFrom,\n resumed_by: options.resumedBy,\n stdout_path: stdoutPath,\n stderr_path: stderrPath,\n result_path: resultPath,\n progress: {\n phase: \"queued\",\n message: \"Queued for background execution.\",\n heartbeat_at: createdAt,\n },\n };\n await writeBackgroundRunRecord(options.pmRoot, record);\n return {\n started: true,\n run: record,\n };\n}\n\nexport async function spawnBackgroundTestRunWorker(options: SpawnBackgroundTestRunWorkerOptions): Promise<BackgroundTestRunRecord> {\n const record = await readBackgroundTestRunRecord(options.pmRoot, options.runId);\n if (!record) {\n throw new PmCliError(`Background test run ${options.runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n if (BACKGROUND_RUN_TERMINAL_STATUSES.has(record.status)) {\n throw new PmCliError(`Background test run ${record.id} is already terminal (${record.status}).`, EXIT_CODE.CONFLICT);\n }\n const cliEntry = await resolveBackgroundCliEntry(process.cwd());\n const args: string[] = [];\n if (options.noExtensions === true) {\n args.push(\"--no-extensions\");\n }\n args.push(\"--path\", record.pm_root, \"test-runs-worker\", record.id);\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n PM_PATH: record.pm_root,\n PM_GLOBAL_PATH: record.global_pm_root,\n PM_BACKGROUND_TEST_RUN_ID: record.id,\n PM_BACKGROUND_TEST_RUN_ATTEMPT: String(record.attempt),\n PM_BACKGROUND_TEST_RUN_RESUMED_FROM: record.resumed_from ?? \"\",\n FORCE_COLOR: \"0\",\n };\n const child = spawn(process.execPath, [cliEntry, ...args], {\n cwd: process.cwd(),\n env,\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n });\n child.unref();\n const next: BackgroundTestRunRecord = {\n ...record,\n status: \"queued\",\n worker_pid: child.pid && child.pid > 0 ? child.pid : record.worker_pid,\n progress: {\n phase: \"queued\",\n message: \"Worker process started.\",\n heartbeat_at: nowIso(),\n },\n };\n await writeBackgroundRunRecord(options.pmRoot, next);\n return next;\n}\n\nasync function appendFileOrdered(queue: Promise<void>, filePath: string, text: string): Promise<void> {\n await queue;\n await fs.appendFile(filePath, text, \"utf8\");\n}\n\nexport async function runBackgroundTestRunWorker(pmRoot: string, runId: string, noExtensions = false): Promise<BackgroundTestRunRecord> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const record: BackgroundTestRunRecord = {\n ...loaded,\n status: \"running\",\n started_at: loaded.started_at ?? nowIso(),\n worker_pid: process.pid,\n progress: {\n phase: \"running\",\n message: \"Worker started.\",\n heartbeat_at: nowIso(),\n },\n };\n const cliEntry = await resolveBackgroundCliEntry(process.cwd());\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n PM_PATH: record.pm_root,\n PM_GLOBAL_PATH: record.global_pm_root,\n FORCE_COLOR: \"0\",\n };\n await writeBackgroundRunRecord(pmRoot, record);\n\n const childArgs = noExtensions ? [\"--no-extensions\", ...record.command_args] : [...record.command_args];\n const child = spawn(process.execPath, [cliEntry, ...childArgs], {\n cwd: process.cwd(),\n env,\n detached: false,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n record.child_pid = child.pid && child.pid > 0 ? child.pid : undefined;\n\n let writeQueue: Promise<void> = Promise.resolve();\n const scheduleRecordWrite = (): void => {\n writeQueue = writeQueue.then(async () => {\n await writeBackgroundRunRecord(pmRoot, record);\n }).catch(() => {\n // Keep worker alive even if a single metadata write fails.\n });\n };\n\n let stdoutWriteQueue: Promise<void> = Promise.resolve();\n let stderrWriteQueue: Promise<void> = Promise.resolve();\n let stdoutBuffer = \"\";\n let stopRequested = false;\n\n const requestStop = async (): Promise<void> => {\n if (stopRequested) {\n return;\n }\n stopRequested = true;\n record.stop_requested_at = nowIso();\n record.progress = {\n ...record.progress,\n phase: \"stopping\",\n message: \"Stop requested for background run.\",\n heartbeat_at: nowIso(),\n };\n scheduleRecordWrite();\n if (!child.pid || child.pid <= 0) {\n return;\n }\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Child may already be gone.\n }\n const forceKillDelayMs = Number.parseInt(process.env.PM_BACKGROUND_RUN_FORCE_KILL_DELAY_MS ?? \"\", 10);\n const delay = Number.isFinite(forceKillDelayMs) && forceKillDelayMs > 0\n ? forceKillDelayMs\n : DEFAULT_BACKGROUND_RUN_FORCE_KILL_DELAY_MS;\n const forceTimer = setTimeout(() => {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // Child may already be gone.\n }\n }, delay);\n forceTimer.unref?.();\n };\n\n const onSignal = (): void => {\n void requestStop();\n };\n process.on(\"SIGTERM\", onSignal);\n process.on(\"SIGINT\", onSignal);\n\n const resourceIntervalMs = Number.parseInt(process.env.PM_BACKGROUND_RUN_RESOURCE_INTERVAL_MS ?? \"\", 10);\n const resourceInterval = Number.isFinite(resourceIntervalMs) && resourceIntervalMs > 0\n ? resourceIntervalMs\n : DEFAULT_BACKGROUND_RUN_RESOURCE_SNAPSHOT_INTERVAL_MS;\n const resourceTimer = setInterval(() => {\n void (async () => {\n record.resource = await buildResourceSnapshot(record);\n if (record.progress) {\n record.progress.heartbeat_at = nowIso();\n }\n scheduleRecordWrite();\n })();\n }, resourceInterval);\n resourceTimer.unref?.();\n\n child.stdout?.on(\"data\", (chunk) => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n stdoutBuffer += text;\n stdoutWriteQueue = appendFileOrdered(stdoutWriteQueue, record.stdout_path, text);\n });\n child.stderr?.on(\"data\", (chunk) => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n stderrWriteQueue = appendFileOrdered(stderrWriteQueue, record.stderr_path, text);\n const lines = splitLines(text);\n const latestLine = lines.at(-1);\n if (latestLine) {\n const progressPatch = parseProgressLine(latestLine);\n record.progress = {\n phase: record.progress?.phase ?? \"running\",\n message: latestLine,\n heartbeat_at: nowIso(),\n linked_test_index: progressPatch?.linked_test_index ?? record.progress?.linked_test_index,\n linked_test_total: progressPatch?.linked_test_total ?? record.progress?.linked_test_total,\n elapsed_ms: progressPatch?.elapsed_ms ?? record.progress?.elapsed_ms,\n };\n if (progressPatch?.phase === \"finished\" && !stopRequested) {\n record.progress.phase = \"running\";\n }\n scheduleRecordWrite();\n }\n });\n\n let exitCode: number | null = null;\n let signal: NodeJS.Signals | null = null;\n try {\n ({ code: exitCode, signal } = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => {\n child.on(\"close\", (code, closeSignal) => {\n resolve({ code, signal: closeSignal });\n });\n }));\n } finally {\n clearInterval(resourceTimer);\n process.off(\"SIGTERM\", onSignal);\n process.off(\"SIGINT\", onSignal);\n }\n\n await stdoutWriteQueue;\n await stderrWriteQueue;\n\n let parsedResult: unknown | null = null;\n if (stdoutBuffer.trim().length > 0) {\n try {\n parsedResult = JSON.parse(stdoutBuffer);\n } catch {\n parsedResult = null;\n }\n }\n const evaluated = evaluateWorkerResult(record.kind, parsedResult);\n record.summary = evaluated.summary;\n record.exit_code = typeof exitCode === \"number\" ? exitCode : undefined;\n record.signal = signal ?? undefined;\n record.finished_at = nowIso();\n record.status = stopRequested\n ? \"stopped\"\n : (record.exit_code === 0 &&\n (record.summary.failed ?? 0) === 0 &&\n record.summary.fail_on_skipped_triggered !== true)\n ? \"passed\"\n : \"failed\";\n record.progress = {\n phase: \"finished\",\n message: stopRequested ? \"Background run stopped.\" : `Background run finished with status=${record.status}.`,\n heartbeat_at: nowIso(),\n linked_test_index: record.progress?.linked_test_index,\n linked_test_total: record.progress?.linked_test_total,\n elapsed_ms: record.progress?.elapsed_ms,\n };\n record.resource = await buildResourceSnapshot(record);\n if (parsedResult !== null) {\n await writeFileAtomic(record.result_path, `${JSON.stringify(parsedResult, null, 2)}\\n`);\n } else {\n await writeFileAtomic(\n record.result_path,\n `${JSON.stringify(\n {\n parse_error: \"Background run output was not valid JSON.\",\n stdout_excerpt: tailLines(stdoutBuffer, DEFAULT_BACKGROUND_RUN_LOG_TAIL_LINES),\n },\n null,\n 2,\n )}\\n`,\n );\n }\n await writeBackgroundRunRecord(pmRoot, record);\n await writeQueue;\n return record;\n}\n\nexport async function listBackgroundTestRuns(\n pmRoot: string,\n options: ListBackgroundTestRunOptions,\n): Promise<BackgroundTestRunRecord[]> {\n const recordPaths = await listBackgroundRunRecordPaths(pmRoot);\n const runs: BackgroundTestRunRecord[] = [];\n for (const recordPath of recordPaths) {\n const raw = await readFileIfExists(recordPath);\n if (!raw) {\n continue;\n }\n const parsed = await parseBackgroundRunRecord(raw, recordPath);\n runs.push(parsed);\n }\n const refreshed: BackgroundTestRunRecord[] = [];\n for (const run of runs) {\n refreshed.push(await refreshRunIfStale(pmRoot, run));\n }\n const filtered = options.status ? refreshed.filter((entry) => entry.status === options.status) : refreshed;\n const sorted = filtered.sort((left, right) => {\n const byUpdated = Date.parse(right.updated_at) - Date.parse(left.updated_at);\n if (Number.isFinite(byUpdated) && byUpdated !== 0) {\n return byUpdated;\n }\n return right.id.localeCompare(left.id);\n });\n const limit = typeof options.limit === \"number\" && options.limit >= 0 ? options.limit : undefined;\n return limit === undefined ? sorted : sorted.slice(0, limit);\n}\n\nexport async function getBackgroundTestRunStatus(pmRoot: string, runId: string): Promise<BackgroundRunStatusView> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const refreshed = await refreshRunIfStale(pmRoot, loaded);\n const workerAlive = isPidRunning(refreshed.worker_pid);\n const childAlive = isPidRunning(refreshed.child_pid);\n if (refreshed.status === \"running\" && !childAlive && !refreshed.finished_at && !workerAlive) {\n refreshed.status = \"failed\";\n refreshed.finished_at = nowIso();\n refreshed.error = refreshed.error ?? \"Background run process exited unexpectedly.\";\n await writeBackgroundRunRecord(pmRoot, refreshed);\n }\n if (refreshed.status === \"running\") {\n refreshed.resource = await buildResourceSnapshot(refreshed);\n await writeBackgroundRunRecord(pmRoot, refreshed);\n }\n const heartbeatAt = refreshed.progress?.heartbeat_at;\n const heartbeatAtMs = heartbeatAt ? Date.parse(heartbeatAt) : Number.NaN;\n const lagMs = Number.isFinite(heartbeatAtMs) ? Math.max(0, nowMs() - heartbeatAtMs) : undefined;\n const staleMs = Number.parseInt(process.env.PM_BACKGROUND_RUN_HEARTBEAT_STALE_MS ?? \"\", 10);\n const staleThresholdMs = Number.isFinite(staleMs) && staleMs > 0 ? staleMs : DEFAULT_BACKGROUND_RUN_HEARTBEAT_STALE_MS;\n const healthState = refreshed.status === \"running\"\n ? lagMs !== undefined && lagMs > staleThresholdMs\n ? \"stale\"\n : \"healthy\"\n : \"inactive\";\n return {\n run: refreshed,\n health: {\n state: healthState,\n last_heartbeat_at: heartbeatAt,\n heartbeat_lag_ms: lagMs,\n worker_alive: workerAlive,\n child_alive: childAlive,\n },\n };\n}\n\nexport async function stopBackgroundTestRun(pmRoot: string, runId: string, force = false): Promise<StopBackgroundTestRunResult> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const refreshed = await refreshRunIfStale(pmRoot, loaded);\n if (BACKGROUND_RUN_TERMINAL_STATUSES.has(refreshed.status)) {\n return {\n run: refreshed,\n signal_sent: \"none\",\n };\n }\n let signalSent: \"SIGTERM\" | \"SIGKILL\" | \"none\" = \"none\";\n const signal: NodeJS.Signals = force ? \"SIGKILL\" : \"SIGTERM\";\n if (isPidRunning(refreshed.worker_pid) && refreshed.worker_pid) {\n try {\n process.kill(refreshed.worker_pid, signal);\n signalSent = signal;\n } catch {\n signalSent = \"none\";\n }\n }\n if (signalSent === \"none\") {\n refreshed.status = \"stopped\";\n refreshed.finished_at = refreshed.finished_at ?? nowIso();\n }\n refreshed.stop_requested_at = nowIso();\n refreshed.progress = {\n phase: \"stopping\",\n message: signalSent === \"none\" ? \"Run marked stopped.\" : `Stop requested via ${signalSent}.`,\n heartbeat_at: nowIso(),\n linked_test_index: refreshed.progress?.linked_test_index,\n linked_test_total: refreshed.progress?.linked_test_total,\n elapsed_ms: refreshed.progress?.elapsed_ms,\n };\n await writeBackgroundRunRecord(pmRoot, refreshed);\n return {\n run: refreshed,\n signal_sent: signalSent,\n };\n}\n\nexport async function resumeBackgroundTestRun(\n pmRoot: string,\n runId: string,\n requestedBy: string,\n noExtensions = false,\n): Promise<BackgroundTestRunRecord> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const refreshed = await refreshRunIfStale(pmRoot, loaded);\n if (!BACKGROUND_RUN_TERMINAL_STATUSES.has(refreshed.status)) {\n throw new PmCliError(`Background test run ${runId} is not terminal and cannot be resumed.`, EXIT_CODE.CONFLICT);\n }\n const started = await startBackgroundTestRun({\n pmRoot: refreshed.pm_root,\n globalPmRoot: refreshed.global_pm_root,\n kind: refreshed.kind,\n commandArgs: refreshed.command_args,\n requestedBy,\n targetId: refreshed.target_id,\n statusFilter: refreshed.status_filter,\n resumedFrom: refreshed.id,\n resumedBy: requestedBy,\n attempt: refreshed.attempt + 1,\n });\n if (!started.started) {\n return started.run;\n }\n const spawned = await spawnBackgroundTestRunWorker({\n pmRoot,\n runId: started.run.id,\n noExtensions,\n });\n const prior: BackgroundTestRunRecord = {\n ...refreshed,\n resumed_by: spawned.id,\n };\n await writeBackgroundRunRecord(pmRoot, prior);\n return spawned;\n}\n\nexport async function readBackgroundTestRunLogs(\n pmRoot: string,\n runId: string,\n stream: BackgroundLogStream,\n tail: number | undefined,\n): Promise<BackgroundRunLogsResult> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const resolvedTail = typeof tail === \"number\" && Number.isFinite(tail) && tail >= 0 ? Math.floor(tail) : DEFAULT_BACKGROUND_RUN_LOG_TAIL_LINES;\n const stdoutRaw = stream === \"stdout\" || stream === \"both\" ? (await readFileIfExists(loaded.stdout_path)) ?? \"\" : \"\";\n const stderrRaw = stream === \"stderr\" || stream === \"both\" ? (await readFileIfExists(loaded.stderr_path)) ?? \"\" : \"\";\n return {\n run: loaded,\n stream,\n tail: resolvedTail,\n stdout: stream === \"stdout\" || stream === \"both\" ? tailLines(stdoutRaw, resolvedTail) : [],\n stderr: stream === \"stderr\" || stream === \"both\" ? tailLines(stderrRaw, resolvedTail) : [],\n };\n}\n"]}
1
+ {"version":3,"file":"background-runs.js","sources":["core/test/background-runs.ts"],"sourceRoot":"/","sourcesContent":["import fs from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport { ensureDir, pathExists, readFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { PmCliError } from \"../shared/errors.js\";\nimport { EXIT_CODE } from \"../shared/constants.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport {\n getTestRunRecordPath,\n getTestRunResultPath,\n getTestRunStderrPath,\n getTestRunStdoutPath,\n getTestRunsPath,\n getTestRunsRecordsPath,\n getTestRunsResultsPath,\n getTestRunsStderrPath,\n getTestRunsStdoutPath,\n} from \"../store/paths.js\";\n\nconst BACKGROUND_RUN_ACTIVE_STATUSES = new Set<BackgroundTestRunStatus>([\"queued\", \"running\"]);\nconst BACKGROUND_RUN_TERMINAL_STATUSES = new Set<BackgroundTestRunStatus>([\"passed\", \"failed\", \"stopped\", \"canceled\"]);\nconst DEFAULT_BACKGROUND_RUN_RESOURCE_SNAPSHOT_INTERVAL_MS = 3000;\nconst DEFAULT_BACKGROUND_RUN_FORCE_KILL_DELAY_MS = 3000;\nconst DEFAULT_BACKGROUND_RUN_HEARTBEAT_STALE_MS = 30000;\nconst DEFAULT_BACKGROUND_RUN_LOG_TAIL_LINES = 100;\nconst PROC_STAT_TICKS_PER_SECOND = 100;\n\nexport type BackgroundTestRunKind = \"test\" | \"test-all\";\n\nexport type BackgroundTestRunStatus = \"queued\" | \"running\" | \"passed\" | \"failed\" | \"stopped\" | \"canceled\";\n\nexport type BackgroundLogStream = \"stdout\" | \"stderr\" | \"both\";\n\nexport interface BackgroundRunProgress {\n phase: \"queued\" | \"running\" | \"stopping\" | \"finished\";\n message?: string;\n linked_test_index?: number;\n linked_test_total?: number;\n elapsed_ms?: number;\n heartbeat_at?: string;\n}\n\nexport interface BackgroundRunResourceSnapshot {\n recorded_at: string;\n rss_bytes?: number;\n cpu_user_seconds?: number;\n cpu_system_seconds?: number;\n uptime_seconds?: number;\n}\n\nexport interface BackgroundRunSummary {\n items?: number;\n linked_tests?: number;\n passed: number;\n failed: number;\n skipped: number;\n fail_on_skipped_triggered?: boolean;\n}\n\nexport interface BackgroundTestRunRecord {\n id: string;\n kind: BackgroundTestRunKind;\n status: BackgroundTestRunStatus;\n created_at: string;\n started_at?: string;\n finished_at?: string;\n updated_at: string;\n requested_by: string;\n fingerprint: string;\n command_args: string[];\n command_label: string;\n pm_root: string;\n global_pm_root: string;\n target_id?: string;\n status_filter?: string;\n attempt: number;\n resumed_from?: string;\n resumed_by?: string;\n worker_pid?: number;\n child_pid?: number;\n exit_code?: number;\n signal?: string;\n stdout_path: string;\n stderr_path: string;\n result_path: string;\n progress?: BackgroundRunProgress;\n resource?: BackgroundRunResourceSnapshot;\n summary?: BackgroundRunSummary;\n stop_requested_at?: string;\n duplicate_of?: string;\n error?: string;\n}\n\nexport interface StartBackgroundTestRunOptions {\n pmRoot: string;\n globalPmRoot: string;\n kind: BackgroundTestRunKind;\n commandArgs: string[];\n requestedBy: string;\n targetId?: string;\n statusFilter?: string;\n resumedFrom?: string;\n resumedBy?: string;\n attempt?: number;\n}\n\nexport interface StartBackgroundTestRunResult {\n started: boolean;\n run: BackgroundTestRunRecord;\n duplicate_of?: string;\n}\n\nexport interface SpawnBackgroundTestRunWorkerOptions {\n pmRoot: string;\n runId: string;\n noExtensions?: boolean;\n}\n\nexport interface StopBackgroundTestRunResult {\n run: BackgroundTestRunRecord;\n signal_sent: \"SIGTERM\" | \"SIGKILL\" | \"none\";\n}\n\nexport interface ListBackgroundTestRunOptions {\n status?: BackgroundTestRunStatus;\n limit?: number;\n}\n\nexport interface BackgroundRunHealth {\n state: \"healthy\" | \"stale\" | \"inactive\";\n last_heartbeat_at?: string;\n heartbeat_lag_ms?: number;\n worker_alive: boolean;\n child_alive: boolean;\n}\n\nexport interface BackgroundRunStatusView {\n run: BackgroundTestRunRecord;\n health: BackgroundRunHealth;\n}\n\nexport interface BackgroundRunLogsResult {\n run: BackgroundTestRunRecord;\n stream: BackgroundLogStream;\n tail: number;\n stdout: string[];\n stderr: string[];\n}\n\ninterface WorkerEvaluationResult {\n summary: BackgroundRunSummary;\n parsedResult: unknown | null;\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction normalizeCommandArgs(args: string[]): string[] {\n return args.map((entry) => entry.trim()).filter((entry) => entry.length > 0);\n}\n\nfunction summarizeCommandLabel(args: string[]): string {\n const joined = args.join(\" \").replaceAll(/\\s+/g, \" \").trim();\n if (joined.length <= 180) {\n return joined;\n }\n return `${joined.slice(0, 177)}...`;\n}\n\nfunction buildRunId(): string {\n const timePart = Date.now().toString(36);\n const randomPart = randomBytes(3).toString(\"hex\");\n return `tr-${timePart}-${randomPart}`;\n}\n\nexport function buildBackgroundTestRunFingerprint(kind: BackgroundTestRunKind, commandArgs: string[], pmRoot: string): string {\n const payload = {\n kind,\n command: normalizeCommandArgs(commandArgs),\n pm_root: path.resolve(pmRoot),\n };\n return createHash(\"sha256\").update(JSON.stringify(payload)).digest(\"hex\");\n}\n\nfunction isPidRunning(pid: number | undefined): boolean {\n if (!Number.isInteger(pid) || !pid || pid <= 0) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (error: unknown) {\n const code = typeof error === \"object\" && error !== null && \"code\" in error ? (error as { code?: string }).code : undefined;\n return code === \"EPERM\";\n }\n}\n\nasync function ensureBackgroundRunStorage(pmRoot: string): Promise<void> {\n await ensureDir(getTestRunsPath(pmRoot));\n await ensureDir(getTestRunsRecordsPath(pmRoot));\n await ensureDir(getTestRunsStdoutPath(pmRoot));\n await ensureDir(getTestRunsStderrPath(pmRoot));\n await ensureDir(getTestRunsResultsPath(pmRoot));\n}\n\nasync function parseBackgroundRunRecord(raw: string, recordPath: string): Promise<BackgroundTestRunRecord> {\n try {\n const parsed = JSON.parse(raw) as BackgroundTestRunRecord;\n if (!parsed || typeof parsed !== \"object\" || typeof parsed.id !== \"string\") {\n throw new Error(\"invalid run record payload\");\n }\n return parsed;\n } catch (error: unknown) {\n throw new PmCliError(\n `Failed to parse background test run record at ${recordPath}: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\nasync function writeBackgroundRunRecord(pmRoot: string, record: BackgroundTestRunRecord): Promise<void> {\n const next: BackgroundTestRunRecord = {\n ...record,\n updated_at: nowIso(),\n };\n await writeFileAtomic(getTestRunRecordPath(pmRoot, record.id), `${JSON.stringify(next, null, 2)}\\n`);\n}\n\nexport async function readBackgroundTestRunRecord(pmRoot: string, runId: string): Promise<BackgroundTestRunRecord | null> {\n const recordPath = getTestRunRecordPath(pmRoot, runId);\n const raw = await readFileIfExists(recordPath);\n if (!raw) {\n return null;\n }\n return parseBackgroundRunRecord(raw, recordPath);\n}\n\nasync function listBackgroundRunRecordPaths(pmRoot: string): Promise<string[]> {\n const recordsRoot = getTestRunsRecordsPath(pmRoot);\n if (!(await pathExists(recordsRoot))) {\n return [];\n }\n const entries = await fs.readdir(recordsRoot, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => path.join(recordsRoot, entry.name))\n .sort((left, right) => right.localeCompare(left));\n}\n\nasync function readLinuxRssBytes(pid: number): Promise<number | undefined> {\n if (process.platform !== \"linux\") {\n return undefined;\n }\n try {\n const raw = await fs.readFile(`/proc/${pid}/status`, \"utf8\");\n const match = raw.match(/^VmRSS:\\s+(\\d+)\\s+kB$/m);\n if (!match) {\n return undefined;\n }\n const value = Number.parseInt(match[1] ?? \"\", 10);\n if (!Number.isFinite(value)) {\n return undefined;\n }\n return value * 1024;\n } catch {\n return undefined;\n }\n}\n\nasync function readLinuxCpuSeconds(\n pid: number,\n): Promise<{ cpu_user_seconds?: number; cpu_system_seconds?: number }> {\n if (process.platform !== \"linux\") {\n return {};\n }\n try {\n const raw = await fs.readFile(`/proc/${pid}/stat`, \"utf8\");\n const closeParenIndex = raw.lastIndexOf(\")\");\n if (closeParenIndex < 0) {\n return {};\n }\n const remainder = raw.slice(closeParenIndex + 2).trim();\n const parts = remainder.split(/\\s+/);\n const utimeTicks = Number.parseInt(parts[11] ?? \"\", 10);\n const stimeTicks = Number.parseInt(parts[12] ?? \"\", 10);\n if (!Number.isFinite(utimeTicks) || !Number.isFinite(stimeTicks)) {\n return {};\n }\n return {\n cpu_user_seconds: utimeTicks / PROC_STAT_TICKS_PER_SECOND,\n cpu_system_seconds: stimeTicks / PROC_STAT_TICKS_PER_SECOND,\n };\n } catch {\n return {};\n }\n}\n\nasync function buildResourceSnapshot(record: BackgroundTestRunRecord): Promise<BackgroundRunResourceSnapshot | undefined> {\n const pid = record.child_pid ?? record.worker_pid;\n if (!isPidRunning(pid)) {\n return undefined;\n }\n const rssBytes = await readLinuxRssBytes(pid as number);\n const cpu = await readLinuxCpuSeconds(pid as number);\n const startedAtMs = record.started_at ? Date.parse(record.started_at) : Number.NaN;\n const uptimeSeconds = Number.isFinite(startedAtMs) ? Math.max(0, (nowMs() - startedAtMs) / 1000) : undefined;\n return {\n recorded_at: nowIso(),\n rss_bytes: rssBytes,\n cpu_user_seconds: cpu.cpu_user_seconds,\n cpu_system_seconds: cpu.cpu_system_seconds,\n uptime_seconds: uptimeSeconds,\n };\n}\n\nfunction readCount(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nfunction evaluateWorkerResult(kind: BackgroundTestRunKind, payload: unknown): WorkerEvaluationResult {\n if (!payload || typeof payload !== \"object\") {\n return {\n summary: {\n passed: 0,\n failed: 1,\n skipped: 0,\n },\n parsedResult: null,\n };\n }\n const record = payload as Record<string, unknown>;\n if (kind === \"test-all\") {\n const totals = (record.totals ?? {}) as Record<string, unknown>;\n return {\n summary: {\n items: typeof totals.items === \"number\" ? totals.items : undefined,\n linked_tests: typeof totals.linked_tests === \"number\" ? totals.linked_tests : undefined,\n passed: readCount(totals.passed),\n failed: readCount(totals.failed),\n skipped: readCount(totals.skipped),\n fail_on_skipped_triggered: record.fail_on_skipped_triggered === true ? true : undefined,\n },\n parsedResult: payload,\n };\n }\n const runResults = Array.isArray(record.run_results) ? record.run_results : [];\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n for (const entry of runResults) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const status = (entry as { status?: unknown }).status;\n if (status === \"passed\") {\n passed += 1;\n continue;\n }\n if (status === \"failed\") {\n failed += 1;\n continue;\n }\n skipped += 1;\n }\n return {\n summary: {\n passed,\n failed,\n skipped,\n fail_on_skipped_triggered: record.fail_on_skipped_triggered === true ? true : undefined,\n },\n parsedResult: payload,\n };\n}\n\nfunction parseProgressLine(stderrLine: string): Partial<BackgroundRunProgress> | null {\n const line = stderrLine.trim();\n if (line.length === 0) {\n return null;\n }\n const match = line.match(/\\[pm test\\]\\s+linked-test\\s+(\\d+)\\/(\\d+)\\s+(start|running|end)(?:.*elapsed_ms=(\\d+))?/i);\n if (!match) {\n return null;\n }\n const index = Number.parseInt(match[1] ?? \"\", 10);\n const total = Number.parseInt(match[2] ?? \"\", 10);\n const elapsed = match[4] ? Number.parseInt(match[4], 10) : undefined;\n return {\n linked_test_index: Number.isFinite(index) ? index : undefined,\n linked_test_total: Number.isFinite(total) ? total : undefined,\n elapsed_ms: Number.isFinite(elapsed) ? elapsed : undefined,\n heartbeat_at: nowIso(),\n phase: match[3]?.toLowerCase() === \"end\" ? \"finished\" : \"running\",\n };\n}\n\nfunction splitLines(value: string): string[] {\n return value\n .split(/\\r?\\n/)\n .map((entry) => entry.trimEnd())\n .filter((entry) => entry.length > 0);\n}\n\nfunction tailLines(value: string, limit: number): string[] {\n if (limit <= 0) {\n return [];\n }\n const lines = splitLines(value);\n if (lines.length <= limit) {\n return lines;\n }\n return lines.slice(lines.length - limit);\n}\n\nasync function resolveBackgroundCliEntry(cwd: string): Promise<string> {\n const configured = process.env.PM_BACKGROUND_CLI_ENTRY?.trim();\n if (configured && configured.length > 0) {\n const resolvedConfigured = path.resolve(cwd, configured);\n if (await pathExists(resolvedConfigured)) {\n return resolvedConfigured;\n }\n }\n const distEntry = path.resolve(cwd, \"dist\", \"cli.js\");\n if (await pathExists(distEntry)) {\n return distEntry;\n }\n const argvEntry = process.argv[1]?.trim();\n if (argvEntry && argvEntry.length > 0) {\n const resolvedArgvEntry = path.resolve(cwd, argvEntry);\n if (await pathExists(resolvedArgvEntry)) {\n return resolvedArgvEntry;\n }\n }\n throw new PmCliError(\n \"Unable to resolve a CLI entrypoint for background test runs. Build the project or set PM_BACKGROUND_CLI_ENTRY.\",\n EXIT_CODE.GENERIC_FAILURE,\n );\n}\n\nasync function refreshRunIfStale(pmRoot: string, record: BackgroundTestRunRecord): Promise<BackgroundTestRunRecord> {\n if (!BACKGROUND_RUN_ACTIVE_STATUSES.has(record.status)) {\n return record;\n }\n const workerAlive = isPidRunning(record.worker_pid);\n if (workerAlive) {\n return record;\n }\n if (record.finished_at) {\n return record;\n }\n const next: BackgroundTestRunRecord = {\n ...record,\n status: \"failed\",\n finished_at: nowIso(),\n error: record.error ?? \"Background test run worker exited before writing terminal status.\",\n };\n await writeBackgroundRunRecord(pmRoot, next);\n return next;\n}\n\nexport async function startBackgroundTestRun(options: StartBackgroundTestRunOptions): Promise<StartBackgroundTestRunResult> {\n await ensureBackgroundRunStorage(options.pmRoot);\n const normalizedArgs = normalizeCommandArgs(options.commandArgs);\n if (normalizedArgs.length === 0) {\n throw new PmCliError(\"Background test run requires command arguments.\", EXIT_CODE.USAGE);\n }\n const fingerprint = buildBackgroundTestRunFingerprint(options.kind, normalizedArgs, options.pmRoot);\n const existingRuns = await listBackgroundTestRuns(options.pmRoot, {});\n for (const existing of existingRuns) {\n const refreshed = await refreshRunIfStale(options.pmRoot, existing);\n if (refreshed.fingerprint !== fingerprint) {\n continue;\n }\n if (!BACKGROUND_RUN_ACTIVE_STATUSES.has(refreshed.status)) {\n continue;\n }\n if (!isPidRunning(refreshed.worker_pid)) {\n continue;\n }\n return {\n started: false,\n run: {\n ...refreshed,\n duplicate_of: refreshed.id,\n },\n duplicate_of: refreshed.id,\n };\n }\n\n const runId = buildRunId();\n const createdAt = nowIso();\n const stdoutPath = getTestRunStdoutPath(options.pmRoot, runId);\n const stderrPath = getTestRunStderrPath(options.pmRoot, runId);\n const resultPath = getTestRunResultPath(options.pmRoot, runId);\n await fs.writeFile(stdoutPath, \"\", \"utf8\");\n await fs.writeFile(stderrPath, \"\", \"utf8\");\n const record: BackgroundTestRunRecord = {\n id: runId,\n kind: options.kind,\n status: \"queued\",\n created_at: createdAt,\n updated_at: createdAt,\n requested_by: options.requestedBy,\n fingerprint,\n command_args: normalizedArgs,\n command_label: summarizeCommandLabel(normalizedArgs),\n pm_root: options.pmRoot,\n global_pm_root: options.globalPmRoot,\n target_id: options.targetId,\n status_filter: options.statusFilter,\n attempt: typeof options.attempt === \"number\" && Number.isFinite(options.attempt) && options.attempt >= 1\n ? Math.floor(options.attempt)\n : 1,\n resumed_from: options.resumedFrom,\n resumed_by: options.resumedBy,\n stdout_path: stdoutPath,\n stderr_path: stderrPath,\n result_path: resultPath,\n progress: {\n phase: \"queued\",\n message: \"Queued for background execution.\",\n heartbeat_at: createdAt,\n },\n };\n await writeBackgroundRunRecord(options.pmRoot, record);\n return {\n started: true,\n run: record,\n };\n}\n\nexport async function spawnBackgroundTestRunWorker(options: SpawnBackgroundTestRunWorkerOptions): Promise<BackgroundTestRunRecord> {\n const record = await readBackgroundTestRunRecord(options.pmRoot, options.runId);\n if (!record) {\n throw new PmCliError(`Background test run ${options.runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n if (BACKGROUND_RUN_TERMINAL_STATUSES.has(record.status)) {\n throw new PmCliError(`Background test run ${record.id} is already terminal (${record.status}).`, EXIT_CODE.CONFLICT);\n }\n const cliEntry = await resolveBackgroundCliEntry(process.cwd());\n const args: string[] = [];\n if (options.noExtensions === true) {\n args.push(\"--no-extensions\");\n }\n args.push(\"--path\", record.pm_root, \"test-runs-worker\", record.id);\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n PM_PATH: record.pm_root,\n PM_GLOBAL_PATH: record.global_pm_root,\n PM_BACKGROUND_TEST_RUN_ID: record.id,\n PM_BACKGROUND_TEST_RUN_ATTEMPT: String(record.attempt),\n PM_BACKGROUND_TEST_RUN_RESUMED_FROM: record.resumed_from ?? \"\",\n FORCE_COLOR: \"0\",\n };\n const child = spawn(process.execPath, [cliEntry, ...args], {\n cwd: process.cwd(),\n env,\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n });\n child.unref();\n const next: BackgroundTestRunRecord = {\n ...record,\n status: \"queued\",\n worker_pid: child.pid && child.pid > 0 ? child.pid : record.worker_pid,\n progress: {\n phase: \"queued\",\n message: \"Worker process started.\",\n heartbeat_at: nowIso(),\n },\n };\n await writeBackgroundRunRecord(options.pmRoot, next);\n return next;\n}\n\nasync function appendFileOrdered(queue: Promise<void>, filePath: string, text: string): Promise<void> {\n await queue;\n await fs.appendFile(filePath, text, \"utf8\");\n}\n\nexport async function runBackgroundTestRunWorker(pmRoot: string, runId: string, noExtensions = false): Promise<BackgroundTestRunRecord> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const record: BackgroundTestRunRecord = {\n ...loaded,\n status: \"running\",\n started_at: loaded.started_at ?? nowIso(),\n worker_pid: process.pid,\n progress: {\n phase: \"running\",\n message: \"Worker started.\",\n heartbeat_at: nowIso(),\n },\n };\n const cliEntry = await resolveBackgroundCliEntry(process.cwd());\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n PM_PATH: record.pm_root,\n PM_GLOBAL_PATH: record.global_pm_root,\n FORCE_COLOR: \"0\",\n };\n await writeBackgroundRunRecord(pmRoot, record);\n\n const childArgs = noExtensions ? [\"--no-extensions\", ...record.command_args] : [...record.command_args];\n const child = spawn(process.execPath, [cliEntry, ...childArgs], {\n cwd: process.cwd(),\n env,\n detached: false,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n record.child_pid = child.pid && child.pid > 0 ? child.pid : undefined;\n\n let writeQueue: Promise<void> = Promise.resolve();\n const scheduleRecordWrite = (): void => {\n writeQueue = writeQueue.then(async () => {\n await writeBackgroundRunRecord(pmRoot, record);\n }).catch(() => {\n // Keep worker alive even if a single metadata write fails.\n });\n };\n\n let stdoutWriteQueue: Promise<void> = Promise.resolve();\n let stderrWriteQueue: Promise<void> = Promise.resolve();\n let stdoutBuffer = \"\";\n let stopRequested = false;\n\n const requestStop = async (): Promise<void> => {\n if (stopRequested) {\n return;\n }\n stopRequested = true;\n record.stop_requested_at = nowIso();\n record.progress = {\n ...record.progress,\n phase: \"stopping\",\n message: \"Stop requested for background run.\",\n heartbeat_at: nowIso(),\n };\n scheduleRecordWrite();\n if (!child.pid || child.pid <= 0) {\n return;\n }\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Child may already be gone.\n }\n const forceKillDelayMs = Number.parseInt(process.env.PM_BACKGROUND_RUN_FORCE_KILL_DELAY_MS ?? \"\", 10);\n const delay = Number.isFinite(forceKillDelayMs) && forceKillDelayMs > 0\n ? forceKillDelayMs\n : DEFAULT_BACKGROUND_RUN_FORCE_KILL_DELAY_MS;\n const forceTimer = setTimeout(() => {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // Child may already be gone.\n }\n }, delay);\n forceTimer.unref?.();\n };\n\n const onSignal = (): void => {\n void requestStop();\n };\n process.on(\"SIGTERM\", onSignal);\n process.on(\"SIGINT\", onSignal);\n\n const resourceIntervalMs = Number.parseInt(process.env.PM_BACKGROUND_RUN_RESOURCE_INTERVAL_MS ?? \"\", 10);\n const resourceInterval = Number.isFinite(resourceIntervalMs) && resourceIntervalMs > 0\n ? resourceIntervalMs\n : DEFAULT_BACKGROUND_RUN_RESOURCE_SNAPSHOT_INTERVAL_MS;\n const resourceTimer = setInterval(() => {\n void (async () => {\n record.resource = await buildResourceSnapshot(record);\n if (record.progress) {\n record.progress.heartbeat_at = nowIso();\n }\n scheduleRecordWrite();\n })();\n }, resourceInterval);\n resourceTimer.unref?.();\n\n child.stdout?.on(\"data\", (chunk) => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n stdoutBuffer += text;\n stdoutWriteQueue = appendFileOrdered(stdoutWriteQueue, record.stdout_path, text);\n });\n child.stderr?.on(\"data\", (chunk) => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n stderrWriteQueue = appendFileOrdered(stderrWriteQueue, record.stderr_path, text);\n const lines = splitLines(text);\n const latestLine = lines.at(-1);\n if (latestLine) {\n const progressPatch = parseProgressLine(latestLine);\n record.progress = {\n phase: record.progress?.phase ?? \"running\",\n message: latestLine,\n heartbeat_at: nowIso(),\n linked_test_index: progressPatch?.linked_test_index ?? record.progress?.linked_test_index,\n linked_test_total: progressPatch?.linked_test_total ?? record.progress?.linked_test_total,\n elapsed_ms: progressPatch?.elapsed_ms ?? record.progress?.elapsed_ms,\n };\n if (progressPatch?.phase === \"finished\" && !stopRequested) {\n record.progress.phase = \"running\";\n }\n scheduleRecordWrite();\n }\n });\n\n let exitCode: number | null = null;\n let signal: NodeJS.Signals | null = null;\n try {\n ({ code: exitCode, signal } = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => {\n child.on(\"close\", (code, closeSignal) => {\n resolve({ code, signal: closeSignal });\n });\n }));\n } finally {\n clearInterval(resourceTimer);\n process.off(\"SIGTERM\", onSignal);\n process.off(\"SIGINT\", onSignal);\n }\n\n await stdoutWriteQueue;\n await stderrWriteQueue;\n\n let parsedResult: unknown | null = null;\n if (stdoutBuffer.trim().length > 0) {\n try {\n parsedResult = JSON.parse(stdoutBuffer);\n } catch {\n parsedResult = null;\n }\n }\n const evaluated = evaluateWorkerResult(record.kind, parsedResult);\n record.summary = evaluated.summary;\n record.exit_code = typeof exitCode === \"number\" ? exitCode : undefined;\n record.signal = signal ?? undefined;\n record.finished_at = nowIso();\n record.status = stopRequested\n ? \"stopped\"\n : (record.exit_code === 0 &&\n (record.summary.failed ?? 0) === 0 &&\n record.summary.fail_on_skipped_triggered !== true)\n ? \"passed\"\n : \"failed\";\n record.progress = {\n phase: \"finished\",\n message: stopRequested ? \"Background run stopped.\" : `Background run finished with status=${record.status}.`,\n heartbeat_at: nowIso(),\n linked_test_index: record.progress?.linked_test_index,\n linked_test_total: record.progress?.linked_test_total,\n elapsed_ms: record.progress?.elapsed_ms,\n };\n record.resource = await buildResourceSnapshot(record);\n if (parsedResult !== null) {\n await writeFileAtomic(record.result_path, `${JSON.stringify(parsedResult, null, 2)}\\n`);\n } else {\n await writeFileAtomic(\n record.result_path,\n `${JSON.stringify(\n {\n parse_error: \"Background run output was not valid JSON.\",\n stdout_excerpt: tailLines(stdoutBuffer, DEFAULT_BACKGROUND_RUN_LOG_TAIL_LINES),\n },\n null,\n 2,\n )}\\n`,\n );\n }\n await writeBackgroundRunRecord(pmRoot, record);\n await writeQueue;\n return record;\n}\n\nexport async function listBackgroundTestRuns(\n pmRoot: string,\n options: ListBackgroundTestRunOptions,\n): Promise<BackgroundTestRunRecord[]> {\n const recordPaths = await listBackgroundRunRecordPaths(pmRoot);\n const runs: BackgroundTestRunRecord[] = [];\n for (const recordPath of recordPaths) {\n const raw = await readFileIfExists(recordPath);\n if (!raw) {\n continue;\n }\n const parsed = await parseBackgroundRunRecord(raw, recordPath);\n runs.push(parsed);\n }\n const refreshed: BackgroundTestRunRecord[] = [];\n for (const run of runs) {\n refreshed.push(await refreshRunIfStale(pmRoot, run));\n }\n const filtered = options.status ? refreshed.filter((entry) => entry.status === options.status) : refreshed;\n const sorted = filtered.sort((left, right) => {\n const byUpdated = Date.parse(right.updated_at) - Date.parse(left.updated_at);\n if (Number.isFinite(byUpdated) && byUpdated !== 0) {\n return byUpdated;\n }\n return right.id.localeCompare(left.id);\n });\n const limit = typeof options.limit === \"number\" && options.limit >= 0 ? options.limit : undefined;\n return limit === undefined ? sorted : sorted.slice(0, limit);\n}\n\nexport async function getBackgroundTestRunStatus(pmRoot: string, runId: string): Promise<BackgroundRunStatusView> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const refreshed = await refreshRunIfStale(pmRoot, loaded);\n const workerAlive = isPidRunning(refreshed.worker_pid);\n const childAlive = isPidRunning(refreshed.child_pid);\n if (refreshed.status === \"running\" && !childAlive && !refreshed.finished_at && !workerAlive) {\n refreshed.status = \"failed\";\n refreshed.finished_at = nowIso();\n refreshed.error = refreshed.error ?? \"Background run process exited unexpectedly.\";\n await writeBackgroundRunRecord(pmRoot, refreshed);\n }\n if (refreshed.status === \"running\") {\n refreshed.resource = await buildResourceSnapshot(refreshed);\n await writeBackgroundRunRecord(pmRoot, refreshed);\n }\n const heartbeatAt = refreshed.progress?.heartbeat_at;\n const heartbeatAtMs = heartbeatAt ? Date.parse(heartbeatAt) : Number.NaN;\n const lagMs = Number.isFinite(heartbeatAtMs) ? Math.max(0, nowMs() - heartbeatAtMs) : undefined;\n const staleMs = Number.parseInt(process.env.PM_BACKGROUND_RUN_HEARTBEAT_STALE_MS ?? \"\", 10);\n const staleThresholdMs = Number.isFinite(staleMs) && staleMs > 0 ? staleMs : DEFAULT_BACKGROUND_RUN_HEARTBEAT_STALE_MS;\n const healthState = refreshed.status === \"running\"\n ? lagMs !== undefined && lagMs > staleThresholdMs\n ? \"stale\"\n : \"healthy\"\n : \"inactive\";\n return {\n run: refreshed,\n health: {\n state: healthState,\n last_heartbeat_at: heartbeatAt,\n heartbeat_lag_ms: lagMs,\n worker_alive: workerAlive,\n child_alive: childAlive,\n },\n };\n}\n\nexport async function stopBackgroundTestRun(pmRoot: string, runId: string, force = false): Promise<StopBackgroundTestRunResult> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const refreshed = await refreshRunIfStale(pmRoot, loaded);\n if (BACKGROUND_RUN_TERMINAL_STATUSES.has(refreshed.status)) {\n return {\n run: refreshed,\n signal_sent: \"none\",\n };\n }\n let signalSent: \"SIGTERM\" | \"SIGKILL\" | \"none\" = \"none\";\n const signal: NodeJS.Signals = force ? \"SIGKILL\" : \"SIGTERM\";\n if (isPidRunning(refreshed.worker_pid) && refreshed.worker_pid) {\n try {\n process.kill(refreshed.worker_pid, signal);\n signalSent = signal;\n } catch {\n signalSent = \"none\";\n }\n }\n if (signalSent === \"none\") {\n refreshed.status = \"stopped\";\n refreshed.finished_at = refreshed.finished_at ?? nowIso();\n }\n refreshed.stop_requested_at = nowIso();\n refreshed.progress = {\n phase: \"stopping\",\n message: signalSent === \"none\" ? \"Run marked stopped.\" : `Stop requested via ${signalSent}.`,\n heartbeat_at: nowIso(),\n linked_test_index: refreshed.progress?.linked_test_index,\n linked_test_total: refreshed.progress?.linked_test_total,\n elapsed_ms: refreshed.progress?.elapsed_ms,\n };\n await writeBackgroundRunRecord(pmRoot, refreshed);\n return {\n run: refreshed,\n signal_sent: signalSent,\n };\n}\n\nexport async function resumeBackgroundTestRun(\n pmRoot: string,\n runId: string,\n requestedBy: string,\n noExtensions = false,\n): Promise<BackgroundTestRunRecord> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const refreshed = await refreshRunIfStale(pmRoot, loaded);\n if (!BACKGROUND_RUN_TERMINAL_STATUSES.has(refreshed.status)) {\n throw new PmCliError(`Background test run ${runId} is not terminal and cannot be resumed.`, EXIT_CODE.CONFLICT);\n }\n const started = await startBackgroundTestRun({\n pmRoot: refreshed.pm_root,\n globalPmRoot: refreshed.global_pm_root,\n kind: refreshed.kind,\n commandArgs: refreshed.command_args,\n requestedBy,\n targetId: refreshed.target_id,\n statusFilter: refreshed.status_filter,\n resumedFrom: refreshed.id,\n resumedBy: requestedBy,\n attempt: refreshed.attempt + 1,\n });\n if (!started.started) {\n return started.run;\n }\n const spawned = await spawnBackgroundTestRunWorker({\n pmRoot,\n runId: started.run.id,\n noExtensions,\n });\n const prior: BackgroundTestRunRecord = {\n ...refreshed,\n resumed_by: spawned.id,\n };\n await writeBackgroundRunRecord(pmRoot, prior);\n return spawned;\n}\n\nexport async function readBackgroundTestRunLogs(\n pmRoot: string,\n runId: string,\n stream: BackgroundLogStream,\n tail: number | undefined,\n): Promise<BackgroundRunLogsResult> {\n const loaded = await readBackgroundTestRunRecord(pmRoot, runId);\n if (!loaded) {\n throw new PmCliError(`Background test run ${runId} not found`, EXIT_CODE.NOT_FOUND);\n }\n const resolvedTail = typeof tail === \"number\" && Number.isFinite(tail) && tail >= 0 ? Math.floor(tail) : DEFAULT_BACKGROUND_RUN_LOG_TAIL_LINES;\n const stdoutRaw = stream === \"stdout\" || stream === \"both\" ? (await readFileIfExists(loaded.stdout_path)) ?? \"\" : \"\";\n const stderrRaw = stream === \"stderr\" || stream === \"both\" ? (await readFileIfExists(loaded.stderr_path)) ?? \"\" : \"\";\n return {\n run: loaded,\n stream,\n tail: resolvedTail,\n stdout: stream === \"stdout\" || stream === \"both\" ? tailLines(stdoutRaw, resolvedTail) : [],\n stderr: stream === \"stderr\" || stream === \"both\" ? tailLines(stderrRaw, resolvedTail) : [],\n };\n}\n"],"names":[],"mappings":"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","debugId":"2ba2ffd6-1f2e-5ee4-8534-9ac9e3ba2c77"}
@@ -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]="5ad8395d-c5d2-5777-9bb7-665ac473c0d0")}catch(e){}}();
1
3
  import { mutateItem } from "../store/item-store.js";
2
4
  import { compareTimestampStrings } from "../shared/time.js";
3
5
  const DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT = 20;
@@ -47,4 +49,5 @@ export async function appendTrackedTestRunSummary(options) {
47
49
  },
48
50
  });
49
51
  }
50
- //# sourceMappingURL=item-test-run-tracking.js.map
52
+ //# sourceMappingURL=item-test-run-tracking.js.map
53
+ //# debugId=5ad8395d-c5d2-5777-9bb7-665ac473c0d0
@@ -1 +1 @@
1
- {"version":3,"file":"item-test-run-tracking.js","sourceRoot":"/","sources":["core/test/item-test-run-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAElD,SAAS,0BAA0B;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;IAC1D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,sCAAsC,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,sCAAsC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gCAAgC,CAAC,OAA6B;IACrE,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAChB,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAClC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACnC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACpC;SACA,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAOjD;IACC,MAAM,YAAY,GAAG,0BAA0B,EAAE,CAAC;IAClD,MAAM,UAAU,CAAC;QACf,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,EAAE,EAAE,OAAO,CAAC,MAAM;QAClB,EAAE,EAAE,gBAAgB;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,KAAK;QACZ,MAAM,CAAC,QAAQ;YACb,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,gCAAgC,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3F,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC;YACtC,OAAO,EAAE,aAAa,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { mutateItem } from \"../store/item-store.js\";\nimport { compareTimestampStrings } from \"../shared/time.js\";\nimport type { ItemTestRunSummary, PmSettings } from \"../../types/index.js\";\n\nconst DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT = 20;\n\nfunction trackedTestRunHistoryLimit(): number {\n const raw = process.env.PM_TRACKED_TEST_RUN_HISTORY_LIMIT;\n if (!raw || raw.trim().length === 0) {\n return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;\n }\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;\n }\n return parsed;\n}\n\nfunction normalizeTrackedTestRunSummaries(entries: ItemTestRunSummary[]): ItemTestRunSummary[] {\n return [...entries]\n .filter((entry) =>\n entry.run_id.trim().length > 0 &&\n entry.started_at.trim().length > 0 &&\n entry.finished_at.trim().length > 0 &&\n entry.recorded_at.trim().length > 0\n )\n .sort((left, right) => {\n const byRecorded = compareTimestampStrings(left.recorded_at, right.recorded_at);\n if (byRecorded !== 0) return byRecorded;\n const byRunId = left.run_id.localeCompare(right.run_id);\n if (byRunId !== 0) return byRunId;\n return left.kind.localeCompare(right.kind);\n });\n}\n\nexport async function appendTrackedTestRunSummary(options: {\n pmRoot: string;\n settings: PmSettings;\n itemId: string;\n author: string;\n entry: ItemTestRunSummary;\n message?: string;\n}): Promise<void> {\n const historyLimit = trackedTestRunHistoryLimit();\n await mutateItem({\n pmRoot: options.pmRoot,\n settings: options.settings,\n id: options.itemId,\n op: \"test_run_track\",\n author: options.author,\n message: options.message,\n force: false,\n mutate(document) {\n const current = document.metadata.test_runs ?? [];\n const next = normalizeTrackedTestRunSummaries([...current, options.entry]);\n const bounded = next.length > historyLimit ? next.slice(next.length - historyLimit) : next;\n document.metadata.test_runs = bounded;\n return { changedFields: [\"test_runs\"] };\n },\n });\n}\n"]}
1
+ {"version":3,"file":"item-test-run-tracking.js","sources":["core/test/item-test-run-tracking.ts"],"sourceRoot":"/","sourcesContent":["import { mutateItem } from \"../store/item-store.js\";\nimport { compareTimestampStrings } from \"../shared/time.js\";\nimport type { ItemTestRunSummary, PmSettings } from \"../../types/index.js\";\n\nconst DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT = 20;\n\nfunction trackedTestRunHistoryLimit(): number {\n const raw = process.env.PM_TRACKED_TEST_RUN_HISTORY_LIMIT;\n if (!raw || raw.trim().length === 0) {\n return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;\n }\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;\n }\n return parsed;\n}\n\nfunction normalizeTrackedTestRunSummaries(entries: ItemTestRunSummary[]): ItemTestRunSummary[] {\n return [...entries]\n .filter((entry) =>\n entry.run_id.trim().length > 0 &&\n entry.started_at.trim().length > 0 &&\n entry.finished_at.trim().length > 0 &&\n entry.recorded_at.trim().length > 0\n )\n .sort((left, right) => {\n const byRecorded = compareTimestampStrings(left.recorded_at, right.recorded_at);\n if (byRecorded !== 0) return byRecorded;\n const byRunId = left.run_id.localeCompare(right.run_id);\n if (byRunId !== 0) return byRunId;\n return left.kind.localeCompare(right.kind);\n });\n}\n\nexport async function appendTrackedTestRunSummary(options: {\n pmRoot: string;\n settings: PmSettings;\n itemId: string;\n author: string;\n entry: ItemTestRunSummary;\n message?: string;\n}): Promise<void> {\n const historyLimit = trackedTestRunHistoryLimit();\n await mutateItem({\n pmRoot: options.pmRoot,\n settings: options.settings,\n id: options.itemId,\n op: \"test_run_track\",\n author: options.author,\n message: options.message,\n force: false,\n mutate(document) {\n const current = document.metadata.test_runs ?? [];\n const next = normalizeTrackedTestRunSummaries([...current, options.entry]);\n const bounded = next.length > historyLimit ? next.slice(next.length - historyLimit) : next;\n document.metadata.test_runs = bounded;\n return { changedFields: [\"test_runs\"] };\n },\n });\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAElD,SAAS,0BAA0B;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;IAC1D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,sCAAsC,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,sCAAsC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gCAAgC,CAAC,OAA6B;IACrE,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAChB,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAClC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACnC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACpC;SACA,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAOjD;IACC,MAAM,YAAY,GAAG,0BAA0B,EAAE,CAAC;IAClD,MAAM,UAAU,CAAC;QACf,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,EAAE,EAAE,OAAO,CAAC,MAAM;QAClB,EAAE,EAAE,gBAAgB;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,KAAK;QACZ,MAAM,CAAC,QAAQ;YACb,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,gCAAgC,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3F,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC;YACtC,OAAO,EAAE,aAAa,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,CAAC;KACF,CAAC,CAAC;AACL,CAAC","debugId":"5ad8395d-c5d2-5777-9bb7-665ac473c0d0"}
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+
3
+ !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]="295d3ce6-dcc1-57fe-803a-76ed96fc5ce1")}catch(e){}}();
2
4
  import readline from "node:readline";
3
5
  import { fileURLToPath } from "node:url";
4
6
  import { activateExtensions, loadExtensions, runActiveCommandHandler, setActiveExtensionCommands, setActiveExtensionHooks, setActiveExtensionParsers, setActiveExtensionPreflight, setActiveExtensionRegistrations, setActiveExtensionRenderers, setActiveExtensionServices, } from "../core/extensions/index.js";
@@ -6,7 +8,7 @@ import { pathExists } from "../core/fs/fs-utils.js";
6
8
  import { PmCliError } from "../core/shared/errors.js";
7
9
  import { getSettingsPath, resolvePmRoot } from "../core/store/paths.js";
8
10
  import { readSettings } from "../core/store/settings.js";
9
- import { runActivity, runAggregate, runAppend, runClaim, runClose, runComments, runContracts, runContext, runCreate, runConfig, runDelete, runDeps, runDocs, runExtension, runFiles, runFilesDiscover, runGc, runGet, runHealth, runHistory, runInit, runLearnings, runList, runNotes, runRelease, runSearch, runStats, runTest, runTestAll, runUpdate, runUpdateMany, runUpgrade, runValidate, } from "../cli/commands/index.js";
11
+ import { runActivity, runAggregate, runAppend, runClaim, runClose, runComments, runContracts, runContext, runCreate, runConfig, runDelete, runDeps, runDocs, runExtension, runFiles, runFilesDiscover, runGc, runGet, runHealth, runHistory, runHistoryRedact, runInit, runLearnings, runList, runNotes, runPlan, runRelease, runSearch, runStats, runTest, runTestAll, runUpdate, runUpdateMany, runUpgrade, runValidate, } from "../cli/commands/index.js";
10
12
  const PM_PACKAGE_ROOT_ENV = "PM_CLI_PACKAGE_ROOT";
11
13
  function resolvePmPackageRoot() {
12
14
  return fileURLToPath(new URL("../..", import.meta.url));
@@ -74,13 +76,21 @@ const TOOLS = [
74
76
  },
75
77
  {
76
78
  name: "pm_list",
77
- description: "List pm items with status/type/tag/priority filters.",
79
+ description: "List pm items with status/type/tag/priority filters. Defaults to compact projection for token efficiency. " +
80
+ "options.status accepts CSV (open,in_progress). " +
81
+ "Pass options.compact=false or options.includeBody=true for full bodies/comments. " +
82
+ "Pass options.brief=true for ultra-terse (id/status/type/title only). " +
83
+ "Pass options.fields='id,title,priority' for custom projection. " +
84
+ "Pass options.limit=N to cap row count.",
78
85
  inputSchema: objectSchema({ options: { type: "object" } }),
79
86
  },
80
87
  {
81
88
  name: "pm_get",
82
- description: "Read one pm item with body, linked files/tests/docs, and claim state.",
83
- inputSchema: objectSchema({ id: idSchema }, ["id"]),
89
+ description: "Read one pm item. Pass options.depth='brief' or options.fields='id,title,status' for low-token inspection.",
90
+ inputSchema: objectSchema({
91
+ id: idSchema,
92
+ options: { type: "object", description: "Get options such as depth=brief|standard|deep or fields=id,title,status." },
93
+ }, ["id"]),
84
94
  },
85
95
  {
86
96
  name: "pm_create",
@@ -136,7 +146,7 @@ const TOOLS = [
136
146
  },
137
147
  {
138
148
  name: "pm_health",
139
- description: "Run pm health diagnostics.",
149
+ description: "Run pm health diagnostics. Pass options.skipIntegrity=true, options.skipDrift=true, options.skipVectors=true for a fast (~800ms) status-only check. Use options.full=true for the complete deep check including file integrity and history drift.",
140
150
  inputSchema: objectSchema({ options: { type: "object" } }),
141
151
  },
142
152
  {
@@ -144,6 +154,16 @@ const TOOLS = [
144
154
  description: "Inspect pm command, flag, schema, and availability contracts.",
145
155
  inputSchema: objectSchema({ options: { type: "object" } }),
146
156
  },
157
+ {
158
+ name: "pm_plan",
159
+ description: "Run agent-optimized Plan workflows. options.subcommand selects: create|show|add-step|update-step|complete-step|block-step|reorder-step|remove-step|link|unlink|decision|discovery|validation|resume|approve|materialize. Provide id for all non-create subcommands; provide stepRef for step lifecycle subcommands. Plans store agent-readable steps with dependencies, decisions, discoveries, validation, and resume context.",
160
+ inputSchema: objectSchema({
161
+ id: { type: "string", description: "Plan id (required for all subcommands except create)." },
162
+ stepRef: { type: "string", description: "Step id or order for step lifecycle subcommands." },
163
+ reorderTo: { type: "number", description: "New order for reorder-step." },
164
+ options: { type: "object", description: "Plan options including subcommand, stepRef, stepStatus, link, depth, etc." },
165
+ }),
166
+ },
147
167
  ];
148
168
  function asRecord(value) {
149
169
  return typeof value === "object" && value !== null && !Array.isArray(value) ? { ...value } : {};
@@ -167,8 +187,60 @@ function globalOptions(args) {
167
187
  noPager: true,
168
188
  };
169
189
  }
170
- function optionsWithAuthor(args) {
171
- const options = asRecord(args.options);
190
+ const ARRAY_TO_CSV_FIELDS = new Set(["tags", "blockedBy", "blocked_by", "skills"]);
191
+ const SCALAR_TO_ARRAY_FIELDS = new Set([
192
+ "comment",
193
+ "note",
194
+ "learning",
195
+ "reminder",
196
+ "event",
197
+ "dep",
198
+ "depRemove",
199
+ "dep_remove",
200
+ "file",
201
+ "doc",
202
+ "test",
203
+ "unset",
204
+ "addGlob",
205
+ "add_glob",
206
+ "migrate",
207
+ "envSet",
208
+ "env_set",
209
+ "envClear",
210
+ "env_clear",
211
+ ]);
212
+ // Actions where the linked-resource fields `add` and `remove` are string[] arrays.
213
+ // For other actions (comments/notes/learnings) `add` and `remove` are scalar strings
214
+ // and must NOT be auto-promoted.
215
+ const ARRAY_ADD_REMOVE_ACTIONS = new Set([
216
+ "files",
217
+ "files-discover",
218
+ "docs",
219
+ "test",
220
+ "test-all",
221
+ ]);
222
+ function normalizeOptionsArrays(options, action) {
223
+ const result = {};
224
+ const promoteAddRemove = action !== undefined && ARRAY_ADD_REMOVE_ACTIONS.has(action);
225
+ for (const [key, value] of Object.entries(options)) {
226
+ if (Array.isArray(value) && ARRAY_TO_CSV_FIELDS.has(key)) {
227
+ result[key] = value.join(",");
228
+ continue;
229
+ }
230
+ if (typeof value === "string" && SCALAR_TO_ARRAY_FIELDS.has(key)) {
231
+ result[key] = [value];
232
+ continue;
233
+ }
234
+ if (typeof value === "string" && promoteAddRemove && (key === "add" || key === "remove")) {
235
+ result[key] = [value];
236
+ continue;
237
+ }
238
+ result[key] = value;
239
+ }
240
+ return result;
241
+ }
242
+ function optionsWithAuthor(args, action) {
243
+ const options = normalizeOptionsArrays(asRecord(args.options), action);
172
244
  const author = readString(args, "author");
173
245
  return author && options.author === undefined ? { ...options, author } : options;
174
246
  }
@@ -258,7 +330,7 @@ async function withCwd(cwd, run) {
258
330
  async function runAction(args) {
259
331
  const action = readRequiredString(args, "action");
260
332
  const global = globalOptions(args);
261
- const options = optionsWithAuthor(args);
333
+ const options = optionsWithAuthor(args, action);
262
334
  const id = readString(args, "id");
263
335
  const force = args.force === true;
264
336
  switch (action) {
@@ -266,10 +338,18 @@ async function runAction(args) {
266
338
  return runInit(readString(args, "prefix"), global, options);
267
339
  case "context":
268
340
  return runContext(options, global);
269
- case "list":
270
- return runList(readString(args, "status"), options, global);
341
+ case "list": {
342
+ const listOptions = { ...options };
343
+ if (listOptions.compact === undefined &&
344
+ listOptions.brief === undefined &&
345
+ listOptions.fields === undefined &&
346
+ listOptions.includeBody === undefined) {
347
+ listOptions.compact = true;
348
+ }
349
+ return runList(readString(args, "status"), listOptions, global);
350
+ }
271
351
  case "get":
272
- return runGet(id ?? readRequiredString(options, "id"), global);
352
+ return runGet(id ?? readRequiredString(options, "id"), global, options);
273
353
  case "search":
274
354
  return runSearch(readRequiredString(args, "query"), options, global);
275
355
  case "create":
@@ -329,6 +409,31 @@ async function runAction(args) {
329
409
  return runFilesDiscover(id ?? readRequiredString(options, "id"), options, global);
330
410
  case "history":
331
411
  return runHistory(id ?? readRequiredString(options, "id"), options, global);
412
+ case "history-redact":
413
+ return runHistoryRedact(id ?? readRequiredString(options, "id"), options, global);
414
+ case "plan": {
415
+ const subcommand = readRequiredString(options, "subcommand");
416
+ const planRecord = options;
417
+ const reorderToken = planRecord.reorderTo ?? args.reorderTo;
418
+ const reorderTo = typeof reorderToken === "number" && Number.isFinite(reorderToken)
419
+ ? reorderToken
420
+ : typeof reorderToken === "string" && reorderToken.trim().length > 0
421
+ ? Number.parseInt(reorderToken, 10)
422
+ : undefined;
423
+ const stepRef = typeof planRecord.stepRef === "string"
424
+ ? planRecord.stepRef
425
+ : typeof args.stepRef === "string"
426
+ ? args.stepRef
427
+ : undefined;
428
+ return runPlan({
429
+ subcommand: subcommand,
430
+ id: typeof id === "string" ? id : typeof planRecord.id === "string" ? planRecord.id : undefined,
431
+ stepRef,
432
+ reorderTo,
433
+ options: options,
434
+ global,
435
+ });
436
+ }
332
437
  case "stats":
333
438
  return runStats(global);
334
439
  case "append":
@@ -359,6 +464,7 @@ const HANDLERS = {
359
464
  pm_validate: (args) => runAction({ ...args, action: "validate" }),
360
465
  pm_health: (args) => runAction({ ...args, action: "health" }),
361
466
  pm_contracts: (args) => runAction({ ...args, action: "contracts" }),
467
+ pm_plan: (args) => runAction({ ...args, action: "plan" }),
362
468
  };
363
469
  function resultContent(result) {
364
470
  return {
@@ -393,11 +499,13 @@ export async function handleRequest(request) {
393
499
  return {
394
500
  protocolVersion: "2025-06-18",
395
501
  capabilities: { tools: {} },
396
- serverInfo: { name: "pm-cli-native", version: "1.0.0" },
502
+ serverInfo: { name: "pm-mcp", version: "1.0.0" },
397
503
  instructions: "You have access to native pm CLI tools for git-based project management. " +
398
504
  "Use pm_context or pm_search before creating new work. " +
399
- "Prefer narrow tools (pm_context, pm_list, pm_get, pm_search, pm_create, pm_update, pm_claim, pm_release, pm_close, pm_comments, pm_files, pm_docs, pm_test, pm_validate, pm_health, pm_contracts) over pm_run when they cover the operation. " +
505
+ "Prefer narrow tools (pm_context, pm_list, pm_get, pm_search, pm_create, pm_update, pm_claim, pm_release, pm_close, pm_comments, pm_files, pm_docs, pm_test, pm_validate, pm_health, pm_contracts, pm_plan) over pm_run when they cover the operation. " +
506
+ "Use pm_plan for agent harness Plan workflows: it provides Codex/Claude/Cursor-style planning with durable steps, dependencies, decisions, discoveries, validation, and materialization. " +
400
507
  "Use pm_run with an explicit action for package-owned operations (calendar/templates/guide/dedupe-audit/normalize/reindex/comments-audit/completion/test-runs-list/test-runs-status/test-runs-logs/test-runs-stop/test-runs-resume), plus activity, aggregate, history, stats, append, notes, learnings, test-all, and gc. " +
508
+ "Use history-redact for audited history-stream redaction workflows. " +
401
509
  "Set author to 'claude-code-agent' on all mutations. " +
402
510
  "Do not pass path during real repository tracking — only pass path for sandbox or test runs.",
403
511
  };
@@ -461,4 +569,5 @@ export function startMcpServer() {
461
569
  if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
462
570
  startMcpServer();
463
571
  }
464
- //# sourceMappingURL=server.js.map
572
+ //# sourceMappingURL=server.js.map
573
+ //# debugId=295d3ce6-dcc1-57fe-803a-76ed96fc5ce1