@unbrained/pm-cli 2026.3.9 → 2026.5.1-2

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 (288) hide show
  1. package/.agents/pm/extensions/.managed-extensions.json +42 -0
  2. package/.agents/pm/extensions/beads/index.js +109 -0
  3. package/.agents/pm/extensions/beads/manifest.json +7 -0
  4. package/{dist/cli/commands/beads.js → .agents/pm/extensions/beads/runtime.js} +167 -56
  5. package/.agents/pm/extensions/beads/runtime.ts +702 -0
  6. package/.agents/pm/extensions/todos/index.js +126 -0
  7. package/.agents/pm/extensions/todos/manifest.json +7 -0
  8. package/{dist/extensions/builtins/todos/import-export.js → .agents/pm/extensions/todos/runtime.js} +39 -29
  9. package/.agents/pm/extensions/todos/runtime.ts +568 -0
  10. package/AGENTS.md +212 -94
  11. package/CHANGELOG.md +404 -0
  12. package/CODE_OF_CONDUCT.md +42 -0
  13. package/CONTRIBUTING.md +144 -0
  14. package/PRD.md +522 -173
  15. package/README.md +996 -495
  16. package/SECURITY.md +51 -0
  17. package/dist/cli/commands/activity.d.ts +5 -0
  18. package/dist/cli/commands/activity.js +66 -3
  19. package/dist/cli/commands/activity.js.map +1 -1
  20. package/dist/cli/commands/aggregate.d.ts +54 -0
  21. package/dist/cli/commands/aggregate.js +181 -0
  22. package/dist/cli/commands/aggregate.js.map +1 -0
  23. package/dist/cli/commands/append.js +4 -1
  24. package/dist/cli/commands/append.js.map +1 -1
  25. package/dist/cli/commands/calendar.d.ts +109 -0
  26. package/dist/cli/commands/calendar.js +797 -0
  27. package/dist/cli/commands/calendar.js.map +1 -0
  28. package/dist/cli/commands/claim.d.ts +5 -1
  29. package/dist/cli/commands/claim.js +42 -21
  30. package/dist/cli/commands/claim.js.map +1 -1
  31. package/dist/cli/commands/close.d.ts +1 -0
  32. package/dist/cli/commands/close.js +54 -5
  33. package/dist/cli/commands/close.js.map +1 -1
  34. package/dist/cli/commands/comments-audit.d.ts +91 -0
  35. package/dist/cli/commands/comments-audit.js +195 -0
  36. package/dist/cli/commands/comments-audit.js.map +1 -0
  37. package/dist/cli/commands/comments.d.ts +1 -0
  38. package/dist/cli/commands/comments.js +70 -21
  39. package/dist/cli/commands/comments.js.map +1 -1
  40. package/dist/cli/commands/completion.d.ts +10 -4
  41. package/dist/cli/commands/completion.js +1240 -193
  42. package/dist/cli/commands/completion.js.map +1 -1
  43. package/dist/cli/commands/config.d.ts +35 -3
  44. package/dist/cli/commands/config.js +968 -13
  45. package/dist/cli/commands/config.js.map +1 -1
  46. package/dist/cli/commands/context.d.ts +86 -0
  47. package/dist/cli/commands/context.js +299 -0
  48. package/dist/cli/commands/context.js.map +1 -0
  49. package/dist/cli/commands/contracts.d.ts +78 -0
  50. package/dist/cli/commands/contracts.js +920 -0
  51. package/dist/cli/commands/contracts.js.map +1 -0
  52. package/dist/cli/commands/create.d.ts +48 -14
  53. package/dist/cli/commands/create.js +1331 -160
  54. package/dist/cli/commands/create.js.map +1 -1
  55. package/dist/cli/commands/dedupe-audit.d.ts +81 -0
  56. package/dist/cli/commands/dedupe-audit.js +330 -0
  57. package/dist/cli/commands/dedupe-audit.js.map +1 -0
  58. package/dist/cli/commands/deps.d.ts +52 -0
  59. package/dist/cli/commands/deps.js +204 -0
  60. package/dist/cli/commands/deps.js.map +1 -0
  61. package/dist/cli/commands/docs.d.ts +19 -0
  62. package/dist/cli/commands/docs.js +212 -13
  63. package/dist/cli/commands/docs.js.map +1 -1
  64. package/dist/cli/commands/extension.d.ts +122 -0
  65. package/dist/cli/commands/extension.js +1850 -0
  66. package/dist/cli/commands/extension.js.map +1 -0
  67. package/dist/cli/commands/files.d.ts +52 -1
  68. package/dist/cli/commands/files.js +455 -13
  69. package/dist/cli/commands/files.js.map +1 -1
  70. package/dist/cli/commands/gc.d.ts +11 -1
  71. package/dist/cli/commands/gc.js +89 -11
  72. package/dist/cli/commands/gc.js.map +1 -1
  73. package/dist/cli/commands/get.d.ts +13 -0
  74. package/dist/cli/commands/get.js +35 -3
  75. package/dist/cli/commands/get.js.map +1 -1
  76. package/dist/cli/commands/health.d.ts +10 -2
  77. package/dist/cli/commands/health.js +774 -23
  78. package/dist/cli/commands/health.js.map +1 -1
  79. package/dist/cli/commands/history.d.ts +20 -0
  80. package/dist/cli/commands/history.js +152 -6
  81. package/dist/cli/commands/history.js.map +1 -1
  82. package/dist/cli/commands/index.d.ts +16 -3
  83. package/dist/cli/commands/index.js +16 -3
  84. package/dist/cli/commands/index.js.map +1 -1
  85. package/dist/cli/commands/init.d.ts +7 -2
  86. package/dist/cli/commands/init.js +137 -5
  87. package/dist/cli/commands/init.js.map +1 -1
  88. package/dist/cli/commands/learnings.d.ts +17 -0
  89. package/dist/cli/commands/learnings.js +129 -0
  90. package/dist/cli/commands/learnings.js.map +1 -0
  91. package/dist/cli/commands/list.d.ts +29 -1
  92. package/dist/cli/commands/list.js +292 -56
  93. package/dist/cli/commands/list.js.map +1 -1
  94. package/dist/cli/commands/normalize.d.ts +51 -0
  95. package/dist/cli/commands/normalize.js +298 -0
  96. package/dist/cli/commands/normalize.js.map +1 -0
  97. package/dist/cli/commands/notes.d.ts +17 -0
  98. package/dist/cli/commands/notes.js +129 -0
  99. package/dist/cli/commands/notes.js.map +1 -0
  100. package/dist/cli/commands/reindex.d.ts +1 -0
  101. package/dist/cli/commands/reindex.js +208 -32
  102. package/dist/cli/commands/reindex.js.map +1 -1
  103. package/dist/cli/commands/restore.js +164 -30
  104. package/dist/cli/commands/restore.js.map +1 -1
  105. package/dist/cli/commands/search.d.ts +14 -1
  106. package/dist/cli/commands/search.js +479 -85
  107. package/dist/cli/commands/search.js.map +1 -1
  108. package/dist/cli/commands/stats.js +26 -10
  109. package/dist/cli/commands/stats.js.map +1 -1
  110. package/dist/cli/commands/templates.d.ts +26 -0
  111. package/dist/cli/commands/templates.js +179 -0
  112. package/dist/cli/commands/templates.js.map +1 -0
  113. package/dist/cli/commands/test-all.d.ts +19 -1
  114. package/dist/cli/commands/test-all.js +161 -13
  115. package/dist/cli/commands/test-all.js.map +1 -1
  116. package/dist/cli/commands/test-runs.d.ts +63 -0
  117. package/dist/cli/commands/test-runs.js +179 -0
  118. package/dist/cli/commands/test-runs.js.map +1 -0
  119. package/dist/cli/commands/test.d.ts +75 -1
  120. package/dist/cli/commands/test.js +1360 -41
  121. package/dist/cli/commands/test.js.map +1 -1
  122. package/dist/cli/commands/update-many.d.ts +57 -0
  123. package/dist/cli/commands/update-many.js +631 -0
  124. package/dist/cli/commands/update-many.js.map +1 -0
  125. package/dist/cli/commands/update.d.ts +30 -0
  126. package/dist/cli/commands/update.js +1393 -84
  127. package/dist/cli/commands/update.js.map +1 -1
  128. package/dist/cli/commands/validate.d.ts +30 -0
  129. package/dist/cli/commands/validate.js +1151 -0
  130. package/dist/cli/commands/validate.js.map +1 -0
  131. package/dist/cli/error-guidance.d.ts +33 -0
  132. package/dist/cli/error-guidance.js +337 -0
  133. package/dist/cli/error-guidance.js.map +1 -0
  134. package/dist/cli/extension-command-options.d.ts +1 -0
  135. package/dist/cli/extension-command-options.js +92 -0
  136. package/dist/cli/extension-command-options.js.map +1 -1
  137. package/dist/cli/help-content.d.ts +20 -0
  138. package/dist/cli/help-content.js +543 -0
  139. package/dist/cli/help-content.js.map +1 -0
  140. package/dist/cli/main.js +3648 -467
  141. package/dist/cli/main.js.map +1 -1
  142. package/dist/core/extensions/index.d.ts +13 -1
  143. package/dist/core/extensions/index.js +108 -1
  144. package/dist/core/extensions/index.js.map +1 -1
  145. package/dist/core/extensions/item-fields.d.ts +2 -0
  146. package/dist/core/extensions/item-fields.js +79 -0
  147. package/dist/core/extensions/item-fields.js.map +1 -0
  148. package/dist/core/extensions/loader.d.ts +322 -9
  149. package/dist/core/extensions/loader.js +911 -20
  150. package/dist/core/extensions/loader.js.map +1 -1
  151. package/dist/core/extensions/runtime-registrations.d.ts +5 -0
  152. package/dist/core/extensions/runtime-registrations.js +51 -0
  153. package/dist/core/extensions/runtime-registrations.js.map +1 -0
  154. package/dist/core/history/history-stream-policy.d.ts +20 -0
  155. package/dist/core/history/history-stream-policy.js +53 -0
  156. package/dist/core/history/history-stream-policy.js.map +1 -0
  157. package/dist/core/history/history.js +90 -1
  158. package/dist/core/history/history.js.map +1 -1
  159. package/dist/core/item/id.d.ts +1 -0
  160. package/dist/core/item/id.js +10 -3
  161. package/dist/core/item/id.js.map +1 -1
  162. package/dist/core/item/index.d.ts +1 -0
  163. package/dist/core/item/index.js +1 -0
  164. package/dist/core/item/index.js.map +1 -1
  165. package/dist/core/item/item-format.d.ts +11 -5
  166. package/dist/core/item/item-format.js +532 -28
  167. package/dist/core/item/item-format.js.map +1 -1
  168. package/dist/core/item/parent-reference-policy.d.ts +6 -0
  169. package/dist/core/item/parent-reference-policy.js +32 -0
  170. package/dist/core/item/parent-reference-policy.js.map +1 -0
  171. package/dist/core/item/parse.d.ts +5 -0
  172. package/dist/core/item/parse.js +216 -19
  173. package/dist/core/item/parse.js.map +1 -1
  174. package/dist/core/item/sprint-release-format.d.ts +6 -0
  175. package/dist/core/item/sprint-release-format.js +33 -0
  176. package/dist/core/item/sprint-release-format.js.map +1 -0
  177. package/dist/core/item/status.d.ts +3 -0
  178. package/dist/core/item/status.js +24 -0
  179. package/dist/core/item/status.js.map +1 -0
  180. package/dist/core/item/type-registry.d.ts +37 -0
  181. package/dist/core/item/type-registry.js +706 -0
  182. package/dist/core/item/type-registry.js.map +1 -0
  183. package/dist/core/lock/lock.d.ts +1 -1
  184. package/dist/core/lock/lock.js +101 -12
  185. package/dist/core/lock/lock.js.map +1 -1
  186. package/dist/core/output/command-aware.d.ts +1 -0
  187. package/dist/core/output/command-aware.js +394 -0
  188. package/dist/core/output/command-aware.js.map +1 -0
  189. package/dist/core/output/output.d.ts +3 -0
  190. package/dist/core/output/output.js +124 -6
  191. package/dist/core/output/output.js.map +1 -1
  192. package/dist/core/schema/runtime-field-filters.d.ts +3 -0
  193. package/dist/core/schema/runtime-field-filters.js +39 -0
  194. package/dist/core/schema/runtime-field-filters.js.map +1 -0
  195. package/dist/core/schema/runtime-field-values.d.ts +8 -0
  196. package/dist/core/schema/runtime-field-values.js +154 -0
  197. package/dist/core/schema/runtime-field-values.js.map +1 -0
  198. package/dist/core/schema/runtime-schema.d.ts +68 -0
  199. package/dist/core/schema/runtime-schema.js +554 -0
  200. package/dist/core/schema/runtime-schema.js.map +1 -0
  201. package/dist/core/search/cache.d.ts +13 -1
  202. package/dist/core/search/cache.js +123 -14
  203. package/dist/core/search/cache.js.map +1 -1
  204. package/dist/core/search/semantic-defaults.d.ts +6 -0
  205. package/dist/core/search/semantic-defaults.js +120 -0
  206. package/dist/core/search/semantic-defaults.js.map +1 -0
  207. package/dist/core/search/vector-stores.js +3 -1
  208. package/dist/core/search/vector-stores.js.map +1 -1
  209. package/dist/core/shared/command-types.d.ts +2 -0
  210. package/dist/core/shared/conflict-markers.d.ts +7 -0
  211. package/dist/core/shared/conflict-markers.js +27 -0
  212. package/dist/core/shared/conflict-markers.js.map +1 -0
  213. package/dist/core/shared/constants.d.ts +15 -4
  214. package/dist/core/shared/constants.js +146 -1
  215. package/dist/core/shared/constants.js.map +1 -1
  216. package/dist/core/shared/errors.d.ts +10 -1
  217. package/dist/core/shared/errors.js +3 -1
  218. package/dist/core/shared/errors.js.map +1 -1
  219. package/dist/core/shared/text-normalization.d.ts +4 -0
  220. package/dist/core/shared/text-normalization.js +33 -0
  221. package/dist/core/shared/text-normalization.js.map +1 -0
  222. package/dist/core/shared/time.d.ts +3 -2
  223. package/dist/core/shared/time.js +109 -11
  224. package/dist/core/shared/time.js.map +1 -1
  225. package/dist/core/store/index.d.ts +1 -0
  226. package/dist/core/store/index.js +1 -0
  227. package/dist/core/store/index.js.map +1 -1
  228. package/dist/core/store/item-format-migration.d.ts +9 -0
  229. package/dist/core/store/item-format-migration.js +87 -0
  230. package/dist/core/store/item-format-migration.js.map +1 -0
  231. package/dist/core/store/item-store.d.ts +13 -4
  232. package/dist/core/store/item-store.js +243 -52
  233. package/dist/core/store/item-store.js.map +1 -1
  234. package/dist/core/store/paths.d.ts +21 -3
  235. package/dist/core/store/paths.js +59 -4
  236. package/dist/core/store/paths.js.map +1 -1
  237. package/dist/core/store/settings.d.ts +14 -1
  238. package/dist/core/store/settings.js +463 -7
  239. package/dist/core/store/settings.js.map +1 -1
  240. package/dist/core/telemetry/consent.d.ts +2 -0
  241. package/dist/core/telemetry/consent.js +79 -0
  242. package/dist/core/telemetry/consent.js.map +1 -0
  243. package/dist/core/telemetry/runtime.d.ts +38 -0
  244. package/dist/core/telemetry/runtime.js +733 -0
  245. package/dist/core/telemetry/runtime.js.map +1 -0
  246. package/dist/core/test/background-runs.d.ts +117 -0
  247. package/dist/core/test/background-runs.js +760 -0
  248. package/dist/core/test/background-runs.js.map +1 -0
  249. package/dist/core/test/item-test-run-tracking.d.ts +9 -0
  250. package/dist/core/test/item-test-run-tracking.js +50 -0
  251. package/dist/core/test/item-test-run-tracking.js.map +1 -0
  252. package/dist/sdk/cli-contracts.d.ts +92 -0
  253. package/dist/sdk/cli-contracts.js +2357 -0
  254. package/dist/sdk/cli-contracts.js.map +1 -0
  255. package/dist/sdk/index.d.ts +34 -0
  256. package/dist/sdk/index.js +23 -0
  257. package/dist/sdk/index.js.map +1 -0
  258. package/dist/types.d.ts +204 -4
  259. package/dist/types.js +56 -1
  260. package/dist/types.js.map +1 -1
  261. package/docs/ARCHITECTURE.md +369 -40
  262. package/docs/EXTENSIONS.md +454 -49
  263. package/docs/RELEASING.md +70 -19
  264. package/docs/SDK.md +123 -0
  265. package/docs/examples/starter-extension/README.md +48 -0
  266. package/docs/examples/starter-extension/index.js +191 -0
  267. package/docs/examples/starter-extension/manifest.json +17 -0
  268. package/docs/examples/starter-extension/package.json +10 -0
  269. package/package.json +41 -14
  270. package/scripts/install.ps1 +2 -1
  271. package/scripts/install.sh +2 -1
  272. package/.pi/extensions/pm-cli/index.ts +0 -778
  273. package/dist/cli/commands/beads.d.ts +0 -15
  274. package/dist/cli/commands/beads.js.map +0 -1
  275. package/dist/cli/commands/install.d.ts +0 -18
  276. package/dist/cli/commands/install.js +0 -87
  277. package/dist/cli/commands/install.js.map +0 -1
  278. package/dist/core/extensions/builtins.d.ts +0 -3
  279. package/dist/core/extensions/builtins.js +0 -47
  280. package/dist/core/extensions/builtins.js.map +0 -1
  281. package/dist/extensions/builtins/beads/index.d.ts +0 -8
  282. package/dist/extensions/builtins/beads/index.js +0 -29
  283. package/dist/extensions/builtins/beads/index.js.map +0 -1
  284. package/dist/extensions/builtins/todos/import-export.d.ts +0 -26
  285. package/dist/extensions/builtins/todos/import-export.js.map +0 -1
  286. package/dist/extensions/builtins/todos/index.d.ts +0 -8
  287. package/dist/extensions/builtins/todos/index.js +0 -38
  288. package/dist/extensions/builtins/todos/index.js.map +0 -1
