@unbrained/pm-cli 2026.9.30 → 2026.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +12 -0
  3. package/dist/cli/register-list-query.d.ts +8 -5
  4. package/dist/cli/register-list-query.js +2 -2
  5. package/dist/cli-bundle/bundle-manifest.json +82 -82
  6. package/dist/cli-bundle/chunks/{chunk-6XTJLOKW.js → chunk-7E2EBJLY.js} +2 -2
  7. package/dist/cli-bundle/chunks/{chunk-O23CQ5T4.js → chunk-A2UPOCSW.js} +7 -7
  8. package/dist/cli-bundle/chunks/{chunk-BTCE36JS.js → chunk-AYHLUJKD.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-6YEET7XI.js → chunk-DGOIXJZJ.js} +42 -42
  10. package/dist/cli-bundle/chunks/{chunk-BX4LEJX4.js → chunk-HGJLVN56.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-A6NDNRCK.js → chunk-JAVO3Z42.js} +2 -2
  12. package/dist/cli-bundle/chunks/{chunk-EGAIIWI3.js → chunk-SCZMJ5DC.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-FYTXVVZG.js → chunk-TV3YDE36.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-XRN3JYNN.js → chunk-VWVFKPLX.js} +2 -2
  15. package/dist/cli-bundle/chunks/{register-list-query-SYNBVMNG.js → register-list-query-L6HAHW7V.js} +6 -6
  16. package/dist/cli-bundle/chunks/{register-mutation-4GSUK23D.js → register-mutation-6OCZVTW5.js} +2 -2
  17. package/dist/cli-bundle/chunks/{register-operations-7FCJUC4Z.js → register-operations-3E5U4TOE.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-setup-YTWW2KL5.js → register-setup-VUD37N4A.js} +2 -2
  19. package/dist/cli-bundle/focused-chunks/{chunk-KZULQIAG.js → chunk-6275G2AN.js} +2 -2
  20. package/dist/cli-bundle/focused-chunks/{chunk-EFD4ATS7.js → chunk-DJPP2HAK.js} +2 -2
  21. package/dist/cli-bundle/focused-chunks/{chunk-AKB3JN57.js → chunk-YBQ27KG7.js} +45 -45
  22. package/dist/cli-bundle/main.js +2 -2
  23. package/dist/cli-bundle/sdk-contracts.js +1 -1
  24. package/dist/cli-bundle/sdk-core.js +1 -1
  25. package/dist/cli-bundle/sdk-governance.js +1 -1
  26. package/dist/cli-bundle/sdk-merge.js +22 -22
  27. package/dist/cli-bundle/sdk-query.js +1 -1
  28. package/dist/cli-bundle/sdk-runtime.js +1 -1
  29. package/dist/cli-bundle/sdk-testing.js +1 -1
  30. package/dist/cli-bundle/sdk.js +1 -1
  31. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  32. package/dist/sdk/merge/install.d.ts +2 -2
  33. package/dist/sdk/merge/install.js +1 -1
  34. package/dist/sdk/public-surface.json +1 -1
  35. package/dist/sdk/query/get.d.ts +19 -15
  36. package/dist/sdk/query/get.js +1 -1
  37. package/docs/BOUNDED_CONTEXT_READS.md +10 -7
  38. package/docs/COMMANDS.md +1 -1
  39. package/docs/MERGE_SAFETY.md +12 -6
  40. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
  41. package/marketplace.json +2 -2
  42. package/package.json +1 -1
  43. package/packages/pm-beads/package.json +1 -1
  44. package/packages/pm-calendar/package.json +1 -1
  45. package/packages/pm-command-kit/package.json +1 -1
  46. package/packages/pm-digital-twin/package.json +1 -1
  47. package/packages/pm-governance-audit/package.json +1 -1
  48. package/packages/pm-guide-shell/package.json +1 -1
  49. package/packages/pm-kanban/package.json +1 -1
  50. package/packages/pm-lifecycle-hooks/package.json +1 -1
  51. package/packages/pm-linked-test-adapters/package.json +1 -1
  52. package/packages/pm-search-advanced/package.json +1 -1
  53. package/packages/pm-templates/package.json +1 -1
  54. package/packages/pm-todos/package.json +1 -1
  55. package/packages/pm-vcs/package.json +1 -1
  56. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  57. package/plugins/pm-claude/package.json +2 -2
  58. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  59. package/plugins/pm-codex/package.json +2 -2
  60. package/plugins/pm-codex/plugin.json +1 -1
@@ -3,20 +3,24 @@ import { type ChildRollupContext } from "../item-children.js";
3
3
  import { type ItemScheduleContext } from "../item-schedule.js";
4
4
  import type { ItemMetadata, LinkedDoc, LinkedFile, LinkedTest } from "../../types/index.js";
5
5
  export { GET_DEPTH_VALUES, listGetProjectionFields, } from "./projection-contracts.js";
6
+ /** Latest claim or release coordinate exposed without its mutation patch. */
6
7
  interface ClaimHistoryContext {
7
8
  ts: string;
8
9
  author: string;
9
10
  message: string | null;
10
11
  }
12
+ /** Ownership from the selected item snapshot, accompanied by its latest claim and release events. */
11
13
  interface ClaimStateContext {
12
14
  claimed: boolean;
13
15
  assignee: string | null;
14
16
  last_claim: ClaimHistoryContext | null;
15
17
  last_release: ClaimHistoryContext | null;
16
18
  }
19
+ /** Depth or field-selected metadata; identity survives every projection. */
17
20
  type GetItemProjection = Partial<ItemMetadata> & {
18
21
  /** Canonical item identity retained by every depth and field projection. */
19
22
  id: string;
23
+ /** Item document body, included inside metadata for CLI/list parity. */
20
24
  body?: string;
21
25
  /** Number of notes omitted by a token-bounded projection. */
22
26
  notes_count?: number;
@@ -34,19 +38,19 @@ type GetItemProjection = Partial<ItemMetadata> & {
34
38
  events: number;
35
39
  }>;
36
40
  };
