@unbrained/pm-cli 2026.9.11 → 2026.9.13

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 (165) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +42 -0
  3. package/dist/cli/command-namespaces.js +1 -1
  4. package/dist/cli/commander-usage.js +2 -2
  5. package/dist/cli/error-guidance.d.ts +10 -0
  6. package/dist/cli/error-guidance.js +1 -1
  7. package/dist/cli/main.js +2 -2
  8. package/dist/cli/option-values.d.ts +3 -0
  9. package/dist/cli/option-values.js +2 -0
  10. package/dist/cli/register-mutation.d.ts +5 -0
  11. package/dist/cli/register-mutation.js +2 -16
  12. package/dist/cli/schema/registration.d.ts +4 -0
  13. package/dist/cli/schema/registration.js +16 -0
  14. package/dist/cli-bundle/bundle-manifest.json +160 -152
  15. package/dist/cli-bundle/chunks/{chunk-TDKWJQD7.js → chunk-3DWX3CKN.js} +2 -2
  16. package/dist/cli-bundle/chunks/chunk-6KHYW3FH.js +235 -0
  17. package/dist/cli-bundle/chunks/chunk-AKTBOX6U.js +2 -0
  18. package/dist/cli-bundle/chunks/chunk-GBK5MV6N.js +29 -0
  19. package/dist/cli-bundle/chunks/{chunk-JMQKJ7CJ.js → chunk-GQQR6JAL.js} +2 -2
  20. package/dist/cli-bundle/chunks/{chunk-QER6OSOP.js → chunk-KM4XVZR7.js} +53 -53
  21. package/dist/cli-bundle/chunks/{chunk-VFKBNGF6.js → chunk-LA44JECQ.js} +2 -2
  22. package/dist/cli-bundle/chunks/{chunk-DAWH7TGV.js → chunk-XEZOGC3P.js} +2 -2
  23. package/dist/cli-bundle/chunks/{chunk-TFVKBJJ4.js → chunk-XM7RWQLM.js} +103 -103
  24. package/dist/cli-bundle/chunks/{chunk-RJQSCK74.js → chunk-YDSV4QIQ.js} +6 -6
  25. package/dist/cli-bundle/chunks/chunk-YQTJACN5.js +20 -0
  26. package/dist/cli-bundle/chunks/{chunk-BN5QVWNY.js → chunk-ZZI7IHMM.js} +2 -2
  27. package/dist/cli-bundle/chunks/{register-list-query-U6MY437C.js → register-list-query-WMJTBWNW.js} +2 -2
  28. package/dist/cli-bundle/chunks/register-mutation-EXGOXP3D.js +20 -0
  29. package/dist/cli-bundle/chunks/{register-operations-EHWIZW3X.js → register-operations-2H4CDRGU.js} +2 -2
  30. package/dist/cli-bundle/chunks/{register-setup-BZYL3HBL.js → register-setup-NYBWGPOS.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-TWE3GPQM.js → chunk-7JR6M2JR.js} +17 -17
  32. package/dist/cli-bundle/focused-chunks/{chunk-GKUF7TM5.js → chunk-B6JAANOH.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-UJCQXUD2.js → chunk-DSJYL4VP.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-VS6MR2HT.js → chunk-F66QJWI4.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/{chunk-MOT32PR2.js → chunk-FBCLVOBE.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-HM6JS6Q3.js → chunk-FPNI4U2B.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/chunk-HFAW3FJQ.js +2 -0
  38. package/dist/cli-bundle/focused-chunks/chunk-KP3N6PVZ.js +164 -0
  39. package/dist/cli-bundle/focused-chunks/chunk-LQ67C7ZO.js +2 -0
  40. package/dist/cli-bundle/focused-chunks/{chunk-TGMSSI3Z.js → chunk-OENAWWP4.js} +2 -2
  41. package/dist/cli-bundle/focused-chunks/{chunk-7WISPJRZ.js → chunk-SDQCJF4H.js} +53 -53
  42. package/dist/cli-bundle/focused-chunks/chunk-TUHRUFID.js +2 -0
  43. package/dist/cli-bundle/focused-chunks/{chunk-6JF66HAG.js → chunk-V7PSTKHD.js} +2 -2
  44. package/dist/cli-bundle/focused-chunks/{chunk-FJDEFA64.js → chunk-XCCM7P7V.js} +2 -2
  45. package/dist/cli-bundle/focused-chunks/chunk-YUXBHIUV.js +20 -0
  46. package/dist/cli-bundle/focused-chunks/{chunk-BEQAW7OT.js → chunk-ZAMG7HBB.js} +4 -4
  47. package/dist/cli-bundle/focused-chunks/chunk-ZF5PXK6A.js +2 -0
  48. package/dist/cli-bundle/main.js +20 -20
  49. package/dist/cli-bundle/sdk-authoring.js +1 -1
  50. package/dist/cli-bundle/sdk-contracts.js +2 -2
  51. package/dist/cli-bundle/sdk-core.js +34 -34
  52. package/dist/cli-bundle/sdk-governance.js +1 -1
  53. package/dist/cli-bundle/sdk-graph.js +1 -1
  54. package/dist/cli-bundle/sdk-merge.js +42 -42
  55. package/dist/cli-bundle/sdk-query.js +1 -1
  56. package/dist/cli-bundle/sdk-runtime.js +1 -1
  57. package/dist/cli-bundle/sdk-testing.js +1 -1
  58. package/dist/cli-bundle/sdk.js +8 -8
  59. package/dist/core/history/history.js +1 -1
  60. package/dist/core/history/operation-contract.d.ts +30 -0
  61. package/dist/core/history/operation-contract.js +2 -0
  62. package/dist/core/history/tombstone.d.ts +3 -0
  63. package/dist/core/history/tombstone.js +2 -0
  64. package/dist/core/item/id.d.ts +8 -7
  65. package/dist/core/item/id.js +1 -1
  66. package/dist/core/output/mutation-projection.d.ts +1 -0
  67. package/dist/core/output/mutation-projection.js +1 -1
  68. package/dist/core/sentry/instrument.js +1 -1
  69. package/dist/core/shared/command-line.d.ts +10 -0
  70. package/dist/core/shared/command-line.js +2 -0
  71. package/dist/core/shared/errors.d.ts +13 -0
  72. package/dist/core/shared/errors.js +1 -1
  73. package/dist/core/store/item-store.d.ts +5 -1
  74. package/dist/core/store/item-store.js +1 -1
  75. package/dist/core/telemetry/consent.d.ts +1 -1
  76. package/dist/core/telemetry/consent.js +2 -2
  77. package/dist/core/telemetry/policy.d.ts +10 -0
  78. package/dist/core/telemetry/policy.js +2 -0
  79. package/dist/core/telemetry/runtime.d.ts +11 -9
  80. package/dist/core/telemetry/runtime.js +3 -3
  81. package/dist/sdk/agent/command-suggestions.js +1 -1
  82. package/dist/sdk/agent/item-addressing.js +1 -1
  83. package/dist/sdk/agent-capability-contracts.js +1 -1
  84. package/dist/sdk/cli-bootstrap.js +1 -1
  85. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  86. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  87. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
  88. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  89. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +3 -0
  90. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  91. package/dist/sdk/cli-contracts/tool-schema.d.ts +1 -1
  92. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  93. package/dist/sdk/command-line.d.ts +1 -6
  94. package/dist/sdk/command-line.js +1 -1
  95. package/dist/sdk/comments.js +1 -1
  96. package/dist/sdk/completion.js +1 -1
  97. package/dist/sdk/contracts.d.ts +1 -0
  98. package/dist/sdk/contracts.js +1 -1
  99. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  100. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  101. package/dist/sdk/governance/health.js +1 -1
  102. package/dist/sdk/governance/storage-integrity.js +1 -1
  103. package/dist/sdk/governance/workflow-completeness.js +1 -1
  104. package/dist/sdk/governance/workflow-policy.js +2 -2
  105. package/dist/sdk/index.d.ts +1 -0
  106. package/dist/sdk/index.js +1 -1
  107. package/dist/sdk/learnings.js +1 -1
  108. package/dist/sdk/lifecycle/claim.d.ts +2 -0
  109. package/dist/sdk/lifecycle/claim.js +1 -1
  110. package/dist/sdk/lifecycle/mcp-actions.d.ts +4 -0
  111. package/dist/sdk/lifecycle/mcp-actions.js +1 -1
  112. package/dist/sdk/lifecycle/task-composition.d.ts +2 -0
  113. package/dist/sdk/lifecycle/task-composition.js +1 -1
  114. package/dist/sdk/merge/reconcile.js +1 -1
  115. package/dist/sdk/merge/three-way.js +2 -2
  116. package/dist/sdk/notes.js +1 -1
  117. package/dist/sdk/public-surface.json +1 -1
  118. package/dist/sdk/query/projection-contracts.d.ts +1 -1
  119. package/dist/sdk/query/projection-contracts.js +1 -1
  120. package/dist/sdk/runtime.js +1 -1
  121. package/dist/sdk/telemetry.d.ts +5 -0
  122. package/dist/sdk/telemetry.js +1 -1
  123. package/docs/AGENT_UX_CONTRACTS.md +8 -0
  124. package/docs/ARCHITECTURE.md +7 -0
  125. package/docs/CLI_GRAMMAR.md +31 -0
  126. package/docs/COMMAND_NAMESPACES.md +7 -4
  127. package/docs/CONFIGURATION.md +13 -2
  128. package/docs/HISTORY_OPERATIONS.md +46 -0
  129. package/docs/HISTORY_RECOVERY.md +27 -2
  130. package/docs/LIFECYCLE_COMMANDS.md +19 -2
  131. package/docs/MERGE_SAFETY.md +64 -3
  132. package/docs/WORKFLOW_POLICIES.md +47 -3
  133. package/docs/generated/AGENT_CAPABILITY_ROUTING.md +4 -4
  134. package/docs/generated/AGENT_COMMAND_SURFACE.md +10 -0
  135. package/docs/generated/FLAG_LEXICON_BUDGETS.md +11 -1
  136. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +8 -5
  137. package/marketplace.json +2 -2
  138. package/package.json +1 -1
  139. package/packages/pm-beads/package.json +1 -1
  140. package/packages/pm-calendar/package.json +1 -1
  141. package/packages/pm-command-kit/package.json +1 -1
  142. package/packages/pm-digital-twin/package.json +1 -1
  143. package/packages/pm-governance-audit/README.md +22 -0
  144. package/packages/pm-governance-audit/package.json +1 -1
  145. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +13 -26
  146. package/packages/pm-guide-shell/package.json +1 -1
  147. package/packages/pm-kanban/package.json +1 -1
  148. package/packages/pm-lifecycle-hooks/package.json +1 -1
  149. package/packages/pm-linked-test-adapters/package.json +1 -1
  150. package/packages/pm-search-advanced/package.json +1 -1
  151. package/packages/pm-templates/package.json +1 -1
  152. package/packages/pm-todos/package.json +1 -1
  153. package/packages/pm-vcs/package.json +1 -1
  154. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  155. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  156. package/dist/cli-bundle/chunks/chunk-FBY6PEIR.js +0 -20
  157. package/dist/cli-bundle/chunks/chunk-IRUNFLLG.js +0 -2
  158. package/dist/cli-bundle/chunks/chunk-RJZFAXBW.js +0 -235
  159. package/dist/cli-bundle/chunks/chunk-SGAKQIGQ.js +0 -29
  160. package/dist/cli-bundle/chunks/register-mutation-HAPHD4S7.js +0 -20
  161. package/dist/cli-bundle/focused-chunks/chunk-3JVTLBCW.js +0 -20
  162. package/dist/cli-bundle/focused-chunks/chunk-DZ3ATEFS.js +0 -2
  163. package/dist/cli-bundle/focused-chunks/chunk-M74YW332.js +0 -164
  164. package/dist/cli-bundle/focused-chunks/chunk-ONDKO4EL.js +0 -2
  165. package/dist/cli-bundle/focused-chunks/chunk-YOPNRWSX.js +0 -2
@@ -0,0 +1,46 @@
1
+ # History operation contracts
2
+
3
+ Tracked by [pm-0elqjj](../.agents/pm/issues/pm-0elqjj.toon).
4
+
5
+ History operation names are durable data. The public
6
+ `PM_HISTORY_OPERATION_CONTRACT` declares native item operations, workspace
7
+ operations, parameterized families, and historical aliases. Inspect it through
8
+ `pm contracts --command history --json` or import it from
9
+ `@unbrained/pm-cli/sdk/contracts`.
10
+
11
+ Native write sites are checked against that declaration by the mandatory
12
+ `operation-source-contract.spec.ts` test. New literal operation names fail the
13
+ gate until their contract is declared. Schema migration families also have a
14
+ type-exhaustive test covering their forward and compensation identities. JSON Patch verbs, extension write-hook
15
+ labels, remediation-plan verbs, and telemetry span names are different domains;
16
+ they do not become history operations merely because they have an `op` field.
17
+
18
+ `createHistoryEntry` canonicalizes declared aliases before sealing new records.
19
+ Both `init:type-preset` and `init:type_preset` write `init:type_preset`.
20
+ Existing
21
+ records retain their exact operation and hashes. Readers can explicitly call
22
+ `resolveHistoryOperation` for comparison; unknown historical operations remain
23
+ unchanged so a newer writer does not make an older reader destroy information.
24
+ These additive naming contracts do not change the item storage format or hash
25
+ epochs.
26
+
27
+ Custom SDK consumers retain their own operation identities. New packages should
28
+ use `extension:<package_name>:<snake_case_operation>`. Legacy custom names remain
29
+ accepted when they use lowercase alphanumeric segments separated by underscores,
30
+ hyphens, colons, or dots. Workspace retry keys remain opaque colon suffixes,
31
+ including schema reference paths. Whitespace and control characters are rejected
32
+ before new record construction. The native inventory
33
+ gate is stricter than this compatibility grammar: a typo in product code cannot
34
+ silently become a custom operation.
35
+
36
+ Validation separates the prefix from its opaque suffix at the first colon.
37
+ Both checks run in linear time, including long invalid inputs; no arbitrary
38
+ length cap truncates or rejects otherwise valid SDK identities.
39
+
40
+ `requireHistoryOperation` validates a native identity or a declared parameterized
41
+ family. `normalizeHistoryOperationForWrite` applies the compatible SDK writer
42
+ grammar. Existing append/rewrite primitives retain their responsibility to
43
+ preserve imported and historical records; reading old records does not run a
44
+ new-writer naming migration. Custom writers using other spellings must select
45
+ grammar-compliant identities for new events; their retained records remain
46
+ readable under their original names.
@@ -3,8 +3,9 @@
3
3
  Tracked by [pm-96fsma](../.agents/pm/issues/pm-96fsma.toon),
4
4
  [pm-m0yjtg](../.agents/pm/issues/pm-m0yjtg.toon),
5
5
  [pm-qw1uw6](../.agents/pm/issues/pm-qw1uw6.toon),
6
- [pm-e3gn0z](../.agents/pm/issues/pm-e3gn0z.toon), and
7
- [pm-wlqxg3](../.agents/pm/tasks/pm-wlqxg3.toon).
6
+ [pm-e3gn0z](../.agents/pm/issues/pm-e3gn0z.toon),
7
+ [pm-wlqxg3](../.agents/pm/tasks/pm-wlqxg3.toon), and
8
+ [pm-nb4zwz](../.agents/pm/issues/pm-nb4zwz.toon).
8
9
 
9
10
  Project management depends on trustworthy context. History is not just an
10
11
  activity feed: it is the reconstructable source for prior item states, including
@@ -104,6 +105,30 @@ separate recovery implementation.
104
105
 
105
106
  ## Permanent item identities
106
107
 
108
+ Reading a deleted ID returns `item_deleted`, distinct from an unknown ID.
109
+ The SDK error context and JSON diagnostic include `item_id` and a bounded
110
+ `tombstone` with deletion time, recoverability, and the last materialized durable
111
+ version. Human output supplies the same recovery commands:
112
+
113
+ ```bash
114
+ pm get <id> --at <last-materialized-version>
115
+ pm restore <id> <last-materialized-version>
116
+ ```
117
+
118
+ The not-found exit code remains `3`. Hosts that branch on diagnostic codes
119
+ should handle `item_deleted` alongside other not-found cases; the new context
120
+ fields are optional on general SDK errors. No existing required SDK input changes.
121
+
122
+ The diagnostic verifies retained history before claiming deletion. A missing
123
+ file whose history ends in a live state is not called deleted. A corrupt stream
124
+ retains its integrity refusal. For legacy compacted streams, a timestamp is
125
+ suggested only if it selects exactly the last materialized state; ambiguous
126
+ timestamps or a pruned materialized state report `recoverable: false` and direct
127
+ the caller to retained history and version control. The suggested read is
128
+ available as `recovery.suggested_retry_args` for execution without shell parsing.
129
+
130
+ Immutable event naming is documented in [History operations](HISTORY_OPERATIONS.md).
131
+
107
132
  Deleting an item retains its identity reservation through its history file.
108
133
  Generated IDs skip those reservations, even under reproducible execution.
109
134
  Explicit recreation fails with `item_identity_reserved`; use restore to recover
@@ -1,7 +1,8 @@
1
1
  # Lifecycle Commands and Ownership
2
2
 
3
3
  Tracked by [pm-ik19](../.agents/pm/tasks/pm-ik19.toon) and
4
- [pm-eq4x](../.agents/pm/tasks/pm-eq4x.toon).
4
+ [pm-eq4x](../.agents/pm/tasks/pm-eq4x.toon) and
5
+ [pm-r1f9f1](../.agents/pm/tasks/pm-r1f9f1.toon).
5
6
 
6
7
  Bulk mutations and ownership compositions share SDK implementations with their
7
8
  compatibility spellings. Runtime help and contracts describe the active surface:
@@ -41,7 +42,23 @@ close and its inline evidence, then releases ownership.
41
42
  Each constituent operation enforces its own policy and writes its own history.
42
43
  Compositions do not provide rollback across operations: for example, if the
43
44
  status transition fails after a successful claim, the claim remains. Inspect the
44
- item before retrying after an error.
45
+ item before retrying after an error. A second-step failure retains the original
46
+ error code and adds recovery guidance naming the completed operation. Its SDK
47
+ error `cause` retains the underlying failure.
48
+
49
+ ## Compact transport receipts
50
+
51
+ CLI and MCP compositions default to an `id`, final `status`, `action`, and
52
+ `changed_field_count`, plus compact receipts for each constituent step. The root
53
+ count is the number of distinct fields touched across the steps, not their sum.
54
+ Step receipts retain ownership, close reason, warnings, and recovery evidence.
55
+ Item descriptions, bodies, and annotation histories are not echoed by default.
56
+
57
+ Use CLI `--full-changed-fields` or MCP `fullChangedFields: true` for complete
58
+ constituent results; `--id-only` or `idOnly: true` returns only the final identity
59
+ and status. CLI `--no-changed-fields` preserves item snapshots while replacing
60
+ field arrays with counts. Plain release supports the same output controls.
61
+ Typed `PmClient` methods and the direct SDK primitives retain full results.
45
62
 
46
63
  ## SDK and MCP
47
64
 
@@ -235,18 +235,79 @@ Deleting or ignoring them would lose the evidence needed by other clones.
235
235
 
236
236
  ## Cross-branch id collision safety
237
237
 
238
- Item ids are `<prefix>` plus random base36 characters, and uniqueness is only probed against the local working tree — two agents branching from the same commit can mint the same id for different items (GH-600 / pm-pibw). Two controls bound that risk:
238
+ Tracked by [pm-qx95lz](../.agents/pm/issues/pm-qx95lz.toon).
239
+
240
+ Item ids are `<prefix>` plus random base36 characters. Local allocation reserves
241
+ both live documents and retained history, but cannot see independent creations
242
+ on another branch. The four-character default is a small, synchronized-workspace
243
+ setting; it is not a fleet uniqueness guarantee. `ids.token_length` accepts 4–12.
244
+ The allocator increases width after 32 local collisions to escape local density;
245
+ this does not measure concurrent branch activity.
246
+
247
+ For a shared base containing `n` reserved ids and `m` unsynchronized creations,
248
+ choose width `L` so `m*(m-1)/(2*(36^L-n))` stays below the desired per-sync
249
+ collision probability. This birthday union bound assumes independent uniform
250
+ allocation and all branches know the same reserved ids. At one million reserved
251
+ ids, eight characters keep 1,000 concurrent creations below one in a million;
252
+ nine characters do so for 10,000 creations. Configure the width before branching:
239
253
 
240
- - **Entropy budget** — `ids.token_length` in `settings.json` (default 4, accepted range 4–12) sets the random token length for newly minted ids. Approximate 1%-birthday-collision workloads per length: 4 chars ≈ 1.68M ids (~184 concurrent unsynced creations), 6 chars ≈ 2.18B (~6.6k), 8 chars ≈ 2.8T (~238k). Multi-agent repositories that fan out many branches between merges should raise it, e.g. `pm config project set ids_token_length 6`.
241
- - **Post-merge detection** — the `storage_integrity` validate check reports `validate_storage_duplicate_item_ids` whenever one id is claimed by multiple item documents (across type folders or format variants), which is how a same-id/different-item merge materializes. Remediation: keep one document, recreate the other item under a fresh id (`pm copy` then delete the colliding file), and re-point any dependencies.
254
+ ```bash
255
+ pm config project set ids_token_length 8
256
+ ```
257
+
258
+ The SDK item merge refuses an empty common ancestor with
259
+ `item_identity_conflict`, even for equal item content: document equality alone
260
+ cannot prove a common creation. It leaves the driver output untouched instead
261
+ of combining two identities through scalar preference. The history merge also
262
+ refuses different create events across its inputs, multiple creates in either
263
+ input, or creations on both sides when the ancestor lacks a create event even
264
+ when their bytes match, before fast-forwarding or reanchoring. A common ancestor
265
+ containing the shared create event remains valid.
266
+
267
+ `storage_integrity` detects multiple physical documents and a second create event
268
+ within one history stream, reporting its line in `history_unparseable_streams`
269
+ as an invalid lifecycle. This check also protects merges Git resolves without
270
+ invoking a content driver. `pm get` and SDK item lookup refuse multiple physical
271
+ matches with `item_identity_ambiguous`; the message lists tracker-relative paths
272
+ and SDK error context exposes a typed `paths` array. Format preference cannot
273
+ select a winner. Only candidate paths are probed, so lookup
274
+ does not enumerate every item in the workspace.
275
+
276
+ Preserve both branches when a collision is reported. Recover each item from its
277
+ unambiguous source branch, create the second under a fresh id, and update its
278
+ references before retrying the merge. Do not repair a fused stream merely to
279
+ make its hashes pass: a new hash chain does not recover a lost identity.
242
280
 
243
281
  Within one working tree, create and copy serialize on the candidate id and
244
282
  recheck every built-in and extension-defined type folder before the
245
283
  authoritative write. A raced collision fails with `item_id_collision` instead
246
284
  of replacing the existing document.
247
285
 
286
+ ### Executable convergence evidence
287
+
288
+ [pm-1tns7o](../.agents/pm/tasks/pm-1tns7o.toon) replaces the tag-only property
289
+ with generated complete-document comparisons. Fixed branch snapshots are folded
290
+ in original, reversed, and rotated order, with both ours/theirs directions.
291
+ Cases cover conflicting scalar writes and bodies, collection additions, distinct
292
+ and equal timestamps, disjoint edits, and optional-field deletion. Independent
293
+ expected documents are constructed directly for every N-branch case to check
294
+ retained values and preserved context. A policy table
295
+ also asserts that the compatibility `preferred_side` option is directional.
296
+ The field-class inventories are pinned so changes require an explicit test update.
297
+
298
+ These properties exercise the declared three-way policies; they do not turn the
299
+ document-level timestamp into per-field causal provenance. In particular, the
300
+ N-branch conflict fixture compares competing writes to the same scalar set.
301
+ Arbitrary histories, ordered executable test definitions with receiving-clone
302
+ trust, and relationship-event ordering retain their separate conformance contracts.
303
+
248
304
  ## Required post-merge gate
249
305
 
306
+ Reconciliation resolves receipt discovery and settlement from the requested
307
+ tracker. An explicit tracker outside Git does not consume clone-local receipts
308
+ from an unrelated invocation directory; see
309
+ [pm-q5grv5](../.agents/pm/issues/pm-q5grv5.toon).
310
+
250
311
  After every branch merge that touches `.agents/pm`, run:
251
312
 
252
313
  ```bash
@@ -1,6 +1,6 @@
1
1
  # Declarative workflow policies
2
2
 
3
- Tracker: [pm-mj42og](../.agents/pm/features/pm-mj42og.toon) and [pm-htbetn](../.agents/pm/features/pm-htbetn.toon).
3
+ Tracker: [pm-mj42og](../.agents/pm/features/pm-mj42og.toon) [pm-htbetn](../.agents/pm/features/pm-htbetn.toon), [pm-khd2fd](../.agents/pm/issues/pm-khd2fd.toon), and [pm-ycv2cz](../.agents/pm/issues/pm-ycv2cz.toon).
4
4
 
5
5
  Projects can describe their lifecycle requirements as versioned data. The SDK
6
6
  uses the same evaluator for item mutations, policy previews, and completeness
@@ -10,7 +10,7 @@ warn, or refuse; refusal also requires an explicit workspace opt-in.
10
10
  ## Configure a requirement
11
11
 
12
12
  ```bash
13
- pm schema policy-put close-evidence --definition '{"id":"close-evidence","effect":"refuse","subject":{"statuses":["closed"]},"rule":{"kind":"require_fields","fields":["resolution","actual_result"]}}'
13
+ pm schema policy-put close-evidence --definition '{"effect":"refuse","subject":{"statuses":["closed"]},"rule":{"kind":"require_fields","fields":["resolution","actual_result"]}}'
14
14
  pm schema policies
15
15
  pm schema policy-check pm-example --definition '{"status":"closed"}'
16
16
  pm schema policy-mode refuse
@@ -21,6 +21,10 @@ body. Custom fields can use dotted paths with at most eight segments. Empty
21
21
  strings, arrays, objects, null, and absent values do not satisfy required fields;
22
22
  zero and false are meaningful values.
23
23
 
24
+ `policy-put` accepts the id once: pass it as the operand, or omit the operand
25
+ and include `id` in the definition. When both are supplied their normalized ids
26
+ must agree; a mismatch refuses without changing the registry or history.
27
+ The same normalization applies to JSON strings, objects, previews, SDK, and MCP.
24
28
  `policy-put` replaces a declaration with the same id. `policy-remove <id>` removes
25
29
  one declaration. `policy-mode advise` disables refusal while retaining diagnostics.
26
30
  Registry writes are locked and recorded in workspace history. `--dry-run` previews
@@ -122,8 +126,48 @@ declaration once. Later edits to the supplied document do not change that
122
126
  snapshot; create another evaluator to adopt them. Completeness validation uses
123
127
  one such snapshot for the whole supplied corpus.
124
128
 
125
- The schema contract version is 4.16. Existing schema operations remain available;
129
+ The schema contract version is 4.19; `policy-put` requires `definition` but
130
+ no longer requires a separate `name`. Existing schema operations remain available;
126
131
  `SchemaResult` now also includes `WorkflowPolicyActionResult`. Consumers that
127
132
  exhaustively narrow schema results should handle the `policy_result: true`
128
133
  discriminant. Validation options include `checkCompleteness`, and validation
129
134
  results can contain a `completeness` check.
135
+
136
+ ## Require a meaningful completeness contract
137
+
138
+ A successful completeness check means no applicable field requirement was
139
+ violated. It does not establish that a project declared any requirements.
140
+ The receipt exposes these independent measurements even in counts mode:
141
+
142
+ | Field | Meaning |
143
+ | --- | --- |
144
+ | `declared_requirement_count` | Number of `require_fields` declarations, including operation-specific ones |
145
+ | `state_requirement_count` | Number eligible for a state scan, without operation selectors |
146
+ | `applicable_requirement_count` | Distinct requirements that matched at least one supplied item |
147
+ | `requirement_application_count` | Item/requirement pairs actually evaluated |
148
+ | `governed_items`, `ungoverned_items` | Items with and without a matching state requirement |
149
+ | `contract_status` | `undeclared`, `empty`, `inapplicable`, `partial`, or `covered` |
150
+
151
+ `applied_policy_ids` is bounded by the diagnostic row limit; its truncation flag
152
+ and `applicable_requirement_count` retain the complete total. `covered` describes
153
+ applicability, not compliance: violations are reported independently. Unreadable
154
+ source data still fails the check, regardless of the coverage of readable items.
155
+
156
+ Projects can require a nonempty applied contract with the existing assurance
157
+ primitives. Replace `pm-example` with the accountable item in your workspace:
158
+
159
+ ```bash
160
+ pm assurance put measurement completeness-contract --definition '{"id":"completeness-contract","source":{"kind":"validate","check":"completeness","field":"applicable_requirement_count"}}'
161
+ pm assurance put assertion completeness-contract-required --definition '{"id":"completeness-contract-required","measurement_id":"completeness-contract","owner_item_id":"pm-example","scope":{"kind":"all"},"floor":1,"lifetime":"hold","enforcement":"block","negative_control":{"cases":[{"observed":0,"expected":"fail"},{"observed":1,"expected":"pass"}]}}'
162
+ pm assurance put gate completeness-contract --definition '{"id":"completeness-contract","assertion_ids":["completeness-contract-required"],"triggers":["ci"]}'
163
+ pm assurance run completeness-contract --trigger ci --dry-run
164
+ pm ops validate --check-completeness --strict-exit
165
+ ```
166
+
167
+ Run both checks: the gate requires applicability and validation checks compliance.
168
+ Deleting the last applicable policy fails the gate. For an empty workspace, or a
169
+ contract intended only for a future lifecycle state, measure
170
+ `state_requirement_count` instead. To require coverage of every current item,
171
+ also enforce a zero bound on `ungoverned_items`. Higher per-project floors can
172
+ protect against partial policy deletion; a floor of one only proves at least
173
+ one requirement applies.
@@ -7,11 +7,11 @@ This file is generated from `PM_COMMAND_CAPABILITY_CONTRACTS`. Do not edit it ma
7
7
  | Capability family | Commands |
8
8
  | --- | --- |
9
9
  | workspace | `init`, `config`, `workspace merge`, `schema`, `profile`, `ops telemetry`, `ops health`, `ops gc`, `workspace` |
10
- | intake | `create`, `item copy`, `context focus`, `history restore` |
10
+ | intake | `create`, `item`, `item copy`, `context focus`, `history restore` |
11
11
  | context | `list`, `aggregate`, `context`, `get`, `search`, `item duplicates`, `ops eval`, `context next`, `history activity`, `ops stats`, `help` |
12
12
  | lifecycle | `update`, `update many`, `close`, `close many`, `close delete`, `claim`, `release` |
13
- | evidence | `history`, `history events`, `history redact`, `history repair`, `history compact`, `history attest`, `history-author-acknowledge`, `append`, `comments`, `notes`, `learnings`, `files`, `docs` |
14
- | graph | `graph`, `deps`, `plan` |
15
- | quality | `test`, `ops test-all`, `ops validate`, `assurance`, `contracts`, `ops` |
13
+ | evidence | `history`, `history events`, `history redact`, `history repair`, `history compact`, `history attest`, `history-author-acknowledge`, `item append`, `item comments`, `item notes`, `item learnings`, `item files`, `item docs` |
14
+ | graph | `graph`, `item deps`, `plan` |
15
+ | quality | `item test`, `ops test-all`, `ops validate`, `assurance`, `contracts`, `ops` |
16
16
  | automation | `meet`, `event`, `remind` |
17
17
  | extensions | `package` |
@@ -12,6 +12,7 @@ This file is generated from `PM_COMMAND_CAPABILITY_CONTRACTS`. Do not edit it ma
12
12
  | `install` | full | extensions |
13
13
  | `upgrade` | full | extensions |
14
14
  | `create` | core | intake |
15
+ | `item` | full | intake |
15
16
  | `item-reopen` | full | lifecycle |
16
17
  | `copy` | full | intake |
17
18
  | `item copy` | full | intake |
@@ -66,14 +67,22 @@ This file is generated from `PM_COMMAND_CAPABILITY_CONTRACTS`. Do not edit it ma
66
67
  | `delete` | full | lifecycle |
67
68
  | `close delete` | full | lifecycle |
68
69
  | `append` | standard | evidence |
70
+ | `item append` | standard | evidence |
69
71
  | `comments` | standard | evidence |
72
+ | `item comments` | standard | evidence |
70
73
  | `notes` | standard | evidence |
74
+ | `item notes` | standard | evidence |
71
75
  | `learnings` | standard | evidence |
76
+ | `item learnings` | standard | evidence |
72
77
  | `files` | standard | evidence |
78
+ | `item files` | standard | evidence |
73
79
  | `docs` | standard | evidence |
80
+ | `item docs` | standard | evidence |
74
81
  | `deps` | standard | graph |
82
+ | `item deps` | standard | graph |
75
83
  | `plan` | core | graph |
76
84
  | `test` | standard | quality |
85
+ | `item test` | standard | quality |
77
86
  | `test-all` | full | quality |
78
87
  | `ops test-all` | full | quality |
79
88
  | `telemetry` | full | workspace |
@@ -103,3 +112,4 @@ This file is generated from `PM_COMMAND_CAPABILITY_CONTRACTS`. Do not edit it ma
103
112
  | `completion-tags` | internal | internal |
104
113
  | `completion-types` | internal | internal |
105
114
  | `test-runs-worker` | internal | internal |
115
+ | `item test worker` | internal | internal |
@@ -5,6 +5,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
5
5
  | Command | Capability family | Canonical flags | Maximum |
6
6
  | --- | --- | ---: | ---: |
7
7
  | `init` | workspace | 30 | 30 |
8
+ | `item` | intake | 20 | 20 |
8
9
  | `config` | workspace | 36 | 36 |
9
10
  | `extension` | extensions | 54 | 54 |
10
11
  | `package` | extensions | 55 | 55 |
@@ -74,7 +75,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
74
75
  | `meet` | automation | 33 | 33 |
75
76
  | `event` | automation | 33 | 33 |
76
77
  | `remind` | automation | 29 | 29 |
77
- | `test-runs-worker` | internal | 25 | 25 |
78
+ | `test-runs-worker` | internal | 20 | 20 |
78
79
  | `history attest` | evidence | 23 | 23 |
79
80
  | `history redact` | evidence | 27 | 27 |
80
81
  | `history repair` | evidence | 27 | 27 |
@@ -94,6 +95,15 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
94
95
  | `update many` | lifecycle | 146 | 146 |
95
96
  | `close many` | lifecycle | 72 | 72 |
96
97
  | `close delete` | lifecycle | 24 | 24 |
98
+ | `item comments` | evidence | 31 | 31 |
99
+ | `item notes` | evidence | 35 | 35 |
100
+ | `item learnings` | evidence | 31 | 31 |
101
+ | `item files` | evidence | 39 | 39 |
102
+ | `item docs` | evidence | 30 | 30 |
103
+ | `item deps` | graph | 32 | 32 |
104
+ | `item append` | evidence | 25 | 25 |
105
+ | `item test` | quality | 53 | 53 |
106
+ | `item test worker` | internal | 20 | 20 |
97
107
  | `item copy` | intake | 24 | 24 |
98
108
  | `workspace merge` | workspace | 27 | 27 |
99
109
  | `item duplicates` | context | 25 | 25 |
@@ -4,14 +4,14 @@ Tracker: `pm-f05lsg`.
4
4
 
5
5
  Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval.
6
6
 
7
- - Catalog error codes: 371
7
+ - Catalog error codes: 374
8
8
  - Executable error codes: 19
9
9
  - Executable-code ratchet floor: 18
10
10
  - Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand`
11
- - Uncovered error codes: 352
12
- - Coverage fraction: 0.051213
11
+ - Uncovered error codes: 355
12
+ - Coverage fraction: 0.050802
13
13
  - Closed-domain probes: 19
14
- - Grammar probes: 101
14
+ - Grammar probes: 113
15
15
 
16
16
  | Error code | Canonical code | Disposition | Evidence kinds | Probe count |
17
17
  | --- | --- | --- | --- | --- |
@@ -169,10 +169,13 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
169
169
  | `invalid_reproducible_process_environment` | `invalid_reproducible_process_environment` | uncovered | none | 0 |
170
170
  | `invalid_workspace_snapshot_target` | `invalid_workspace_snapshot_target` | uncovered | none | 0 |
171
171
  | `item_already_active` | `item_already_active` | uncovered | none | 0 |
172
+ | `item_deleted` | `item_deleted` | uncovered | none | 0 |
172
173
  | `item_document_encoding_invalid` | `item_document_encoding_invalid` | uncovered | none | 0 |
173
174
  | `item_document_invalid` | `item_document_invalid` | uncovered | none | 0 |
174
175
  | `item_document_roundtrip_failed` | `item_document_roundtrip_failed` | uncovered | none | 0 |
175
176
  | `item_id_collision` | `item_id_collision` | uncovered | none | 0 |
177
+ | `item_identity_ambiguous` | `item_identity_ambiguous` | uncovered | none | 0 |
178
+ | `item_identity_conflict` | `item_identity_conflict` | uncovered | none | 0 |
176
179
  | `item_identity_reserved` | `item_identity_reserved` | uncovered | none | 0 |
177
180
  | `item_not_found` | `item_not_found` | uncovered | none | 0 |
178
181
  | `likely_duplicate` | `likely_duplicate` | uncovered | none | 0 |
@@ -211,7 +214,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
211
214
  | `missing_parameter_alias` | `missing_parameter_alias` | uncovered | none | 0 |
212
215
  | `missing_positive_execution_receipt` | `missing_positive_execution_receipt` | uncovered | none | 0 |
213
216
  | `missing_probe` | `missing_probe` | uncovered | none | 0 |
214
- | `missing_required_argument` | `missing_required_argument` | executable | grammar | 63 |
217
+ | `missing_required_argument` | `missing_required_argument` | executable | grammar | 75 |
215
218
  | `missing_required_option` | `missing_required_option` | uncovered | none | 0 |
216
219
  | `missing_suggested_retry` | `missing_suggested_retry` | uncovered | none | 0 |
217
220
  | `missing_suggested_retry_args` | `missing_suggested_retry_args` | uncovered | none | 0 |
package/marketplace.json CHANGED
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
9
- "version": "2026.9.11"
9
+ "version": "2026.9.13"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "pm-claude",
14
14
  "source": "./plugins/pm-claude",
15
15
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
16
- "version": "2026.9.11",
16
+ "version": "2026.9.13",
17
17
  "author": {
18
18
  "name": "unbrained",
19
19
  "url": "https://github.com/unbraind/pm-cli"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-cli",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for importing Beads JSONL records.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-calendar",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for calendar and agenda views.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-command-kit",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-digital-twin",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.",
@@ -4,6 +4,28 @@ Trackers: [pm-fmy9ih](../../.agents/pm/tasks/pm-fmy9ih.toon), [pm-vjk3](../../.a
4
4
 
5
5
  First-party package that restores optional governance audit surfaces in bare-core `pm`.
6
6
 
7
+ ## Concurrent annotations under strict ownership
8
+
9
+ Tracked by [pm-nrkjik](../../.agents/pm/issues/pm-nrkjik.toon).
10
+
11
+ Merge-safe notes preserve independent entries during merging. Strict ownership
12
+ still applies to writes. For an approved append across owners, install this
13
+ package and use its narrow flag:
14
+
15
+ ```bash
16
+ pm package install governance-audit --project
17
+ pm notes pm-example "Review observation" --allow-audit-comment
18
+ ```
19
+
20
+ The same flag works for `comments` and `learnings`. It permits additions only:
21
+ edit and delete still require ownership, and the existing assignee is preserved.
22
+ For a non-terminal handoff, the current owner runs `pm release <id>`, then the
23
+ new owner runs `pm claim <id>`; claim refuses work still held by another owner.
24
+ This changes the assignee;
25
+ it is a different operation from appending an observation. Bare `--force` remains
26
+ an explicit override requiring approval. Body `append` is not merge-safe and has
27
+ no annotation bypass; use a note when the information is an independent event.
28
+
7
29
  ## Hooks
8
30
 
9
31
  The package also registers default-inert `onRead` and `onWrite` hooks as the
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-governance-audit",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for governance audit and normalization workflows.",
@@ -126,50 +126,37 @@ function completionCommand(): CommandDefinition {
126
126
  runCompletionPackage(context.args, context.options, context.global),
127
127
  };
128
128
  }
129
-
130
- function completionTagsCommand(): CommandDefinition {
131
- return {
132
- name: "completion-tags",
129
+ /** Registers this package's commands, actions, and runtime hooks with the host. */
130
+ export function activate(api: ExtensionApi): void {
131
+ api.registerCommand(guideCommand());
132
+ api.registerCommand(completionCommand());
133
+ api.registerCommand({
134
+ name: "completion tags",
133
135
  action: "completion-tags",
134
136
  tier: "internal",
135
137
  family: "internal",
136
138
  description: "Print known tags for completion filters.",
137
139
  intent: "List tag values for lazy shell completion.",
138
140
  run: async (context) => runCompletionTagsPackage(context.global),
139
- };
140
- }
141
-
142
- function completionStatusesCommand(): CommandDefinition {
143
- return {
144
- name: "completion-statuses",
141
+ });
142
+ api.registerCommand({
143
+ name: "completion statuses",
145
144
  action: "completion-statuses",
146
145
  tier: "internal",
147
146
  family: "internal",
148
147
  description: "Print runtime status IDs for completion filters.",
149
148
  intent: "List runtime status values for shell completion.",
150
149
  run: async (context) => runCompletionStatusesPackage(context.global),
151
- };
152
- }
153
-
154
- function completionTypesCommand(): CommandDefinition {
155
- return {
156
- name: "completion-types",
150
+ });
151
+ api.registerCommand({
152
+ name: "completion types",
157
153
  action: "completion-types",
158
154
  tier: "internal",
159
155
  family: "internal",
160
156
  description: "Print runtime item type IDs for completion filters.",
161
157
  intent: "List runtime item types for shell completion.",
162
158
  run: async (context) => runCompletionTypesPackage(context.global),
163
- };
164
- }
165
-
166
- /** Registers this package's commands, actions, and runtime hooks with the host. */
167
- export function activate(api: ExtensionApi): void {
168
- api.registerCommand(guideCommand());
169
- api.registerCommand(completionCommand());
170
- api.registerCommand(completionTagsCommand());
171
- api.registerCommand(completionStatusesCommand());
172
- api.registerCommand(completionTypesCommand());
159
+ });
173
160
  api.registerService("output_format", (context) => {
174
161
  const rendered = renderGuideShellPackageOutput(
175
162
  context as ServiceOverrideContext,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-guide-shell",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for guide and shell completion workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-kanban",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-lifecycle-hooks",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package demonstrating safe lifecycle hook registration.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-linked-test-adapters",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for optional linked-test run management adapters and reporters.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-search-advanced",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for semantic, hybrid, and reindex search workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-templates",
3
- "version": "2026.9.11",
3
+ "version": "2026.9.13",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for reusable create templates.",