package/AGENTS.md CHANGED
@@ -6,7 +6,8 @@ This document defines how coding agents must use `pm` for planning, execution, a
6
6
 
7
7
  - Use `pm` as the system of record for project work.
8
8
  - Prefer deterministic, script-friendly command usage (`--json` when strict parsing is needed).
9
- - Default to TOON output when human + model readability and low token use are desired.
9
+ - Default to TOON output when human + model readability and low token use are desired (calendar command is the intentional exception and defaults to markdown unless overridden).
10
+ - Treat TOON as the canonical item-document format in this repo; `front_matter` is an internal model key, while TOON item metadata is stored as top-level object fields.
10
11
  - Never make destructive item changes outside `pm` mutations.
11
12
  - Every mutation must produce a history entry.
12
13
 
@@ -19,6 +20,11 @@ This document defines how coding agents must use `pm` for planning, execution, a
19
20
  - Refresh the global CLI from this repository for maintainer runs:
20
21
  - Run `npm install -g .` from repository root.
21
22
  - Verify availability with `pm --version` before mutation commands.
23
+ - Run baseline runtime/build sanity checks before mutation commands:
24
+ - `PM_CMD --version`
25
+ - `node -v`
26
+ - `pnpm -v`
27
+ - `pnpm build` (if configured)
22
28
  - For real repository tracking, do not override `PM_PATH`.