37
- /** Documents the get result payload exchanged by command, SDK, and package integrations. */
41
+ /** Single-item read with optional derived facets; omission materiality is carried separately from its JSON representation. */
38
42
  export interface GetResult {
39
- /** Value that configures or reports item for this contract. */
43
+ /** Selected metadata and body; requested empty collections are represented explicitly. */
40
44
  item: GetItemProjection;
41
- /** Value that configures or reports linked for this contract. */
45
+ /** Requested artifact groups; narrower selectors leave unrequested groups empty. */
42
46
  linked?: {
43
47
  files: LinkedFile[];
44
48
  tests: LinkedTest[];
45
49
  docs: LinkedDoc[];
46
50
  };
47
- /** Value that configures or reports claim state for this contract. */
51
+ /** Ownership evidence for the current or selected historical snapshot. */
48
52
  claim_state?: ClaimStateContext;
49
- /** Value that configures or reports children for this contract. */
53
+ /** Current child rollup for full or explicit child reads and deep container reads; historical hierarchy is not indexed. */
50
54
  children?: ChildRollupContext;
51
55
  /** Normalized scheduling data for scheduled item types and metadata. */
52
56
  schedule?: Partial<ItemScheduleContext>;
@@ -56,7 +60,7 @@ export interface GetResult {
56
60
  as_of_version?: number | null;
57
61
  /** Timestamp of the last history entry included in a reconstructed read. */
58
62
  as_of_timestamp?: string;
59
- /** Value that configures or reports tree for this contract. */
63
+ /** Current descendants selected through registered hierarchy semantics and the optional depth bound. */
60
64
  tree?: {
61
65
  root_id: string;
62
66
  root_title: string | null;
@@ -65,26 +69,26 @@ export interface GetResult {
65
69
  items: Record<string, unknown>[];
66
70
  };
67
71
  }
68
- /** Decide whether a normal read should pay for a workspace-wide child projection. */
72
+ /** Decide which item types receive a child rollup during deep reads. */
69
73
  declare function shouldAutoIncludeGetChildren(itemType: string): boolean;
70
- /** Documents the get options payload exchanged by command, SDK, and package integrations. */
74
+ /** Select item detail and optional hierarchy or verified historical evidence. Incompatible projections fail before serving the item. */
71
75
  export interface GetOptions {
72
- /** Value that configures or reports depth for this contract. */
76
+ /** Detail depth: brief|standard|deep|full. Full includes current children for every type; standard and brief avoid workspace enumeration. */
73
77
  depth?: string;
74
- /** Value that configures or reports fields for this contract. */
78
+ /** Comma-separated metadata or facet selectors, including item-prefixed aliases; identity is always retained. */
75
79
  fields?: string;
76
- /** Value that configures or reports full for this contract. */
80
+ /** Complete item and current child rollup for every type, mutually exclusive with fields/depth. Historical reads retain child recovery because past hierarchy is not indexed. */
77
81
  full?: boolean;
78
- /** Value that configures or reports tree for this contract. */
82
+ /** Include current descendants; cannot be combined with a historical read. */
79
83
  tree?: boolean;
80
- /** Value that configures or reports tree depth for this contract. */
84
+ /** Non-negative descendant depth limit, valid only when tree is enabled. */
81
85
  treeDepth?: string;
82
86
  /** One-based history version or ISO timestamp for a mutation-free read. */
83
87
  at?: string;
84
88
  }
85
- /** Implements run get for the public runtime surface of this module. */
89
+ /** Read one authoritative item and selected facets. Full current reads compute children for every type; ordinary Task reads avoid corpus enumeration. Historical reads exclude current hierarchy, and failed derived usage recording never invalidates the item read. */
86
90
  export declare function runGet(id: string, global: GlobalOptions, options?: GetOptions): Promise<GetResult>;
87
- /** Public contract for test-only get command policy helpers. */
91
+ /** Compatibility access to deep-read container classification; explicit full reads override that classification. */
88
92
  export declare const _testOnlyGetCommand: {
89
93
  shouldAutoIncludeGetChildren: typeof shouldAutoIncludeGetChildren;
90
94
  };
@@ -1,2 +1,2 @@
1
- !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="26bf8487-2515-5885-b6de-56ba6292fb65")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations,toItemRecord,resolveItemTypeRegistry,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,TYPE_TO_FOLDER,PmCliError,buildItemNotFoundError,listAllItemMetadataLight,locateItem,readLocatedItem,getHistoryPath,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{readHistoryEntries}from"../history-read.js";import{renderPmCommand}from"../command-line.js";import{recordContextUsageTouches}from"../context-usage.js";import{buildItemChildrenRollup}from"../item-children.js";import{buildItemSchedule}from"../item-schedule.js";import{getItemAt}from"../history-read.js";import{parseIntegerLimit}from"./parsers.js";import{runList}from"./list.js";import{registerOutputMaterialFieldGroups}from"../output-projection.js";import{GET_DEPTH_VALUES,listGetProjectionFields}from"./projection-contracts.js";import{GET_DEPTH_VALUES as GET_DEPTH_VALUES2,listGetProjectionFields as listGetProjectionFields2}from"./projection-contracts.js";const AUTOMATIC_CHILD_ROLLUP_TYPES=new Set(["epic","feature","milestone","plan"]);const BUILTIN_ITEM_TYPES=new Set(Object.keys(TYPE_TO_FOLDER).map(type=>type.toLowerCase()));function itemCollectionCounts(item){const lengths=Object.fromEntries(["comments","notes","learnings","files","tests","docs","reminders","events"].map(key=>[key,item[key]?.length??0]));return lengths}function itemMaterialFieldGroups(item,body){const collectionCounts=itemCollectionCounts(item);return[...body.length>0?["body"]:[],...Object.entries(collectionCounts).flatMap(([name,count])=>count>0?[name]:[]),...collectionCounts.files+collectionCounts.tests+collectionCounts.docs>0?["linked"]:[],"children",...typeof item.assignee==="string"&&item.assignee.trim().length>0?["claim_state"]:[],...buildItemSchedule(item)?["schedule"]:[]]}function shouldAutoIncludeGetChildren(itemType){const normalizedType=itemType.trim().toLowerCase();return normalizedType.length>0&&(AUTOMATIC_CHILD_ROLLUP_TYPES.has(normalizedType)||!BUILTIN_ITEM_TYPES.has(normalizedType))}function toClaimHistoryContext(entry){return{ts:entry.ts,author:entry.author,message:entry.message??null}}function resolveClaimStateContext(assigneeValue,history){const assignee=assigneeValue?.trim();const normalizedAssignee=assignee&&assignee.length>0?assignee:null;const lastClaim=[...history].reverse().find(entry=>entry.op==="claim");const lastRelease=[...history].reverse().find(entry=>entry.op==="release");return{claimed:normalizedAssignee!==null,assignee:normalizedAssignee,last_claim:lastClaim?toClaimHistoryContext(lastClaim):null,last_release:lastRelease?toClaimHistoryContext(lastRelease):null}}function parseGetDepth(raw){if(raw===void 0||raw.trim().length===0){return"standard"}const normalized=raw.trim().toLowerCase();if(normalized==="full"){return"deep"}if(GET_DEPTH_VALUES.includes(normalized)){return normalized}throw new PmCliError("Get --depth must be one of brief|standard|deep|full",EXIT_CODE.USAGE)}function projectItemForDepth(item,depth){const collectionCounts=itemCollectionCounts(item);if(depth==="deep"){return{...item,comments:item.comments??[],notes:item.notes??[],learnings:item.learnings??[],files:item.files??[],tests:item.tests??[],docs:item.docs??[],reminders:item.reminders??[],events:item.events??[],notes_count:collectionCounts.notes,tests_count:collectionCounts.tests,collection_counts:collectionCounts}}const{comments:_comments,notes:_notes,learnings:_learnings,files:_files,tests:_tests,docs:_docs,reminders:_reminders,events:_events,...projected}=item;return{...projected,notes_count:item.notes?.length??0,tests_count:item.tests?.length??0,collection_counts:collectionCounts}}function parseGetFields(raw){if(raw===void 0){return null}const fields=raw.split(",").map(entry=>entry.trim()).filter(entry=>entry.length>0);if(fields.length===0){throw new PmCliError("Get --fields requires a comma-separated list of field names",EXIT_CODE.USAGE)}return fields}function normalizeGetField(field){return field.startsWith("item.")?field.slice("item.".length):field}function validateGetFields(fields,runtimeMetadataKeys,id){if(fields===null){return}const allowedValues=listGetProjectionFields(runtimeMetadataKeys);const allowed=new Set(allowedValues);const unknown=fields.filter(field=>{const normalized=normalizeGetField(field);return!allowed.has(field)&&!allowed.has(normalized)});if(unknown.length>0){const suggestedRetryArguments=["get",id,"--fields","id,title,status"];throw new PmCliError(`Unknown get --fields value(s): ${unknown.join(", ")}`,EXIT_CODE.USAGE,{code:"unknown_field_projection",examples:["pm get <id> --fields id,title,status,type,updated_at","pm get <id> --fields id,title,claim_state","pm get <id> --fields id,title,body,linked.files"],recovery:{allowed_values:allowedValues,suggested_retry:renderPmCommand(suggestedRetryArguments),suggested_retry_args:suggestedRetryArguments}})}}const EMPTY_PROJECTED_COLLECTION_FIELDS=new Set(["comments","notes","learnings","files","tests","test_runs","docs","reminders","events","dependencies","plan_steps","plan_decisions","plan_discoveries","plan_validation"]);function projectedMetadataValue(source,counts,field){if(Object.hasOwn(counts,field))return counts[field];if(source[field]!==void 0)return source[field];return EMPTY_PROJECTED_COLLECTION_FIELDS.has(field)?[]:void 0}function projectItemForFields(item,fields){const source=toItemRecord(item);const omittedCounts={notes_count:item.notes?.length??0,tests_count:item.tests?.length??0,collection_counts:itemCollectionCounts(item)};const projected={id:item.id};for(const field of fields){const normalized=normalizeGetField(field);if(normalized==="body"||normalized==="linked"||normalized.startsWith("linked.")||normalized==="claim_state"||normalized.startsWith("claim_state.")||normalized==="children"||normalized.startsWith("children.")||normalized==="schedule"||normalized.startsWith("schedule.")){continue}projected[normalized]=projectedMetadataValue(source,omittedCounts,normalized)}return projected}function fieldsInclude(fields,name){return fields?.some(field=>field===name||field===`item.${name}`)??false}function fieldsIncludeRoot(fields,name){return fields.some(field=>{const normalized=normalizeGetField(field);return normalized===name||normalized.startsWith(`${name}.`)})}function resolveGetProjection(options,id){if(options.full&&(options.fields!==void 0||options.depth!==void 0)){throw new PmCliError("Get projection options are mutually exclusive; remove the extra projection flag and retry.",EXIT_CODE.USAGE,{code:"projection_options_mutually_exclusive",recovery:{suggested_retry:renderPmCommand(["get",id,"--full"]),suggested_retry_args:["get",id,"--full"]}})}if(options.tree!==true&&options.treeDepth!==void 0){throw new PmCliError("Get --tree-depth requires --tree",EXIT_CODE.USAGE)}if(options.at!==void 0&&options.tree===true){throw new PmCliError("Get --at cannot be combined with --tree because workspace-level historical projections are not yet indexed.",EXIT_CODE.USAGE)}return{depth:options.full?"deep":parseGetDepth(options.depth),treeDepth:options.tree===true?parseIntegerLimit(options.treeDepth,"--tree-depth"):void 0,fields:parseGetFields(options.fields),fieldProjection:options.fields!==void 0}}async function loadGetItemContext(id,global2,at){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());if(at!==void 0){const historical=await getItemAt(id,at,{pmRoot:global2.path});return{pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,locatedId:historical.document.metadata.id,metadata:historical.document.metadata,body:historical.document.body,historical}}const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located){throw await buildItemNotFoundError(pmRoot,id,settings.id_prefix,typeRegistry.type_to_folder)}const loaded=await readLocatedItem(located,{schema:settings.schema});return{pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,locatedId:located.id,metadata:loaded.document.metadata,body:loaded.document.body}}function validateGetProjectionFields(fields,settings,historical,id){const runtimeMetadataKeys=resolveRuntimeFieldRegistry(settings.schema).definitions.map(field=>field.metadata_key);validateGetFields(fields,runtimeMetadataKeys,id);if(historical&&fieldsIncludeRoot(fields??[],"children")){throw new PmCliError("Get --at cannot project children because workspace-level historical relationships are not yet indexed.",EXIT_CODE.USAGE)}}function shouldIncludeGetField(params){const{fieldProjection,depth,fields,field}=params;if(fieldProjection){if(field==="body"||field==="linked"){return fieldsInclude(fields,field)}return fieldsIncludeRoot(fields,field)}return depth!=="brief"}async function resolveGetClaimState(context,includeClaimState){if(!includeClaimState){return void 0}const historyPath=getHistoryPath(context.pmRoot,context.locatedId);const history=await readHistoryEntries(historyPath,context.locatedId);return resolveClaimStateContext(context.metadata.assignee,context.historical?history.slice(0,context.historical.target.historyIndex+1):history)}function attachGetLinked(result,context,fields,includeLinked){const includeLinkedFiles=includeLinked||fieldsInclude(fields,"linked.files");const includeLinkedTests=includeLinked||fieldsInclude(fields,"linked.tests");const includeLinkedDocs=includeLinked||fieldsInclude(fields,"linked.docs");if(!includeLinked&&!includeLinkedFiles&&!includeLinkedTests&&!includeLinkedDocs){return}result.linked={files:includeLinkedFiles?context.metadata.files??[]:[],tests:includeLinkedTests?context.metadata.tests??[]:[],docs:includeLinkedDocs?context.metadata.docs??[]:[]}}async function buildGetChildrenRollup(context,includeChildren){if(!includeChildren){return void 0}const statusRegistry=resolveRuntimeStatusRegistry(context.settings.schema);const corpus=await listAllItemMetadataLight(context.pmRoot,context.settings.item_format,context.typeToFolder,void 0,context.settings.schema);return buildItemChildrenRollup(context.locatedId,corpus,statusRegistry)}function attachGetSchedule(result,context,fields,includeSchedule){if(!includeSchedule){return}const schedule=buildItemSchedule(context.metadata);if(!schedule){return}if(fields===null||fieldsInclude(fields,"schedule")){result.schedule=schedule;return}result.schedule=Object.fromEntries(Object.entries(schedule).filter(([key])=>fields.some(field=>normalizeGetField(field)===`schedule.${key}`)))}async function buildGetTree(context,options,treeDepth,global2){if(options.tree!==true){return void 0}const subtree=await runList(void 0,{parent:context.locatedId,tree:true,treeDepth:treeDepth===void 0?void 0:String(treeDepth),full:true},global2);return{root_id:context.locatedId,root_title:context.metadata.title,depth_limit:treeDepth??null,count:subtree.count,items:subtree.items.map(entry=>toItemRecord(entry))}}async function runGet(id,global2,options={}){const projection=resolveGetProjection(options,id);const context=await loadGetItemContext(id,global2,options.at);validateGetProjectionFields(projection.fields,context.settings,context.historical!==void 0,context.locatedId);const includeBody=shouldIncludeGetField({...projection,field:"body"});const includeLinked=shouldIncludeGetField({...projection,field:"linked"});const includeClaimState=shouldIncludeGetField({...projection,field:"claim_state"});const includeChildren=context.historical===void 0&&(projection.fieldProjection?fieldsIncludeRoot(projection.fields,"children"):projection.depth==="deep"&&shouldAutoIncludeGetChildren(context.metadata.type));const includeSchedule=projection.fieldProjection?fieldsIncludeRoot(projection.fields,"schedule"):projection.depth!=="brief";const claimState=await resolveGetClaimState(context,includeClaimState);const result={item:projection.fieldProjection?projectItemForFields(context.metadata,projection.fields):projectItemForDepth(context.metadata,projection.depth)};if(includeBody){result.item.body=context.body}attachGetLinked(result,context,projection.fields,includeLinked);if(claimState){result.claim_state=claimState}attachGetSchedule(result,context,projection.fields,includeSchedule);const children=await buildGetChildrenRollup(context,includeChildren);if(children!==void 0){result.children=children}const tree=await buildGetTree(context,options,projection.treeDepth,global2);if(tree!==void 0){result.tree=tree}if(context.historical){result.reconstructed=true;result.as_of_version=context.historical.as_of_version;result.as_of_timestamp=context.historical.as_of_timestamp}if(context.historical===void 0){try{await recordContextUsageTouches({pmRoot:context.pmRoot,author:resolveAuthor(void 0,context.settings.author_default),itemIds:[context.locatedId],intent:"get"})}catch{}}registerOutputMaterialFieldGroups(result,itemMaterialFieldGroups(context.metadata,context.body));return result}const _testOnlyGetCommand={shouldAutoIncludeGetChildren};export{GET_DEPTH_VALUES2 as GET_DEPTH_VALUES,_testOnlyGetCommand,listGetProjectionFields2 as listGetProjectionFields,runGet};
1
+ !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4f77ad73-bb93-5b04-b33b-c0666e55f83a")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations,toItemRecord,resolveItemTypeRegistry,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,TYPE_TO_FOLDER,PmCliError,buildItemNotFoundError,listAllItemMetadataLight,locateItem,readLocatedItem,getHistoryPath,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{readHistoryEntries}from"../history-read.js";import{renderPmCommand}from"../command-line.js";import{recordContextUsageTouches}from"../context-usage.js";import{buildItemChildrenRollup}from"../item-children.js";import{buildItemSchedule}from"../item-schedule.js";import{getItemAt}from"../history-read.js";import{parseIntegerLimit}from"./parsers.js";import{runList}from"./list.js";import{registerOutputMaterialFieldGroups}from"../output-projection.js";import{GET_DEPTH_VALUES,listGetProjectionFields}from"./projection-contracts.js";import{GET_DEPTH_VALUES as GET_DEPTH_VALUES2,listGetProjectionFields as listGetProjectionFields2}from"./projection-contracts.js";const AUTOMATIC_CHILD_ROLLUP_TYPES=new Set(["epic","feature","milestone","plan"]);const BUILTIN_ITEM_TYPES=new Set(Object.keys(TYPE_TO_FOLDER).map(type=>type.toLowerCase()));function itemCollectionCounts(item){const lengths=Object.fromEntries(["comments","notes","learnings","files","tests","docs","reminders","events"].map(key=>[key,item[key]?.length??0]));return lengths}function itemMaterialFieldGroups(item,body,children){const collectionCounts=itemCollectionCounts(item);return[...body.length>0?["body"]:[],...Object.entries(collectionCounts).flatMap(([name,count])=>count>0?[name]:[]),...collectionCounts.files+collectionCounts.tests+collectionCounts.docs>0?["linked"]:[],...children===void 0?["children"]:children.count>0?["children"]:[],...typeof item.assignee==="string"&&item.assignee.trim().length>0?["claim_state"]:[],...buildItemSchedule(item)?["schedule"]:[]]}function shouldAutoIncludeGetChildren(itemType){const normalizedType=itemType.trim().toLowerCase();return normalizedType.length>0&&(AUTOMATIC_CHILD_ROLLUP_TYPES.has(normalizedType)||!BUILTIN_ITEM_TYPES.has(normalizedType))}function toClaimHistoryContext(entry){return{ts:entry.ts,author:entry.author,message:entry.message??null}}function resolveClaimStateContext(assigneeValue,history){const assignee=assigneeValue?.trim();const normalizedAssignee=assignee&&assignee.length>0?assignee:null;const lastClaim=[...history].reverse().find(entry=>entry.op==="claim");const lastRelease=[...history].reverse().find(entry=>entry.op==="release");return{claimed:normalizedAssignee!==null,assignee:normalizedAssignee,last_claim:lastClaim?toClaimHistoryContext(lastClaim):null,last_release:lastRelease?toClaimHistoryContext(lastRelease):null}}function parseGetDepth(raw){if(raw===void 0||raw.trim().length===0){return"standard"}const normalized=raw.trim().toLowerCase();if(normalized==="full"){return"deep"}if(GET_DEPTH_VALUES.includes(normalized)){return normalized}throw new PmCliError("Get --depth must be one of brief|standard|deep|full",EXIT_CODE.USAGE)}function projectItemForDepth(item,depth){const collectionCounts=itemCollectionCounts(item);if(depth==="deep"){return{...item,comments:item.comments??[],notes:item.notes??[],learnings:item.learnings??[],files:item.files??[],tests:item.tests??[],docs:item.docs??[],reminders:item.reminders??[],events:item.events??[],notes_count:collectionCounts.notes,tests_count:collectionCounts.tests,collection_counts:collectionCounts}}const{comments:_comments,notes:_notes,learnings:_learnings,files:_files,tests:_tests,docs:_docs,reminders:_reminders,events:_events,...projected}=item;return{...projected,notes_count:item.notes?.length??0,tests_count:item.tests?.length??0,collection_counts:collectionCounts}}function parseGetFields(raw){if(raw===void 0){return null}const fields=raw.split(",").map(entry=>entry.trim()).filter(entry=>entry.length>0);if(fields.length===0){throw new PmCliError("Get --fields requires a comma-separated list of field names",EXIT_CODE.USAGE)}return fields}function normalizeGetField(field){return field.startsWith("item.")?field.slice("item.".length):field}function validateGetFields(fields,runtimeMetadataKeys,id){if(fields===null){return}const allowedValues=listGetProjectionFields(runtimeMetadataKeys);const allowed=new Set(allowedValues);const unknown=fields.filter(field=>{const normalized=normalizeGetField(field);return!allowed.has(field)&&!allowed.has(normalized)});if(unknown.length>0){const suggestedRetryArguments=["get",id,"--fields","id,title,status"];throw new PmCliError(`Unknown get --fields value(s): ${unknown.join(", ")}`,EXIT_CODE.USAGE,{code:"unknown_field_projection",examples:["pm get <id> --fields id,title,status,type,updated_at","pm get <id> --fields id,title,claim_state","pm get <id> --fields id,title,body,linked.files"],recovery:{allowed_values:allowedValues,suggested_retry:renderPmCommand(suggestedRetryArguments),suggested_retry_args:suggestedRetryArguments}})}}const EMPTY_PROJECTED_COLLECTION_FIELDS=new Set(["comments","notes","learnings","files","tests","test_runs","docs","reminders","events","dependencies","plan_steps","plan_decisions","plan_discoveries","plan_validation"]);function projectedMetadataValue(source,counts,field){if(Object.hasOwn(counts,field))return counts[field];if(source[field]!==void 0)return source[field];return EMPTY_PROJECTED_COLLECTION_FIELDS.has(field)?[]:void 0}function projectItemForFields(item,fields){const source=toItemRecord(item);const omittedCounts={notes_count:item.notes?.length??0,tests_count:item.tests?.length??0,collection_counts:itemCollectionCounts(item)};const projected={id:item.id};for(const field of fields){const normalized=normalizeGetField(field);if(normalized==="body"||normalized==="linked"||normalized.startsWith("linked.")||normalized==="claim_state"||normalized.startsWith("claim_state.")||normalized==="children"||normalized.startsWith("children.")||normalized==="schedule"||normalized.startsWith("schedule.")){continue}projected[normalized]=projectedMetadataValue(source,omittedCounts,normalized)}return projected}function fieldsInclude(fields,name){return fields?.some(field=>field===name||field===`item.${name}`)??false}function fieldsIncludeRoot(fields,name){return fields.some(field=>{const normalized=normalizeGetField(field);return normalized===name||normalized.startsWith(`${name}.`)})}function resolveGetProjection(options,id){if(options.full&&(options.fields!==void 0||options.depth!==void 0)){throw new PmCliError("Get projection options are mutually exclusive; remove the extra projection flag and retry.",EXIT_CODE.USAGE,{code:"projection_options_mutually_exclusive",recovery:{suggested_retry:renderPmCommand(["get",id,"--full"]),suggested_retry_args:["get",id,"--full"]}})}if(options.tree!==true&&options.treeDepth!==void 0){throw new PmCliError("Get --tree-depth requires --tree",EXIT_CODE.USAGE)}if(options.at!==void 0&&options.tree===true){throw new PmCliError("Get --at cannot be combined with --tree because workspace-level historical projections are not yet indexed.",EXIT_CODE.USAGE)}return{depth:options.full?"deep":parseGetDepth(options.depth),full:options.full===true||options.depth?.trim().toLowerCase()==="full",treeDepth:options.tree===true?parseIntegerLimit(options.treeDepth,"--tree-depth"):void 0,fields:parseGetFields(options.fields),fieldProjection:options.fields!==void 0}}async function loadGetItemContext(id,global2,at){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());if(at!==void 0){const historical=await getItemAt(id,at,{pmRoot:global2.path});return{pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,locatedId:historical.document.metadata.id,metadata:historical.document.metadata,body:historical.document.body,historical}}const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located){throw await buildItemNotFoundError(pmRoot,id,settings.id_prefix,typeRegistry.type_to_folder)}const loaded=await readLocatedItem(located,{schema:settings.schema});return{pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,locatedId:located.id,metadata:loaded.document.metadata,body:loaded.document.body}}function validateGetProjectionFields(fields,settings,historical,id){const runtimeMetadataKeys=resolveRuntimeFieldRegistry(settings.schema).definitions.map(field=>field.metadata_key);validateGetFields(fields,runtimeMetadataKeys,id);if(historical&&fieldsIncludeRoot(fields??[],"children")){throw new PmCliError("Get --at cannot project children because workspace-level historical relationships are not yet indexed.",EXIT_CODE.USAGE)}}function shouldIncludeGetField(params){const{fieldProjection,depth,fields,field}=params;if(fieldProjection){if(field==="body"||field==="linked"){return fieldsInclude(fields,field)}return fieldsIncludeRoot(fields,field)}return depth!=="brief"}async function resolveGetClaimState(context,includeClaimState){if(!includeClaimState){return void 0}const historyPath=getHistoryPath(context.pmRoot,context.locatedId);const history=await readHistoryEntries(historyPath,context.locatedId);return resolveClaimStateContext(context.metadata.assignee,context.historical?history.slice(0,context.historical.target.historyIndex+1):history)}function attachGetLinked(result,context,fields,includeLinked){const includeLinkedFiles=includeLinked||fieldsInclude(fields,"linked.files");const includeLinkedTests=includeLinked||fieldsInclude(fields,"linked.tests");const includeLinkedDocs=includeLinked||fieldsInclude(fields,"linked.docs");if(!includeLinked&&!includeLinkedFiles&&!includeLinkedTests&&!includeLinkedDocs){return}result.linked={files:includeLinkedFiles?context.metadata.files??[]:[],tests:includeLinkedTests?context.metadata.tests??[]:[],docs:includeLinkedDocs?context.metadata.docs??[]:[]}}async function buildGetChildrenRollup(context,includeChildren){if(!includeChildren){return void 0}const statusRegistry=resolveRuntimeStatusRegistry(context.settings.schema);const corpus=await listAllItemMetadataLight(context.pmRoot,context.settings.item_format,context.typeToFolder,void 0,context.settings.schema);return buildItemChildrenRollup(context.locatedId,corpus,statusRegistry)}function attachGetSchedule(result,context,fields,includeSchedule){if(!includeSchedule){return}const schedule=buildItemSchedule(context.metadata);if(!schedule){return}if(fields===null||fieldsInclude(fields,"schedule")){result.schedule=schedule;return}result.schedule=Object.fromEntries(Object.entries(schedule).filter(([key])=>fields.some(field=>normalizeGetField(field)===`schedule.${key}`)))}async function buildGetTree(context,options,treeDepth,global2){if(options.tree!==true){return void 0}const subtree=await runList(void 0,{parent:context.locatedId,tree:true,treeDepth:treeDepth===void 0?void 0:String(treeDepth),full:true},global2);return{root_id:context.locatedId,root_title:context.metadata.title,depth_limit:treeDepth??null,count:subtree.count,items:subtree.items.map(entry=>toItemRecord(entry))}}async function runGet(id,global2,options={}){const projection=resolveGetProjection(options,id);const context=await loadGetItemContext(id,global2,options.at);validateGetProjectionFields(projection.fields,context.settings,context.historical!==void 0,context.locatedId);const includeBody=shouldIncludeGetField({...projection,field:"body"});const includeLinked=shouldIncludeGetField({...projection,field:"linked"});const includeClaimState=shouldIncludeGetField({...projection,field:"claim_state"});const includeChildren=context.historical===void 0&&(projection.fieldProjection?fieldsIncludeRoot(projection.fields,"children"):projection.depth==="deep"&&(projection.full||shouldAutoIncludeGetChildren(context.metadata.type)));const includeSchedule=projection.fieldProjection?fieldsIncludeRoot(projection.fields,"schedule"):projection.depth!=="brief";const claimState=await resolveGetClaimState(context,includeClaimState);const result={item:projection.fieldProjection?projectItemForFields(context.metadata,projection.fields):projectItemForDepth(context.metadata,projection.depth)};if(includeBody){result.item.body=context.body}attachGetLinked(result,context,projection.fields,includeLinked);if(claimState){result.claim_state=claimState}attachGetSchedule(result,context,projection.fields,includeSchedule);const children=await buildGetChildrenRollup(context,includeChildren);if(children!==void 0){result.children=children}const tree=await buildGetTree(context,options,projection.treeDepth,global2);if(tree!==void 0){result.tree=tree}if(context.historical){result.reconstructed=true;result.as_of_version=context.historical.as_of_version;result.as_of_timestamp=context.historical.as_of_timestamp}if(context.historical===void 0){try{await recordContextUsageTouches({pmRoot:context.pmRoot,author:resolveAuthor(void 0,context.settings.author_default),itemIds:[context.locatedId],intent:"get"})}catch{}}registerOutputMaterialFieldGroups(result,itemMaterialFieldGroups(context.metadata,context.body,children));return result}const _testOnlyGetCommand={shouldAutoIncludeGetChildren};export{GET_DEPTH_VALUES2 as GET_DEPTH_VALUES,_testOnlyGetCommand,listGetProjectionFields2 as listGetProjectionFields,runGet};
2
2
  //# sourceMappingURL=get.js.map
