@unbrained/pm-cli 2026.3.12 → 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 (285) 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} +31 -21
  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 +196 -92
  11. package/CHANGELOG.md +404 -0
  12. package/CODE_OF_CONDUCT.md +42 -0
  13. package/CONTRIBUTING.md +144 -0
  14. package/PRD.md +512 -164
  15. package/README.md +1053 -2
  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 +1184 -137
  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 +289 -53
  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 +475 -81
  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 +3625 -445
  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.js +4 -1
  160. package/dist/core/item/id.js.map +1 -1
  161. package/dist/core/item/index.d.ts +1 -0
  162. package/dist/core/item/index.js +1 -0
  163. package/dist/core/item/index.js.map +1 -1
  164. package/dist/core/item/item-format.d.ts +11 -5
  165. package/dist/core/item/item-format.js +507 -24
  166. package/dist/core/item/item-format.js.map +1 -1
  167. package/dist/core/item/parent-reference-policy.d.ts +6 -0
  168. package/dist/core/item/parent-reference-policy.js +32 -0
  169. package/dist/core/item/parent-reference-policy.js.map +1 -0
  170. package/dist/core/item/parse.d.ts +5 -0
  171. package/dist/core/item/parse.js +216 -19
  172. package/dist/core/item/parse.js.map +1 -1
  173. package/dist/core/item/sprint-release-format.d.ts +6 -0
  174. package/dist/core/item/sprint-release-format.js +33 -0
  175. package/dist/core/item/sprint-release-format.js.map +1 -0
  176. package/dist/core/item/status.d.ts +3 -0
  177. package/dist/core/item/status.js +24 -0
  178. package/dist/core/item/status.js.map +1 -0
  179. package/dist/core/item/type-registry.d.ts +37 -0
  180. package/dist/core/item/type-registry.js +706 -0
  181. package/dist/core/item/type-registry.js.map +1 -0
  182. package/dist/core/lock/lock.d.ts +1 -1
  183. package/dist/core/lock/lock.js +101 -12
  184. package/dist/core/lock/lock.js.map +1 -1
  185. package/dist/core/output/command-aware.d.ts +1 -0
  186. package/dist/core/output/command-aware.js +394 -0
  187. package/dist/core/output/command-aware.js.map +1 -0
  188. package/dist/core/output/output.d.ts +3 -0
  189. package/dist/core/output/output.js +124 -6
  190. package/dist/core/output/output.js.map +1 -1
  191. package/dist/core/schema/runtime-field-filters.d.ts +3 -0
  192. package/dist/core/schema/runtime-field-filters.js +39 -0
  193. package/dist/core/schema/runtime-field-filters.js.map +1 -0
  194. package/dist/core/schema/runtime-field-values.d.ts +8 -0
  195. package/dist/core/schema/runtime-field-values.js +154 -0
  196. package/dist/core/schema/runtime-field-values.js.map +1 -0
  197. package/dist/core/schema/runtime-schema.d.ts +68 -0
  198. package/dist/core/schema/runtime-schema.js +554 -0
  199. package/dist/core/schema/runtime-schema.js.map +1 -0
  200. package/dist/core/search/cache.d.ts +13 -1
  201. package/dist/core/search/cache.js +123 -14
  202. package/dist/core/search/cache.js.map +1 -1
  203. package/dist/core/search/semantic-defaults.d.ts +6 -0
  204. package/dist/core/search/semantic-defaults.js +120 -0
  205. package/dist/core/search/semantic-defaults.js.map +1 -0
  206. package/dist/core/search/vector-stores.js +3 -1
  207. package/dist/core/search/vector-stores.js.map +1 -1
  208. package/dist/core/shared/command-types.d.ts +2 -0
  209. package/dist/core/shared/conflict-markers.d.ts +7 -0
  210. package/dist/core/shared/conflict-markers.js +27 -0
  211. package/dist/core/shared/conflict-markers.js.map +1 -0
  212. package/dist/core/shared/constants.d.ts +15 -4
  213. package/dist/core/shared/constants.js +141 -1
  214. package/dist/core/shared/constants.js.map +1 -1
  215. package/dist/core/shared/errors.d.ts +10 -1
  216. package/dist/core/shared/errors.js +3 -1
  217. package/dist/core/shared/errors.js.map +1 -1
  218. package/dist/core/shared/text-normalization.d.ts +4 -0
  219. package/dist/core/shared/text-normalization.js +33 -0
  220. package/dist/core/shared/text-normalization.js.map +1 -0
  221. package/dist/core/shared/time.d.ts +1 -2
  222. package/dist/core/shared/time.js +98 -11
  223. package/dist/core/shared/time.js.map +1 -1
  224. package/dist/core/store/index.d.ts +1 -0
  225. package/dist/core/store/index.js +1 -0
  226. package/dist/core/store/index.js.map +1 -1
  227. package/dist/core/store/item-format-migration.d.ts +9 -0
  228. package/dist/core/store/item-format-migration.js +87 -0
  229. package/dist/core/store/item-format-migration.js.map +1 -0
  230. package/dist/core/store/item-store.d.ts +13 -4
  231. package/dist/core/store/item-store.js +238 -51
  232. package/dist/core/store/item-store.js.map +1 -1
  233. package/dist/core/store/paths.d.ts +21 -3
  234. package/dist/core/store/paths.js +59 -4
  235. package/dist/core/store/paths.js.map +1 -1
  236. package/dist/core/store/settings.d.ts +14 -1
  237. package/dist/core/store/settings.js +463 -7
  238. package/dist/core/store/settings.js.map +1 -1
  239. package/dist/core/telemetry/consent.d.ts +2 -0
  240. package/dist/core/telemetry/consent.js +79 -0
  241. package/dist/core/telemetry/consent.js.map +1 -0
  242. package/dist/core/telemetry/runtime.d.ts +38 -0
  243. package/dist/core/telemetry/runtime.js +733 -0
  244. package/dist/core/telemetry/runtime.js.map +1 -0
  245. package/dist/core/test/background-runs.d.ts +117 -0
  246. package/dist/core/test/background-runs.js +760 -0
  247. package/dist/core/test/background-runs.js.map +1 -0
  248. package/dist/core/test/item-test-run-tracking.d.ts +9 -0
  249. package/dist/core/test/item-test-run-tracking.js +50 -0
  250. package/dist/core/test/item-test-run-tracking.js.map +1 -0
  251. package/dist/sdk/cli-contracts.d.ts +92 -0
  252. package/dist/sdk/cli-contracts.js +2357 -0
  253. package/dist/sdk/cli-contracts.js.map +1 -0
  254. package/dist/sdk/index.d.ts +34 -0
  255. package/dist/sdk/index.js +23 -0
  256. package/dist/sdk/index.js.map +1 -0
  257. package/dist/types.d.ts +197 -3
  258. package/dist/types.js +48 -1
  259. package/dist/types.js.map +1 -1
  260. package/docs/ARCHITECTURE.md +368 -39
  261. package/docs/EXTENSIONS.md +454 -49
  262. package/docs/RELEASING.md +70 -19
  263. package/docs/SDK.md +123 -0
  264. package/docs/examples/starter-extension/README.md +48 -0
  265. package/docs/examples/starter-extension/index.js +191 -0
  266. package/docs/examples/starter-extension/manifest.json +17 -0
  267. package/docs/examples/starter-extension/package.json +10 -0
  268. package/package.json +41 -14
  269. package/.pi/extensions/pm-cli/index.ts +0 -778
  270. package/dist/cli/commands/beads.d.ts +0 -16
  271. package/dist/cli/commands/beads.js.map +0 -1
  272. package/dist/cli/commands/install.d.ts +0 -18
  273. package/dist/cli/commands/install.js +0 -87
  274. package/dist/cli/commands/install.js.map +0 -1
  275. package/dist/core/extensions/builtins.d.ts +0 -3
  276. package/dist/core/extensions/builtins.js +0 -47
  277. package/dist/core/extensions/builtins.js.map +0 -1
  278. package/dist/extensions/builtins/beads/index.d.ts +0 -8
  279. package/dist/extensions/builtins/beads/index.js +0 -33
  280. package/dist/extensions/builtins/beads/index.js.map +0 -1
  281. package/dist/extensions/builtins/todos/import-export.d.ts +0 -26
  282. package/dist/extensions/builtins/todos/import-export.js.map +0 -1
  283. package/dist/extensions/builtins/todos/index.d.ts +0 -8
  284. package/dist/extensions/builtins/todos/index.js +0 -38
  285. 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
 