23
29
  - For tests only, always use sandboxed `PM_PATH` and `PM_GLOBAL_PATH` (or `node scripts/run-tests.mjs ...`).
24
30
 
@@ -26,6 +32,19 @@ This document defines how coding agents must use `pm` for planning, execution, a
26
32
 
27
33
  ### Step A - Pick next work
28
34
 
35
+ Before creating any new `pm` item, always check for an existing relevant item first.
36
+
37
+ - Search and list existing items before `pm create`:
38
+ - `pm context --limit 10`
39
+ - `pm search "<keywords>" --limit 10`
40
+ - `pm list-open --limit 20`
41
+ - `pm list-in-progress --limit 20`
42
+ - If a relevant item already exists, reuse it, update it, or claim it instead of creating a new one.
43
+ - Never create duplicate `pm` items for the same work.
44
+ - Before `pm create`, identify the canonical parent lineage (`Epic` -> `Feature`) for the incoming scope.
45
+ - If scope is truly net-new, create/normalize parent lineage first, then create child work with explicit `--parent`.
46
+ - Add a create-time comment that records duplicate-check evidence (commands run + why net-new scope was required).
47
+
29
48
  Use one of:
30
49
 
31
50
  - `pm list-in-progress --limit 20`
@@ -34,7 +53,7 @@ Use one of:
34
53
 