@@ -4,8 +4,9 @@ Tracked by [pm-pshhry](../.agents/pm/issues/pm-pshhry.toon),
4
4
  [pm-ydshl9](../.agents/pm/issues/pm-ydshl9.toon),
5
5
  [pm-bab3gb](../.agents/pm/issues/pm-bab3gb.toon),
6
6
  [pm-fx80w2](../.agents/pm/issues/pm-fx80w2.toon),
7
- [pm-gtw5zh](../.agents/pm/issues/pm-gtw5zh.toon), and
8
- [pm-s8ybl9](../.agents/pm/issues/pm-s8ybl9.toon).
7
+ [pm-gtw5zh](../.agents/pm/issues/pm-gtw5zh.toon),
8
+ [pm-s8ybl9](../.agents/pm/issues/pm-s8ybl9.toon), and
9
+ [pm-x8jdt8](../.agents/pm/issues/pm-x8jdt8.toon).
9
10
 
10
11
  Project management is context management. Routine reads should pay for the
11
12
  requested evidence, and derived feedback should not grow with every candidate
@@ -21,12 +22,14 @@ The cost still depends on the addressed record, registered type directories,
21
22
  and extension activation; this is not a constant-latency guarantee for arbitrary
22
23
  extensions or unbounded individual history streams.
