@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +12 -0
- package/dist/cli/register-list-query.d.ts +8 -5
- package/dist/cli/register-list-query.js +2 -2
- package/dist/cli-bundle/bundle-manifest.json +82 -82
- package/dist/cli-bundle/chunks/{chunk-6XTJLOKW.js → chunk-7E2EBJLY.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-O23CQ5T4.js → chunk-A2UPOCSW.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-BTCE36JS.js → chunk-AYHLUJKD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6YEET7XI.js → chunk-DGOIXJZJ.js} +42 -42
- package/dist/cli-bundle/chunks/{chunk-BX4LEJX4.js → chunk-HGJLVN56.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-A6NDNRCK.js → chunk-JAVO3Z42.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EGAIIWI3.js → chunk-SCZMJ5DC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FYTXVVZG.js → chunk-TV3YDE36.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XRN3JYNN.js → chunk-VWVFKPLX.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-SYNBVMNG.js → register-list-query-L6HAHW7V.js} +6 -6
- package/dist/cli-bundle/chunks/{register-mutation-4GSUK23D.js → register-mutation-6OCZVTW5.js} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-7FCJUC4Z.js → register-operations-3E5U4TOE.js} +2 -2
- package/dist/cli-bundle/chunks/{register-setup-YTWW2KL5.js → register-setup-VUD37N4A.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-KZULQIAG.js → chunk-6275G2AN.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-EFD4ATS7.js → chunk-DJPP2HAK.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-AKB3JN57.js → chunk-YBQ27KG7.js} +45 -45
- package/dist/cli-bundle/main.js +2 -2
- package/dist/cli-bundle/sdk-contracts.js +1 -1
- package/dist/cli-bundle/sdk-core.js +1 -1
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +22 -22
- 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 +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/merge/install.d.ts +2 -2
- package/dist/sdk/merge/install.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/get.d.ts +19 -15
- package/dist/sdk/query/get.js +1 -1
- package/docs/BOUNDED_CONTEXT_READS.md +10 -7
- package/docs/COMMANDS.md +1 -1
- package/docs/MERGE_SAFETY.md +12 -6
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
- package/marketplace.json +2 -2
- 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 +2 -2
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +2 -2
- package/plugins/pm-codex/plugin.json +1 -1
package/dist/sdk/query/get.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
41
|
+
/** Single-item read with optional derived facets; omission materiality is carried separately from its JSON representation. */
|
|
38
42
|
export interface GetResult {
|
|
39
|
-
/**
|
|
43
|
+
/** Selected metadata and body; requested empty collections are represented explicitly. */
|
|
40
44
|
item: GetItemProjection;
|
|
41
|
-
/**
|
|
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
|
-
/**
|
|
51
|
+
/** Ownership evidence for the current or selected historical snapshot. */
|
|
48
52
|
claim_state?: ClaimStateContext;
|
|
49
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
72
|
+
/** Decide which item types receive a child rollup during deep reads. */
|
|
69
73
|
declare function shouldAutoIncludeGetChildren(itemType: string): boolean;
|
|
70
|
-
/**
|
|
74
|
+
/** Select item detail and optional hierarchy or verified historical evidence. Incompatible projections fail before serving the item. */
|
|
71
75
|
export interface GetOptions {
|
|
72
|
-
/**
|
|
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
|
-
/**
|
|
78
|
+
/** Comma-separated metadata or facet selectors, including item-prefixed aliases; identity is always retained. */
|
|
75
79
|
fields?: string;
|
|
76
|
-
/**
|
|
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
|
-
/**
|
|
82
|
+
/** Include current descendants; cannot be combined with a historical read. */
|
|
79
83
|
tree?: boolean;
|
|
80
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
};
|
package/dist/sdk/query/get.js
CHANGED
|
@@ -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),
|
|
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`,
|
|
25
|
-
deep
|
|
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
|
|
28
|
-
restore selector in the omission receipt
|
|
29
|
-
projections retain a zero-count rollup
|
|
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
|
|
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:
|
package/docs/MERGE_SAFETY.md
CHANGED
|
@@ -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,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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:
|
|
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:
|
|
12
|
-
- Coverage fraction: 0.
|
|
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.
|
|
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.
|
|
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-digital-twin",
|
|
3
|
-
"version": "2026.
|
|
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.",
|
|
@@ -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.
|
|
6
|
+
"version": "2026.10.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "unbrained",
|
|
9
9
|
"url": "https://github.com/unbraind/pm-cli"
|
|
@@ -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.
|
|
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",
|