35
54
  Then filter:
36
55
 
37
- - by type: `--type Task|Feature|Issue|Chore|Epic`
56
+ - by type: `--type <value>` (resolved by runtime type registry: built-ins plus configured custom types)
38
57
  - by priority: `--priority 0..4`
39
58
  - by tag: `--tag <name>`
40
59
 
@@ -42,6 +61,7 @@ Then filter:
42
61
 
43
62
  - `pm claim <ID>`
44
63
  - If conflict and explicitly approved: `pm claim <ID> --force`
64
+ - `pm claim` takeover of non-terminal items assigned to another owner does not require `--force`; reserve `--force` for terminal-state or lock override paths.
45
65
 
46
66
  Rules:
47
67
 
@@ -54,10 +74,13 @@ Populate metadata early:
54
74
 
55
75
  - `pm update <ID> --description "..."`
56
76
  - `pm update <ID> --acceptance-criteria/--ac "..."`
77
+ - `pm update <ID> --body "..."` (replace body content for normalization/backfill; use `pm append --body` for additive notes)
78
+ - `pm update <ID> --parent <ID>` to keep hierarchy deterministic for future linking (clear with `pm update <ID> --unset parent`)
57
79
  - `pm update <ID> --estimate <minutes>`
58
- - `pm update <ID> --deadline +1d` (resolved to ISO at write)
80
+ - `pm update <ID> --deadline +1d` (accepts ISO/date strings or relative `+6h/+1d/+2w/+6m`; resolved to ISO at write)
81
+ - `pm update <ID> --close-reason <text>` for explicit close_reason set; clear with `pm update <ID> --unset close-reason` (reopen transitions from `closed` to non-terminal status auto-clear stale close_reason unless explicitly overridden in that same update call)
59
82
  - when team-level close-readiness policy changes, update Definition of Done criteria via:
60
- - `pm config project set definition-of-done --criterion "tests pass" --criterion "linked files/tests/docs present"`
83
+ - `pm config project set definition-of-done --criterion "tests pass" --criterion "linked files/tests/docs present" --criterion "parent/dependency links complete" --criterion "duplicate check performed before create"`
61
84
 
62
85
  ### Step D - Link execution context
63
86
 
@@ -65,43 +88,63 @@ Attach references to keep work reproducible:
65
88
 
66
89
  - Files:
67
90
  - `pm files <ID> --add path=src/app.ts,scope=project,note="entrypoint"`
91
+ - `pm files <ID> --add-glob "src/**/*.ts"` for deterministic batch linking
92
+ - `pm files <ID> --add path=src/new.ts,scope=project --append-stable` when preserving existing link order and minimizing history patch churn
68
93
  - Tests:
69
94
  - `pm test <ID> --add command="node scripts/run-tests.mjs test",scope=project,timeout_seconds=240`
70
- - `pm test <ID> --add path=tests/history.spec.ts,scope=project`
95
+ - `pm test <ID> --add command="node scripts/run-tests.mjs test -- tests/history.spec.ts",path=tests/history.spec.ts,scope=project`
71
96
  - Docs:
72
97
  - `pm docs <ID> --add path=docs/ARCHITECTURE.md,scope=project`
98
+ - Command boundaries:
99
+ - `pm update` intentionally does not mutate linked files/docs; use `pm files` / `pm docs`.
100
+ - `pm deps` is read-only and intended for dependency tree/graph inspection (`--format tree|graph`).
101
+ - Entry-format resilience:
102
+ - `--add`/repeatable seed flags accept CSV `key=value`, markdown `key: value`, or stdin token `-` with piped payload.
103
+ - for `pm create` log-seed flags, `--comment` supports plain-text shorthand in addition to structured key/value input; structured `--comment`/`--note`/`--learning` payloads accept only `author`, `created_at`, and `text` keys. Quote punctuation-heavy text (for example `text="hello,scope:project"`) or use markdown/stdin to avoid ambiguous key-like continuations.
104
+ - for `pm comments|notes|learnings --add`, CSV-like strings with extra key fragments (for example `text=hello,scope:project`) are intentionally preserved as plain text; use explicit `text=...`, markdown `text: ...`, or stdin token `-` when structured parsing is required.
105
+ - Example: `printf '%s\n' 'path: src/app.ts' 'scope: project' | pm files <ID> --add -`
73
106
 
74
107
  ### Step E - Record progress
75
108
 
76
109
  Use append-style updates:
77
110
 
78
- - `pm comments <ID> --add "Implemented lock retry path"`
111
+ - `pm comments <ID> "Implemented lock retry path"` (or `--add "..."` for structured/stdin forms)
112
+ - use `pm comments <ID> ... --allow-audit-comment` for append-only audit comments on items assigned to another owner
113
+ - use `pm notes <ID> ... --allow-audit-comment` / `pm learnings <ID> ... --allow-audit-comment` for append-only audit note/learning entries on another owner's item
114
+ - use `pm update <ID> --dep ... --allow-audit-dep-update` for cross-owner append-only dependency wiring without broad `--force`
115
+ - use `pm release <ID> ... --allow-audit-release` for non-owner handoffs that only clear assignee metadata
116
+ - reserve `pm comments <ID> ... --force` for coordinated ownership-override paths beyond append-only audit comments
79
117
  - `pm update <ID> --status in_progress`
80
118
  - `pm append <ID> --body "Detailed implementation notes..."`
81
119
 
82
120
  Capture durable notes:
83
121
 
84
- - `pm update <ID> --message "Add design rationale"` with note additions
85
- - Add learnings at the end of significant discoveries.
122
+ - `pm notes <ID> --add "Design rationale and implementation context"`
123
+ - `pm learnings <ID> --add "Durable lesson for future work"`
86
124
 
87
125
  ### Step F - Validate and close
88
126
 
89
127
  Before close:
90
128
 