@@ -34,11 +35,15 @@ This document defines how coding agents must use `pm` for planning, execution, a
34
35
  Before creating any new `pm` item, always check for an existing relevant item first.
35
36
 
36
37
  - Search and list existing items before `pm create`:
38
+ - `pm context --limit 10`
37
39
  - `pm search "<keywords>" --limit 10`
38
40
  - `pm list-open --limit 20`
39
41
  - `pm list-in-progress --limit 20`
40
42
  - If a relevant item already exists, reuse it, update it, or claim it instead of creating a new one.
41
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).
42
47
 
43
48
  Use one of:
44
49
 
@@ -48,7 +53,7 @@ Use one of:
48
53
 
49
54
  Then filter:
50
55
 
51
- - by type: `--type Task|Feature|Issue|Chore|Epic`
56
+ - by type: `--type <value>` (resolved by runtime type registry: built-ins plus configured custom types)
52
57
  - by priority: `--priority 0..4`
53
58
  - by tag: `--tag <name>`
54
59
 
@@ -56,6 +61,7 @@ Then filter:
56
61
 
57
62
  - `pm claim <ID>`
58
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.
59
65
 
60
66
  Rules:
61
67
 
@@ -68,10 +74,13 @@ Populate metadata early:
68
74
 
69
75
  - `pm update <ID> --description "..."`
