@unbrained/pm-cli 2026.10.21 → 2026.10.22
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 +1 -1
- package/CHANGELOG.md +117 -77
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/{chunk-KBSVPUFD.js → chunk-35ISFIPC.js} +35 -35
- package/dist/cli-bundle/chunks/{chunk-DIR3YEFD.js → chunk-5LSN7K4N.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-DR6DUBTU.js → chunk-7OTYULIJ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-TMXWWOPJ.js → chunk-AOAQDCXX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZNKFMIVA.js → chunk-BAIVTLJM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NNB65OOO.js → chunk-C37RDYZI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EMGMLKRV.js → chunk-E3JC3WQL.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-5PZ7JNMI.js → chunk-HC2DCGFA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-V5GJTXYW.js → chunk-J444ZX23.js} +26 -26
- package/dist/cli-bundle/chunks/{chunk-V3XONSVC.js → chunk-LIC5EUQS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-DJQVNDXO.js → chunk-MV3KYY2A.js} +6 -6
- package/dist/cli-bundle/chunks/chunk-O67N62DT.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-C6SAXKBO.js → chunk-PCPOTFJP.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TNU3XVPC.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-MOC5BJHW.js → chunk-URV4VHQ4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QPV6UD55.js → chunk-UYYTV2TX.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-VO3KDIU7.js +9 -0
- package/dist/cli-bundle/chunks/{indexed-receipt-blobs-65XXSPPR.js → indexed-receipt-blobs-L3BOTMZN.js} +2 -2
- package/dist/cli-bundle/chunks/{mutation-admission-FNWOVJLN.js → mutation-admission-TATOFEXF.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-6PT5Y2EZ.js → register-list-query-GULR2IYO.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-TAIQV46L.js → register-mutation-HLSQ4WVW.js} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-ONIRO22G.js → register-operations-FE3GGA7O.js} +2 -2
- package/dist/cli-bundle/chunks/{register-setup-OQMUZBJV.js → register-setup-XUIKAIZA.js} +2 -2
- package/dist/cli-bundle/chunks/{stage-FCPVFO3B.js → stage-QCPZBZRC.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-25L3L2PF.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PDOWLRHC.js → chunk-25NQRZ7J.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-XE7P7N5X.js → chunk-2GFTVXKZ.js} +6 -6
- package/dist/cli-bundle/focused-chunks/chunk-46HBJC6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-32ZKLRWM.js → chunk-A52W6GLA.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-CB7TSZ7P.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-5IMM7GOF.js → chunk-CX5FNEFC.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-DVNUHTVK.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-VD64TPXI.js → chunk-EHPRSWJE.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-P5D7MHDS.js → chunk-GC4VMLXL.js} +15 -15
- package/dist/cli-bundle/focused-chunks/{chunk-CUWNNU4N.js → chunk-GVKYTDOH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-HNCMYF2W.js → chunk-KM77WU5U.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QGDKWULS.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-YIWDX6KO.js → chunk-QWKCQ5PW.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-SOVXHW6Z.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-4HJVAUFX.js → chunk-SXVJRLLP.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-KVYUQS6Y.js → chunk-TMN3RAXZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-7UD7XTOE.js → chunk-UQ5JPBY2.js} +11 -11
- package/dist/cli-bundle/focused-chunks/{chunk-JMZPZQHR.js → chunk-UUPJ6OZL.js} +13 -13
- package/dist/cli-bundle/focused-chunks/{chunk-JI3RXXRN.js → chunk-VYAZND5Q.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-T27TLSEU.js → chunk-W2CND3BD.js} +3 -3
- package/dist/cli-bundle/focused-chunks/{chunk-44353U27.js → chunk-XX5JQCLF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-CRP6HAZY.js → indexed-receipt-blobs-AAQOKO5B.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{mutation-admission-KM57KDDF.js → mutation-admission-TBKR4KRM.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{stage-UJYGWNZ7.js → stage-RM6MJIMT.js} +2 -2
- package/dist/cli-bundle/main.js +21 -21
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +21 -21
- 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 +58 -58
- 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 +7 -7
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +1 -1
- package/dist/sdk/agent/command-recovery.d.ts +2 -0
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +6 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/context-intent-contracts.d.ts +13 -0
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/contracts.d.ts +1 -1
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core.d.ts +2 -2
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/define.d.ts +15 -16
- package/dist/sdk/define.js +1 -1
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/merge/install.js +2 -2
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/context.d.ts +5 -0
- package/dist/sdk/query/context.js +2 -2
- package/dist/sdk/read-output/session-result.d.ts +39 -0
- package/dist/sdk/read-output/session-result.js +2 -0
- package/dist/sdk/read-output-contracts.d.ts +18 -5
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/read-output-session.d.ts +2 -0
- package/dist/sdk/read-output-session.js +1 -1
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.d.ts +6 -0
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime.d.ts +10 -8
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/workspace.d.ts +3 -1
- package/dist/sdk/workspace.js +8 -5
- package/docs/CONFIGURATION.md +9 -0
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +30 -0
- package/docs/MCP_OPTION_CONFORMANCE.md +27 -1
- package/docs/MERGE_SAFETY.md +8 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +79 -0
- package/docs/RELATIONSHIP_GRAPH.md +15 -0
- package/docs/RELEASING.md +8 -0
- package/docs/SDK.md +37 -7
- package/docs/TESTING.md +5 -0
- package/marketplace.json +1 -1
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- 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/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +1 -1
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +1 -1
- package/dist/cli-bundle/chunks/chunk-4OYU5OXQ.js +0 -6
- package/dist/cli-bundle/chunks/chunk-DIKQ2AL5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-MZZIAC6S.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-6QSZHRM7.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-E2S42XCT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-GRSQGMRR.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-IAGFXKMZ.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-O3M6YWVL.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-VE6MTRH5.js +0 -2
package/dist/sdk/workspace.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
-
`)}
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="df771be0-6c32-5483-8aa7-3f8c5253a506")}catch{}})();import{isFileMissingError}from"../core/fs/fs-utils.js";import{readFile,writeFile}from"node:fs/promises";import path from"node:path";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";const PM_GITIGNORE_START="# pm-cli:runtime-cache:start",PM_GITIGNORE_END="# pm-cli:runtime-cache:end",PM_GITIGNORE_DEFAULT_TRACKER_ROOT=".agents/pm",PM_GITIGNORE_RUNTIME_DIRECTORIES=["runtime/","search/","locks/","transactions/","checkpoints/"],PM_GITIGNORE_TRACKED_FILES=["search/eval-queries.json"];async function withGitignorePermissionRecovery(operation){try{return await operation()}catch(error){throw error instanceof Error&&"code"in error&&typeof error.code=="string"&&["EACCES","EPERM","EROFS"].includes(error.code)?new PmCliError("The workspace .gitignore is not writable.",EXIT_CODE.GENERIC_FAILURE,{code:"init_gitignore_unwritable",reason:error.code.toLowerCase(),required:"Grant the current user read and write access to the workspace .gitignore before initialization.",why:"pm init must publish its managed runtime-cache ignore fence without replacing unrelated entries.",nextSteps:["Grant read and write access to the workspace .gitignore and rerun pm init.","If the workspace is intentionally read-only, initialize pm in a writable workspace or clone."]}):error}}function normalizeTrackerRelativeRoot(trackerRelativeRoot){const root=trackerRelativeRoot.split(path.sep).join("/").replace(/^\.\/+/,"");let end=root.length;for(;end>0&&root[end-1]==="/";)end-=1;return root.slice(0,end)}function isPathOutsideRoot(relativePath){const normalized=relativePath.replaceAll("\\","/");return path.isAbsolute(relativePath)||normalized===".."||normalized.startsWith("../")}function getPmGitignoreBlock(trackerRelativeRoot=PM_GITIGNORE_DEFAULT_TRACKER_ROOT){const root=normalizeTrackerRelativeRoot(trackerRelativeRoot);if(/[\r\n]/u.test(root))throw new PmCliError("A tracker path containing a line break cannot be represented safely in .gitignore.",EXIT_CODE.USAGE,{code:"invalid_argument_value",required:"a tracker path without line breaks",nextSteps:["Choose a tracker path without carriage returns or newlines and rerun pm init."]});const literalRoot=root.replace(/[\\*?[\]#! \t]/gu,"\\$&");return[PM_GITIGNORE_START,...PM_GITIGNORE_RUNTIME_DIRECTORIES.map(directory=>directory==="search/"?`${literalRoot}/${directory}*`:`${literalRoot}/${directory}`),...PM_GITIGNORE_TRACKED_FILES.map(file=>`!${literalRoot}/${file}`),PM_GITIGNORE_END].join(`
|
|
2
|
+
`)}function mergeTrackerIgnoreRules(lines,trackerRoot,rules){const literalRoot=trackerRoot.replace(/[\\*?[\]#! \t]/gu,"\\$&"),prefixes=[...new Set([trackerRoot,literalRoot])].flatMap(root=>PM_GITIGNORE_RUNTIME_DIRECTORIES.flatMap(directory=>[`${root}/${directory}`,`!${root}/${directory}`])),merged=[];let replaced=!1;for(const line of lines)prefixes.some(prefix=>line.startsWith(prefix))?(replaced||merged.push(...rules),replaced=!0):merged.push(line);return replaced||merged.push(...rules),merged}function managedGitignoreBlocks(current){const blocks=[];let start=-1,bodyStart=0,offset=0;for(const line of current.split(`
|
|
3
|
+
`)){const marker=line.endsWith("\r")?line.slice(0,-1):line;marker===PM_GITIGNORE_START?(start=offset,bodyStart=offset+line.length+1):marker===PM_GITIGNORE_END&&start>=0&&(blocks.push({index:start,end:offset+marker.length,lines:current.slice(bodyStart,offset).split(/\r?\n/u).filter(entry=>entry.length>0)}),start=-1),offset+=line.length+1}return blocks}function reconcileGitignoreContent(current,trackerRoot){const newline=current.includes(`\r
|
|
4
|
+
`)?`\r
|
|
5
|
+
`:`
|
|
6
|
+
`,rules=getPmGitignoreBlock(trackerRoot).split(`
|
|
7
|
+
`).slice(1,-1),blocks=managedGitignoreBlocks(current),existingRules=blocks.flatMap(entry=>entry.lines),block=[PM_GITIGNORE_START,...mergeTrackerIgnoreRules(existingRules,trackerRoot,rules),PM_GITIGNORE_END].join(newline);if(blocks.length===0){const separator=current.length===0?"":current.endsWith(`
|
|
8
|
+
`)?newline:`${newline}${newline}`;return`${current}${separator}${block}${newline}`}let next=current;for(const[index,match]of[...blocks.entries()].reverse())next=`${next.slice(0,match.index)}${index===0?block:""}${next.slice(match.end)}`;return next}async function ensurePmGitignore(workspaceRoot,options={}){const gitignorePath=path.join(workspaceRoot,".gitignore");let trackerRelativeRoot=PM_GITIGNORE_DEFAULT_TRACKER_ROOT;if(options.pmRoot!==void 0){const relative=normalizeTrackerRelativeRoot(path.relative(path.resolve(workspaceRoot),path.resolve(options.pmRoot)));if(isPathOutsideRoot(relative))return{path:gitignorePath,changed:!1};trackerRelativeRoot=relative}let current="";try{current=await withGitignorePermissionRecovery(()=>readFile(gitignorePath,"utf8"))}catch(error){if(!(error instanceof Error&&"code"in error&&isFileMissingError(error)))throw error}const next=reconcileGitignoreContent(current,trackerRelativeRoot);return next===current?{path:gitignorePath,changed:!1}:(await withGitignorePermissionRecovery(()=>writeFile(gitignorePath,next,"utf8")),{path:gitignorePath,changed:!0})}export{PM_GITIGNORE_DEFAULT_TRACKER_ROOT,PM_GITIGNORE_END,PM_GITIGNORE_RUNTIME_DIRECTORIES,PM_GITIGNORE_START,PM_GITIGNORE_TRACKED_FILES,ensurePmGitignore,getPmGitignoreBlock,isPathOutsideRoot};
|
|
6
9
|
//# sourceMappingURL=workspace.js.map
|
package/docs/CONFIGURATION.md
CHANGED
|
@@ -177,6 +177,15 @@ For command-level tracker targeting, prefer `--pm-path <tracker-root>`. The old
|
|
|
177
177
|
itself, not the repository workspace. During `pm init`, explicit tracker paths
|
|
178
178
|
that look like workspace roots are rejected unless `--force` is provided.
|
|
179
179
|
|
|
180
|
+
Initialization maintains the repository's runtime-cache `.gitignore` fence for
|
|
181
|
+
every tracker sharing that repository. Initializing or reinitializing a nested
|
|
182
|
+
tracker preserves the enclosing tracker's exclusions and unrelated user rules.
|
|
183
|
+
Custom tracker paths are literal Git paths, including spaces and wildcard
|
|
184
|
+
characters. An intentional root-layout tracker uses repository-root exclusions.
|
|
185
|
+
Paths containing line breaks are refused because `.gitignore` cannot safely
|
|
186
|
+
represent them. Curated `search/eval-queries.json` files remain trackable in
|
|
187
|
+
each tracker. See [merge safety](MERGE_SAFETY.md#runtime-receipts-and-retention).
|
|
188
|
+
|
|
180
189
|
Implicit discovery checks the current directory and its ancestors up to the
|
|
181
190
|
nearest `.git` directory or file, including worktrees and submodules. An
|
|
182
191
|
uninitialized repository selects its own `.agents/pm` and returns initialization
|
|
@@ -36,6 +36,11 @@ immediately before SDK assurance evaluation, which verifies advisory evidence
|
|
|
36
36
|
before slower providers. The blocking registry command settles before OSV starts
|
|
37
37
|
its network deadlines.
|
|
38
38
|
|
|
39
|
+
CI retains this single receipt after successful and failed static jobs, with a
|
|
40
|
+
separate artifact name for each run attempt and seven-day retention. Inspect both
|
|
41
|
+
feeds before diagnosing a blocked collector: a positive advisory is a refusal,
|
|
42
|
+
even when the other feed is clean.
|
|
43
|
+
|
|
39
44
|
The command then verifies the installed CodSpeed bundle policy. Network/audit errors,
|
|
40
45
|
missing packages, incomplete policy entries, changed package files, and unreviewed
|
|
41
46
|
upgrades all fail. `quality:static` includes this command, so the existing CI,
|
|
@@ -50,6 +55,31 @@ defaults to the `latest` image. The workflow contract checks both values on
|
|
|
50
55
|
every TruffleHog step. Recheck the action's executable selectors when renewing
|
|
51
56
|
its commit pin.
|
|
52
57
|
|
|
58
|
+
## Vitest mocker advisory pair
|
|
59
|
+
|
|
60
|
+
[pm-vitest4112](../.agents/pm/tasks/pm-vitest4112.toon) coordinates the
|
|
61
|
+
[manual-registration finding](../.agents/pm/issues/pm-vitestmanual.toon) and
|
|
62
|
+
[Windows redirect finding](../.agents/pm/issues/pm-vitestredirect.toon).
|
|
63
|
+
[GHSA-qxg6-89mg-rqv8](https://github.com/advisories/GHSA-qxg6-89mg-rqv8)
|
|
64
|
+
and [GHSA-xp26-3454-mjgp](https://github.com/advisories/GHSA-xp26-3454-mjgp)
|
|
65
|
+
affect the previously locked `@vitest/mocker` 4.1.11. The compatible Vitest and
|
|
66
|
+
coverage-provider pair now requires 4.1.12, whose shared mock-source generator
|
|
67
|
+
serializes module URLs and export names, including asynchronous rebinding, and
|
|
68
|
+
whose public redirect handler normalizes backslashes before the file allowlist
|
|
69
|
+
check. Both fixes apply to public mocker/interceptor WebSocket handlers. The
|
|
70
|
+
repository's Node test configurations do not register these handlers, so the
|
|
71
|
+
affected development dependency does not establish an exploitable CLI or SDK
|
|
72
|
+
route.
|
|
73
|
+
|
|
74
|
+
The retained hosted OSV receipt identified both advisories while the registry
|
|
75
|
+
audit returned zero. Keep full-lock admission mandatory and verify the patched
|
|
76
|
+
graph against both feeds. This patch keeps Vitest 4, the CodSpeed peer contract
|
|
77
|
+
and the Vite 7 override; the broader Vitest 5 migration remains separate. The
|
|
78
|
+
installed-handler regressions run in coverage and the required native Windows
|
|
79
|
+
cohort, whose aggregate refuses failed, canceled or skipped partitions. The
|
|
80
|
+
October 15 patch releases meet pnpm's one-day minimum age on October 21 without
|
|
81
|
+
an exclusion. Dependabot's seven-day scheduling cooldown is unchanged.
|
|
82
|
+
|
|
53
83
|
## Indexed source-map offsets
|
|
54
84
|
|
|
55
85
|
[pm-dba47](../.agents/pm/issues/pm-dba47.toon) tracks Dependabot alert 47 and
|
|
@@ -1,12 +1,38 @@
|
|
|
1
1
|
# MCP Option Conformance
|
|
2
2
|
|
|
3
|
-
Tracked by [pm-v0s2rm](
|
|
3
|
+
Tracked by [pm-v0s2rm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/chores/pm-v0s2rm.toon), [pm-gh1538](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1538.toon), and [pm-ap7ilf](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ap7ilf.toon).
|
|
4
|
+
These repository-only tracking records are excluded from npm.
|
|
4
5
|
|
|
5
6
|
An integration test can pass while an undeclared option is ignored. That leaves
|
|
6
7
|
the test asserting a behavior it never exercised. The repository therefore
|
|
7
8
|
treats emitted MCP unknown-option diagnostics as test failures, while the
|
|
8
9
|
production server retains its advisory warning behavior for clients.
|
|
9
10
|
|
|
11
|
+
`pm_create` and `pm_update` accept the canonical mutation fields advertised by
|
|
12
|
+
their input schemas either at the top level or inside `options`. `pm_run` with
|
|
13
|
+
the corresponding action uses the same SDK normalization. Explicit nested
|
|
14
|
+
options take precedence, including CLI
|
|
15
|
+
aliases for the same field. Repeatable inputs, numeric values, and linked-resource
|
|
16
|
+
aliases use the shared mutation contracts before persistence. Native SDK `run`
|
|
17
|
+
callers continue to put update fields inside `options`.
|
|
18
|
+
|
|
19
|
+
Malformed option containers, values discarded from known scalar fields, and malformed repeatable
|
|
20
|
+
entries refuse before execution with `invalid_argument_value` and
|
|
21
|
+
`changed: false`. Declared boolean mutation fields, their aliases, and receipt
|
|
22
|
+
controls must be booleans, including `false`; this covers clear/replace flags,
|
|
23
|
+
parent/dependency exceptions, duplicate allowance, and `force`. These checks preserve project-defined
|
|
24
|
+
custom fields and template-based type resolution while preventing a bad field
|
|
25
|
+
from disappearing as a sibling field is written.
|
|
26
|
+
Array values that become CLI CSV inputs, such as `tags`, must contain only
|
|
27
|
+
strings and are checked before conversion. Validation follows nested precedence:
|
|
28
|
+
an explicit valid nested value replaces a flat value before either is normalized.
|
|
29
|
+
|
|
30
|
+
For example, `{ "id": "pm-one", "options": {}, "priority": 4 }` changes priority;
|
|
31
|
+
with `"options": { "priority": 2 }`, priority becomes `2`. Create also honors its
|
|
32
|
+
advertised explicit `id`, `deadline`, and other metadata. Regressions check the
|
|
33
|
+
discovered schema, persisted values and verified history, and compare item and
|
|
34
|
+
history bytes after invalid mutations to prove atomic refusal.
|
|
35
|
+
|
|
10
36
|
Every run using [vitest.config.ts](../vitest.config.ts) installs
|
|
11
37
|
[McpContractReporter](../scripts/mcp-contract-reporter.mts). The reporter records
|
|
12
38
|
the emitting file, full test name, option, tool, and action, and rejects the run
|
package/docs/MERGE_SAFETY.md
CHANGED
|
@@ -667,6 +667,14 @@ Never remove conflict markers manually while leaving the authoritative item and
|
|
|
667
667
|
|
|
668
668
|
`transactions/` and `checkpoints/` are per-branch crash-recovery state, not shared project context. `pm init` places both below the resolved tracker root in the managed `.gitignore` block, including custom `--pm-path` roots.
|
|
669
669
|
|
|
670
|
+
Each tracker sharing a repository retains its own cache exclusions and merge
|
|
671
|
+
patterns in either initialization order. Tracker names containing Git wildcard
|
|
672
|
+
characters are escaped as literal paths, while the generated item/history globs
|
|
673
|
+
remain active. Unrelated user rules and curated evaluation files are preserved.
|
|
674
|
+
These contracts are tracked by
|
|
675
|
+
[pm-nl60tbxzkjwp](../.agents/pm/issues/pm-nl60tbxzkjwp.toon) and
|
|
676
|
+
[pm-47wuv8awpqvj](../.agents/pm/issues/pm-47wuv8awpqvj.toon).
|
|
677
|
+
|
|
670
678
|
Ignore rules do not remove files that were already committed. `pm health`
|
|
671
679
|
(`integrity`) and `pm validate` (`storage_integrity`) therefore scan Git's
|
|
672
680
|
index for tracked files below `runtime/`, `search/`, `locks/`,
|
|
@@ -85,8 +85,87 @@ If brief still exceeds the ceiling, normal compaction and eventual refusal
|
|
|
85
85
|
apply. `estimated_tokens` measures the emitted envelope;
|
|
86
86
|
`omitted_result_estimated_tokens` measures the useful result that could not fit.
|
|
87
87
|
|
|
88
|
+
## Typed producer pages
|
|
89
|
+
|
|
90
|
+
Tracked by [pm-oybmsd](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-oybmsd.toon),
|
|
91
|
+
[pm-jqgkis](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-jqgkis.toon), and
|
|
92
|
+
[pm-qal1uw](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-qal1uw.toon)
|
|
93
|
+
(repository-only tracker records excluded from npm).
|
|
94
|
+
Native `PmClient.list`, `search`, and `context` reads and their standalone
|
|
95
|
+
convenience functions return sparse metadata when `after` resumes a producer
|
|
96
|
+
page. Retain the first page's filters, projection, sorting, totals and completeness
|
|
97
|
+
certificate. Subsequent pages carry `continuation_contract` with
|
|
98
|
+
`metadata: "reference"` and `restore_with: "omit --after"`; repeated metadata
|
|
99
|
+
is optional in `PmReadOutputProducerContinuation<Result>`. Follow `next_cursor`
|
|
100
|
+
until it is empty, rather than relying on the optional `has_more` field.
|
|
101
|
+
|
|
102
|
+
Calls whose options contain no producer cursor retain their first-page types.
|
|
103
|
+
Omitting the options argument has the same precise type as passing `{}` for
|
|
104
|
+
client and standalone `list`, `context`, and `search` calls; it does not imply
|
|
105
|
+
that an explicit budget, session, or output cursor was supplied.
|
|
106
|
+
Options with an optional cursor can return either page shape. When a budget,
|
|
107
|
+
session, or output cursor is possible, first use `isReadOutputBudgetExceeded`
|
|
108
|
+
to narrow the omission branch before accessing rows. This remains required for
|
|
109
|
+
unions of option shapes: a budgeted variant cannot be erased by an unbudgeted
|
|
110
|
+
variant. The low-level query producers retain their original result contracts;
|
|
111
|
+
metadata suppression belongs to the shared native SDK transport.
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
const first = await client.list({ brief: true, limit: "10" });
|
|
115
|
+
consume(first.items);
|
|
116
|
+
let cursor = first.next_cursor;
|
|
117
|
+
while (cursor) {
|
|
118
|
+
const page = await client.list({ brief: true, limit: "10", after: cursor });
|
|
119
|
+
consume(page.items);
|
|
120
|
+
cursor = page.next_cursor;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
88
124
|
## Cross-Call Context Sessions
|
|
89
125
|
|
|
126
|
+
Typed session results are tracked by
|
|
127
|
+
[pm-t1p1jv](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-t1p1jv.toon)
|
|
128
|
+
(repository-only tracker record excluded from npm). After narrowing budget
|
|
129
|
+
omission with `isReadOutputBudgetExceeded`, use `isReadOutputSessionReference`
|
|
130
|
+
from the SDK or `sdk/core` before accessing row prose or a search hit's nested
|
|
131
|
+
`item`. A reference contains only `id` and `context_ref`. Calls with no session,
|
|
132
|
+
including calls that specify only an output budget, retain their ordinary row
|
|
133
|
+
types. The direct `applyReadOutputDimensions` helper also infers session
|
|
134
|
+
capability from its options, including the accepted `output_session` spelling.
|
|
135
|
+
Unspecified or explicitly undefined session options retain ordinary rows;
|
|
136
|
+
optional, union, or dynamically typed session options admit references.
|
|
137
|
+
`PmReadOutputSessionResult<Result>` models literal `row_contract.row_keys`
|
|
138
|
+
paths (including nested arrays and keyed maps). Dynamic path declarations
|
|
139
|
+
conservatively admit references in nested collections, and envelopes without a
|
|
140
|
+
row declaration use the top-level array fallback. Keep package row paths literal
|
|
141
|
+
with `as const` to preserve precision in package result declarations.
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
const page = await client.context({ outputSession: sessionState });
|
|
145
|
+
if (!isReadOutputBudgetExceeded(page)) {
|
|
146
|
+
for (const row of page.high_level) {
|
|
147
|
+
if (isReadOutputSessionReference(row)) consumeReference(row.context_ref);
|
|
148
|
+
else consumeTitle(row.title);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Read-option recovery is tracked by
|
|
154
|
+
[pm-7gpx34](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-7gpx34.toon)
|
|
155
|
+
(repository-only tracker record excluded from npm). For explicit static encoding,
|
|
156
|
+
use `--output-format toon|json` across read commands. Completeness uses
|
|
157
|
+
`--output-include full` on list, search and get; context detail depth uses
|
|
158
|
+
`--depth full`. These controls retain the normal row and token ceilings.
|
|
159
|
+
When `context --full`, `list/search --depth full`, or `--toon` on list, search,
|
|
160
|
+
context or get is refused,
|
|
161
|
+
the error provides `recovery.suggested_retry_args` for the same command with the
|
|
162
|
+
supported spelling. The SDK's `resolveReadOptionRetryArgs` exposes the same
|
|
163
|
+
token-preserving correction. Conflicting controls or ambiguous operands do not
|
|
164
|
+
receive a guessed retry.
|
|
165
|
+
An explicit `--json` conflicts with `--toon`, so that invocation receives no
|
|
166
|
+
encoding-changing retry. Non-conflicting TOON refusals include the corrected
|
|
167
|
+
command in human output without requiring JSON diagnostics.
|
|
168
|
+
|
|
90
169
|
`--output-session <json>` / `outputSession` composes the four per-call
|
|
91
170
|
dimensions across a request group. The caller supplies versioned state and
|
|
92
171
|
passes the returned `read_session.next_state` to the next read:
|
|
@@ -238,6 +238,21 @@ Every returned node is explainable: `role` names its semantic family (`prerequis
|
|
|
238
238
|
|
|
239
239
|
`meta.completeness` reports result quality: the exact in-memory kernel emits `complete` or `truncated`, and the contract reserves `sampled`, `approximate`, `stale_index`, and `redacted` for index-backed or policy-filtered providers so consumers can branch on one field.
|
|
240
240
|
|
|
241
|
+
The packer orders direct prerequisite and ancestor endpoints before optional
|
|
242
|
+
descendants or related nodes, reserves their direct relationship costs, and
|
|
243
|
+
emits root-incident edges first. An oversized edge is skipped so later feasible
|
|
244
|
+
edges can still be returned. The same order governs cursor pages; the cursor
|
|
245
|
+
fingerprint identifies this packing policy and rejects earlier-policy cursors. An
|
|
246
|
+
edge limit or a budget too small for an endpoint and its edges can still omit
|
|
247
|
+
evidence: inspect the direct-family totals, omitted counts and completeness
|
|
248
|
+
before using the packet to make a decision. The native adapter also reports
|
|
249
|
+
`relationship_context_bounds` in `omission_receipt` whenever the producer is
|
|
250
|
+
truncated. Increase the relevant bounds or follow the node cursor for more
|
|
251
|
+
detail; a full projection alone does not remove traversal limits.
|
|
252
|
+
|
|
253
|
+
Tracked by [pm-gh1534](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1534.toon)
|
|
254
|
+
(repository tracker records are excluded from npm).
|
|
255
|
+
|
|
241
256
|
Node, edge, depth, kind, direction, and token bounds are independent. The cursor fingerprint covers semantic filters and traversal shape, so it is rejected when reused for a different root or query. Output remains a plain object suitable for TOON, JSON, JSONL, MCP, or a custom UI; adapters own rendering and do not reimplement traversal.
|
|
242
257
|
|
|
243
258
|
The native adapter is `pm deps <id> --format context`. It is also available through `PmClient.deps`, `runAction({ action: "deps" })`, and the MCP `pm_deps` tool. `--max-depth`, `--node-limit`, `--edge-limit`, `--token-budget`, `--cursor`, `--direction`, and repeatable or comma-separated `--kind` map directly to the public SDK context options; `--summary` keeps only counts. Unknown `--kind` values fail fast with the registered-kind list instead of silently matching nothing. Tree and graph formats share those first four bounds, use safe defaults when omitted, and report deterministic truncation metadata instead of recursively expanding a cyclic or multiply-linked graph without limit.
|
package/docs/RELEASING.md
CHANGED
|
@@ -315,6 +315,14 @@ missing locked package. npm 12 ignores published shrinkwraps; shipping
|
|
|
315
315
|
a shrinkwrap alone therefore cannot enforce this contract. SDK consumers
|
|
316
316
|
supply the bounded optional Node types peer themselves.
|
|
317
317
|
|
|
318
|
+
Physical entrypoint verification is tracked by
|
|
319
|
+
[pm-tl7vlu](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-tl7vlu.toon)
|
|
320
|
+
(repository-only tracker record excluded from npm). The dependency advisory CLI
|
|
321
|
+
resolves both its invocation and module to physical paths, so directory aliases
|
|
322
|
+
and Node's symlink-preserving main-module mode still execute verification and
|
|
323
|
+
return a receipt or failure status. Module imports expose the collector without
|
|
324
|
+
starting verification.
|
|
325
|
+
|
|
318
326
|
Push the final implementation commit through a reviewed pull request first,
|
|
319
327
|
wait for DeepScan and CodeFactor to finish on that reviewed SHA, then run the
|
|
320
328
|
canonical registry-owned preflight:
|
package/docs/SDK.md
CHANGED
|
@@ -1899,6 +1899,22 @@ compact rounded report metrics for stable machine output.
|
|
|
1899
1899
|
|
|
1900
1900
|
### Context relevance and evaluation
|
|
1901
1901
|
|
|
1902
|
+
Context test health is tracked by
|
|
1903
|
+
[pm-gh1535](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1535.toon)
|
|
1904
|
+
(repository tracker records are excluded from npm). `ContextResult.tests` counts
|
|
1905
|
+
the complete matching active population, independently of the focus page and
|
|
1906
|
+
token selection. `scope: "matching_active_items"` and `total_items` declare its
|
|
1907
|
+
denominator, including active items without tests. Draft, blocked-lifecycle and
|
|
1908
|
+
terminal items are excluded unless the project schema classifies their status
|
|
1909
|
+
as active. The main summary still counts every matching lifecycle status.
|
|
1910
|
+
Consumers constructing `TestHealthSummary` values must supply the new scope and
|
|
1911
|
+
denominator fields; consumers reading results can use them directly.
|
|
1912
|
+
Markdown limits failing-item identities to the effective focus limit (or the
|
|
1913
|
+
default context limit) and native token budget, with `items_failing_omitted`
|
|
1914
|
+
when detail is withheld. Population counters remain exact. Structured SDK and
|
|
1915
|
+
MCP results retain the complete failing-item collection before their normal
|
|
1916
|
+
read-output budget handling.
|
|
1917
|
+
|
|
1902
1918
|
Tracked by [pm-4k6b](../.agents/pm/features/pm-4k6b.toon),
|
|
1903
1919
|
[pm-h3no](../.agents/pm/tasks/pm-h3no.toon),
|
|
1904
1920
|
[pm-3hps](../.agents/pm/tasks/pm-3hps.toon),
|
|
@@ -2629,7 +2645,8 @@ import { createPmCliExpectedError } from "@unbrained/pm-cli/sdk/runtime";
|
|
|
2629
2645
|
|
|
2630
2646
|
## Authoring Builders
|
|
2631
2647
|
|
|
2632
|
-
Tracked: [pm-12tj](
|
|
2648
|
+
Tracked: [pm-12tj](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-12tj.toon) (design rationale: ADR [pm-3mph](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/decisions/pm-3mph.toon)); exactness and literal inference: [pm-gh1539](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1539.toon).
|
|
2649
|
+
These repository-only tracking records are excluded from npm.
|
|
2633
2650
|
|
|
2634
2651
|
The `define*` builders are the authoring half of the `author → register → test`
|
|
2635
2652
|
loop: they type a registration definition where you write it, before it ever
|
|
@@ -2672,7 +2689,8 @@ export function activate(api: ExtensionApi): void {
|
|
|
2672
2689
|
|
|
2673
2690
|
Object-definition builders (`defineExtensionManifest`, `defineCommand`,
|
|
2674
2691
|
`defineFlag`, `defineItemType`, `defineItemField`, `defineMigration`,
|
|
2675
|
-
`defineSearchProvider`, `defineVectorStoreAdapter`)
|
|
2692
|
+
`defineSearchProvider`, `defineVectorStoreAdapter`, `defineProjectProfile`) use
|
|
2693
|
+
const type parameters to preserve the narrow literal
|
|
2676
2694
|
type. `defineExtensionManifest` additionally contract-checks the in-module
|
|
2677
2695
|
manifest mirror where it is authored and pairs with `deriveExtensionCapabilities`
|
|
2678
2696
|
(see [Declarative Authoring](#declarative-authoring)). Function-definition
|
|
@@ -2685,11 +2703,16 @@ parameter is contextually typed instead of falling back to `any`. The
|
|
|
2685
2703
|
[`assertRegistered*`](#testing-helpers) helpers below verify these same
|
|
2686
2704
|
definitions once registered.
|
|
2687
2705
|
|
|
2688
|
-
The object builders reject unknown keys
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2706
|
+
The object builders reject unknown top-level keys, including command, manifest,
|
|
2707
|
+
and profile definitions and separately authored variables. This catches
|
|
2708
|
+
misspellings without changing the runtime registry's storage boundary. Keep
|
|
2709
|
+
package-specific annotations beside the registration definition. Existing values
|
|
2710
|
+
already typed as a registration contract remain usable; a builder cannot recover
|
|
2711
|
+
literal information that was widened before the call. Flag builders support
|
|
2712
|
+
`repeatable` and `value_validation`; schema builders include their supported
|
|
2713
|
+
`default`/`values` and item-type description/default-status fields. Scoped renderer
|
|
2714
|
+
and preflight object builders also retain literal command ownership while
|
|
2715
|
+
contextually typing their callbacks.
|
|
2693
2716
|
|
|
2694
2717
|
## Declarative Authoring
|
|
2695
2718
|
|
|
@@ -3356,6 +3379,13 @@ MCP retains its existing transport-specific admission contract. The no-change
|
|
|
3356
3379
|
receipt applies to these preflight refusals; an executed operation's outcome
|
|
3357
3380
|
and evidence must be assessed separately.
|
|
3358
3381
|
|
|
3382
|
+
MCP create/update normalize their advertised mutation fields through the SDK and
|
|
3383
|
+
refuse malformed values atomically; see [MCP option conformance](MCP_OPTION_CONFORMANCE.md).
|
|
3384
|
+
Embedded hosts can use `readRuntimeFieldOptionValue(options, definition)` with
|
|
3385
|
+
definitions from `resolveRuntimeFieldRegistry(settings.schema)` to recognize the
|
|
3386
|
+
same project-field aliases as persistence. These helpers are exported from the
|
|
3387
|
+
aggregate SDK, so hosts can preserve customization without copying key mappings.
|
|
3388
|
+
|
|
3359
3389
|
1. Read `PM_TOOL_ACTIONS` or `PM_TOOL_PARAMETERS_SCHEMA` for baseline static validation.
|
|
3360
3390
|
2. Load runtime contracts with `getContracts(pmRoot, { runtimeOnly: true })` or run `pm contracts --runtime-only --json` inside the target project.
|
|
3361
3391
|
3. Verify the action appears in `actions` and has `action_availability[].invocable: true`.
|
package/docs/TESTING.md
CHANGED
|
@@ -62,6 +62,11 @@ read, and surface-replication fixture files after parallel contracts
|
|
|
62
62
|
a repository-only tracker record excluded from npm). Their original input
|
|
63
63
|
populations, assertions, per-test deadlines and retry policy remain in force.
|
|
64
64
|
|
|
65
|
+
The context decision keeper also runs in that phase, preserving its 200-item
|
|
66
|
+
corpus and 30-second completion-regression deadline. Allocation is tracked by
|
|
67
|
+
[pm-j2vwbh](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-j2vwbh.toon)
|
|
68
|
+
(a repository-only tracker record excluded from npm).
|
|
69
|
+
|
|
65
70
|
`node scripts/run-tests.mjs` wraps Vitest in temporary tracker roots, disables
|
|
66
71
|
external Sentry delivery for the build, test workers, and their nested CLI
|
|
67
72
|
children, then cleans the roots up. Instrumentation tests can still exercise
|
package/marketplace.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.
|
|
1
|
+
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.22","plugins":[{"name":"pm-claude","source":"./plugins/pm-claude","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.","version":"2026.10.22","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"],"category":"productivity"}]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-beads","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-beads","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for importing Beads JSONL records.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-beads"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","beads"],"pm":{"aliases":["beads"],"extensions":["extensions/beads"],"catalog":{"display_name":"Beads Import","category":"migration","summary":"Import Beads JSONL records into pm while preserving source IDs.","tags":["migration","beads","import"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-calendar","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-calendar","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for calendar and agenda views.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-calendar"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","calendar","agenda"],"pm":{"aliases":["calendar"],"extensions":["extensions/calendar"],"catalog":{"display_name":"Calendar Views","category":"workflow","summary":"Show agenda, day, week, and month views for deadlines, reminders, and scheduled events.","tags":["calendar","agenda","workflow"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-command-kit","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-command-kit","version":"2026.10.22","private":true,"type":"module","description":"First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-command-kit"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","sdk","commands","exemplar"],"pm":{"aliases":["command-kit"],"extensions":["extensions/command-kit"],"catalog":{"display_name":"Command Kit Exemplar","category":"sdk","summary":"Copy-paste-able exemplar for registerCommand, registerFlags, and registerParser.","tags":["sdk","commands","parser","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-digital-twin","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-digital-twin","version":"2026.10.22","private":true,"type":"module","description":"Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-digital-twin"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","sdk","digital-twin","event-sourcing","temporal-graph","exemplar"],"pm":{"aliases":["digital-twin","twin"],"extensions":["extensions/digital-twin"],"catalog":{"display_name":"Digital Twin SDK Exemplar","category":"sdk","summary":"Temporal facility graph proving event replay, point-in-time state, invariants, federation, checkpoints, and compact exports through public SDK contracts.","tags":["sdk","digital-twin","event-sourcing","graph","offline-first","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin","report":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin/GAP_REPORT.md"}},"docs":["README.md","GAP_REPORT.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-governance-audit","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-governance-audit","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for governance audit and normalization workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-governance-audit"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","governance","audit","normalize","hooks"],"pm":{"aliases":["governance-audit","audit"],"extensions":["extensions/governance-audit"],"catalog":{"display_name":"Governance Audit","category":"governance","summary":"Run dedupe audits, comments audits, and normalize sweeps as package-owned workflows.","tags":["governance","audit","normalize","hooks"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-guide-shell","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-guide-shell","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for guide and shell completion workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-guide-shell"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","guide","completion","shell"],"pm":{"aliases":["guide-shell"],"extensions":["extensions/guide-shell"],"catalog":{"display_name":"Guide + Shell UX","category":"workflow","summary":"Restore guide documentation and shell completion commands as package-owned UX surfaces.","tags":["guide","completion","shell"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-kanban","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-kanban","version":"2026.10.22","private":true,"type":"module","description":"First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-kanban"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","sdk","profile","archetype","kanban","exemplar"],"pm":{"aliases":["kanban"],"extensions":["extensions/kanban"],"catalog":{"display_name":"Kanban Archetype","category":"sdk","summary":"Installable Kanban continuous-flow archetype: Card item type, flow fields, and a ProjectProfileDefinition built on public SDK primitives.","tags":["sdk","profile","archetype","kanban","schema","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-lifecycle-hooks","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-lifecycle-hooks","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package demonstrating safe lifecycle hook registration.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-lifecycle-hooks"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","hooks","lifecycle","sdk"],"pm":{"aliases":["lifecycle-hooks"],"extensions":["extensions/lifecycle-hooks"],"catalog":{"display_name":"Lifecycle Hooks","category":"sdk","summary":"Default-inert lifecycle hook exemplar for package authors.","tags":["hooks","lifecycle","sdk"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-linked-test-adapters","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-linked-test-adapters","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for optional linked-test run management adapters and reporters.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-linked-test-adapters"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","linked-tests","background-runs","test-runs"],"pm":{"aliases":["linked-test-adapters"],"extensions":["extensions/linked-test-adapters"],"catalog":{"display_name":"Linked Test Adapters","category":"testing","summary":"Restore optional linked-test run management/reporting command surfaces.","tags":["tests","linked-tests","background","reporting"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-search-advanced","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-search-advanced","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for semantic, hybrid, and reindex search workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-search-advanced"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","search","reindex","semantic","hybrid"],"pm":{"aliases":["search-advanced"],"extensions":["extensions/search-advanced"],"catalog":{"display_name":"Advanced Search","category":"search","summary":"Enable semantic/hybrid search modes and reindex workflows.","tags":["search","semantic","hybrid","reindex"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-templates","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-templates","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for reusable create templates.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-templates"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","templates"],"pm":{"aliases":["templates"],"extensions":["extensions/templates"],"catalog":{"display_name":"Create Templates","category":"workflow","summary":"Save, list, show, and apply reusable pm create option templates.","tags":["templates","create","workflow"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-todos","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-todos","version":"2026.10.22","private":true,"type":"module","description":"First-party pm package for Todo markdown import and export.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-todos"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","todos"],"pm":{"aliases":["todos"],"extensions":["extensions/todos"],"catalog":{"display_name":"Todos Import/Export","category":"migration","summary":"Import and export Todo markdown tasks through pm package commands.","tags":["migration","todos","import","export"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-vcs-sdk-exemplar","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-vcs-sdk-exemplar","version":"2026.10.22","private":true,"type":"module","description":"Beyond-PM exemplar: a VCS-style changeset workflow built entirely on public pm SDK and extension primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-vcs"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","sdk","vcs","event-sourcing","exemplar"],"pm":{"aliases":["vcs-exemplar"],"extensions":["extensions/vcs"],"catalog":{"display_name":"VCS SDK Exemplar","category":"sdk","summary":"Non-PM changeset/ref workflow proving custom schema, domain commands, hooks, history replay, and typed relationship events through public SDK contracts.","tags":["sdk","vcs","event-sourcing","graph","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs","report":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs/GAP_REPORT.md"}},"docs":["README.md","GAP_REPORT.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://json.schemastore.org/claude-code-plugin-manifest.json","name":"pm-claude","displayName":"pm CLI","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.","version":"2026.10.
|
|
1
|
+
{"$schema":"https://json.schemastore.org/claude-code-plugin-manifest.json","name":"pm-claude","displayName":"pm CLI","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.","version":"2026.10.22","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-claude-runtime","private":true,"type":"module","version":"2026.10.
|
|
1
|
+
{"name":"pm-claude-runtime","private":true,"type":"module","version":"2026.10.22","dependencies":{"@unbrained/pm-cli":"2026.10.22"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-codex","version":"2026.10.
|
|
1
|
+
{"name":"pm-codex","version":"2026.10.22","description":"Native Codex integration for pm-cli with bundled MCP tools, skills, commands, and agent workflows.","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli/tree/main/plugins/pm-codex","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","codex","mcp","project-management","agents","tasks","workflows"],"skills":"./skills/","mcpServers":"./.mcp.json","interface":{"displayName":"pm CLI","shortDescription":"Native pm tracker tools and agent workflows","longDescription":"Use pm CLI from Codex through native MCP tools instead of shelling out to the pm command. The plugin bundles tracker operations, skills, command prompts, and subagent workflow guidance for planning, execution, validation, release, and audit work.","developerName":"unbrained","category":"Coding","capabilities":["Interactive","Read","Write"],"websiteURL":"https://github.com/unbraind/pm-cli","privacyPolicyURL":"https://github.com/unbraind/pm-cli/blob/main/SECURITY.md","termsOfServiceURL":"https://github.com/unbraind/pm-cli/blob/main/LICENSE","defaultPrompt":["Use pm CLI to orient, claim, track, verify, and close this repository task"],"composerIcon":"./assets/pm-cli-small.svg","logo":"./assets/pm-cli-small.svg","screenshots":[],"brandColor":"#2563EB"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-codex-runtime","private":true,"type":"module","version":"2026.10.
|
|
1
|
+
{"name":"pm-codex-runtime","private":true,"type":"module","version":"2026.10.22","dependencies":{"@unbrained/pm-cli":"2026.10.22"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json","name":"pm-codex","version":"2026.10.
|
|
1
|
+
{"$schema":"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json","name":"pm-codex","version":"2026.10.22","description":"Repository-native project context workflows and a version-pinned pm MCP server for Codex.","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli/tree/main/plugins/pm-codex","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","codex","mcp","project-management","agents"],"extensions":{"com.openai":{"interface":{"displayName":"pm CLI","shortDescription":"Track project context with pm","longDescription":"Orient, plan, implement, verify, and hand off work with repository-native pm records and a bundled MCP server.","developerName":"unbrained","category":"Coding","capabilities":["Interactive","Read","Write"],"websiteURL":"https://github.com/unbraind/pm-cli","privacyPolicyURL":"https://github.com/unbraind/pm-cli/blob/main/SECURITY.md","termsOfServiceURL":"https://github.com/unbraind/pm-cli/blob/main/LICENSE","defaultPrompt":["Use pm to orient, track, verify, and hand off this repository task."],"composerIcon":"./assets/pm-cli-small.svg","logo":"./assets/pm-cli-small.svg","brandColor":"#2563EB"}}}}
|