91
129
  1. Run linked tests:
92
- - `pm test <ID> --run`
130
+ - `pm test <ID> --run` (add `--progress` for explicit non-interactive stderr progress visibility)
131
+ - optional managed background mode: `pm test <ID> --run --background` / `pm test-all --background`, then monitor/control with `pm test-runs` (defaults to list) or explicit `pm test-runs list|status|logs|stop|resume`
93
132
  2. Run sandbox-safe coverage verification:
94
133
  - `node scripts/run-tests.mjs coverage`
95
134
  3. Optionally run project sweep:
96
- - `pm test-all --status in_progress`
135
+ - `pm test-all --status in_progress` (add `--progress` for explicit non-interactive visibility)
97
136
  - `pm test-all --status closed` (when running a broader release-readiness regression sweep)
98
137
  - Avoid linking `pm test-all` itself as an item-level linked test command, since that creates recursive orchestration.
99
- 4. Add closure evidence:
100
- - `pm comments <ID> --add "Evidence: tests X, Y passed; coverage remains 100%."`
138
+ 4. Run targeted close-readiness validation when relevant:
139
+ - `pm validate --check-resolution --check-history-drift`
140
+ - `pm normalize --dry-run --json` (when performing lifecycle metadata hygiene sweeps before apply mode)
141
+ - for linked-file coverage audits, use `pm validate --check-files --scan-mode tracked-all`
142
+ 5. Add closure evidence:
143
+ - `pm comments <ID> "Evidence: tests X, Y passed; coverage remains 100%."` (or `--add "..."`)
101
144
 
102
145
  Close (current v0.1 workflow):
103
146
 
104
- - `pm close <ID> "<reason>" --author "..." --message "Close: <reason with evidence>"`
147
+ - `pm close <ID> "<reason>" --validate-close warn --author "..." --message "Close: <reason with evidence>"`
105
148
 
106
149
  ### Step G - Release claim
107
150
 
@@ -128,9 +171,16 @@ Use release when:
128
171
  - Tests must never read/write the repository's real `.agents/pm` data.
129
172
  - Unit/integration test runs must set `PM_PATH` to a temporary sandbox directory.
130
173
  - pm-driven test execution should use `node scripts/run-tests.mjs <test|coverage>` so both `PM_PATH` and `PM_GLOBAL_PATH` are sandboxed automatically per run.
131
- - `pm test <ID> --add` should only link sandbox-safe test-runner commands: use `node scripts/run-tests.mjs ...` or explicitly set both `PM_PATH` and `PM_GLOBAL_PATH`; sandbox-unsafe runner commands are rejected at add-time, including unsandboxed package-manager run-script variants (for example `npm run test`, `pnpm run test`, `yarn run test`, and `bun run test`) and chained direct test-runner segments that are not explicitly sandboxed.
174
+ - `pm test <ID> --add` should only link sandbox-safe runnable commands and now requires `command=...` metadata (optional `path=...` is supplemental context): use `node scripts/run-tests.mjs ...` or explicitly set both `PM_PATH` and `PM_GLOBAL_PATH`; sandbox-unsafe runner commands are rejected at add-time, including unsandboxed package-manager run-script variants (for example `npm run test`, `pnpm run test`, `yarn run test`, and `bun run test`) and chained direct test-runner segments that are not explicitly sandboxed.
132
175
  - `pm test <ID> --run` should defensively skip legacy linked commands that invoke `pm test-all` (including global-flag and package-spec launcher forms such as `pm --json test-all`, `npx @unbrained/pm-cli@latest --json test-all`, `pnpm dlx @unbrained/pm-cli@latest --json test-all`, and `npm exec -- @unbrained/pm-cli@latest --json test-all`) and report deterministic skipped results.
133
- - `pm test-all` deduplicates linked tests by scope+normalized command or scope+path and reports duplicates as skipped; when duplicate keys disagree on `timeout_seconds`, execution uses the deterministic maximum timeout for that key.
176
+ - `pm test <ID> --run` / `pm test-all` should preserve sandbox isolation while seeding project/global `settings.json` and `extensions/` from source roots so extension-defined type/schema behavior matches direct workspace runs.
177
+ - `pm test <ID> --run --background` / `pm test-all --background` should be treated as additive lifecycle controls only; use `pm test-runs` commands for status/log/stop/resume and rely on fingerprint dedupe to avoid duplicate parallel runs.
178
+ - PM-command linked-test runs should default to `--pm-context schema`; PM tracker-read linked commands fail on context mismatch by default in schema mode, `--pm-context auto` can route tracker-read commands automatically, and `--pm-context tracker` should be used when full tracker parity is required. Use `--check-context` for deterministic preflight diagnostics and `--auto-pm-context` for tracker-read auto-remediation. Per-linked-test `pm_context_mode` metadata can override run-level mode; when that override forces schema against run-level tracker, mismatch guidance should call out the override explicitly. Rely on `run_results[].execution_context` metadata (including tracker-read classification plus `requested_pm_context_mode` / `auto_pm_context_applied`) for parity diagnostics.
179
+ - Use strict governance flags when verification quality matters: `--fail-on-context-mismatch`, `--fail-on-skipped`, and `--require-assertions-for-pm`.
180
+ - Treat failed linked-test run results from `pm test <ID> --run` as dependency-failed process exits (code `5`) in automation/CI checks, matching `pm test-all` gating semantics.
181
+ - Linked-test assertion metadata is optional but preferred for PM-command checks (`assert_stdout_contains`, `assert_stdout_regex`, `assert_stderr_contains`, `assert_stderr_regex`, `assert_stdout_min_lines`, `assert_json_field_equals`, `assert_json_field_gte`).
182
+ - `pm test-all` deduplicates linked tests by scope+normalized command or scope+path (including runtime directives/assertions/context metadata) and reports duplicates as skipped; when duplicate keys disagree on `timeout_seconds`, execution uses the deterministic maximum timeout for that key.
183
+ - Item-level test result persistence is controlled via `pm config ... test-result-tracking --policy enabled|disabled`; when enabled, bounded `test_runs` summaries are appended on `pm test --run` / `pm test-all` completion.
134
184
  - Integration tests should invoke the built CLI (`node dist/cli.js ...`) with explicit `PM_PATH`, `PM_GLOBAL_PATH`, and `PM_AUTHOR`.
135
185
  - Cleanup temporary test directories after each test/suite.
136
186
 
@@ -143,9 +193,21 @@ Use release when:
143
193
  - `SECURITY.md` with vulnerability reporting instructions
144
194
  - `CODE_OF_CONDUCT.md` contributor behavior policy
145
195
 
