@unbrained/pm-cli 2026.8.13 → 2026.8.15
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 +165 -113
- package/dist/cli/commander-usage.js +17 -4
- package/dist/cli/error-guidance.d.ts +2 -0
- package/dist/cli/error-guidance.js +52 -25
- package/dist/cli/main.js +40 -3
- package/dist/cli/register-mutation.js +4 -2
- package/dist/cli/register-operations.js +5 -5
- package/dist/cli-bundle/bundle-manifest.json +146 -178
- package/dist/cli-bundle/chunks/{chunk-F7FJYGK3.js → chunk-24GAV7XL.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-AIM6VT2N.js +13 -0
- package/dist/cli-bundle/chunks/chunk-DSWDLTDR.js +197 -0
- package/dist/cli-bundle/chunks/{chunk-Q47C67TQ.js → chunk-J42EGKDK.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-KIEGUBYQ.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-3ZMOWAFM.js → chunk-KLKYLSDX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QGTUPEU5.js → chunk-LJHOAVGI.js} +59 -59
- package/dist/cli-bundle/chunks/chunk-MEM2ZS3O.js +5 -0
- package/dist/cli-bundle/chunks/chunk-QHPCJWEJ.js +35 -0
- package/dist/cli-bundle/chunks/{chunk-YLBAPY22.js → chunk-WLPDLNEZ.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-4HIZ7EA3.js → register-list-query-CT3LFDDN.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-W64FZ5HN.js → register-mutation-NWEVA5YS.js} +3 -3
- package/dist/cli-bundle/chunks/register-operations-AHIAG5KM.js +2 -0
- package/dist/cli-bundle/chunks/{register-setup-634MFRXU.js → register-setup-ZJZFVAKE.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-4X57RE4U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-6XKF3PGV.js +18 -0
- package/dist/cli-bundle/focused-chunks/chunk-7NJ4QYQ2.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-I75MANL7.js → chunk-EXZA4257.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-ITAUHSO6.js +50 -0
- package/dist/cli-bundle/focused-chunks/{chunk-OOYYKQWX.js → chunk-KLVUMNXJ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-2RI2FESN.js → chunk-KT5XMYSX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-E3AVJ655.js → chunk-KTKH4IMG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-M67F5AIN.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3DJSGWVB.js → chunk-NSPYTG6G.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-OKA6ELTL.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-PUISBOPP.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-QLNMCESQ.js +155 -0
- package/dist/cli-bundle/focused-chunks/{chunk-IIS2FRKL.js → chunk-SLKC6QLJ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-U65UC4G3.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-WTSER4WJ.js +16 -0
- package/dist/cli-bundle/focused-chunks/{chunk-2JP7W7GO.js → chunk-ZMFXQ7VF.js} +2 -2
- 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 +41 -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 +110 -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/diagnostics/remediation.js +7 -2
- package/dist/core/extensions/reserved-host-flags.js +3 -2
- package/dist/core/history/drift-scan.d.ts +6 -0
- package/dist/core/history/drift-scan.js +74 -50
- package/dist/core/history/replay.d.ts +14 -1
- package/dist/core/history/replay.js +45 -8
- package/dist/core/history/workspace-history.d.ts +59 -0
- package/dist/core/history/workspace-history.js +197 -10
- package/dist/core/output/output.d.ts +2 -0
- package/dist/core/output/output.js +13 -4
- package/dist/core/shared/command-types.d.ts +2 -0
- package/dist/core/shared/command-types.js +2 -2
- package/dist/core/shared/errors.d.ts +12 -0
- package/dist/core/shared/errors.js +2 -2
- package/dist/mcp/tool-definitions.js +9 -5
- package/dist/sdk/agent/refusal-reachability.d.ts +61 -0
- package/dist/sdk/agent/refusal-reachability.js +91 -3
- package/dist/sdk/cli-bootstrap.d.ts +2 -0
- package/dist/sdk/cli-bootstrap.js +7 -2
- package/dist/sdk/cli-contracts/completeness.js +3 -2
- package/dist/sdk/cli-contracts/flag-contracts.js +3 -2
- package/dist/sdk/cli-contracts/registration-helpers.js +3 -2
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +11 -1
- package/dist/sdk/cli-contracts/runtime-contracts.js +176 -65
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +15 -5
- package/dist/sdk/cli-contracts/tool-schema.js +10 -3
- package/dist/sdk/cli-program.js +4 -3
- package/dist/sdk/context-relevance.js +12 -4
- package/dist/sdk/core.d.ts +2 -2
- package/dist/sdk/core.js +3 -3
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +26 -2
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +50 -26
- package/dist/sdk/governance/assurance-action.d.ts +7 -1
- package/dist/sdk/governance/assurance-action.js +7 -6
- package/dist/sdk/governance/assurance-mutation-error.d.ts +42 -1
- package/dist/sdk/governance/assurance-mutation-error.js +27 -3
- package/dist/sdk/governance/assurance-runtime.js +12 -11
- package/dist/sdk/governance/assurance.d.ts +9 -0
- package/dist/sdk/governance/assurance.js +82 -16
- package/dist/sdk/governance/extension-host-version.d.ts +25 -0
- package/dist/sdk/governance/extension-host-version.js +105 -0
- package/dist/sdk/governance/health.d.ts +32 -1
- package/dist/sdk/governance/health.js +132 -28
- package/dist/sdk/governance/provenance-health.d.ts +27 -0
- package/dist/sdk/governance/provenance-health.js +95 -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 +9 -52
- package/dist/sdk/governance.d.ts +6 -0
- package/dist/sdk/governance.js +8 -2
- 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/history-repair.d.ts +13 -1
- package/dist/sdk/history-repair.js +62 -18
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/linked-artifacts.js +16 -5
- package/dist/sdk/pagination.d.ts +15 -0
- package/dist/sdk/pagination.js +9 -5
- package/dist/sdk/query/context.d.ts +5 -1
- package/dist/sdk/query/context.js +14 -5
- package/dist/sdk/query/history.js +20 -3
- package/dist/sdk/read-output/continuation.d.ts +11 -0
- package/dist/sdk/read-output/continuation.js +132 -0
- package/dist/sdk/read-output-budget.d.ts +3 -1
- package/dist/sdk/read-output-budget.js +24 -13
- package/dist/sdk/read-output-contracts.d.ts +127 -7
- package/dist/sdk/read-output-contracts.js +381 -35
- package/dist/sdk/read-output-rows.d.ts +13 -0
- package/dist/sdk/read-output-rows.js +60 -2
- package/dist/sdk/runtime-input.js +4 -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 +68 -2
- package/docs/COMMANDS.md +39 -4
- package/docs/READ_OUTPUT_CONTRACTS.md +85 -8
- package/docs/RELATIONSHIP_GRAPH.md +20 -5
- package/docs/RELEASING.md +42 -5
- package/docs/SDK.md +12 -5
- package/docs/SDK_CONTEXT_INTEGRITY.md +94 -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 +7 -7
- 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 +1283 -157
- package/dist/cli-bundle/chunks/chunk-DEDU3DG7.js +0 -196
- package/dist/cli-bundle/chunks/chunk-DL5M5J3V.js +0 -13
- package/dist/cli-bundle/chunks/chunk-HIUZVCMN.js +0 -5
- package/dist/cli-bundle/chunks/chunk-IMGIN7R6.js +0 -2
- package/dist/cli-bundle/chunks/chunk-TF3TPKPR.js +0 -34
- package/dist/cli-bundle/chunks/register-operations-C44ET7R5.js +0 -2
- 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-NFHFZH2Z.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-QDZUABWL.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
package/docs/RELEASING.md
CHANGED
|
@@ -24,7 +24,8 @@ Tracked documentation work: [pm-u9d0](../.agents/pm/epics/pm-u9d0.toon),
|
|
|
24
24
|
[pm-lwnifd](../.agents/pm/issues/pm-lwnifd.toon), and SDK-bound reliability
|
|
25
25
|
classification [pm-dqtzva](../.agents/pm/issues/pm-dqtzva.toon).
|
|
26
26
|
The local/hosted gate selection contract is tracked by
|
|
27
|
-
[pm-ei6x66](../.agents/pm/tasks/pm-ei6x66.toon).
|
|
27
|
+
[pm-ei6x66](../.agents/pm/tasks/pm-ei6x66.toon). Release-candidate analyzer
|
|
28
|
+
provenance is tracked by [pm-u1baah](../.agents/pm/issues/pm-u1baah.toon).
|
|
28
29
|
|
|
29
30
|
## Version Policy
|
|
30
31
|
|
|
@@ -80,6 +81,9 @@ Policy:
|
|
|
80
81
|
creating an ordinal replacement; an already-successful run is recorded as
|
|
81
82
|
recovered without republishing
|
|
82
83
|
- release preparation must pass all quality and compatibility gates before commit+tag push
|
|
84
|
+
- before dependency installation or build, auto-release verifies that the
|
|
85
|
+
candidate has exact-commit analyzer results or an immutable tree-identical
|
|
86
|
+
reviewed PR head with successful DeepScan and CodeFactor results
|
|
83
87
|
- `CHANGELOG.md` is generated by the latest npm `pm-changelog` package (`pm install npm:pm-changelog --project`, then `pm changelog generate --mode replace --all-release-tags`) from closed tracker items across git release tag windows and checked in CI; do not edit it by hand
|
|
84
88
|
- protected-branch pushes require `RELEASE_PAT`; Auto Release fails fast before the expensive release gates when `push=true`, `dry_run=false`, and that secret is not configured
|
|
85
89
|
- release reliability gating requires `SENTRY_PERSONAL_ADMIN_TOKEN` for issue-threshold checks; Auto Release fails before creating the version commit/tag when the token is missing and `push=true`, while sourcemap upload remains optional through `SENTRY_AUTH_TOKEN`
|
|
@@ -196,8 +200,9 @@ The build writes `dist/cli-bundle/bundle-manifest.json` atomically with SHA-256
|
|
|
196
200
|
|
|
197
201
|
4. Run the same release pipeline locally.
|
|
198
202
|
|
|
199
|
-
Push the final implementation commit
|
|
200
|
-
finish on that reviewed SHA, then run the
|
|
203
|
+
Push the final implementation commit through a reviewed pull request first,
|
|
204
|
+
wait for DeepScan and CodeFactor to finish on that reviewed SHA, then run the
|
|
205
|
+
canonical registry-owned preflight:
|
|
201
206
|
|
|
202
207
|
```bash
|
|
203
208
|
pnpm verify:preflight
|
|
@@ -207,7 +212,8 @@ The registry supplies the ordered executable plan, command arguments,
|
|
|
207
212
|
environment, capture policy, and explicit skip policy. Its receipt distinguishes
|
|
208
213
|
passed checks from declared skips. The same registry maps named PR, nightly,
|
|
209
214
|
and release workflow gates; hosted-only entries must explain why no faithful
|
|
210
|
-
local equivalent exists.
|
|
215
|
+
local equivalent exists. Analyzer provenance is the first executable step, so
|
|
216
|
+
an unreleasable candidate fails before build, coverage, or package work.
|
|
211
217
|
|
|
212
218
|
The preflight includes the mandatory local hosted-analysis proof:
|
|
213
219
|
|
|
@@ -218,13 +224,44 @@ pnpm quality:hosted-analysis
|
|
|
218
224
|
The gate accepts only DeepScan's explicit zero-new-issue status and
|
|
219
225
|
CodeFactor's explicit no-issues result. Both contexts are required by `main`
|
|
220
226
|
branch protection, and the release pipeline reruns the same immutable-tree
|
|
221
|
-
proof.
|
|
227
|
+
proof. The gate reads branch protection through REST first; if that transport
|
|
228
|
+
is unavailable or its core API quota is exhausted, it queries the equivalent
|
|
229
|
+
GraphQL rules across every cursor-paginated page and still requires one exact
|
|
230
|
+
`main` rule with strict updates plus both analyzer contexts. Malformed,
|
|
231
|
+
truncated, missing, or ambiguous admin policy data fails closed. GitHub Actions'
|
|
232
|
+
ephemeral token cannot request the repository `Administration: read` permission
|
|
233
|
+
required by both of those policy surfaces. When both admin transports reject
|
|
234
|
+
that token, the gate uses the contents-readable `GET /branches/main` summary
|
|
235
|
+
and requires that the exact candidate is the current protected branch head,
|
|
236
|
+
protection is enabled and enforced, and CodeFactor plus DeepScan are effective
|
|
237
|
+
required contexts. That summary intentionally cannot attest the admin-only
|
|
238
|
+
strict-update setting: its receipt reports `strict: null`,
|
|
239
|
+
`strict_verified: false`, and `verification_scope: effective_required_checks`
|
|
240
|
+
instead of inventing a positive result. Exact or immutable identical-tree
|
|
241
|
+
analyzer provenance remains mandatory and is emitted beside the policy receipt,
|
|
242
|
+
so the restricted-token recovery cannot admit an unanalyzed or different-tree
|
|
243
|
+
candidate. A maintainer token with administration-read access still verifies
|
|
244
|
+
and reports `strict: true` through REST or paginated GraphQL. It reads the
|
|
245
|
+
release commit first. When GitHub does not copy app results
|
|
222
246
|
onto a merge commit, the gate may reuse a reviewed merge-parent or squash-PR
|
|
223
247
|
head only when its immutable Git tree SHA exactly matches the release commit.
|
|
224
248
|
Squash provenance additionally requires one unambiguous GitHub association to a
|
|
225
249
|
closed PR merged into `main` with the release commit as its merge commit.
|
|
226
250
|
Missing, ambiguous, or different-tree provenance fails closed.
|
|
227
251
|
|
|
252
|
+
The supported default-branch arrival path is a reviewed pull request. A direct
|
|
253
|
+
push to `main` is releasable only if both analyzers attached successful evidence
|
|
254
|
+
to that exact commit; when they did not, the gate explicitly refuses the
|
|
255
|
+
candidate instead of letting the next scheduled release discover the missing
|
|
256
|
+
precondition after expensive work. CI runs `Release analyzer readiness (main)`
|
|
257
|
+
on every product-relevant push to `main`, providing continuous visibility
|
|
258
|
+
between release attempts. If GitHub's commit-association endpoint has not yet
|
|
259
|
+
published a new merge, the gate reads the pull-request number from GitHub's
|
|
260
|
+
standard merge message and accepts it only after the immutable PR resource
|
|
261
|
+
confirms that exact merge SHA, `main` base, and reviewed head. Remediate a
|
|
262
|
+
refused direct-main candidate by landing the next tree-changing fix through a
|
|
263
|
+
reviewed PR; never copy, synthesize, or bypass analyzer evidence.
|
|
264
|
+
|
|
228
265
|
```bash
|
|
229
266
|
# Read-only parity check
|
|
230
267
|
pnpm release:pipeline:dry-run
|
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), [pm-5t33or](../.agents/pm/features/pm-5t33or.toon), [pm-in23qu](../.agents/pm/issues/pm-in23qu.toon), [pm-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon), [pm-okgxwa](../.agents/pm/issues/pm-okgxwa.toon), [pm-22rzjp](../.agents/pm/issues/pm-22rzjp.toon), [pm-76fkpp](../.agents/pm/issues/pm-76fkpp.toon), [pm-igdvfq](../.agents/pm/issues/pm-igdvfq.toon), [pm-643e0k](../.agents/pm/issues/pm-643e0k.toon), and [pm-larv4r](../.agents/pm/issues/pm-larv4r.toon).
|
|
4
4
|
|
|
5
5
|
## Agent Quick Context
|
|
6
6
|
|
|
@@ -31,6 +31,67 @@ 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
|
+
recovery names a bounded budget increase when no declared row path can resume.
|
|
58
|
+
|
|
59
|
+
Budget-compacted declared rows instead publish a bounded `outputCursor`
|
|
60
|
+
continuation on every transport. The cursor resumes the first withheld row and
|
|
61
|
+
rejects a command, path, row-total, or stable-identity mismatch. This gives SDK
|
|
62
|
+
and package loops a recursive self-improvement primitive: consume a bounded
|
|
63
|
+
page, update context, and continue without abandoning the ceiling.
|
|
64
|
+
|
|
65
|
+
`context --explain-ranking` projects explanations to the focus rows actually
|
|
66
|
+
served. `candidate_count` records the scorer population and `omitted_count`
|
|
67
|
+
records explanations intentionally withheld, while each returned row retains
|
|
68
|
+
its rank, baseline rank, score, and per-signal contributions. Explanation cost
|
|
69
|
+
therefore scales with the answer rather than with the active workspace.
|
|
70
|
+
|
|
71
|
+
Unknown-option recovery is likewise derived from the declared flag lexicon.
|
|
72
|
+
The structured `option_scope` is `declared_on_path`, `declared_elsewhere`, or
|
|
73
|
+
`declared_nowhere`; accepting command paths are included only for the second
|
|
74
|
+
case, while the third names the nearest current-path spellings and explicitly
|
|
75
|
+
terminates the otherwise-unbounded command search.
|
|
76
|
+
|
|
77
|
+
## Executable recovery-reference coverage
|
|
78
|
+
|
|
79
|
+
Structured refusal guidance is a forward-reference contract, not decorative
|
|
80
|
+
text. `verifyPmRecoveryReferences` accepts obligations derived from real error
|
|
81
|
+
envelopes and observations produced by executing a retry, resolving a declared
|
|
82
|
+
command path, or linking prose to an already executed recovery. Its report
|
|
83
|
+
includes the total obligation set, pass fraction, sorted findings, and stable
|
|
84
|
+
coverage buckets for `suggested_retry`, `candidate_command`, `example`, and
|
|
85
|
+
`next_step`, including zero-population buckets.
|
|
86
|
+
|
|
87
|
+
The repository integration corpus drives real CLI refusals, executes the
|
|
88
|
+
emitted retry in a temporary tracker, compares candidate commands with the
|
|
89
|
+
unbounded runtime contract enumeration, and binds examples and next steps to
|
|
90
|
+
those proofs. A seeded unreachable observation must lower the pass fraction
|
|
91
|
+
and produce `unreachable_reference`. The same corpus is a provider-backed
|
|
92
|
+
blocking assertion in `repository-context-quality`, so a well-formed but broken
|
|
93
|
+
recovery promise cannot pass CI merely because its text or target flag exists.
|
|
94
|
+
|
|
34
95
|
## Row discovery and exact output receipts
|
|
35
96
|
|
|
36
97
|
Row locations and encoding capabilities remain part of the SDK-owned read
|
|
@@ -85,6 +146,12 @@ The SDK exposes `resolveUnknownAuthorAcknowledgmentSelector` and `parseUnknownAu
|
|
|
85
146
|
|
|
86
147
|
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
148
|
|
|
149
|
+
Default history-drift verification also replays the append-only `_workspace`
|
|
150
|
+
stream and compares every governed singleton with its latest recorded state.
|
|
151
|
+
That agreement check reads only local history and JSON files: mismatched,
|
|
152
|
+
missing, or unreadable singleton paths become bounded `history_drift` evidence
|
|
153
|
+
without enabling embeddings, vector-store access, or any other provider I/O.
|
|
154
|
+
|
|
88
155
|
Brief and summary check-only health projections use the scalar-only metadata
|
|
89
156
|
reader. Validation uses collection-bearing metadata for evidence and
|
|
90
157
|
relationship checks and materializes bodies only when strict history-drift
|
|
@@ -103,6 +170,26 @@ never succeeded. The same bounded pass classifies bare boolean and single-digit
|
|
|
103
170
|
values across every recorded provenance dimension, publishes only aggregate
|
|
104
171
|
harness/dimension/kind counts, and never echoes the historical value.
|
|
105
172
|
|
|
173
|
+
`historyRepair` and `historyRepairAll` retain the detected history hash epoch
|
|
174
|
+
instead of unconditionally upgrading it. `normalizeProvenance: true` adds a
|
|
175
|
+
privacy-safe repair mode that removes invalid bounded observations and records
|
|
176
|
+
only aggregate counts/classes in the synthetic audit event. The bulk form
|
|
177
|
+
selects both drifted streams and streams requiring provenance normalization.
|
|
178
|
+
|
|
179
|
+
Health results are self-indexing: every retained warning has a `findings` row
|
|
180
|
+
with its owning check, stable code, severity, and either executable remediation
|
|
181
|
+
or an explicit safe refusal. `failed_because` contains the exact warning tokens
|
|
182
|
+
that decide `ok: false` and survives brief/summary projection. Extension health
|
|
183
|
+
adds a host-version census by resolving the pm-cli package visible from each
|
|
184
|
+
loaded extension; npm/pnpm duplicate-version skew is gate-failing while matching
|
|
185
|
+
workspace-linked and deduplicated copies remain green.
|
|
186
|
+
|
|
187
|
+
Linked file/doc add parsing uses one SDK allowlist. Whitespace-free filesystem
|
|
188
|
+
paths and scheme-prefixed URLs remain positional even when a path or query
|
|
189
|
+
contains `=`. Leading assignment syntax, including malformed URL-plus-note
|
|
190
|
+
input, must use the declared `path`, `scope`, and `note` keys or fail before
|
|
191
|
+
mutation.
|
|
192
|
+
|
|
106
193
|
## Replication and refusal gate
|
|
107
194
|
|
|
108
195
|
`scripts/release/surface-replication-sets.json` declares replicated SDK, CLI, MCP, documentation, and test members. `pnpm quality:surface-replication` activates sets from the Git changeset, verifies every member invariant, and reports:
|
|
@@ -114,6 +201,12 @@ harness/dimension/kind counts, and never echoes the historical value.
|
|
|
114
201
|
- an AST-derived denominator of identical named rule bodies, declared coverage,
|
|
115
202
|
and a non-decreasing detected-cluster floor.
|
|
116
203
|
|
|
204
|
+
Trigger entries may constrain a shared file with `changed_lines_contain_any`.
|
|
205
|
+
The set then activates only when an added or removed diff line carries one of
|
|
206
|
+
those contract markers. Missing diff evidence fails closed and activates the
|
|
207
|
+
set, while an unrelated hunk in the same shared table does not force artificial
|
|
208
|
+
edits across every replicated member.
|
|
209
|
+
|
|
117
210
|
Query waivers directly with:
|
|
118
211
|
|
|
119
212
|
```bash
|
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.15"
|
|
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.15",
|
|
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.15",
|
|
4
4
|
"description": "Git-native project management CLI for humans and agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@11.10.0",
|
|
@@ -120,17 +120,17 @@
|
|
|
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 &&
|
|
123
|
+
"quality:static": "pnpm build && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-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",
|
|
127
|
-
"quality:context-eval": "pnpm build && node scripts/release/
|
|
127
|
+
"quality:context-eval": "pnpm build && node scripts/release/repository-assurance.mjs repository-context-quality --trigger ci --json && pnpm quality:token-surface",
|
|
128
128
|
"quality:agent-task-token": "pnpm build && node scripts/release/agent-task-token-gate.mjs",
|
|
129
129
|
"quality:agent-task-token:update": "pnpm build && node scripts/release/agent-task-token-gate.mjs --update",
|
|
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.15",
|
|
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
|
}
|