@unbrained/pm-cli 2026.8.13 → 2026.8.14
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.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +141 -112
- package/dist/cli/main.js +39 -3
- package/dist/cli-bundle/bundle-manifest.json +144 -176
- package/dist/cli-bundle/chunks/{chunk-DEDU3DG7.js → chunk-BBOFSVAK.js} +66 -65
- package/dist/cli-bundle/chunks/chunk-BFALV3YP.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-Q47C67TQ.js → chunk-FIW4P64F.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QGTUPEU5.js → chunk-G5JUB66K.js} +41 -41
- package/dist/cli-bundle/chunks/{chunk-3ZMOWAFM.js → chunk-SBRKH6OR.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TMJ7URWS.js +13 -0
- package/dist/cli-bundle/chunks/{chunk-F7FJYGK3.js → chunk-TXMEUUUY.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YLBAPY22.js → chunk-XAVMOK6B.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TF3TPKPR.js → chunk-YAMTJL6Y.js} +33 -33
- package/dist/cli-bundle/chunks/{chunk-IMGIN7R6.js → chunk-YSVSMJ2B.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-4HIZ7EA3.js → register-list-query-T3EHHNNV.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-W64FZ5HN.js → register-mutation-E27WCLSZ.js} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-C44ET7R5.js → register-operations-4R6I7CPY.js} +2 -2
- package/dist/cli-bundle/chunks/{register-setup-634MFRXU.js → register-setup-3YXZ444E.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-OOYYKQWX.js → chunk-4DQ2YERC.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-F43TT2QQ.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-2RI2FESN.js → chunk-K7RWWOAG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-KFSZ3BP6.js +16 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3DJSGWVB.js → chunk-KSEDUWVZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-NFHFZH2Z.js → chunk-KYUQGTSB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-IIS2FRKL.js → chunk-LZ4MV3RH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-PGXJQLCT.js +155 -0
- package/dist/cli-bundle/focused-chunks/{chunk-E3AVJ655.js → chunk-PPFGQDSI.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-Q4YY3XNF.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-QK753U3U.js +46 -0
- package/dist/cli-bundle/focused-chunks/{chunk-QDZUABWL.js → chunk-QUMB2J27.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-SM7MTG27.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-I75MANL7.js → chunk-WCVE2NIG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-XDNAW5OI.js +18 -0
- package/dist/cli-bundle/focused-chunks/{chunk-2JP7W7GO.js → chunk-YOOI3UZX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-ZM6TZVHC.js +2 -0
- package/dist/cli-bundle/main.js +13 -13
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +1 -1
- package/dist/cli-bundle/sdk-core.js +44 -41
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +109 -1
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +2 -2
- package/dist/core/history/drift-scan.d.ts +6 -0
- package/dist/core/history/drift-scan.js +74 -50
- package/dist/core/history/workspace-history.d.ts +59 -0
- package/dist/core/history/workspace-history.js +197 -10
- package/dist/core/output/output.js +12 -4
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +6 -1
- package/dist/sdk/cli-contracts/runtime-contracts.js +155 -60
- package/dist/sdk/cli-program.js +3 -3
- package/dist/sdk/context-relevance.js +12 -4
- package/dist/sdk/governance/assurance.js +4 -4
- package/dist/sdk/governance/health.js +15 -3
- package/dist/sdk/governance/validate-history-drift.d.ts +7 -0
- package/dist/sdk/governance/validate-history-drift.js +68 -0
- package/dist/sdk/governance/validate.js +4 -46
- package/dist/sdk/graph/assembly.d.ts +23 -0
- package/dist/sdk/graph/assembly.js +54 -2
- package/dist/sdk/graph/durable-cache.js +50 -20
- package/dist/sdk/graph/governance-contracts.d.ts +1 -1
- package/dist/sdk/graph/governance-contracts.js +4 -2
- package/dist/sdk/graph/governance.d.ts +21 -1
- package/dist/sdk/graph/governance.js +94 -32
- package/dist/sdk/graph/index.d.ts +2 -2
- package/dist/sdk/graph/index.js +4 -4
- package/dist/sdk/graph/mutation-advisory.js +15 -7
- package/dist/sdk/graph/remediation.js +12 -2
- package/dist/sdk/history-read.d.ts +8 -0
- package/dist/sdk/history-read.js +2 -2
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/query/history.js +20 -3
- package/dist/sdk/read-output-budget.d.ts +2 -0
- package/dist/sdk/read-output-budget.js +12 -5
- package/dist/sdk/read-output-contracts.d.ts +61 -5
- package/dist/sdk/read-output-contracts.js +210 -28
- package/dist/sdk/read-output-rows.d.ts +11 -0
- package/dist/sdk/read-output-rows.js +47 -2
- package/dist/sdk/runtime-primitives.d.ts +1 -1
- package/dist/sdk/runtime-primitives.js +3 -3
- package/dist/sdk/runtime.js +5 -3
- package/docs/ASSURANCE.md +10 -1
- package/docs/COMMANDS.md +31 -2
- package/docs/READ_OUTPUT_CONTRACTS.md +44 -8
- package/docs/RELATIONSHIP_GRAPH.md +20 -5
- package/docs/SDK.md +12 -5
- package/docs/SDK_CONTEXT_INTEGRITY.md +32 -1
- package/docs/TESTING.md +23 -1
- package/docs/performance/sdk-entrypoint-import-costs.md +20 -13
- package/marketplace.json +2 -2
- package/package.json +6 -6
- package/packages/pm-beads/extensions/beads/index.ts +1 -0
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/extensions/calendar/index.ts +1 -0
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/extensions/digital-twin/index.ts +7 -0
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/extensions/governance-audit/index.ts +4 -0
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/extensions/guide-shell/index.ts +5 -0
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +6 -0
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +2 -0
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/extensions/templates/index.ts +4 -0
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/extensions/todos/index.ts +2 -0
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/extensions/vcs/index.ts +7 -0
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/bundle-cli.mjs +17 -4
- package/sdk/public-surface.json +209 -29
- package/dist/cli-bundle/chunks/chunk-DL5M5J3V.js +0 -13
- package/dist/cli-bundle/chunks/chunk-HIUZVCMN.js +0 -5
- package/dist/cli-bundle/focused-chunks/chunk-27N23W6M.js +0 -31
- package/dist/cli-bundle/focused-chunks/chunk-3BNVU6LC.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-6MLIRBLV.js +0 -5
- package/dist/cli-bundle/focused-chunks/chunk-6XYLENDV.js +0 -155
- package/dist/cli-bundle/focused-chunks/chunk-CP4K4WFS.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-EBTNSFYE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-HC2OL2H2.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-OGC4XSBC.js +0 -17
- package/dist/cli-bundle/focused-chunks/chunk-PKPOZXLL.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-QQX5TDFT.js +0 -16
- package/dist/cli-bundle/focused-chunks/chunk-TEZIXMTH.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-WEH6NSL6.js +0 -18
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# Universal Read Output Contracts
|
|
2
2
|
|
|
3
|
-
Tracker references: [pm-hb7ug8](../.agents/pm/features/pm-hb7ug8.toon), [pm-cxr0jb](../.agents/pm/features/pm-cxr0jb.toon), [pm-hid9g1](../.agents/pm/features/pm-hid9g1.toon), [pm-sb0tns](../.agents/pm/issues/pm-sb0tns.toon),
|
|
3
|
+
Tracker references: [pm-hb7ug8](../.agents/pm/features/pm-hb7ug8.toon), [pm-cxr0jb](../.agents/pm/features/pm-cxr0jb.toon), [pm-hid9g1](../.agents/pm/features/pm-hid9g1.toon), [pm-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon), [pm-sb0tns](../.agents/pm/issues/pm-sb0tns.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), [pm-eugaqy](../.agents/pm/issues/pm-eugaqy.toon), [pm-jt8aa2](../.agents/pm/issues/pm-jt8aa2.toon), and [pm-kyjdne](../.agents/pm/issues/pm-kyjdne.toon).
|
|
4
4
|
|
|
5
5
|
## Agent Quick Context
|
|
6
6
|
|
|
7
7
|
Every built-in read surface uses four output dimensions: what to include, how much to return, how much the result may cost, and how to encode it. The same canonical controls work through the CLI, SDK, MCP, generated schemas, runtime contracts, and shell completions.
|
|
8
8
|
|
|
9
|
-
| Dimension | CLI | SDK and MCP | Meaning
|
|
10
|
-
| --------- | ------------------------------- | --------------- |
|
|
11
|
-
| Include | `--output-include <csv>` | `outputInclude` | Retain named fields or
|
|
12
|
-
| Amount | `--output-limit <n\|unbounded>` | `outputLimit` | Bound shared row collections.
|
|
13
|
-
| Cost | `--output-budget <tokens>` | `outputBudget` | Fail closed when even the compact result cannot fit.
|
|
14
|
-
| Encoding | `--output-format <toon\|json>` | `outputFormat` | Select the CLI renderer and record the requested encoding.
|
|
9
|
+
| Dimension | CLI | SDK and MCP | Meaning |
|
|
10
|
+
| --------- | ------------------------------- | --------------- | ---------------------------------------------------------------------- |
|
|
11
|
+
| Include | `--output-include <csv>` | `outputInclude` | Retain named fields or sections, or select a declared projection mode. |
|
|
12
|
+
| Amount | `--output-limit <n\|unbounded>` | `outputLimit` | Bound shared row collections. |
|
|
13
|
+
| Cost | `--output-budget <tokens>` | `outputBudget` | Fail closed when even the compact result cannot fit. |
|
|
14
|
+
| Encoding | `--output-format <toon\|json>` | `outputFormat` | Select the CLI renderer and record the requested encoding. |
|
|
15
15
|
|
|
16
16
|
The contract covers `list`, `context`, `search`, `get`, `next`, `health`, `deps`, `graph`, `history`, `activity`, `validate`, `events`, `contracts`, `comments`, `notes`, `files`, `docs`, `stats`, and `aggregate`, including list aliases and `ctx`.
|
|
17
17
|
|
|
@@ -24,6 +24,39 @@ repeated metadata from results by default. Request
|
|
|
24
24
|
`--output-row-contract` / `outputRowContract: true` when a consumer needs the
|
|
25
25
|
row paths, jq selector, and active TOON encoding contract.
|
|
26
26
|
|
|
27
|
+
### Include Modes
|
|
28
|
+
|
|
29
|
+
`--output-include` accepts two kinds of token. A **field selector** names a row
|
|
30
|
+
field or section and narrows the computed result. A **projection mode** names a
|
|
31
|
+
whole declared projection and is the canonical spelling of a command-local mode
|
|
32
|
+
flag: `brief`, `compact`, `full`, `summary`, and `counts`, depending on the
|
|
33
|
+
surface. Controls that change execution rather than projection remain separate:
|
|
34
|
+
for example, `deps --collapse <none|repeated>` retains dependency-grouping
|
|
35
|
+
semantics, and `health --check-only` retains refresh-suppression semantics.
|
|
36
|
+
|
|
37
|
+
Mode tokens are resolved before the command computes its rows, because a mode
|
|
38
|
+
selects which fields exist rather than which of the computed fields survive.
|
|
39
|
+
`pm list --output-include brief` is therefore exactly `pm list --brief`, and the
|
|
40
|
+
two are byte-identical apart from the `read_output` receipt that records which
|
|
41
|
+
spelling was used. Modes and field selectors compose: the mode selects the
|
|
42
|
+
projection, the remaining selectors narrow it.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pm list --status open --output-include brief # same result as --brief
|
|
46
|
+
pm contracts --output-include full # same result as --full
|
|
47
|
+
pm list --status open --output-include brief,id # brief projection, id only
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Read `readOutputIncludeModeOptions(command)` from the SDK for the exact
|
|
51
|
+
replacement modes a surface declares. Every compatibility alias also declares
|
|
52
|
+
`semantics: "replacement" | "behavior_preserving"`; generators therefore do
|
|
53
|
+
not have to infer obligation strength from prose. The executable migration test
|
|
54
|
+
derives all 22 projection-mode replacements from this table, invokes both
|
|
55
|
+
spellings in a temporary tracker, and compares their useful result after
|
|
56
|
+
removing spelling receipts and volatile run metadata. A selector that matches
|
|
57
|
+
neither a declared mode nor any field on any returned row is refused with the
|
|
58
|
+
legal domain, rather than returning rows with every field removed.
|
|
59
|
+
|
|
27
60
|
## Cross-Call Context Sessions
|
|
28
61
|
|
|
29
62
|
`--output-session <json>` / `outputSession` composes the four per-call
|
|
@@ -92,7 +125,9 @@ pm stats --output-row-contract
|
|
|
92
125
|
pm contracts --full --json
|
|
93
126
|
```
|
|
94
127
|
|
|
95
|
-
Every projected result carries a `read_output` receipt with the requested dimensions, precedence, observed compatibility aliases, deterministic estimated token count, string/row compaction signals, and budget outcome.
|
|
128
|
+
Every projected result carries a `read_output` receipt with the requested dimensions, precedence, observed compatibility aliases, deterministic estimated token count, string/row compaction signals, and budget outcome. Budget degradation discovers nested arrays as well as declared result rows, so validation diagnostics and other governance payloads compact their inner findings before the useful result is omitted. `compacted_row_paths` names every reduced collection without redefining those nested arrays as ordinary pagination rows.
|
|
129
|
+
|
|
130
|
+
When rows are dropped to satisfy a ceiling, the result also carries `output_budget_truncation`, naming the binding budget and its source, any explicitly requested dimension the budget overrode, every compacted collection path, and an executable recovery instruction — a default ceiling can override an explicit `--output-limit unbounded`, and that override is reported rather than silent. If no useful content can fit, `PmReadOutputBudgetExceeded` provides a discriminated omission result and reports `omitted_result_estimated_tokens`, the last useful-result estimate before omission; use `isReadOutputBudgetExceeded` before accessing result-specific fields. Universal controls are rejected on mutation commands and on the mutation mode of hybrid commands such as `comments`, `notes`, `files`, and `docs`.
|
|
96
131
|
|
|
97
132
|
## SDK and Package Usage
|
|
98
133
|
|
|
@@ -127,5 +162,6 @@ The full runtime contract reports every surface and all four dimensions. Strict
|
|
|
127
162
|
```bash
|
|
128
163
|
pnpm contracts:check
|
|
129
164
|
node scripts/run-tests.mjs test -- tests/unit/sdk/read-output-contracts.spec.ts
|
|
165
|
+
node scripts/run-tests.mjs test -- tests/unit/sdk/read-output-migration-hints.spec.ts
|
|
130
166
|
node scripts/run-tests.mjs test -- tests/unit/commands/completion-command.spec.ts
|
|
131
167
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Relationship graph semantics
|
|
2
2
|
|
|
3
|
-
Tracked by [pm-4jqm](../.agents/pm/decisions/pm-4jqm.toon), [pm-ju83](../.agents/pm/features/pm-ju83.toon), [pm-8xr8](../.agents/pm/stories/pm-8xr8.toon), [pm-m2il](../.agents/pm/chores/pm-m2il.toon),
|
|
3
|
+
Tracked by [pm-4jqm](../.agents/pm/decisions/pm-4jqm.toon), [pm-dwj33e](../.agents/pm/decisions/pm-dwj33e.toon), [pm-ju83](../.agents/pm/features/pm-ju83.toon), [pm-8xr8](../.agents/pm/stories/pm-8xr8.toon), [pm-m2il](../.agents/pm/chores/pm-m2il.toon), [pm-jiusod](../.agents/pm/issues/pm-jiusod.toon), [pm-mfvsng](../.agents/pm/issues/pm-mfvsng.toon), [pm-9gzr4r](../.agents/pm/issues/pm-9gzr4r.toon), and [pm-xvt7ps](../.agents/pm/issues/pm-xvt7ps.toon).
|
|
4
4
|
|
|
5
5
|
## Decision
|
|
6
6
|
|
|
@@ -251,14 +251,21 @@ terminal dangling-reference partitions. Domain adapters pass their
|
|
|
251
251
|
company, or package-defined edges survive assembly with their registered
|
|
252
252
|
semantics. `auditWorkspaceRelationshipGraph`
|
|
253
253
|
consumes that assembly and emits counts-first findings for active/terminal
|
|
254
|
-
missing references, retired sentinels, ordering cycles,
|
|
255
|
-
|
|
254
|
+
missing references, retired sentinels, ordering cycles, exact
|
|
255
|
+
scalar-versus-structured ordering contradictions, stale lifecycle blocks, and
|
|
256
|
+
sparse or isolated active nodes. Findings include stable codes, severity,
|
|
256
257
|
bounded deterministic samples, truncation, policy text, and safe remediation;
|
|
257
258
|
the audit never invents an edge. Explicit isolate exemptions suppress policy
|
|
258
259
|
findings without changing structural coverage metrics.
|
|
259
260
|
|
|
260
261
|
The audit profile also exposes graph-wide resilience and delivery-lineage
|
|
261
|
-
metrics. `
|
|
262
|
+
metrics. `nodes` and `edges` remain diagnostic totals. Structural ratchets use
|
|
263
|
+
`recorded_nodes`, which excludes synthesized missing/external placeholders,
|
|
264
|
+
and `informative_edges`, which subtracts the union of witnessed redundant edge
|
|
265
|
+
identities and structured rows proven to contradict scalar blocker precedence.
|
|
266
|
+
`redundant_edges` and `ordering_contradiction_edges` remain separate debt
|
|
267
|
+
censuses so repair can tighten their ceilings without weakening the
|
|
268
|
+
information-bearing floor. `articulation_points` and `bridge_edges` reuse the exact cut-structure
|
|
262
269
|
algorithm; outcome metrics count explicit `Milestone` titles beginning with
|
|
263
270
|
`Outcome milestone:` and follow only hierarchy or `implements` edges toward
|
|
264
271
|
them. Active and terminal populations are reported separately, with integer
|
|
@@ -340,7 +347,15 @@ on terminal ones) reports raw dependency rows whose exact identity is stored
|
|
|
340
347
|
more than once on one holder — invisible to every assembled-graph projection
|
|
341
348
|
because graph construction deduplicates edges by identity, so
|
|
342
349
|
`collectDuplicateDependencyRows` scans the pre-assembly item rows carried on
|
|
343
|
-
the assembly.
|
|
350
|
+
the assembly. `collectOrderingStorageContradictions` similarly scans raw rows
|
|
351
|
+
before normalization: `blocked_by: target` plus a same-target source-first
|
|
352
|
+
ordering dependency asserts both directions and manufactures a two-node cycle.
|
|
353
|
+
The audit reports the exact holder, target, and removable dependency kind under
|
|
354
|
+
`ordering_storage_contradiction` or
|
|
355
|
+
`legacy_ordering_storage_contradiction`; cycle findings attach that evidence
|
|
356
|
+
instead of leaving agents to re-derive the storage cause. Mutation advisories
|
|
357
|
+
also identify a newly introduced contradiction before reporting its derived
|
|
358
|
+
cycle. Coverage policy is type-aware: the audit profile's
|
|
344
359
|
`coverage_by_type` breaks active/isolated/degree≤1 counts down per item type
|
|
345
360
|
(untyped items under `(untyped)`), and `isolateExemptTypes`
|
|
346
361
|
(`--exempt-isolate-type`) suppresses isolate/sparse findings for types whose
|
package/docs/SDK.md
CHANGED
|
@@ -284,7 +284,7 @@ Command/action contract exports:
|
|
|
284
284
|
- Large-workspace memory primitives: `buildWorkspaceMemorySnapshot`, `readWorkspaceMemory`, `selectWorkspaceMemoryRollups`, and `searchWorkspaceMemory` build cursor-bound, rebuildable calendar-epoch and epic-lineage summaries. The stock `context` and `search` results attach matching bounded rollups automatically at 10,000 items; smaller projects skip the artifact entirely.
|
|
285
285
|
- Persistent metadata-query primitives: `queryItemMetadataIndex` with `ItemMetadataIndexQuery` / `ItemMetadataIndexQueryResult` executes bounded status/type/id/parent/assignee/sprint/release/priority windows without materializing the JSON metadata corpus. It returns `null` on absent, stale, or corrupt derived state so custom hosts can fall back to authoritative reads.
|
|
286
286
|
- Schema-evolution primitives: `planSchemaEvolutionMigration` and `runSchemaEvolutionMigration`, plus `PmClient.schemaRenameType`, `schemaRenameField`, and `schemaRemapStatus`, provide deterministic dry-run plans, collision refusal, index-backed candidate selection, per-item immutable history, and crash-resumable workspace transactions.
|
|
287
|
-
- Workspace audit primitives: `appendWorkspaceHistoryChange`, `writeWorkspaceJsonWithHistory`, `getWorkspaceHistoryPath`, and `WORKSPACE_HISTORY_ID` let package-owned singleton JSON mutations share the CLI's verified `HistoryEntry` stream
|
|
287
|
+
- Workspace audit primitives: `appendWorkspaceHistoryChange`, `writeWorkspaceJsonWithHistory`, `inspectWorkspaceHistoryState`, `reconcileWorkspaceJsonHistory`, `restoreWorkspaceJsonFromHistory`, `getWorkspaceHistoryPath`, and `WORKSPACE_HISTORY_ID` let package-owned singleton JSON mutations share the CLI's verified `HistoryEntry` stream, prove replay-to-disk agreement, and recover forward without inventing an unaudited side log or rewriting history.
|
|
288
288
|
- Typed annotation and relationship primitives on `PmClient`: `comments`, `notes`, `learnings`, `files`, `filesDiscover`, `docs`, `deps`, `graph`, and `append`
|
|
289
289
|
- Workspace graph-query runner: `runGraph` (with `GraphCommandOptions`, `GraphResult`, and per-subcommand envelopes) resolves the workspace relationship graph through the shared fingerprint-keyed cache and dispatches bounded `ancestors`/`descendants`/`predecessors`/`successors`/`paths`/`impact`/`analyze`/`audit`/`communities`/`redundancy`/`dominators`/`slack`/`centrality`/`articulation`/`plan` queries with counts-first cost, truncation, and cache metadata; the `pm graph` CLI command and `pm_graph` MCP tool are thin adapters over it.
|
|
290
290
|
- Structural graph analytics: `detectRelationshipCommunities` (deterministic label-propagation clustering with `maxIterations`/`minSize` bounds and convergence reporting), `findRedundantRelationshipEdges` (transitive-reduction scan that joins each directed ordering or hierarchy kind with its inverse spelling and returns witness paths), and `computeRelationshipDominators` (Cooper–Harvey–Kennedy immediate dominators with per-node gating weights for bottleneck ranking) — all deterministic, cancellable, and cost-metered like every other graph query.
|
|
@@ -292,8 +292,8 @@ Command/action contract exports:
|
|
|
292
292
|
- Incremental graph cache: `WorkspaceGraphCache`, `workspaceGraphCache`, `resetWorkspaceGraphCache`, and `computeWorkspaceGraphFingerprint` reuse the assembled workspace graph and memoize deterministic query results under a fingerprint that digests every relationship-relevant item field (id, title, status and terminal classification, item type, parent, legacy blocker, structured dependencies), so long-lived hosts stop paying full-workspace assembly per bounded query; `GraphCacheMetadata` reports assembly/result hit-or-miss on every `runGraph` envelope.
|
|
293
293
|
- Durable graph index: `openDurableGraphCache`, `persistDurableGraphResult`, `clearDurableGraphCache`, `durableGraphCacheStatus`, `shouldPersistDurableGraphCache`, and the `durableGraphCachePath`/`graphAuditBaselinePath` locators persist fingerprint-keyed deterministic query results across processes under `runtime/graph-cache.json` — atomic writes, corrupt-tolerant decode, bounded retention, never authoritative (rebuildable from item storage), optional below the `GRAPH_DURABLE_CACHE_MIN_ITEMS` threshold; `pm graph index` is the maintenance surface and `cache.durable` the per-envelope observability.
|
|
294
294
|
- Temporal audit census: `RelationshipAuditSnapshot`, `diffRelationshipAuditSnapshots`, `saveGraphAuditBaseline`, and `loadGraphAuditBaseline` persist and compare point-in-time governance censuses (signed per-code and per-profile deltas, `same_snapshot` fingerprint equality) behind `pm graph audit --save-baseline` and the automatic `baseline` drift block on later audits.
|
|
295
|
-
- Storage-integrity and coverage governance: `collectDuplicateDependencyRows` reports raw same-identity dependency rows duplicated on one holder
|
|
296
|
-
- Incremental mutation advisory: `collectNewOrderingCycleWarnings` detects newly created ordering cycles component-scoped around the changed item over a lightweight per-snapshot ordering digraph (shared `collectOrderingCycles` Tarjan semantics with the audit; no full workspace assembly per mutation)
|
|
295
|
+
- Storage-integrity and coverage governance: `collectDuplicateDependencyRows` reports raw same-identity dependency rows duplicated on one holder; `collectOrderingStorageContradictions` reports exact scalar blocker plus opposite-precedence structured rows before graph normalization; `RelationshipCoverageProfile` separates diagnostic `nodes`/`edges` from invariant-bearing `recorded_nodes`/`informative_edges` and independent redundancy/contradiction debt counts; `coverage_by_type` breaks active connectivity down per item type, and `RelationshipAuditOptions.isolateExemptTypes` suppresses coverage findings for policy-valid disconnected types.
|
|
296
|
+
- Incremental mutation advisory: `collectNewOrderingCycleWarnings` detects newly created ordering cycles component-scoped around the changed item over a lightweight per-snapshot ordering digraph and emits exact newly stored scalar-versus-structured contradiction evidence before the derived cycle warning (shared registry and `collectOrderingCycles` Tarjan semantics with the audit; no full workspace assembly per mutation).
|
|
297
297
|
- Remediation planning: `planRelationshipRemediation` (with `RelationshipRemediationPlan`, `RelationshipRemediationStep`, and operation/confidence/code contracts) derives exact dry-run `remove`/`retype`/`supersede`/`waive`/`investigate` proposals from governance-audit findings and witnessed redundancy rows — evidence-backed, confidence-rated, and never auto-applied.
|
|
298
298
|
- Annotation and relationship option/result contracts: `CommentsCommandOptions` / `CommentsResult`, `NotesCommandOptions` / `NotesResult`, `LearningsCommandOptions` / `LearningsResult`, `FilesCommandOptions` / `FilesResult`, `FilesDiscoverOptions` / `FilesDiscoverResult`, `DocsCommandOptions` / `DocsResult`, `DepsCommandOptions` / `DepsResult`, `AppendCommandOptions` / `AppendResult`
|
|
299
299
|
- Annotation kernel primitives: `resolveAnnotationInput`, `runAnnotationCommand`, `resolveAnnotationIndex`, `parseAnnotationTextInput`, `limitAnnotationEntries`, `readAnnotationEntries`, `wrapOwnershipConflict`, `isErrnoError`, and their typed input/config/result contracts
|
|
@@ -1167,10 +1167,17 @@ snapshot, atomic write, history append, and any compensating restore, so
|
|
|
1167
1167
|
competing SDK writers cannot split persisted state from its audit chain. The
|
|
1168
1168
|
stream participates in the history merge driver, appears in `pm activity`, and
|
|
1169
1169
|
can be checked with
|
|
1170
|
-
`pm history _workspace --verify`.
|
|
1170
|
+
`pm history _workspace --verify`. Verification also replays the latest document
|
|
1171
|
+
map and compares every governed JSON singleton with disk; a valid chain is not
|
|
1172
|
+
reported healthy when the live document differs. Package authors that persist their own
|
|
1171
1173
|
singleton JSON should call `writeWorkspaceJsonWithHistory`; use
|
|
1172
1174
|
`appendWorkspaceHistoryChange` only when another primitive already owns the
|
|
1173
|
-
document write.
|
|
1175
|
+
document write. Recovery code uses `inspectWorkspaceHistoryState` for the
|
|
1176
|
+
read-only classification, `reconcileWorkspaceJsonHistory` only when a terminal
|
|
1177
|
+
Decision explicitly authorizes adoption of the reviewed disk value, and
|
|
1178
|
+
`restoreWorkspaceJsonFromHistory` to reject drift and replace the singleton
|
|
1179
|
+
from a verified version. Reconciliation and restoration append new entries and
|
|
1180
|
+
compensate failed writes; neither edits historical rows.
|
|
1174
1181
|
|
|
1175
1182
|
```ts
|
|
1176
1183
|
import {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SDK Context Integrity
|
|
2
2
|
|
|
3
|
-
Tracker: [pm-0k19l7](../.agents/pm/issues/pm-0k19l7.toon), [pm-9stazf](../.agents/pm/issues/pm-9stazf.toon), [pm-tu71](../.agents/pm/issues/pm-tu71.toon), [pm-0xmajx](../.agents/pm/issues/pm-0xmajx.toon), [pm-7rrqsk](../.agents/pm/issues/pm-7rrqsk.toon), [pm-ety1qc](../.agents/pm/issues/pm-ety1qc.toon), [pm-lu6sca](../.agents/pm/features/pm-lu6sca.toon), [pm-5y05kq](../.agents/pm/issues/pm-5y05kq.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon),
|
|
3
|
+
Tracker: [pm-0k19l7](../.agents/pm/issues/pm-0k19l7.toon), [pm-9stazf](../.agents/pm/issues/pm-9stazf.toon), [pm-tu71](../.agents/pm/issues/pm-tu71.toon), [pm-0xmajx](../.agents/pm/issues/pm-0xmajx.toon), [pm-7rrqsk](../.agents/pm/issues/pm-7rrqsk.toon), [pm-ety1qc](../.agents/pm/issues/pm-ety1qc.toon), [pm-lu6sca](../.agents/pm/features/pm-lu6sca.toon), [pm-5y05kq](../.agents/pm/issues/pm-5y05kq.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), [pm-h97qxd](../.agents/pm/issues/pm-h97qxd.toon), [pm-h06944](../.agents/pm/issues/pm-h06944.toon), and [pm-5t33or](../.agents/pm/features/pm-5t33or.toon).
|
|
4
4
|
|
|
5
5
|
## Agent Quick Context
|
|
6
6
|
|
|
@@ -31,6 +31,31 @@ selector grammar and omission receipts as any other SDK-owned item field.
|
|
|
31
31
|
|
|
32
32
|
The same SDK-owned read-output registry now declares `package manage` as a first-class read surface. Package authors can resolve either `package manage` or `package-manage` to its canonical contract and discover the universal include, amount, cost, and encoding dimensions without copying CLI knowledge.
|
|
33
33
|
|
|
34
|
+
Compatibility aliases declare whether their migration promise is an exact
|
|
35
|
+
`replacement` or only `behavior_preserving`. Exact projection modes are
|
|
36
|
+
available through `readOutputIncludeModeOptions()` and are executed against
|
|
37
|
+
their legacy spelling in the temporary-tracker contract suite. Execution
|
|
38
|
+
controls such as `deps --collapse <value>` and `health --check-only` retain
|
|
39
|
+
their independent semantics and are never exposed as false include-mode
|
|
40
|
+
replacements.
|
|
41
|
+
|
|
42
|
+
Every registered read surface also resolves a format-aware default token ceiling
|
|
43
|
+
from the public command-output contract. Results already inside that ceiling are
|
|
44
|
+
returned byte-for-byte unchanged, so the safety default adds no receipt overhead
|
|
45
|
+
to ordinary reads. Oversized results follow the shared compaction ladder and
|
|
46
|
+
identify `budget_source: default` plus the applied `budget_tokens` in their
|
|
47
|
+
`read_output` receipt. Complete internal artifacts and callers that intentionally
|
|
48
|
+
accept unbounded output must say so explicitly with `--output-budget unbounded`
|
|
49
|
+
or `outputBudget: "unbounded"`; that opt-out is distinct from row-count
|
|
50
|
+
`--unbounded` compatibility behavior.
|
|
51
|
+
|
|
52
|
+
The budget ladder separately discovers nested arrays below declared result
|
|
53
|
+
rows. This lets governance envelopes reduce diagnostic findings before
|
|
54
|
+
omitting the whole verdict without redefining a nested tag or remediation list
|
|
55
|
+
as a pagination row. Receipts name every `compacted_row_paths` entry; a complete
|
|
56
|
+
omission also records the useful result's pre-omission estimate, while the
|
|
57
|
+
universal recovery remains `--output-budget unbounded`.
|
|
58
|
+
|
|
34
59
|
## Row discovery and exact output receipts
|
|
35
60
|
|
|
36
61
|
Row locations and encoding capabilities remain part of the SDK-owned read
|
|
@@ -85,6 +110,12 @@ The SDK exposes `resolveUnknownAuthorAcknowledgmentSelector` and `parseUnknownAu
|
|
|
85
110
|
|
|
86
111
|
Storage integrity is evaluated independently of that provider boundary. Lossless merge receipts remain visible as provenance, while only receipts containing discarded scalar values produce `merge_decisions_unreviewed` guidance; neither classification enables vector refresh or remote provider I/O.
|
|
87
112
|
|
|
113
|
+
Default history-drift verification also replays the append-only `_workspace`
|
|
114
|
+
stream and compares every governed singleton with its latest recorded state.
|
|
115
|
+
That agreement check reads only local history and JSON files: mismatched,
|
|
116
|
+
missing, or unreadable singleton paths become bounded `history_drift` evidence
|
|
117
|
+
without enabling embeddings, vector-store access, or any other provider I/O.
|
|
118
|
+
|
|
88
119
|
Brief and summary check-only health projections use the scalar-only metadata
|
|
89
120
|
reader. Validation uses collection-bearing metadata for evidence and
|
|
90
121
|
relationship checks and materializes bodies only when strict history-drift
|
package/docs/TESTING.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This page describes safe local tests, linked tests, coverage, and release-readiness checks.
|
|
4
4
|
|
|
5
|
-
Tracked implementation updates: [pm-52eh](../.agents/pm/features/pm-52eh.toon), [pm-mcxr](../.agents/pm/issues/pm-mcxr.toon), [pm-u42x](../.agents/pm/issues/pm-u42x.toon), [pm-atfm](../.agents/pm/features/pm-atfm.toon), [pm-xmp5](../.agents/pm/tasks/pm-xmp5.toon), [pm-39cqqx](../.agents/pm/tasks/pm-39cqqx.toon), [pm-5cgm2z](../.agents/pm/chores/pm-5cgm2z.toon), [pm-avv3wx](../.agents/pm/issues/pm-avv3wx.toon).
|
|
5
|
+
Tracked implementation updates: [pm-52eh](../.agents/pm/features/pm-52eh.toon), [pm-mcxr](../.agents/pm/issues/pm-mcxr.toon), [pm-u42x](../.agents/pm/issues/pm-u42x.toon), [pm-atfm](../.agents/pm/features/pm-atfm.toon), [pm-xmp5](../.agents/pm/tasks/pm-xmp5.toon), [pm-39cqqx](../.agents/pm/tasks/pm-39cqqx.toon), [pm-5cgm2z](../.agents/pm/chores/pm-5cgm2z.toon), [pm-avv3wx](../.agents/pm/issues/pm-avv3wx.toon), [pm-rizqb6](../.agents/pm/issues/pm-rizqb6.toon).
|
|
6
6
|
|
|
7
7
|
## Agent Quick Context
|
|
8
8
|
|
|
@@ -100,6 +100,28 @@ node scripts/run-tests.mjs test -- tests/integration/cli.integration.spec.ts
|
|
|
100
100
|
|
|
101
101
|
Use focused runs while iterating, then run coverage before closure when risk or scope warrants it.
|
|
102
102
|
|
|
103
|
+
## CI Retry and Timeout Diagnostics
|
|
104
|
+
|
|
105
|
+
CI retains the 30-second per-test timeout and retries one failed attempt. A
|
|
106
|
+
test that passes only on retry is reported as flaky rather than silently folded
|
|
107
|
+
into the pass count; a persistent assertion still fails after the bounded
|
|
108
|
+
retry. Local runs do not retry, so deterministic failures stay immediate while
|
|
109
|
+
iterating.
|
|
110
|
+
|
|
111
|
+
Vitest's GitHub reporter emits annotations and retry evidence. The repository
|
|
112
|
+
reliability reporter additionally writes
|
|
113
|
+
`.vitest-reports/reliability-<shard>.json` and appends a job-summary table with
|
|
114
|
+
the test identity, file, duration, effective timeout, retry count, shard, and
|
|
115
|
+
failure detail. Tests completing at or above 80% of their timeout are recorded
|
|
116
|
+
as at-risk before load turns them into timeouts. Coverage shards upload this
|
|
117
|
+
JSON beside their blob report, so recurrence can be measured without decoding
|
|
118
|
+
the coverage artifact or re-reading raw logs.
|
|
119
|
+
|
|
120
|
+
`PM_TEST_SHARD` supplies a stable shard identity and
|
|
121
|
+
`PM_TEST_RELIABILITY_REPORT_DIR` can redirect the JSON report for an isolated
|
|
122
|
+
harness. These variables affect diagnostics only; they do not change test
|
|
123
|
+
selection, retry count, timeout, or verdicts.
|
|
124
|
+
|
|
103
125
|
## Coverage Governance
|
|
104
126
|
|
|
105
127
|
Coverage gating now targets literal all-source coverage across runtime code families:
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# SDK entrypoint import costs
|
|
2
2
|
|
|
3
3
|
Tracked by [pm-38bskj](../../.agents/pm/tasks/pm-38bskj.toon) and
|
|
4
|
-
[pm-cg1sjb](../../.agents/pm/issues/pm-cg1sjb.toon).
|
|
4
|
+
[pm-cg1sjb](../../.agents/pm/issues/pm-cg1sjb.toon). Standalone merge-bundle
|
|
5
|
+
topology is tracked by
|
|
6
|
+
[pm-m9gu9r](../../.agents/pm/chores/pm-m9gu9r.toon).
|
|
5
7
|
|
|
6
8
|
This table measures fresh-process ESM import and module evaluation. The bare
|
|
7
9
|
Node v26.5.0 process floor on linux/x64
|
|
@@ -13,20 +15,25 @@ against the unchanged upper-bound budget and 30 ms scheduler margin. A single
|
|
|
13
15
|
cold or descheduled process therefore cannot fail the gate, while a majority of
|
|
14
16
|
over-budget samples still does; p95 remains visible as diagnostic evidence.
|
|
15
17
|
|
|
16
|
-
| Package export
|
|
17
|
-
|
|
18
|
-
| `./sdk`
|
|
19
|
-
| `./sdk/authoring`
|
|
20
|
-
| `./sdk/contracts`
|
|
21
|
-
| `./sdk/core`
|
|
22
|
-
| `./sdk/governance` | 154 ms | 161 ms |
|
|
23
|
-
| `./sdk/graph`
|
|
24
|
-
| `./sdk/merge`
|
|
25
|
-
| `./sdk/query`
|
|
26
|
-
| `./sdk/runtime`
|
|
27
|
-
| `./sdk/testing`
|
|
18
|
+
| Package export | p50 | p95 | p50 above Node | Reduction vs aggregate |
|
|
19
|
+
| ------------------ | -----: | -----: | -------------: | ---------------------: |
|
|
20
|
+
| `./sdk` | 248 ms | 249 ms | 207 ms | 0% |
|
|
21
|
+
| `./sdk/authoring` | 71 ms | 76 ms | 30 ms | 85.5% |
|
|
22
|
+
| `./sdk/contracts` | 73 ms | 87 ms | 32 ms | 84.5% |
|
|
23
|
+
| `./sdk/core` | 221 ms | 255 ms | 180 ms | 13% |
|
|
24
|
+
| `./sdk/governance` | 154 ms | 161 ms | 113 ms | 45.4% |
|
|
25
|
+
| `./sdk/graph` | 87 ms | 87 ms | 46 ms | 77.8% |
|
|
26
|
+
| `./sdk/merge` | 111 ms | 122 ms | 70 ms | 66.2% |
|
|
27
|
+
| `./sdk/query` | 100 ms | 105 ms | 59 ms | 71.5% |
|
|
28
|
+
| `./sdk/runtime` | 251 ms | 289 ms | 210 ms | -1.4% |
|
|
29
|
+
| `./sdk/testing` | 241 ms | 307 ms | 200 ms | 3.4% |
|
|
28
30
|
|
|
29
31
|
The aggregate `@unbrained/pm-cli/sdk` remains supported for compatibility.
|
|
30
32
|
New packages should import the narrowest subpath that owns their capability.
|
|
33
|
+
The build emits `./sdk/merge` as a standalone no-splitting bundle because its
|
|
34
|
+
dependency closure overlaps with several broader focused entrypoints. Keeping
|
|
35
|
+
that surface in the shared focused chunk graph made a merge-only import traverse
|
|
36
|
+
unrelated chunks; the isolated output preserves the same public exports while
|
|
37
|
+
keeping its runtime loading cost proportional to the capability requested.
|
|
31
38
|
The committed budget file is an upper-bound ratchet and must not be weakened to
|
|
32
39
|
hide a regression.
|
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.8.
|
|
9
|
+
"version": "2026.8.14"
|
|
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.8.
|
|
16
|
+
"version": "2026.8.14",
|
|
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.8.
|
|
3
|
+
"version": "2026.8.14",
|
|
4
4
|
"description": "Git-native project management CLI for humans and agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@11.10.0",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"lint:complexity:baseline": "eslint . --suppress-rule complexity --suppress-rule sonarjs/cognitive-complexity",
|
|
121
121
|
"lint:duplicates": "jscpd --config .jscpd.json",
|
|
122
122
|
"lint:codefactor": "pnpm quality:static",
|
|
123
|
-
"quality:static": "pnpm build && pnpm exec tsx scripts/release/static-quality-gate.mts --max-eslint-suppressions
|
|
123
|
+
"quality:static": "pnpm build && pnpm exec tsx scripts/release/static-quality-gate.mts --max-eslint-suppressions 113 --max-coverage-ignore-pragmas 477 --min-docstring-coverage 100 --min-exported-docstring-coverage 100 --min-member-docstring-coverage 100 && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node scripts/release/absence-tolerance-gate.mjs && node scripts/release/token-budget-gate.mjs && node scripts/release/context-intent-calibration-gate.mjs && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded && node scripts/release/gate-registry.mjs && node scripts/sdk-surface-snapshot.mjs --check && node scripts/bench/sdk-entrypoint-costs.mjs --check && node scripts/bench/cli-transport-floor.mjs --check && node dist/cli.js assurance run graph-composition --trigger ci --dry-run --json --output-budget unbounded && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json --output-budget unbounded",
|
|
124
124
|
"quality:token-budget": "node scripts/release/token-budget-gate.mjs",
|
|
125
125
|
"quality:token-surface": "node scripts/measure-agent-token-surface.mjs --check",
|
|
126
126
|
"quality:token-surface:update": "pnpm build && node scripts/measure-agent-token-surface.mjs --update",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"quality:retrieval-eval": "pnpm build && node scripts/release/retrieval-eval-gate.mjs",
|
|
131
131
|
"quality:retrieval-eval:update": "pnpm build && node scripts/release/retrieval-eval-gate.mjs --update",
|
|
132
132
|
"quality:gate-registry": "pnpm build && node scripts/release/gate-registry.mjs",
|
|
133
|
-
"quality:tracker-measurements": "pnpm build && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json",
|
|
133
|
+
"quality:tracker-measurements": "pnpm build && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded",
|
|
134
134
|
"quality:package-artifact": "pnpm build && node scripts/release/package-artifact-gate.mjs",
|
|
135
135
|
"quality:surface-replication": "node scripts/release/surface-replication-gate.mjs",
|
|
136
136
|
"quality:absence-tolerance": "node scripts/release/absence-tolerance-gate.mjs",
|
|
@@ -219,11 +219,11 @@
|
|
|
219
219
|
"eslint-plugin-sonarjs": "^4.2.0",
|
|
220
220
|
"eslint-plugin-unicorn": "^73.0.0",
|
|
221
221
|
"fast-check": "^4.9.0",
|
|
222
|
-
"greptile": "^3.
|
|
223
|
-
"jscpd": "^5.0.
|
|
222
|
+
"greptile": "^3.4.0",
|
|
223
|
+
"jscpd": "^5.0.15",
|
|
224
224
|
"tsx": "^4.23.12",
|
|
225
225
|
"typescript": "^6.0.3",
|
|
226
|
-
"typescript-eslint": "^8.
|
|
226
|
+
"typescript-eslint": "^8.67.0",
|
|
227
227
|
"vitest": "^4.1.10",
|
|
228
228
|
"yaml": "^2.9.0"
|
|
229
229
|
}
|
|
@@ -58,6 +58,7 @@ export function activate(api: ExtensionApi): void {
|
|
|
58
58
|
{
|
|
59
59
|
action: "beads-import",
|
|
60
60
|
description: "Import Beads JSONL records into pm items.",
|
|
61
|
+
intent: "Import Beads records through audited pm item mutations.",
|
|
61
62
|
failure_hints: [
|
|
62
63
|
"Use the host-global --author <id> flag when an explicit mutation identity override is required.",
|
|
63
64
|
],
|
|
@@ -217,6 +217,7 @@ function calendarCommand(name: "calendar" | "cal"): CommandDefinition {
|
|
|
217
217
|
name,
|
|
218
218
|
action: "calendar",
|
|
219
219
|
description: "Show deadline, reminder, and scheduled event calendar views.",
|
|
220
|
+
intent: "Inspect time-bounded project context across schedules and work.",
|
|
220
221
|
arguments: [
|
|
221
222
|
{
|
|
222
223
|
name: "view",
|
|
@@ -697,6 +697,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
697
697
|
action: "twin-entity-create",
|
|
698
698
|
description:
|
|
699
699
|
"Create a stable facility or asset identity and its first immutable state event.",
|
|
700
|
+
intent: "Create one digital-twin entity with an attributable initial state.",
|
|
700
701
|
arguments: ENTITY_ARGUMENT,
|
|
701
702
|
flags: [
|
|
702
703
|
{ long: "--title", value_name: "text", value_type: "string" },
|
|
@@ -728,6 +729,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
728
729
|
action: "twin-observe",
|
|
729
730
|
description:
|
|
730
731
|
"Append an attributable observation or correction with optimistic concurrency.",
|
|
732
|
+
intent: "Append a versioned observation to one digital-twin entity.",
|
|
731
733
|
arguments: ENTITY_ARGUMENT,
|
|
732
734
|
flags: [
|
|
733
735
|
{
|
|
@@ -756,6 +758,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
756
758
|
action: "twin-relate",
|
|
757
759
|
description:
|
|
758
760
|
"Append or supersede one typed containment, flow, or utility relationship.",
|
|
761
|
+
intent: "Record one typed relationship in the digital-twin topology.",
|
|
759
762
|
arguments: ENTITY_ARGUMENT,
|
|
760
763
|
flags: [
|
|
761
764
|
{
|
|
@@ -789,6 +792,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
789
792
|
action: "twin-query",
|
|
790
793
|
description:
|
|
791
794
|
"Query point-in-time state, topology, provenance, conflicts, invariants, and impact.",
|
|
795
|
+
intent: "Inspect one entity's point-in-time state and topology impact.",
|
|
792
796
|
arguments: ENTITY_ARGUMENT,
|
|
793
797
|
flags: [
|
|
794
798
|
{ long: "--at", value_name: "iso", value_type: "string" },
|
|
@@ -802,6 +806,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
802
806
|
action: "twin-export",
|
|
803
807
|
description:
|
|
804
808
|
"Export a bounded shell-friendly event bundle with a tamper-evident checkpoint.",
|
|
809
|
+
intent: "Export a bounded portable digital-twin event bundle.",
|
|
805
810
|
flags: [
|
|
806
811
|
{ long: "--at", value_name: "iso", value_type: "string" },
|
|
807
812
|
{ long: "--limit", value_name: "n", value_type: "number" },
|
|
@@ -813,6 +818,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
813
818
|
action: "twin-import",
|
|
814
819
|
description:
|
|
815
820
|
"Validate and idempotently merge a portable offline replica bundle.",
|
|
821
|
+
intent: "Validate and merge an offline digital-twin replica bundle.",
|
|
816
822
|
flags: [
|
|
817
823
|
{
|
|
818
824
|
long: "--payload",
|
|
@@ -828,6 +834,7 @@ export function buildTwinCommands(): CommandDefinition[] {
|
|
|
828
834
|
action: "twin-verify",
|
|
829
835
|
description:
|
|
830
836
|
"Verify checkpoint integrity, deterministic replay, topology, and invariants.",
|
|
837
|
+
intent: "Verify digital-twin replay, checkpoint, topology, and invariants.",
|
|
831
838
|
flags: [{ long: "--at", value_name: "iso", value_type: "string" }],
|
|
832
839
|
run: runVerify,
|
|
833
840
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unbrained/pm-digital-twin",
|
|
3
|
-
"version": "2026.8.
|
|
3
|
+
"version": "2026.8.14",
|
|
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.",
|
|
@@ -327,6 +327,7 @@ function dedupeAuditCommand(): CommandDefinition {
|
|
|
327
327
|
action: "dedupe-audit",
|
|
328
328
|
description:
|
|
329
329
|
"Audit likely duplicate items by title and parent scope heuristics.",
|
|
330
|
+
intent: "Find likely duplicate work without mutating the tracker.",
|
|
330
331
|
flags: [...dedupeAuditFlags],
|
|
331
332
|
run: async (context) =>
|
|
332
333
|
runDedupeAuditPackage(context.options, context.global),
|
|
@@ -339,6 +340,7 @@ function dedupeMergeCommand(): CommandDefinition {
|
|
|
339
340
|
action: "dedupe-merge",
|
|
340
341
|
description:
|
|
341
342
|
"Consolidate duplicates into a canonical item: re-parent active children and close duplicates with duplicate_of.",
|
|
343
|
+
intent: "Preview or apply an evidence-preserving duplicate consolidation.",
|
|
342
344
|
flags: [...dedupeMergeFlags],
|
|
343
345
|
run: async (context) =>
|
|
344
346
|
runDedupeMergePackage(context.options, context.global),
|
|
@@ -350,6 +352,7 @@ function commentsAuditCommand(): CommandDefinition {
|
|
|
350
352
|
name: "comments-audit",
|
|
351
353
|
action: "comments-audit",
|
|
352
354
|
description: "Audit item comment coverage and export comment history rows.",
|
|
355
|
+
intent: "Audit comment coverage and read bounded comment-history evidence.",
|
|
353
356
|
flags: [...commentsAuditFlags],
|
|
354
357
|
run: async (context) =>
|
|
355
358
|
runCommentsAuditPackage(context.options, context.global),
|
|
@@ -361,6 +364,7 @@ function normalizeCommand(): CommandDefinition {
|
|
|
361
364
|
name: "normalize",
|
|
362
365
|
action: "normalize",
|
|
363
366
|
description: "Plan/apply lifecycle metadata normalization sweeps.",
|
|
367
|
+
intent: "Preview or apply deterministic lifecycle metadata normalization.",
|
|
364
368
|
flags: [...normalizeFlags],
|
|
365
369
|
run: async (context) =>
|
|
366
370
|
runNormalizePackage(context.options, context.global),
|
|
@@ -94,6 +94,7 @@ function guideCommand(): CommandDefinition {
|
|
|
94
94
|
name: "guide",
|
|
95
95
|
action: "guide",
|
|
96
96
|
description: "Show migration and usage guidance for pm command families.",
|
|
97
|
+
intent: "Read focused local guidance for one pm workflow.",
|
|
97
98
|
arguments: [
|
|
98
99
|
{ name: "topic", required: false, description: "Optional guide topic." },
|
|
99
100
|
],
|
|
@@ -108,6 +109,7 @@ function completionCommand(): CommandDefinition {
|
|
|
108
109
|
name: "completion",
|
|
109
110
|
action: "completion",
|
|
110
111
|
description: "Generate shell completion scripts for bash, zsh, and fish.",
|
|
112
|
+
intent: "Generate a completion script for the selected shell.",
|
|
111
113
|
arguments: [
|
|
112
114
|
{
|
|
113
115
|
name: "shell",
|
|
@@ -126,6 +128,7 @@ function completionTagsCommand(): CommandDefinition {
|
|
|
126
128
|
name: "completion-tags",
|
|
127
129
|
action: "completion-tags",
|
|
128
130
|
description: "Print known tags for completion filters.",
|
|
131
|
+
intent: "List tag values for lazy shell completion.",
|
|
129
132
|
run: async (context) => runCompletionTagsPackage(context.global),
|
|
130
133
|
};
|
|
131
134
|
}
|
|
@@ -135,6 +138,7 @@ function completionStatusesCommand(): CommandDefinition {
|
|
|
135
138
|
name: "completion-statuses",
|
|
136
139
|
action: "completion-statuses",
|
|
137
140
|
description: "Print runtime status IDs for completion filters.",
|
|
141
|
+
intent: "List runtime status values for shell completion.",
|
|
138
142
|
run: async (context) => runCompletionStatusesPackage(context.global),
|
|
139
143
|
};
|
|
140
144
|
}
|
|
@@ -144,6 +148,7 @@ function completionTypesCommand(): CommandDefinition {
|
|
|
144
148
|
name: "completion-types",
|
|
145
149
|
action: "completion-types",
|
|
146
150
|
description: "Print runtime item type IDs for completion filters.",
|
|
151
|
+
intent: "List runtime item types for shell completion.",
|
|
147
152
|
run: async (context) => runCompletionTypesPackage(context.global),
|
|
148
153
|
};
|
|
149
154
|
}
|