196
+ ## 3.3 Terminal Compatibility Guardrails
197
+
198
+ - Keep CLI output terminal-neutral by default: deterministic TOON/JSON/markdown text, no required custom OSC/ANSI protocol.
199
+ - Preserve canonical exit-code mapping while preferring graceful exit handling (`process.exitCode`) over forced `process.exit(...)` when feasible.
200
+ - For stdin token paths (`-`) and `pm beads import --file -`, treat interactive TTY stdin as usage error and provide explicit piped-input guidance.
201
+ - Document and test manual EOF guidance for interactive sessions:
202
+ - Unix/macOS: `Ctrl+D`
203
+ - Windows: `Ctrl+Z` then `Enter`
204
+ - For linked test orchestration (`pm test --run` / `pm test-all`), maintain sandbox safety and non-interactive child process behavior, including deterministic timeout/maxBuffer diagnostics.
205
+ - For long-running linked-test and reindex paths, use additive `--progress` when non-interactive visibility is required.
206
+
146
207
  ## 4) Token Minimization Rules (TOON-first)
147
208
 
148
209
  - Prefer default TOON output for list/search/get in agent loops.
210
+ - Prefer `pm context --limit <n>` as the first triage snapshot when selecting next work.
149
211
  - Use `--json` only when strict machine parsing is required.
150
212
  - Request narrow outputs:
151
213
  - `--limit`
@@ -162,6 +224,7 @@ Use release when:
162
224
  - `blocked`: waiting on dependency/input
163
225
  - `closed`: done and verified
164
226
  - `canceled`: intentionally discontinued
227
+ - Input compatibility: `in-progress` is accepted for status flags and normalized to `in_progress`.
165
228
 
166
229
  Ownership:
167
230
 
@@ -197,18 +260,47 @@ Quick start loop:
197
260
 
198
261
  ```bash
199
262
  pm config project set definition-of-done --criterion "tests pass" --criterion "linked files/tests/docs present"
200
- pm list-open --type Task --priority 0 --limit 5
263
+ pm config project set test-result-tracking --policy enabled
264
+ pm list-open --type Task --priority 0 --fields id,title,parent,type --sort priority --order asc --limit 5
201
265
  pm claim pm-a1b2
202
266
  pm update pm-a1b2 --status in_progress --description "Implement restore replay"
267
+ pm update pm-a1b2 --description "Audit metadata clarification" --allow-audit-update --author "audit-maintainer"
268
+ pm update-many --filter-status open --filter-tag governance --status in_progress --dry-run --json
269
+ pm update-many --filter-tag wave:7 --replace-tests --test "command=node scripts/run-tests.mjs test -- tests/core/history.spec.ts,scope=project,timeout_seconds=240" --message "Normalize linked tests"
270
+ pm normalize --filter-status in_progress --dry-run --json
271
+ pm normalize --filter-tag governance --apply --allow-audit-update --author audit-maintainer --message "Normalize lifecycle metadata"
272
+ pm update pm-a1b2 --body "Restore replay scope and acceptance details."
273
+ pm update pm-a1b2 --reminder "at=+1d,text=Follow up on restore replay tests"
203
274
  pm files pm-a1b2 --add path=src/history.ts,scope=project,note="restore implementation"
275
+ pm files pm-a1b2 --add-glob "src/**/*.ts"
204
276
  pm test pm-a1b2 --add command="node scripts/run-tests.mjs test",scope=project,timeout_seconds=240
205
- pm comments pm-a1b2 --add "Restore replay implemented with hash checks"
206
- pm test pm-a1b2 --run
277
+ pm comments pm-a1b2 "Restore replay implemented with hash checks"
278
+ pm notes pm-a1b2 --add "Replay path now guards missing history streams before write"
279
+ pm learnings pm-a1b2 --add "Use sandbox runner for linked test commands to preserve PM_PATH safety"
280
+ pm deps pm-a1b2 --format tree
281
+ pm aggregate --group-by parent,type --status open --json
282
+ pm dedupe-audit --mode parent_scope --limit 20 --json
283
+ pm calendar --view week --date 2026-04-06 --full-period --include deadlines,events --format markdown
284
+ pm activity --id pm-a1b2 --op update --author codex-agent --from -7d --to now --limit 100
285
+ pm activity --json --stream rows --limit 200
286
+ pm start-task pm-a1b2 --author codex-agent --message "Start implementation"
287
+ pm pause-task pm-a1b2 --author codex-agent --message "Pause for dependency unblock"
288
+ pm close-task pm-a1b2 "All acceptance criteria met" --author codex-agent --message "Close and handoff"
289
+ pm contracts --command update --flags-only --json
290
+ pm test pm-a1b2 --run --progress
291
+ pm health --check-only
292
+ pm validate --check-resolution --check-history-drift
207
293
  node scripts/run-tests.mjs coverage
208
- pm close pm-a1b2 "history replay tests passed; restore emits restore history event" --author "..." --message "Close: history replay tests passed; restore emits restore history event"
294
+ pm close pm-a1b2 "history replay tests passed; restore emits restore history event" --validate-close warn --author "..." --message "Close: history replay tests passed; restore emits restore history event"
209
295
  pm release pm-a1b2
210
296
  ```
211
297
 
298
+ Templates syntax reminder:
299
+
300
+ - `pm templates save` and `pm templates show` use positional template names.
301
+ - Use `pm templates save <name> ...` and `pm templates show <name>`.
302
+ - Do not pass `--name`; it is not a supported flag.
303
+
212
304
  Investigate change timeline:
213
305
 