70
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`)
71
79
  - `pm update <ID> --estimate <minutes>`
72
- - `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)
73
82
  - when team-level close-readiness policy changes, update Definition of Done criteria via:
74
- - `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"`
75
84
 
76
85
  ### Step D - Link execution context
77
86
 
@@ -79,43 +88,63 @@ Attach references to keep work reproducible:
79
88
 
80
89
  - Files:
81
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
82
93
  - Tests:
83
94
  - `pm test <ID> --add command="node scripts/run-tests.mjs test",scope=project,timeout_seconds=240`
84
- - `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`
85
96
  - Docs:
86
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 -`
87
106
 
88
107
  ### Step E - Record progress
89
108
 
90
109
  Use append-style updates:
91
110
 
92
- - `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
93
117
  - `pm update <ID> --status in_progress`
94
118
  - `pm append <ID> --body "Detailed implementation notes..."`
95
119
 
96
120
  Capture durable notes:
97
121
 
98
- - `pm update <ID> --message "Add design rationale"` with note additions
99
- - 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"`
100
124
 
101
125
  ### Step F - Validate and close
102
126
 
103
127
  Before close:
104
128
 
105
129
  1. Run linked tests:
106
- - `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`
107
132
  2. Run sandbox-safe coverage verification:
108
133
  - `node scripts/run-tests.mjs coverage`
109
134
  3. Optionally run project sweep:
110
- - `pm test-all --status in_progress`
135
+ - `pm test-all --status in_progress` (add `--progress` for explicit non-interactive visibility)
111
136
  - `pm test-all --status closed` (when running a broader release-readiness regression sweep)
112
137
  - Avoid linking `pm test-all` itself as an item-level linked test command, since that creates recursive orchestration.
113
- 4. Add closure evidence:
114
- - `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 "..."`)
115
144
 
116
145
  Close (current v0.1 workflow):
117
146
 
118
- - `pm close <ID> "<reason>" --author "..." --message "Close: <reason with evidence>"`
147
+ - `pm close <ID> "<reason>" --validate-close warn --author "..." --message "Close: <reason with evidence>"`
119
148
 
120
149
  ### Step G - Release claim
121
150
 
@@ -142,9 +171,16 @@ Use release when:
142
171
  - Tests must never read/write the repository's real `.agents/pm` data.
143
172
  - Unit/integration test runs must set `PM_PATH` to a temporary sandbox directory.
144
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.
145
- - `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.
146
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.
147
- - `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.
148
184
  - Integration tests should invoke the built CLI (`node dist/cli.js ...`) with explicit `PM_PATH`, `PM_GLOBAL_PATH`, and `PM_AUTHOR`.