23
24
 
24
- Request hierarchy work explicitly with `--fields id,children`, `--tree`, or a
25
- deep/full container read. These paths preserve registered hierarchy semantics,
25
+ Request hierarchy work explicitly with `--fields id,children`, `--tree`, a
26
+ deep read of a container or custom type, or a full read of any type. These
27
+ paths preserve registered hierarchy semantics,
26
28
  including inverse and custom relationship kinds, rather than treating only the
27
- scalar `parent` field as authoritative. An omitted `children` facet carries a
28
- restore selector in the omission receipt. Explicit deep/full and child-field
29
- projections retain a zero-count rollup for an empty container.
29
+ scalar `parent` field as authoritative. An uncomputed `children` facet carries a
30
+ restore selector in the omission receipt even for Task items, which may have
31
+ children. Explicit full and child-field projections retain a zero-count rollup
32
+ for an empty item; a deep container read does the same.
30
33
 
31
34
  Caller-carried output sessions retain only portable item identities in
32
35
  `next_state.seen_item_ids`. Workspace activity such as `_workspace` remains
package/docs/COMMANDS.md CHANGED
@@ -184,7 +184,7 @@ As a read-only structured surface, `duplicates` accepts the universal output
184
184
  controls, including `--output-format json`, `--lean`, projection/amount