214
306
  ```bash
@@ -226,10 +318,24 @@ pm restore pm-a1b2 2026-02-17T11:15:03.120Z
226
318
 
227
319
  The built-in Pi wrapper exposes one tool: `pm`.
228
320
  Reference implementation source lives at `.pi/extensions/pm-cli/index.ts` as a Pi agent extension module.
229
- Install the bundled Pi extension with `pm install pi --project` (default) or `pm install pi --global`.
230
- Load it in Pi with `pi -e ./.pi/extensions/pm-cli/index.ts` (or copy to `.pi/extensions/`).
321
+ `pm install` has been removed; install bundled managed runtime extensions via `pm extension --install beads|todos` (or explicit `.agents/pm/extensions/<name>` paths) when needed.
322
+ Load the Pi wrapper in Pi with `pi -e ./.pi/extensions/pm-cli/index.ts` (or copy it into your Pi extensions directory).
231
323
  Use `action: "completion"` with `shell: "bash"|"zsh"|"fish"` to forward to `pm completion <shell>`.
232
- For `create` and `update`, use camelCase wrapper parameters for the canonical CLI scalar fields such as `parent`, `reviewer`, `risk`, `confidence`, `sprint`, `release`, `blockedBy`, `blockedReason`, `unblockNote`, `definitionOfReady`, `order`, `goal`, `objective`, `value`, `impact`, `outcome`, `whyNow`, `reporter`, `severity`, `environment`, `reproSteps`, `resolution`, `expectedResult`, `actualResult`, `affectedVersion`, `fixedVersion`, `component`, `regression`, and `customerImpact`.
324
+ Use `action: "calendar"` for date-centric event views (`view`, `date`, `from`, `to`, `past`, `fullPeriod`, `type`, `tag`, `priority`, `status`, `assignee`, `sprint`, `release`, `limit`, `format`).
325
+ Use `action: "aggregate"` for grouped decomposition checks (`groupBy`, `count`, `includeUnparented`, list-style filters).
326
+ Use `action: "dedupe-audit"` for duplicate corpus checks (`mode`, `threshold`, `limit`, list-style filters).
327
+ Use `action: "normalize"` for lifecycle metadata hygiene scans (`dryRun`) and explicit apply mode (`apply`) with list-style filter targeting.
328
+ Use `action: "validate"` with optional check toggles (`checkMetadata`, `checkResolution`, `checkFiles`, `checkHistoryDrift`) and optional `scanMode` (`default|tracked-all`) for standalone audit workflows.
329
+ Use `action: "extension-doctor"` for consolidated extension diagnostics with optional `scope` and `detail` (`summary|deep`).
330
+ For `list*` wrapper actions, use projection/sort controls (`compact`, `fields`, `sort`, `order`) plus `includeBody` when body projection is needed.
331
+ For `comments-audit`, use governance filters (`parent`, `tag`, `sprint`, `release`, `priority`) in addition to status/type/assignee filters.
332
+ For `health`, use vector refresh controls (`checkOnly`, `noRefresh`, `refreshVectors`) while keeping strict flags available (`strictDirectories`, `strictExit`, `failOnWarn`).
333
+ For `create` and `update`, use camelCase wrapper parameters for the canonical CLI scalar fields such as `parent`, `reviewer`, `risk`, `confidence`, `sprint`, `release`, `blockedBy`, `blockedReason`, `unblockNote`, `definitionOfReady`, `order`, `goal`, `objective`, `value`, `impact`, `outcome`, `whyNow`, `reporter`, `severity`, `environment`, `reproSteps`, `resolution`, `expectedResult`, `actualResult`, `affectedVersion`, `fixedVersion`, `component`, `regression`, and `customerImpact`; use `createMode` (`strict|progressive`) when staged creation is needed, `appendStable` for minimal-diff file-link appends, `allowAuditUpdate` for ownership-safe metadata-only non-owner updates, `allowAuditDepUpdate` for ownership-safe dependency-only non-owner updates, `allowAuditComment` for additive non-owner comment writes, repeatable `reminder` values for persistent reminders (`at=<iso|relative>,text=<text>`), and repeatable `typeOption` values for custom type metadata.
334
+ For `contracts`, use projection controls (`flagsOnly`, `availabilityOnly`) when you need narrow machine-readable payloads; with `command` selected, contract output is command-scoped by default.
335
+ For `completion`, use `eagerTags` only when embedding static tags in generated scripts is required; default generated scripts resolve tags lazily at runtime.
336
+ For `activity`, use `id`, `op`, `author`, `from`, `to`, `limit`, and `stream` (`rows|ndjson|jsonl` or boolean true) for deterministic timeline filtering/export.
337
+ For `test` and `test-all`, prefer explicit runtime parity/strictness parameters when needed: `pmContext` (`schema|tracker|auto`), `checkContext`, `autoPmContext`, `failOnContextMismatch`, `failOnSkipped`, and `requireAssertionsForPm`.
338
+ For `gc`, use `dryRun` and repeatable `gcScope` (`index`, `embeddings`, `runtime`) for no-side-effect previews and targeted cleanup.
233
339
 
234
340
  ### Example: list open tasks
235
341
 
@@ -252,34 +358,34 @@ For `create` and `update`, use camelCase wrapper parameters for the canonical CL
252
358
  "priority": 1,
253
359
  "tags": "extensions,core",
254
360
  "body": "",
255
- "deadline": "none",
361
+ "deadline": "+14d",
256
362
  "estimate": 120,
257
363
  "acceptanceCriteria": "Loader applies deterministic precedence for core global and project extensions.",
258
364
  "author": "maintainer-agent",
259
365
  "message": "Create extension loader task",
260
- "assignee": "none",
261
- "parent": "none",
262
- "reviewer": "none",
366
+ "assignee": "maintainer-agent",
367
+ "parent": "pm-epic01",
368
+ "reviewer": "maintainer-reviewer",
263
369
  "risk": "medium",
264
370
  "confidence": "high",
265
371
  "sprint": "maintainer-loop",
266
372
  "release": "v0.1",
267
- "blockedBy": "none",
268
- "blockedReason": "none",
269
- "unblockNote": "none",
270
- "reporter": "none",
271
- "severity": "none",
272
- "environment": "none",
273
- "reproSteps": "none",
274
- "resolution": "none",
275
- "expectedResult": "none",
276
- "actualResult": "none",
277
- "affectedVersion": "none",
278
- "fixedVersion": "none",
279
- "component": "none",
280
- "regression": "none",
281
- "customerImpact": "none",
282
- "definitionOfReady": "Extension loading contract is clarified in docs.",
373
+ "blockedBy": "pm-arch-review",
374
+ "blockedReason": "Awaiting architecture sign-off",
375
+ "unblockNote": "Resume implementation once review notes are resolved",
376
+ "reporter": "maintainer-agent",
377
+ "severity": "medium",
378
+ "environment": "cli",
379
+ "reproSteps": "Create conflicting extension registrations across project/global scopes",
380
+ "resolution": "Apply deterministic precedence in extension loader bootstrap",
381
+ "expectedResult": "Loader applies project-over-global precedence deterministically",
382
+ "actualResult": "Registration order currently varies by load path",
383
+ "affectedVersion": "v0.1",
384
+ "fixedVersion": "v0.2",
385
+ "component": "extension-host",
386
+ "regression": "false",
387
+ "customerImpact": "Unpredictable extension behavior increases operator overhead",
388
+ "definitionOfReady": "Extension loading behavior is clarified in docs.",
283
389
  "order": 1,
284
390
  "goal": "Release-hardening",
285
391
  "objective": "Ship deterministic extension loading",
@@ -287,13 +393,13 @@ For `create` and `update`, use camelCase wrapper parameters for the canonical CL
287
393
  "impact": "Reduces configuration and precedence drift",
288
394
  "outcome": "Extension loader applies deterministic precedence",
289
395
  "whyNow": "Extension loading is foundational for the remaining roadmap",
290
- "dep": ["none"],
396
+ "dep": ["id=pm-epic01,kind=parent,author=maintainer-agent,created_at=now"],
291
397
  "comment": ["author=maintainer-agent,created_at=now,text=Why this task exists align extension load precedence behavior."],
292
398
  "note": ["author=maintainer-agent,created_at=now,text=Initial implementation plan wire loader in runtime bootstrap."],
293
- "learning": ["none"],
399
+ "learning": [],
294
400
  "linkedFile": ["path=src/core/extensions/loader.ts,scope=project,note=planned implementation file"],
295
401
  "linkedTest": ["command=node scripts/run-tests.mjs test,scope=project,timeout_seconds=240,note=sandbox-safe regression"],
296
- "doc": ["path=PRD.md,scope=project,note=authoritative contract"]
402
+ "doc": ["path=docs/ARCHITECTURE.md,scope=project,note=implementation reference"]
297
403
  }
298
404
  ```