149
185
  - Cleanup temporary test directories after each test/suite.
150
186
 
@@ -157,9 +193,21 @@ Use release when:
157
193
  - `SECURITY.md` with vulnerability reporting instructions
158
194
  - `CODE_OF_CONDUCT.md` contributor behavior policy
159
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
+
160
207
  ## 4) Token Minimization Rules (TOON-first)
161
208
 
162
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.
163
211
  - Use `--json` only when strict machine parsing is required.
164
212
  - Request narrow outputs:
165
213
  - `--limit`
@@ -176,6 +224,7 @@ Use release when:
176
224
  - `blocked`: waiting on dependency/input
177
225
  - `closed`: done and verified
178
226
  - `canceled`: intentionally discontinued
227
+ - Input compatibility: `in-progress` is accepted for status flags and normalized to `in_progress`.
179
228
 
180
229
  Ownership:
181
230
 
@@ -211,18 +260,47 @@ Quick start loop:
211
260
 
212
261
  ```bash
213
262
  pm config project set definition-of-done --criterion "tests pass" --criterion "linked files/tests/docs present"
214
- 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
215
265
  pm claim pm-a1b2
216
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"
217
274
  pm files pm-a1b2 --add path=src/history.ts,scope=project,note="restore implementation"
275
+ pm files pm-a1b2 --add-glob "src/**/*.ts"
218
276
  pm test pm-a1b2 --add command="node scripts/run-tests.mjs test",scope=project,timeout_seconds=240
219
- pm comments pm-a1b2 --add "Restore replay implemented with hash checks"
220
- 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
221
293
  node scripts/run-tests.mjs coverage
222
- 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"
223
295
  pm release pm-a1b2
224
296
  ```
225
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
+
226
304
  Investigate change timeline:
227
305
 
228
306
  ```bash
@@ -240,10 +318,24 @@ pm restore pm-a1b2 2026-02-17T11:15:03.120Z
240
318
 
241
319
  The built-in Pi wrapper exposes one tool: `pm`.
242
320
  Reference implementation source lives at `.pi/extensions/pm-cli/index.ts` as a Pi agent extension module.
243
- Install the bundled Pi extension with `pm install pi --project` (default) or `pm install pi --global`.
244
- 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).
245
323
  Use `action: "completion"` with `shell: "bash"|"zsh"|"fish"` to forward to `pm completion <shell>`.
246
- 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.
247
339
 
248
340
  ### Example: list open tasks
249
341
 
@@ -266,33 +358,33 @@ For `create` and `update`, use camelCase wrapper parameters for the canonical CL
266
358
  "priority": 1,
267
359
  "tags": "extensions,core",
268
360
  "body": "",
269
- "deadline": "none",
361
+ "deadline": "+14d",
270
362
  "estimate": 120,
271
363
  "acceptanceCriteria": "Loader applies deterministic precedence for core global and project extensions.",
272
364
  "author": "maintainer-agent",
273
365
  "message": "Create extension loader task",
274
- "assignee": "none",
275
- "parent": "none",
276
- "reviewer": "none",
366
+ "assignee": "maintainer-agent",
367
+ "parent": "pm-epic01",
368
+ "reviewer": "maintainer-reviewer",
277
369
  "risk": "medium",
278
370
  "confidence": "high",
279
371
  "sprint": "maintainer-loop",
280
372
  "release": "v0.1",
281
- "blockedBy": "none",
282
- "blockedReason": "none",
283
- "unblockNote": "none",
284
- "reporter": "none",
285
- "severity": "none",
286
- "environment": "none",
287
- "reproSteps": "none",
288
- "resolution": "none",
289
- "expectedResult": "none",
290
- "actualResult": "none",
291
- "affectedVersion": "none",
292
- "fixedVersion": "none",
293
- "component": "none",
294
- "regression": "none",
295
- "customerImpact": "none",
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",
296
388
  "definitionOfReady": "Extension loading behavior is clarified in docs.",
297
389
  "order": 1,
298
390
  "goal": "Release-hardening",
@@ -301,10 +393,10 @@ For `create` and `update`, use camelCase wrapper parameters for the canonical CL
301
393
  "impact": "Reduces configuration and precedence drift",
302
394
  "outcome": "Extension loader applies deterministic precedence",
303
395
  "whyNow": "Extension loading is foundational for the remaining roadmap",
304
- "dep": ["none"],
396
+ "dep": ["id=pm-epic01,kind=parent,author=maintainer-agent,created_at=now"],
305
397
  "comment": ["author=maintainer-agent,created_at=now,text=Why this task exists align extension load precedence behavior."],
306
398
  "note": ["author=maintainer-agent,created_at=now,text=Initial implementation plan wire loader in runtime bootstrap."],
307
- "learning": ["none"],
399
+ "learning": [],
308
400
  "linkedFile": ["path=src/core/extensions/loader.ts,scope=project,note=planned implementation file"],
309
401
  "linkedTest": ["command=node scripts/run-tests.mjs test,scope=project,timeout_seconds=240,note=sandbox-safe regression"],
310
402
  "doc": ["path=docs/ARCHITECTURE.md,scope=project,note=implementation reference"]
@@ -363,6 +455,10 @@ Extension issues:
363
455
 
364
456
  - run with `--no-extensions` to isolate core behavior
365
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
366
462
 
367
463
  ## 12) Dogfood Logging Protocol (Required)
368
464
 
@@ -380,6 +476,8 @@ Rules:
380
476
  - Until full command coverage exists, prioritize implementing the minimal missing subset needed for logging:
381
477
  - `append`
382
478
  - `comments`
479
+ - `notes`
480
+ - `learnings`
383
481
  - `files`
384
482
  - `test`
385
483
  - `test-all`
@@ -390,7 +488,7 @@ Rules:
390
488
 
391
489
  ### All-Flags Create Template (copy/paste)
392
490
 
393
- `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.
394
492
 