185
185
  controls, and token accounting, while its default TOON output remains bounded.
186
186
  Tracked by [pm-gh1076](../.agents/pm/issues/pm-gh1076.toon).
187
- Use `pm get <id>` to read a single item by ID — the single-item read primitive used throughout the agent loop. It accepts `--fields <list>` and `--depth brief|standard|deep|full` for token-minimal projections, and `--tree`/`--tree-depth <n>` to include descendants. The universal `--output-include` selector can request stored collections directly, for example `pm get <id> --output-include comments,learnings,tests`; the same bare and `item.<field>` grammar works through CLI, SDK, and MCP transports. Standard/deep reads expose a normalized `schedule` facet (`deadline`, `start_at`, `end_at`, `location`, reminders, and events) when scheduling metadata exists. Standard reads of every item type avoid a workspace child scan. For container-oriented built-ins (Epic, Feature, Milestone, and Plan) and custom types, `--depth deep|full` adds type-agnostic child counts, a bounded sample, and continuation metadata. An explicit `--fields id,children` requests that rollup for any type. See [bounded context reads](BOUNDED_CONTEXT_READS.md) for the cost contract. `pm get <id> --json` returns the `body` inside the `item` object (`.item.body`); see [Full results, totals, and bodies](#full-results-totals-and-bodies). To duplicate an existing item as a starting point, `pm copy <id> --title "New title"` clones it into a fresh id with lifecycle fields reset.
187
+ Use `pm get <id>` to read a single item by ID — the single-item read primitive used throughout the agent loop. It accepts `--fields <list>` and `--depth brief|standard|deep|full` for token-minimal projections, and `--tree`/`--tree-depth <n>` to include descendants. The universal `--output-include` selector can request stored collections directly, for example `pm get <id> --output-include comments,learnings,tests`; the same bare and `item.<field>` grammar works through CLI, SDK, and MCP transports. Standard/deep reads expose a normalized `schedule` facet (`deadline`, `start_at`, `end_at`, `location`, reminders, and events) when scheduling metadata exists. Standard reads of every item type avoid a workspace child scan. For container-oriented built-ins (Epic, Feature, Milestone, and Plan) and custom types, `--depth deep` adds type-agnostic child counts, a bounded sample, and continuation metadata. Explicit `--full` and `--depth full` reads compute that rollup for every type, including Task parents. An explicit `--fields id,children` requests that rollup without the other deep fields. A read without a child rollup retains a `children` omission hint until a rollup proves the item has no children. See [bounded context reads](BOUNDED_CONTEXT_READS.md) for the cost contract. `pm get <id> --json` returns the `body` inside the `item` object (`.item.body`); see [Full results, totals, and bodies](#full-results-totals-and-bodies). To duplicate an existing item as a starting point, `pm copy <id> --title "New title"` clones it into a fresh id with lifecycle fields reset.
188
188
 
189
189
  When the strongest duplicate match is terminal because the same work recurred,
190
190
  reuse its lineage instead of creating or copying another item:
@@ -14,7 +14,9 @@ compatibility is tracked by
14
14
  Lossless concurrent acceptance-criteria composition is tracked by
15
15
  [pm-inn5y5](../.agents/pm/issues/pm-inn5y5.toon).
16
16
  The Bun launcher and strict-health repair are tracked by
17
- [pm-vks66s](../.agents/pm/issues/pm-vks66s.toon).
17
+ [pm-vks66s](../.agents/pm/issues/pm-vks66s.toon), with the Bun 1.3.5
18
+ package-runner recurrence tracked by
19
+ [pm-aaxq4n](../.agents/pm/issues/pm-aaxq4n.toon).
18
20
  Recency-aware scalar convergence, bounded fresh-clone decision evidence, and
19
21
  audited pre-durable receipt dispositions are tracked by
20
22
  [pm-7wzb6d](../.agents/pm/issues/pm-7wzb6d.toon),
@@ -44,11 +46,15 @@ The clone-local driver values record the absolute runtime launcher and bundled
44
46
  `dist/cli.js` path resolved by the installing SDK. With Node, the installer
45
47
  preserves an absolute PATH symlink when it resolves to the executing runtime, so
46
48
  a runtime manager can retarget that launcher during upgrades without breaking
47
- every clone. With Bun, it resolves an executable `bun` on an absolute PATH entry,
48
- checks that its version matches the running Bun version, and records its stable
49
- absolute target. Relative PATH entries, inaccessible launchers, and different
50
- runtimes are ignored; without a matching launcher, the installer retains the
51
- executing binary path.
49
+ every clone. With Bun, the installer checks the absolute executable published
50
+ by the package runner, absolute `PATH` entries, and the directly invoked binary
51
+ for a matching Bun version, then records its stable target. Known temporary
52
+ `bun-node-*` launcher copies are rejected even when their version matches.
53
+ Relative paths, inaccessible launchers, and
54
+ different runtimes are ignored. If no durable matching Bun launcher is available,
55
+ installation fails with recovery guidance before it writes Git configuration or
56
+ the shared fence; a temporary `bunx` runtime is never recorded as a successful
57
+ driver installation.
52
58
  Git therefore does not depend
53
59
  on a bare `pm` command or the caller's later `PATH` when it merges tracker data.
54
60
  The item-path placeholder is stored as bare `%P`: Git performs the required
@@ -4,12 +4,12 @@ Tracker: `pm-f05lsg`.
4
4
 
5
5
  Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval.
6
6
 
7
- - Catalog error codes: 390
7
+ - Catalog error codes: 391
8
8
  - Executable error codes: 19
9
9
  - Executable-code ratchet floor: 18
10
10
  - Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand`
11
- - Uncovered error codes: 371
12
- - Coverage fraction: 0.048718
11
+ - Uncovered error codes: 372
12
+ - Coverage fraction: 0.048593
13
13
  - Closed-domain probes: 19
14
14
  - Grammar probes: 117
15
15
 
@@ -200,6 +200,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
200
200
  | `mcp_annotation_file_unavailable` | `mcp_annotation_file_unavailable` | uncovered | none | 0 |
201
201
  | `mcp_stdin_unavailable` | `mcp_stdin_unavailable` | uncovered | none | 0 |
202
202
  | `mcp_task_not_found_or_not_authorized` | `mcp_task_not_found_or_not_authorized` | uncovered | none | 0 |
203
+ | `merge_bun_launcher_unavailable` | `merge_bun_launcher_unavailable` | uncovered | none | 0 |
203
204
  | `merge_conflict_markers_detected` | `merge_conflict_markers_detected` | uncovered | none | 0 |
204
205
  | `merge_decisions_unreviewed` | `merge_decisions_unreviewed` | uncovered | none | 0 |
205
206
  | `merge_driver_configuration_drift` | `merge_driver_configuration_drift` | uncovered | none | 0 |
package/marketplace.json CHANGED
@@ -5,13 +5,13 @@
5
5
  "url": "https://github.com/unbraind/pm-cli"
6
6
  },
7
7
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
8
- "version": "2026.9.30",
8
+ "version": "2026.10.1",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "pm-claude",
12
12
  "source": "./plugins/pm-claude",
13
13
  "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.",
14
- "version": "2026.9.30",
14
+ "version": "2026.10.1",
15
15
  "author": {
16
16
  "name": "unbrained",
17
17
  "url": "https://github.com/unbraind/pm-cli"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-cli",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for importing Beads JSONL records.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-calendar",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for calendar and agenda views.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-command-kit",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-digital-twin",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
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.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-governance-audit",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for governance audit and normalization workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-guide-shell",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for guide and shell completion workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-kanban",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-lifecycle-hooks",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package demonstrating safe lifecycle hook registration.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-linked-test-adapters",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for optional linked-test run management adapters and reporters.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-search-advanced",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for semantic, hybrid, and reindex search workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-templates",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for reusable create templates.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-todos",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for Todo markdown import and export.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-vcs-sdk-exemplar",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Beyond-PM exemplar: a VCS-style changeset workflow built entirely on public pm SDK and extension primitives.",
@@ -3,7 +3,7 @@
3
3
  "name": "pm-claude",
4
4
  "displayName": "pm CLI",
5
5
  "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.",
6
- "version": "2026.9.30",
6
+ "version": "2026.10.1",
7
7
  "author": {
8
8
  "name": "unbrained",
9
9
  "url": "https://github.com/unbraind/pm-cli"
@@ -2,8 +2,8 @@
2
2
  "name": "pm-claude-runtime",
3
3
  "private": true,
4
4
  "type": "module",
5
- "version": "2026.9.30",
5
+ "version": "2026.10.1",
6
6
  "dependencies": {
7
- "@unbrained/pm-cli": "2026.9.30"
7
+ "@unbrained/pm-cli": "2026.10.1"
8
8
  }
9
9
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-codex",
3
- "version": "2026.9.30",
3
+ "version": "2026.10.1",
4
4
  "description": "Native Codex integration for pm-cli with bundled MCP tools, skills, commands, and agent workflows.",
5
5
  "author": {
6
6
  "name": "unbrained",
@@ -2,8 +2,8 @@
2
2
  "name": "pm-codex-runtime",
3
3
  "private": true,
4
4
  "type": "module",
5
- "version": "2026.9.30",
5
+ "version": "2026.10.1",
6
6
  "dependencies": {
7
- "@unbrained/pm-cli": "2026.9.30"
7
+ "@unbrained/pm-cli": "2026.10.1"
8
8
  }
9
9
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "pm-codex",
4
- "version": "2026.9.30",
4
+ "version": "2026.10.1",
5
5
  "description": "Repository-native project context workflows and a version-pinned pm MCP server for Codex.",
6
6
  "author": {
7
7
  "name": "unbrained",