299
405
 
@@ -349,6 +455,10 @@ Extension issues:
349
455
 
350
456
  - run with `--no-extensions` to isolate core behavior
351
457
  - inspect `pm health` extension checks
458
+ - verify active extension selectors in settings (`search.provider`, `vector_store.adapter`) when semantic search/reindex behavior differs from baseline
459
+ - verify manifest capability declarations include any new API usage (`parser`, `preflight`, `services`) to avoid activation failures
460
+ - when debugging runtime behavior changes, inspect parser/preflight/service override collisions in health/profile diagnostics (last registration wins)
461
+ - use SDK contracts from `@unbrained/pm-cli/sdk` (not internal `src/core/...` imports) for extension authoring and examples
352
462
 
353
463
  ## 12) Dogfood Logging Protocol (Required)
354
464
 
@@ -366,6 +476,8 @@ Rules:
366
476
  - Until full command coverage exists, prioritize implementing the minimal missing subset needed for logging:
367
477
  - `append`
368
478
  - `comments`
479
+ - `notes`
480
+ - `learnings`
369
481
  - `files`
370
482
  - `test`
371
483
  - `test-all`
@@ -376,7 +488,7 @@ Rules:
376
488
 
377
489
  ### All-Flags Create Template (copy/paste)
378
490
 
379
- `pm create` now enforces every repeatable seed flag as explicit input; pass a concrete value or `none` for each of `--dep`, `--comment`, `--note`, `--learning`, `--file`, `--test`, and `--doc`.
491
+ `pm create` strict mode (default / `--create-mode strict`) enforces every repeatable seed flag as concrete input; pass concrete values for each of `--dep`, `--comment`, `--note`, `--learning`, `--file`, `--test`, and `--doc`. If a repeatable field is intentionally empty during staged capture, use `--create-mode progressive` and backfill required metadata before close.
380
492
 
381
493
  ```bash
382
494
  pm create \
@@ -390,38 +502,38 @@ pm create \
390
502
  --deadline +1d \
391
503
  --estimate 60 \
392
504
  --acceptance-criteria/--ac "..." \
393
- --definition-of-ready/--definition_of_ready "none" \
394
- --order/--rank none \
395
- --goal none \
396
- --objective none \
397
- --value none \
398
- --impact none \
399
- --outcome none \
400
- --why-now/--why_now none \
505
+ --unset definition-of-ready \
506
+ --unset order \
507
+ --unset goal \
508
+ --unset objective \
509
+ --unset value \
510
+ --unset impact \
511
+ --unset outcome \
512
+ --unset why-now \
401
513
  --author "..." \
402
514
  --message "..." \
403
- --assignee none \
404
- --parent none \
405
- --reviewer none \
406
- --risk none \
407
- --confidence none \
408
- --sprint none \
409
- --release none \
410
- --blocked-by none \
411
- --blocked-reason none \
412
- --unblock-note/--unblock_note none \
413
- --reporter none \
414
- --severity none \
415
- --environment none \
416
- --repro-steps none \
417
- --resolution none \
418
- --expected-result none \
419
- --actual-result none \
420
- --affected-version none \
421
- --fixed-version none \
422
- --component none \
423
- --regression none \
424
- --customer-impact none \
515
+ --unset assignee \
516
+ --unset parent \
517
+ --unset reviewer \
518
+ --unset risk \
519
+ --unset confidence \
520
+ --unset sprint \
521
+ --unset release \
522
+ --unset blocked-by \
523
+ --unset blocked-reason \
524
+ --unset unblock-note \
525
+ --unset reporter \
526
+ --unset severity \
527
+ --unset environment \
528
+ --unset repro-steps \
529
+ --unset resolution \
530
+ --unset expected-result \
531
+ --unset actual-result \
532
+ --unset affected-version \
533
+ --unset fixed-version \
534
+ --unset component \
535
+ --unset regression \
536
+ --unset customer-impact \
425
537
  --dep <DEP> \
426
538
  --comment <COMMENT> \
427
539
  --note <NOTE> \
@@ -431,6 +543,12 @@ pm create \
431
543
  --doc <DOCS>
432
544
  ```
433
545
 
546
+ Notes:
547
+
548
+ - `--type` values come from the runtime type registry (built-ins plus `settings.item_types.definitions` and extension registrations).
549
+ - Custom type metadata can be passed with repeatable `--type-option key=value` flags (or `--clear-type-options` to explicitly clear).
550
+ - For staged governance capture without placeholder repeatables, use `--create-mode progressive` and backfill required metadata before close.
551
+
434
552
  ### Epic Template With Comment + Note
435
553
 
436
554
  ```bash
@@ -445,26 +563,26 @@ pm create \
445
563
  --deadline +7d \
446
564
  --estimate 240 \
447
565
  --acceptance-criteria/--ac "..." \
448
- --definition-of-ready/--definition_of_ready "none" \
449
- --order/--rank none \
450
- --goal none \
451
- --objective none \
452
- --value none \
453
- --impact none \
454
- --outcome none \
455
- --why-now/--why_now none \
566
+ --unset definition-of-ready \
567
+ --unset order \
568
+ --unset goal \
569
+ --unset objective \
570
+ --unset value \
571
+ --unset impact \
572
+ --unset outcome \
573
+ --unset why-now \
456
574
  --author "..." \
457
575
  --message "MESSAGE" \
458
- --assignee none \
459
- --parent none \
460
- --reviewer none \
461
- --risk none \
462
- --confidence none \
463
- --sprint none \
464
- --release none \
465
- --blocked-by none \
466
- --blocked-reason none \
467
- --unblock-note/--unblock_note none \
576
+ --unset assignee \
577
+ --unset parent \
578
+ --unset reviewer \
579
+ --unset risk \
580
+ --unset confidence \
581
+ --unset sprint \
582
+ --unset release \
583
+ --unset blocked-by \
584
+ --unset blocked-reason \
585
+ --unset unblock-note \
468
586
  --dep "id=pm-xxxx,kind=blocks,author=...,created_at=now" \
469
587
  --comment "author=...,created_at=now,text=Why this epic exists." \
470
588
  --note "author=...,created_at=now,text=How success is measured." \