395
493
  ```bash
396
494
  pm create \
@@ -404,38 +502,38 @@ pm create \
404
502
  --deadline +1d \
405
503
  --estimate 60 \
406
504
  --acceptance-criteria/--ac "..." \
407
- --definition-of-ready/--definition_of_ready "none" \
408
- --order/--rank none \
409
- --goal none \
410
- --objective none \
411
- --value none \
412
- --impact none \
413
- --outcome none \
414
- --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 \
415
513
  --author "..." \
416
514
  --message "..." \
417
- --assignee none \
418
- --parent none \
419
- --reviewer none \
420
- --risk none \
421
- --confidence none \
422
- --sprint none \
423
- --release none \
424
- --blocked-by none \
425
- --blocked-reason none \
426
- --unblock-note/--unblock_note none \
427
- --reporter none \
428
- --severity none \
429
- --environment none \
430
- --repro-steps none \
431
- --resolution none \
432
- --expected-result none \
433
- --actual-result none \
434
- --affected-version none \
435
- --fixed-version none \
436
- --component none \
437
- --regression none \
438
- --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 \
439
537
  --dep <DEP> \
440
538
  --comment <COMMENT> \
441
539
  --note <NOTE> \
@@ -445,6 +543,12 @@ pm create \
445
543
  --doc <DOCS>
446
544
  ```
447
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
+
448
552
  ### Epic Template With Comment + Note
449
553
 
450
554
  ```bash
@@ -459,26 +563,26 @@ pm create \
459
563
  --deadline +7d \
460
564
  --estimate 240 \
461
565
  --acceptance-criteria/--ac "..." \
462
- --definition-of-ready/--definition_of_ready "none" \
463
- --order/--rank none \
464
- --goal none \
465
- --objective none \
466
- --value none \
467
- --impact none \
468
- --outcome none \
469
- --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 \
470
574
  --author "..." \
471
575
  --message "MESSAGE" \
472
- --assignee none \
473
- --parent none \
474
- --reviewer none \
475
- --risk none \
476
- --confidence none \
477
- --sprint none \
478
- --release none \
479
- --blocked-by none \
480
- --blocked-reason none \
481
- --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 \
482
586
  --dep "id=pm-xxxx,kind=blocks,author=...,created_at=now" \
483
587
  --comment "author=...,created_at=now,text=Why this epic exists." \
484
588
  --note "author=...,created_at=now,text=How success is measured." \