@unbrained/pm-cli 2026.11.3 → 2026.11.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +10 -0
- package/dist/cli/error-guidance.d.ts +14 -35
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli/expected-revisions.d.ts +55 -0
- package/dist/cli/expected-revisions.js +2 -0
- package/dist/cli/main.js +2 -2
- package/dist/cli/runtime/invocation-options.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/{chunk-UYNMKUGA.js → chunk-2GW662DP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-32BCU6HN.js → chunk-3OXQGGRD.js} +46 -46
- package/dist/cli-bundle/chunks/chunk-5BVZ32G7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-5S6RT5LX.js +9 -0
- package/dist/cli-bundle/chunks/chunk-5Z6LWFDL.js +31 -0
- package/dist/cli-bundle/chunks/{chunk-MQJXZX3Q.js → chunk-6T2V3UIK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5JZMF4M5.js → chunk-7PGNAHNW.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-7RCI7AAA.js +20 -0
- package/dist/cli-bundle/chunks/chunk-AQ5UHHQS.js +2 -0
- package/dist/cli-bundle/chunks/chunk-BK2XAQVC.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-TZ3D3DPQ.js → chunk-BRIPGUAO.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-BWAXA6S4.js +6 -0
- package/dist/cli-bundle/chunks/{chunk-5IPXDZKU.js → chunk-CERNIZLB.js} +66 -66
- package/dist/cli-bundle/chunks/chunk-DSCFJTHB.js +122 -0
- package/dist/cli-bundle/chunks/{chunk-JPKIUWLG.js → chunk-L4BKTPJ6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-Y7H55PCY.js → chunk-NPEDFOVQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-2CBHQXYJ.js → chunk-ODMJ3HIB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-DEJHTFEF.js → chunk-QN7VCOUU.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-QQHMNUZT.js +2 -0
- package/dist/cli-bundle/chunks/chunk-SRDO2NJU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-T56MB6SF.js +2 -0
- package/dist/cli-bundle/chunks/chunk-TX2W6G37.js +3 -0
- package/dist/cli-bundle/chunks/item-revision-UAZOBP2Q.js +2 -0
- package/dist/cli-bundle/chunks/item-transaction-N5F4LXYV.js +2 -0
- package/dist/cli-bundle/chunks/mutation-admission-QZQI2NN5.js +2 -0
- package/dist/cli-bundle/chunks/{register-list-query-I6AZA3IX.js → register-list-query-P3NOKQUA.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-3DAXCLXR.js → register-mutation-A6I5K5N6.js} +2 -2
- package/dist/cli-bundle/chunks/register-operations-SPKB3TNM.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-ZZRHJ4IS.js +2 -0
- package/dist/cli-bundle/chunks/{stage-7H36OTDJ.js → stage-L3T725DS.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-5NGNO54M.js +44 -0
- package/dist/cli-bundle/focused-chunks/{chunk-ZQRCVRGS.js → chunk-A2246ZM7.js} +54 -54
- package/dist/cli-bundle/focused-chunks/chunk-B6U44WPW.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-BAW3DGQO.js +91 -0
- package/dist/cli-bundle/focused-chunks/chunk-BHNY3KPJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-C3O6JJPO.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LKN2WGGB.js → chunk-C7UX2ZI3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-YVLAP3BL.js → chunk-CBG67HUP.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-TYHDZUL4.js → chunk-CO2DNPH7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-CXTDEQ3N.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-FEPE2CE4.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RY4QEMAE.js → chunk-FFO7RBLN.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-I5FODKYB.js → chunk-FXFDVM5O.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-I5LGPUWH.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-J3YOATXR.js +80 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HOXIIZEO.js → chunk-J6FDCAMH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-J7M52SCZ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-JQS7TYQ6.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-MEJKELWC.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-PMKR4MJI.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-PNPYQDHU.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-Q4OIRSKL.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-F3X6UWMI.js → chunk-QEVJ3Y67.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-HJ27QLZV.js → chunk-SDLIUZEL.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-TFYTTDAK.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-W3CSX6GI.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-D4XQOMG4.js → chunk-Y5GOUUYJ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/item-revision-L6GVT42D.js +2 -0
- package/dist/cli-bundle/focused-chunks/item-transaction-GYGP264N.js +2 -0
- package/dist/cli-bundle/focused-chunks/mutation-admission-UWTH56OD.js +2 -0
- package/dist/cli-bundle/focused-chunks/{stage-4SQHVI3O.js → stage-WRSNJ7VI.js} +2 -2
- package/dist/cli-bundle/main.js +25 -25
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +5 -5
- package/dist/cli-bundle/sdk-core.js +1 -1
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +57 -57
- 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 +11 -11
- package/dist/core/config/positional-value.d.ts +1 -1
- package/dist/core/config/positional-value.js +1 -1
- package/dist/core/extensions/reserved-host-flags.js +1 -1
- package/dist/core/history/history-rewrite.js +1 -1
- package/dist/core/shared/command-types.d.ts +7 -0
- package/dist/core/store/item-mutation-precondition.d.ts +70 -6
- package/dist/core/store/item-mutation-precondition.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.js +1 -1
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/completeness.js +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +11 -0
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
- package/dist/sdk/cli-contracts/registration-helpers.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-program.js +1 -1
- package/dist/sdk/config.d.ts +1 -1
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/history/salvage.js +3 -3
- package/dist/sdk/history-compact.d.ts +7 -1
- package/dist/sdk/history-compact.js +1 -1
- package/dist/sdk/history-repair.d.ts +2 -1
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/index.d.ts +3 -0
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/lifecycle/checkpoint-rollback.d.ts +10 -2
- package/dist/sdk/lifecycle/checkpoint-rollback.js +1 -1
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close-many.d.ts +11 -2
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/close.d.ts +15 -0
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/item-revision.d.ts +162 -0
- package/dist/sdk/lifecycle/item-revision.js +2 -0
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/start-blockers.d.ts +52 -0
- package/dist/sdk/lifecycle/start-blockers.js +2 -0
- package/dist/sdk/lifecycle/task-composition.d.ts +11 -0
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.d.ts +11 -2
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.js +2 -2
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/declared-blockers.d.ts +16 -0
- package/dist/sdk/query/declared-blockers.js +2 -0
- package/dist/sdk/query/get.d.ts +7 -0
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/runtime-input.d.ts +12 -0
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime.d.ts +10 -0
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/execution.js +2 -2
- package/dist/sdk/test/linked-command-detection.js +1 -1
- package/dist/sdk/workspace-transaction.d.ts +17 -6
- package/dist/sdk/workspace-transaction.js +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js +1 -1
- package/docs/COMMANDS.md +91 -0
- package/docs/CONFIGURATION.md +1 -0
- package/docs/SDK.md +110 -1
- package/docs/agent-task-token-baseline.json +1 -1
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +111 -111
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +12 -3
- package/marketplace.json +1 -1
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +1 -1
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +1 -1
- package/dist/cli-bundle/chunks/chunk-7ZEFHFAU.js +0 -2
- package/dist/cli-bundle/chunks/chunk-B6UTLYLM.js +0 -3
- package/dist/cli-bundle/chunks/chunk-HBKD5HZB.js +0 -2
- package/dist/cli-bundle/chunks/chunk-L6LCLC37.js +0 -2
- package/dist/cli-bundle/chunks/chunk-NR4KABHC.js +0 -31
- package/dist/cli-bundle/chunks/chunk-PWD5RY2D.js +0 -2
- package/dist/cli-bundle/chunks/chunk-XRMYA4R7.js +0 -20
- package/dist/cli-bundle/chunks/chunk-YWS4XV4I.js +0 -6
- package/dist/cli-bundle/chunks/chunk-ZOAJNPBL.js +0 -129
- package/dist/cli-bundle/chunks/item-transaction-ZHLJTBD7.js +0 -2
- package/dist/cli-bundle/chunks/mutation-admission-ZQMRMGIB.js +0 -2
- package/dist/cli-bundle/chunks/register-operations-G3QGGQ5Z.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-LDXHMNOT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-3XGKBVJ3.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-4HY6EGPB.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AK2CI2GI.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-HUXZCPWT.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-IKXJ57XA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-MOY6KZGJ.js +0 -44
- package/dist/cli-bundle/focused-chunks/chunk-PWUTFKSI.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PZRB7IXH.js +0 -91
- package/dist/cli-bundle/focused-chunks/chunk-WSYPVBKS.js +0 -80
- package/dist/cli-bundle/focused-chunks/chunk-WXLG7HZ5.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-WZDFCVLX.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-YGO3FWA2.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-ZYXQACPB.js +0 -2
- package/dist/cli-bundle/focused-chunks/item-transaction-PZ2FQ6B2.js +0 -2
- package/dist/cli-bundle/focused-chunks/mutation-admission-XOOK6XFH.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1119e9ef-dbdd-5e2f-abe8-176699263a97")}catch{}})();import{normalizeUniqueStringList}from"./string-lists.js";import{PM_TOOL_ACTIONS}from"./enum-contracts.js";import{TOOL_CREATE_OPTION_CONTRACTS,TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS,TOOL_UPDATE_OPTION_CONTRACTS,TOOL_UPDATE_MANY_FILTER_OPTION_CONTRACTS,TOOL_CONTEXT_OPTION_CONTRACTS,TOOL_ACTIVITY_OPTION_CONTRACTS,TOOL_LIST_FILTER_OPTION_CONTRACTS,TOOL_AGGREGATE_OPTION_CONTRACTS,TOOL_SEARCH_FILTER_OPTION_CONTRACTS,TOOL_CLOSE_MANY_FILTER_OPTION_CONTRACTS}from"./tool-option-contracts.js";import{PM_TOOL_PARAMETER_PROPERTIES as BASE_TOOL_PARAMETER_PROPERTIES,PM_TOOL_PARAMETER_METADATA as BASE_TOOL_PARAMETER_METADATA,PM_TOOL_ACTION_SCOPED_PARAMETER_PROPERTIES as BASE_ACTION_SCOPED_PARAMETER_PROPERTIES,PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA,PLAN_ACTION_PARAMETER_PROPERTIES,PLAN_ACTION_PARAMETER_METADATA}from"./tool-parameter-tables.js";import{toUniqueFlagContracts,withFlagAliasMetadata}from"./flag-contracts.js";import{resolveReadOutputSurface}from"../read-output-contracts.js";import{CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS}from"./commander-mutation-options.js";const PM_TOOL_ACTION_SCOPED_PARAMETER_PROPERTIES={...BASE_ACTION_SCOPED_PARAMETER_PROPERTIES,"history-attest":{verify:{type:"object",additionalProperties:!0},output:{not:{}}}},PM_TOOL_PARAMETER_PROPERTIES={...BASE_TOOL_PARAMETER_PROPERTIES,pause:{type:"boolean"},handoff:{type:"string"},releaseAssignment:{type:"boolean"},hashAlgorithm:{type:"string",enum:["sha256","sha512"]}},PM_TOOL_PARAMETER_METADATA={...BASE_TOOL_PARAMETER_METADATA,pause:{description:"Return work to its configured open status before releasing ownership."},handoff:{description:"Release into a configured non-terminal queue with a required evidence message."},releaseAssignment:{description:"Release assignment after recording closure evidence."},hashAlgorithm:{description:"Digest for detached history bundles; defaults to sha256."}},PM_TOOL_GLOBAL_PARAMETER_KEYS=["json","quiet","profile","noExtensions","noPager","tokenAccounting","path","pmExecutable","timeoutMs"],PM_TOOL_READ_OUTPUT_PARAMETER_KEYS=["outputInclude","outputLimit","outputBudget","outputFormat","outputSession","outputCursor","outputRowContract"],PM_TOOL_RESERVED_CUSTOM_FIELD_PROPERTIES=new Set(["action","cwd","options",...Object.keys(PM_TOOL_PARAMETER_PROPERTIES).filter(property=>property!=="severity")]);function resolvePmToolCustomFieldCollision(field){const normalized=field.trim().toLowerCase();let property="";for(let index=0;index<normalized.length;index+=1){const character=normalized[index];if(character!=="-"&&character!=="_"){property+=character;continue}let nextIndex=index+1;for(;normalized[nextIndex]==="-"||normalized[nextIndex]==="_";)nextIndex+=1;const nextCharacter=normalized[nextIndex];if(nextCharacter!==void 0&&(nextCharacter>="a"&&nextCharacter<="z"||nextCharacter>="0"&&nextCharacter<="9")){property+=nextCharacter.toUpperCase(),index=nextIndex;continue}property+=normalized.slice(index,nextIndex),index=nextIndex-1}return PM_TOOL_RESERVED_CUSTOM_FIELD_PROPERTIES.has(property)?{field,property,owner:"mcp_tool_input",nested_path:`options.${property}`}:void 0}const PM_TOOL_ACTION_MUTATION_PARAMETER_KEYS={create:["fullChangedFields","idOnly"],copy:["fullChangedFields","idOnly"],update:["fullChangedFields","idOnly"],"item-reopen":["fullChangedFields","idOnly"],close:["fullChangedFields","idOnly"],claim:["fullChangedFields","idOnly"],release:["fullChangedFields","idOnly"],"start-task":["fullChangedFields","idOnly"],"pause-task":["fullChangedFields","idOnly"],"close-task":["fullChangedFields","idOnly"],restore:["fullChangedFields","idOnly"],append:["fullChangedFields"],"update-many":["fullChangedFields"],"close-many":["fullChangedFields"],assurance:["fullChangedFields","idOnly"]},PLAN_CREATE_METADATA_PARAMETER_KEYS=["createMode","status","deadline","estimate","acceptanceCriteria","definitionOfReady","order","rank","goal","objective","value","impact","outcome","whyNow","assignee","reviewer","risk","confidence","sprint","release","blockedReason","unblockNote","reporter","severity","environment","reproSteps","resolution","expectedResult","actualResult","affectedVersion","fixedVersion","component","regression","customerImpact","comment","note","learning","reminder","event","typeOption"],PM_TOOL_ACTION_NESTED_OPTION_COMPATIBILITY_KEYS=Object.freeze({"close-many":["list","expected_result","expected","actual_result","actual","validate_close","dry_run","checkpoint","no_checkpoint","filterAssignee_filter"],"update-many":["list","update","dry_run","checkpoint","no_checkpoint","filterAssignee_filter"],...Object.fromEntries(PM_TOOL_ACTIONS.filter(action=>action==="upgrade"||action==="install"||action==="extension"||action==="package"||action.startsWith("extension-")||action.startsWith("package-")).map(action=>[action,["project","local","global"]]))});function toSchemaKeyList(values){return normalizeUniqueStringList(values)}const CREATE_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_CREATE_OPTION_CONTRACTS.map(entry=>entry.param),...TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS.map(entry=>entry.param)]),UPDATE_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_UPDATE_OPTION_CONTRACTS.map(entry=>entry.param),...TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS.map(entry=>entry.param),"force"]),UPDATE_MANY_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_UPDATE_MANY_FILTER_OPTION_CONTRACTS.map(entry=>entry.param),...UPDATE_CONTRACT_PARAMETER_KEYS.filter(key=>key!=="allowMissingParent"&&key!=="completedAt"),"dryRun","rollback","noCheckpoint"]),CLOSE_MANY_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_CLOSE_MANY_FILTER_OPTION_CONTRACTS.map(entry=>entry.param),"reason","completedAt","resolution","expectedResult","actualResult","validateClose","dryRun","rollback","noCheckpoint","author","message","force"]),CONTEXT_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_CONTEXT_OPTION_CONTRACTS.map(entry=>entry.param),"past","section"]),ACTIVITY_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_ACTIVITY_OPTION_CONTRACTS.map(entry=>entry.param),"stream"]),LIST_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_LIST_FILTER_OPTION_CONTRACTS.map(entry=>entry.param),"all","includeBody","noTruncate","strictRead","compact","brief","full"]),FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS=LIST_CONTRACT_PARAMETER_KEYS.filter(parameter=>parameter!=="all"&¶meter!=="status"),LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS=[[{property:"today",schema:{const:!0}},{property:"recent",schema:{const:!0}}],[{property:"today",schema:{const:!0}},{property:"updatedAfter",schema:{type:"string",pattern:"\\S"}}],[{property:"recent",schema:{const:!0}},{property:"updatedAfter",schema:{type:"string",pattern:"\\S"}}]],CONTRACTS_PROJECTION_MUTUALLY_EXCLUSIVE_GROUPS=[[{property:"summary",schema:{const:!0}},{property:"schemaOnly",schema:{const:!0}}],[{property:"summary",schema:{const:!0}},{property:"flagsOnly",schema:{const:!0}}],[{property:"summary",schema:{const:!0}},{property:"availabilityOnly",schema:{const:!0}}],[{property:"schemaOnly",schema:{const:!0}},{property:"flagsOnly",schema:{const:!0}}],[{property:"schemaOnly",schema:{const:!0}},{property:"availabilityOnly",schema:{const:!0}}],[{property:"flagsOnly",schema:{const:!0}},{property:"availabilityOnly",schema:{const:!0}}]],AGGREGATE_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_AGGREGATE_OPTION_CONTRACTS.map(entry=>entry.param),"count","completion","includeUnparented"]),SEARCH_CONTRACT_PARAMETER_KEYS=toSchemaKeyList(["query","keywords","mode","semantic","hybrid","includeLinked","titleExact","phraseExact","highlight","compact","full",...TOOL_SEARCH_FILTER_OPTION_CONTRACTS.map(entry=>entry.param)]),NEXT_CONTRACT_PARAMETER_KEYS=toSchemaKeyList(["type","tag","priority","assignee","assigneeFilter","sprint","release","parent","limit","blockedLimit","readyOnly","format","includeDecisions","includeGates","includeContainers","tokenBudget","explainRanking"]),AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS=["author","message","force"],CLOSE_ACTION_OPTION_KEYS=["releaseAssignment","text","reason","closeReason","completedAt","duplicateOf","validateClose","resolution","expectedResult","actualResult"],LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS=["author","assignee","message","force"],MANAGED_EXTENSION_PACKAGE_OPTION_KEYS=["dryRun","target","scope","capability","declarative","github","ref","init","install","uninstall","explore","manage","offline","describe","markdown","output","reload","doctor","catalog","list","adopt","adoptAll","activate","deactivate","runtimeProbe","fixManagedState","isolated","ignoreGlobal","detail","trace","watch","strictExit","failOnWarn"];function managedLifecycleSchemaContracts(prefix){return{[`${prefix}-init`]:{required:["target"],optional:["scope","capability",...prefix==="package"?["declarative"]:[]]},[`${prefix}-install`]:{optional:["target","github","scope","ref","dryRun"],anyOfRequired:[["target"],["github"]]},[`${prefix}-uninstall`]:{required:["target"],optional:["scope"]},[`${prefix}-explore`]:{optional:["scope"]},[`${prefix}-manage`]:{optional:["scope","runtimeProbe","fixManagedState","offline"]},[`${prefix}-describe`]:{optional:["target","scope","markdown","output"]},[`${prefix}-reload`]:{optional:["scope","watch"]},[`${prefix}-doctor`]:{optional:["scope","detail","trace","fixManagedState","isolated","ignoreGlobal","strictExit","failOnWarn"]},[`${prefix}-catalog`]:{optional:["scope","fields"]},[`${prefix}-adopt`]:{required:["target"],optional:["scope","github","ref"]},[`${prefix}-adopt-all`]:{optional:["scope"]},[`${prefix}-activate`]:{required:["target"],optional:["scope"]},[`${prefix}-deactivate`]:{required:["target"],optional:["scope"]},[prefix]:{optional:MANAGED_EXTENSION_PACKAGE_OPTION_KEYS,dependentAnyOfRequired:[{property:"dryRun",value:!0,anyOfRequired:[["install","target"],["install","github"]]}],mutuallyExclusiveWhen:[[{property:"dryRun",schema:{const:!0}},{property:"install",schema:{const:!1}}]]}}}const SCHEDULING_ACTION_SCHEMA_CONTRACT={required:["title"],optional:["start","duration","end","location","timezone","allDay","parent","inheritFocus","allowMissingParent","tags","priority","body","description","author","message"]},UPGRADE_ACTION_SCHEMA_CONTRACT={optional:["target","scope","dryRun","cliOnly","packagesOnly","repair","tag","packageName"]},PM_TOOL_ACTION_SCHEMA_CONTRACTS={init:{optional:["prefix","idPrefix","workspace","preset","typePreset","defaults","author","agentGuidance","withPackages","mergeFence","force","verbose"]},config:{required:["scope","configAction"],optional:["key","value","criterion","clearCriteria","format","policy"]},...managedLifecycleSchemaContracts("extension"),...managedLifecycleSchemaContracts("package"),"package-upgrade":UPGRADE_ACTION_SCHEMA_CONTRACT,install:{optional:["target","github","scope","ref","dryRun"],anyOfRequired:[["target"],["github"]]},upgrade:UPGRADE_ACTION_SCHEMA_CONTRACT,create:{required:["title","description","type","status","priority","message"],optional:CREATE_CONTRACT_PARAMETER_KEYS},copy:{required:["id"],optional:["title","author","message","allowDuplicate"]},focus:{optional:["id","clear"],mutuallyExclusive:[["id","clear"]]},list:{optional:LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-all":{optional:LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-draft":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-open":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-in-progress":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-blocked":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-closed":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-canceled":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},aggregate:{optional:AGGREGATE_CONTRACT_PARAMETER_KEYS},guide:{optional:["list","format","depth"]},context:{optional:CONTEXT_CONTRACT_PARAMETER_KEYS},ctx:{optional:CONTEXT_CONTRACT_PARAMETER_KEYS},get:{required:["id"],optional:["for","tokenBudget","at","depth","full","fields","tree","treeDepth","format"]},search:{optional:SEARCH_CONTRACT_PARAMETER_KEYS,anyOfRequired:[["query"],["keywords"]]},eval:{optional:["mode","k","failUnder","queries","format"]},events:{optional:["verify","since","type","author","item","limit","full","provenance","provenanceSummary","harness","agentInstance","provenanceFilter","cursorMode"]},merge:{required:["subcommand"],optional:["dryRun","preCommitHook","stage","author","message","force","includeReconciled","artifact","basePath","oursPath","theirsPath","output","outputPath","itemPath","prefer"]},workspace:{required:["subcommand"],optional:["snapshotAction","name","target","dryRun","force","author","message","lockTtlSeconds","lockWaitMs"],conditionalRequired:[{property:"subcommand",value:"snapshot",required:["snapshotAction"]}]},meet:SCHEDULING_ACTION_SCHEMA_CONTRACT,event:SCHEDULING_ACTION_SCHEMA_CONTRACT,remind:{required:["title"],optional:["at","text","parent","inheritFocus","allowMissingParent","tags","priority","body","description","author","message"]},next:{optional:[...NEXT_CONTRACT_PARAMETER_KEYS,"for"]},reindex:{optional:["mode","progress"]},history:{required:["id"],optional:["limit","order","compact","full","provenance","provenanceSummary","harness","agentInstance","provenanceFilter","diff","verify","field","strictExit","failOnWarn","format"]},"history-attest":{optional:["verify","output","hashAlgorithm"],mutuallyExclusive:[["verify","hashAlgorithm"]]},"history-redact":{required:["id"],optional:["literal","regex","replacement","dryRun",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],anyOfRequired:[["literal"],["regex"]]},"history-repair":{optional:["id","all","dryRun","normalizeProvenance","salvageTail",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],oneOfRequired:[["id"],["all"]],mutuallyExclusiveWhen:[[{property:"salvageTail",schema:{const:!0}},{property:"all",schema:{const:!0}}],[{property:"salvageTail",schema:{const:!0}},{property:"normalizeProvenance",schema:{const:!0}}]]},"history-author-acknowledge":{optional:["historyEvent","allActionable","dryRun","planFingerprint","limit","attributedAuthor","reviewer","reason"],oneOfRequired:[["historyEvent"],["allActionable"]]},"history-compact":{optional:["id","before","ids","allOver","closed","allStreams","minEntries","dryRun",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},schema:{mutuallyExclusiveWhen:[[{property:"subcommand",schema:{const:"policy-mode"}},{property:"name",schema:{not:{enum:["advise","refuse"]}}}]],required:["subcommand"],optional:["definition","policy","message","name","description","defaultStatus","folder","alias","role","order","fieldType","commands","cliFlag","required","requiredOnCreate","allowUnset","requiredTypes","typePreset","infer","minCount","apply","to","migrationId","fieldTypeScope","dryRun","author","force"],conditionalRequired:[{property:"subcommand",value:"policy-put",required:["definition"]},{property:"subcommand",value:"policy-remove",required:["name"]},{property:"subcommand",value:"policy-mode",required:["name"]},{property:"subcommand",value:"policy-check",required:["name"]},{property:"subcommand",value:"policy-approve",required:["name","policy"]},{property:"subcommand",value:"show",required:["name"]},{property:"subcommand",value:"show-status",required:["name"]},{property:"subcommand",value:"add-type",required:["name"]},{property:"subcommand",value:"remove-type",required:["name"]},{property:"subcommand",value:"add-status",required:["name"]},{property:"subcommand",value:"remove-status",required:["name"]},{property:"subcommand",value:"add-field",required:["name"]},{property:"subcommand",value:"remove-field",required:["name"]},{property:"subcommand",value:"show-field",required:["name"]},{property:"subcommand",value:"rename-type",required:["name","to"]},{property:"subcommand",value:"rename-field",required:["name","to"]},{property:"subcommand",value:"remap-status",required:["name","to"]},{property:"subcommand",value:"apply-preset",required:["typePreset"]}]},profile:{required:["subcommand"],optional:["name","dryRun","author","force"],conditionalRequired:[{property:"subcommand",value:"show",required:["name"]},{property:"subcommand",value:"apply",required:["name"]},{property:"subcommand",value:"lint",required:["name"]}]},plan:{required:["subcommand"],optional:["id","stepRef","reorderTo","title","description","template","scope","parent","inheritFocus","related","blocks","blockedBy","harness","mode","resumeContext","tags","priority",...PLAN_CREATE_METADATA_PARAMETER_KEYS,"body","claim","fromSearch","stepTitle","step","stepBody","stepOwner","stepStatus","stepEvidence","stepBlockedReason","stepReplacement","dependsOn","link","linkKind","linkNote","promoteToItemDep","allowMultipleActive","file","test","doc","decisionText","decision","decisionRationale","decisionEvidence","discoveryText","discovery","validationText","validation","validationCommand","validationExpected","depth","fields","steps","materializeType","materializeParent","materializeTags","field",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},activity:{optional:ACTIVITY_CONTRACT_PARAMETER_KEYS},restore:{required:["id","target"],optional:AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},update:{required:["id"],optional:UPDATE_CONTRACT_PARAMETER_KEYS,mutuallyExclusive:[["acceptanceCriteria","addAc"],["acceptanceCriteria","removeAc"]]},"update-many":{optional:UPDATE_MANY_CONTRACT_PARAMETER_KEYS,mutuallyExclusive:[["acceptanceCriteria","addAc"],["acceptanceCriteria","removeAc"]]},close:{required:["id"],optional:[...CLOSE_ACTION_OPTION_KEYS,...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},"close-many":{optional:CLOSE_MANY_CONTRACT_PARAMETER_KEYS},delete:{required:["id"],optional:["dryRun",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},append:{required:["id","body"],optional:AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},comments:{required:["id"],optional:["text","add","stdin","edit","delete","limit","full","ifAbsent",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],mutuallyExclusive:[["edit","ifAbsent"],["delete","ifAbsent"]]},notes:{required:["id"],optional:["text","add","addJson","stdin","edit","delete","limit","since","eventType","includeMeta","full","ifAbsent",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],mutuallyExclusive:[["addJson","add"],["addJson","stdin"],["addJson","file"],["addJson","edit"],["addJson","delete"],["edit","ifAbsent"],["delete","ifAbsent"]]},learnings:{required:["id"],optional:["text","add","stdin","edit","delete","limit","full","ifAbsent",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],mutuallyExclusive:[["edit","ifAbsent"],["delete","ifAbsent"]]},files:{required:[],optional:["id","add","addGlob","remove","migrate","list","addNote","discover","apply","discoveryNote","appendStable","validatePaths","lookupPath","scope","limit","offset","noTruncate","strictRead","explain","lines","decisionDepth",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],anyOfRequired:[["id"],["lookupPath"]],dependentAnyOfRequired:[{property:"addNote",anyOfRequired:[["add"],["addGlob"]]}]},docs:{required:["id"],optional:["add","addGlob","remove","migrate","addNote","list","validatePaths",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],dependentAnyOfRequired:[{property:"addNote",anyOfRequired:[["add"],["addGlob"]]}]},deps:{required:["id"],optional:["format","maxDepth","collapse","summary","full","nodeLimit","edgeLimit","tokenBudget","cursor","direction","kind"]},graph:{required:["subcommand"],optional:["id","target","kind","maxDepth","limit","after","direction","maxPaths","sample","exemptIsolate","exemptIsolateType","saveBaseline","rebuild","clear","summary","full"]},test:{required:["id"],optional:["list","add","addJson","remove","removeIndex","update","updateIndex","setJson","run","match","onlyIndex","onlyLast","background","timeout","progress","envSet","envClear","sharedHostSafe","pmContext","overrideLinkedPmContext","workspaceContext","overrideLinkedWorkspaceContext","allowUntrustedLinkedTests","acknowledgeLinkedTests","failOnContextMismatch","failOnSkipped","failOnEmptyTestRun","requireAssertionsForPm","checkContext","autoPmContext","measure","metricBelow","metricDiff",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],dependentAnyOfRequired:[{property:"update",anyOfRequired:[["setJson"]]},{property:"updateIndex",anyOfRequired:[["setJson"]]},{property:"setJson",anyOfRequired:[["update"],["updateIndex"]]}],mutuallyExclusive:[["update","updateIndex"],["acknowledgeLinkedTests","run"],["acknowledgeLinkedTests","background"]]},"test-all":{optional:["status","limit","offset","background","timeout","progress","envSet","envClear","sharedHostSafe","pmContext","overrideLinkedPmContext","workspaceContext","overrideLinkedWorkspaceContext","allowUntrustedLinkedTests","failOnContextMismatch","failOnSkipped","failOnEmptyTestRun","requireAssertionsForPm","checkContext","autoPmContext"]},telemetry:{optional:["subcommand","limit"]},"test-runs-list":{optional:["status","limit"]},"test-runs-status":{required:["runId"]},"test-runs-logs":{required:["runId"],optional:["stream","tail"]},"test-runs-stop":{required:["runId"],optional:["force"]},"test-runs-resume":{required:["runId"],optional:["author"]},stats:{optional:["includeEmpty","storage","metadataCoverage","fieldUtilization","byAssignee","byTag","byPriority","tagPrefix","measurements","metric","measurementLimit","observe","improvementDirection","measurementSource","measurementItem","measurementRevision","author","message","provenanceCoverage","fleetAttribution","since","eventLimit","minimumSample"]},duplicates:{optional:["status","since","threshold","limit","exhaustive"]},health:{optional:["strictDirectories","requireMergeDrivers","strictExit","failOnWarn","checkOnly","checkTelemetry","noRefresh","refreshVectors","verboseStaleItems","verboseAuthorEvents","brief","summary","skipVectors","skipIntegrity","skipDrift","full"]},validate:{optional:["checkCompleteness","checkStorageIntegrity","checkMetadata","metadataProfile","checkResolution","checkLifecycle","checkStaleBlockers","dependencyCycleSeverity","parentCycleSeverity","checkFiles","scanMode","includePmInternals","verboseFileLists","verboseDiagnostics","allAffectedIds","strictExit","failOnWarn","fixHints","autoFix","dryRun","fixScope","pruneMissing","checkHistoryDrift","checkCommandReferences","counts","full"]},assurance:{required:["subcommand"],optional:["kind","id","definition","trigger","treeId","gate","limit","dryRun","author","message","preset","owner","apply","enforcement"],conditionalRequired:[{property:"subcommand",value:"list",required:["kind"]},{property:"subcommand",value:"show",required:["kind","id"]},{property:"subcommand",value:"put",required:["kind","id","definition"]},{property:"subcommand",value:"remove",required:["kind","id"]},{property:"subcommand",value:"run",required:["id","trigger"]},{property:"subcommand",value:"apply",required:["preset","owner"]},{property:"subcommand",value:"derive",required:["owner"]},{property:"subcommand",value:"risk",required:["definition"]},{property:"subcommand",value:"lineages",required:["definition"]},{property:"subcommand",value:"promote",required:["id","enforcement"]}],mutuallyExclusiveWhen:[[{property:"subcommand",schema:{const:"risk"}},{property:"definition",schema:{not:{required:["policy","change"]}}}],[{property:"subcommand",schema:{const:"lineages"}},{property:"definition",schema:{anyOf:[{required:["change"]},{not:{required:["policy"]}}]}}]]},gc:{optional:["dryRun","gcScope"]},contracts:{optional:["contractAction","command","summary","schemaOnly","flagsOnly","availabilityOnly","runtimeOnly","activeOnly","full"],mutuallyExclusiveWhen:CONTRACTS_PROJECTION_MUTUALLY_EXCLUSIVE_GROUPS},completion:{required:["shell"],optional:["eagerTags"]},claim:{optional:["start","id","next","ifAvailable","maxAttempts","includeDecisions",...NEXT_CONTRACT_PARAMETER_KEYS,...LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],oneOfRequired:[["id"],["next"]],mutuallyExclusiveWhen:[[{property:"start",schema:{const:!0}},{property:"ifAvailable",schema:{const:!0}},{property:"id",schema:{type:"string"}}]]},release:{required:["id"],optional:["pause","handoff",...LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],dependentAnyOfRequired:[{property:"handoff",anyOfRequired:[["message"]]}],mutuallyExclusiveWhen:[[{property:"pause",schema:{const:!0}},{property:"handoff",schema:{type:"string"}}]]},"start-task":{required:["id"],optional:LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},"pause-task":{required:["id"],optional:LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},"close-task":{required:["id"],optional:["text","validateClose",...LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},"item-reopen":{required:["id","reason"],optional:["status","expectedResult","author","message","force"]}},PM_TOOL_ACTION_PARAMETER_CONTRACTS=Object.freeze(Object.fromEntries(PM_TOOL_ACTIONS.map(action=>[action,PM_TOOL_ACTION_SCHEMA_CONTRACTS[action]])));function fallbackToolParameterDescription(key){return key.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]/g," ").trim().replace(/^./,value=>value.toUpperCase()).concat(".")}function decorateToolParameterDefinition(key,definition){const baseDefinition=typeof definition=="object"&&definition!==null?{...definition}:{},metadata=PM_TOOL_PARAMETER_METADATA[key];return{...baseDefinition,description:metadata?.description??fallbackToolParameterDescription(key),...metadata?.examples?{examples:metadata.examples}:{}}}function actionScopedToolParameterMetadata(action,key){if(action==="history-attest"&&key==="verify")return{description:"Compare all retained history streams with a detached JSON proof object. Server-local proof paths are not accepted over MCP."};if(action==="history-attest"&&key==="output")return{description:"Local CLI/SDK only. MCP rejects this field; save the returned JSON bundle on the client."};if(action==="claim"&&key==="start")return{description:"Move the claimed item to its configured in-progress status; with next, the selected item is claimed and started in one locked write."};if((action==="list"||action.startsWith("list-"))&&key==="all")return{description:"Return items from every lifecycle status instead of the default active-status set."};if(action==="plan"&&Object.prototype.hasOwnProperty.call(PLAN_ACTION_PARAMETER_METADATA,key))return PLAN_ACTION_PARAMETER_METADATA[key];const actionOverrides=PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA[action];return actionOverrides&&Object.prototype.hasOwnProperty.call(actionOverrides,key)?actionOverrides[key]:PM_TOOL_PARAMETER_METADATA[key]}function decorateActionScopedToolParameterDefinition(action,key,definition){const baseDefinition=typeof definition=="object"&&definition!==null?{...definition}:{},metadata=actionScopedToolParameterMetadata(action,key);return{...baseDefinition,description:metadata?.description??fallbackToolParameterDescription(key),...metadata?.examples?{examples:metadata.examples}:{}}}function actionScopedToolParameterDefinition(action,key){if(action==="claim"&&key==="start")return{type:"boolean"};const actionProperties=PM_TOOL_ACTION_SCOPED_PARAMETER_PROPERTIES[action];return actionProperties&&Object.prototype.hasOwnProperty.call(actionProperties,key)?actionProperties[key]:action==="plan"&&Object.prototype.hasOwnProperty.call(PLAN_ACTION_PARAMETER_PROPERTIES,key)?PLAN_ACTION_PARAMETER_PROPERTIES[key]:(action==="get"||action==="history"||action==="search")&&key==="format"?{type:"string",enum:["json","toon"]}:key==="pause"||key==="handoff"||key==="releaseAssignment"||key==="hashAlgorithm"?PM_TOOL_PARAMETER_PROPERTIES[key]:BASE_TOOL_PARAMETER_PROPERTIES[key]}function buildActionScopedSchemaProperties(action,allowedKeys){const properties={action:{const:action,description:PM_TOOL_PARAMETER_METADATA.action?.description??"Tool action to execute."}};for(const key of allowedKeys){if(key==="action")continue;const definition=actionScopedToolParameterDefinition(action,key);definition&&(properties[key]=decorateActionScopedToolParameterDefinition(action,key,definition))}return properties}function buildOneOfSchemaEntries(action,oneOfRequiredGroups){const allOneOfFields=oneOfRequiredGroups.flat();return oneOfRequiredGroups.map(requiredFields=>{const otherFields=allOneOfFields.filter(field=>!requiredFields.includes(field));return{required:[...requiredFields],...otherFields.length>0?{not:{anyOf:otherFields.map(field=>({required:[field]}))}}:{},...action==="history-repair"&&requiredFields.includes("all")?{properties:{all:{const:!0}}}:action==="claim"&&requiredFields.includes("next")?{properties:{next:{const:!0}}}:{}}})}function schemaPropertyCondition(property,value){return{...value===void 0?{}:{properties:{[property]:{const:value}}},required:[property]}}function buildActionScopedAllOf(contract){const allOf=[];if(contract.conditionalRequired&&contract.conditionalRequired.length>0)for(const entry of contract.conditionalRequired)allOf.push({if:schemaPropertyCondition(entry.property,entry.value),then:{required:entry.required}});if(contract.dependentAnyOfRequired&&contract.dependentAnyOfRequired.length>0)for(const entry of contract.dependentAnyOfRequired)allOf.push({if:schemaPropertyCondition(entry.property,entry.value),then:{anyOf:entry.anyOfRequired.map(requiredFields=>({required:[...requiredFields]}))}});if(contract.mutuallyExclusive&&contract.mutuallyExclusive.length>0)for(const group of contract.mutuallyExclusive)allOf.push({not:{required:toSchemaKeyList(group)}});if(contract.mutuallyExclusiveWhen&&contract.mutuallyExclusiveWhen.length>0)for(const group of contract.mutuallyExclusiveWhen)allOf.push({not:{allOf:group.map(condition=>({properties:{[condition.property]:condition.schema},required:[condition.property]}))}});return allOf}function pmToolActionParameterKeys(action){if(!Object.prototype.hasOwnProperty.call(PM_TOOL_ACTION_SCHEMA_CONTRACTS,action))return;const contract=PM_TOOL_ACTION_SCHEMA_CONTRACTS[action],mutationParameterKeys=PM_TOOL_ACTION_MUTATION_PARAMETER_KEYS[action]??[];return toSchemaKeyList(["action",...PM_TOOL_GLOBAL_PARAMETER_KEYS,...resolveReadOutputSurface(action)!==void 0?PM_TOOL_READ_OUTPUT_PARAMETER_KEYS:[],...mutationParameterKeys,...contract.required??[],...contract.optional??[]])}function pmToolActionNestedOptionKeys(action){const parameterKeys=pmToolActionParameterKeys(action);if(parameterKeys===void 0)return;const mutationContracts=action==="create"?CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS:action==="update"?UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS:[];return toSchemaKeyList([...parameterKeys,...mutationContracts.flatMap(({keys,target})=>[target,...keys]),...PM_TOOL_ACTION_NESTED_OPTION_COMPATIBILITY_KEYS[action]??[]])}function buildActionScopedToolSchema(action){const contract=PM_TOOL_ACTION_SCHEMA_CONTRACTS[action],required=toSchemaKeyList(contract.required??[]),allowedKeys=pmToolActionParameterKeys(action),schema={type:"object",additionalProperties:!1,required:["action",...required],title:`pm action "${action}" parameters`,properties:buildActionScopedSchemaProperties(action,allowedKeys)};contract.anyOfRequired&&contract.anyOfRequired.length>0&&(schema.anyOf=contract.anyOfRequired.map(requiredFields=>({required:[...requiredFields]}))),contract.oneOfRequired&&contract.oneOfRequired.length>0&&(schema.oneOf=buildOneOfSchemaEntries(action,contract.oneOfRequired));const allOf=buildActionScopedAllOf(contract);return allOf.length>0&&(schema.allOf=allOf),schema}function buildPmActionToolInputSchema(action,options={}){const actionSchema=buildActionScopedToolSchema(action),actionProperties={...actionSchema.properties};delete actionProperties.action;const conditionalBranches=[...actionSchema.anyOf??[],...actionSchema.oneOf??[]],required=(options.required??actionSchema.required.map(String)).filter(key=>key==="action"?!1:options.required===void 0?!0:!conditionalBranches.some(branch=>branch.required?.map(String).includes(key))),schema={type:"object",additionalProperties:options.additionalProperties??!0,properties:{...actionProperties,options:{type:"object",additionalProperties:!0,description:"Advanced command options forwarded to the selected pm action."},...options.properties},required};return actionSchema.anyOf!==void 0&&(schema.anyOf=actionSchema.anyOf),actionSchema.oneOf!==void 0&&(schema.oneOf=actionSchema.oneOf),actionSchema.allOf!==void 0&&(schema.allOf=actionSchema.allOf),schema}function createLazyContractSchema(build){let value;const resolve=()=>value??=build();return new Proxy({},{get:(_target,prop)=>resolve()[prop],has:(_target,prop)=>prop in resolve(),ownKeys:()=>Reflect.ownKeys(resolve()),getOwnPropertyDescriptor:(_target,prop)=>{const descriptor=Reflect.getOwnPropertyDescriptor(resolve(),prop);return descriptor&&(descriptor.configurable=!0),descriptor}})}const PM_TOOL_PARAMETERS_SCHEMA_VERSION="4.23.0",PM_TOOL_PARAMETERS_SCHEMA_MAJOR=PM_TOOL_PARAMETERS_SCHEMA_VERSION.split(".")[0],PM_PROVIDER_TOOL_PARAMETERS_SCHEMA_VERSION="1.12.0",PM_TOOL_PARAMETERS_SCHEMA=createLazyContractSchema(()=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://schema.unbrained.dev/pm-cli/tool-parameters-v${PM_TOOL_PARAMETERS_SCHEMA_MAJOR}.schema.json`,title:"pm-cli tool parameters (action-scoped strict schema)","x-schema-version":PM_TOOL_PARAMETERS_SCHEMA_VERSION,type:"object",oneOf:PM_TOOL_ACTIONS.map(action=>buildActionScopedToolSchema(action))}));function toProviderCompatibleParameterDefinition(key,definition){const decorated=decorateToolParameterDefinition(key,definition);if(typeof decorated.type=="string")return decorated;const firstTypedVariant=(Array.isArray(decorated.anyOf)?decorated.anyOf:[]).find(variant=>typeof variant.type=="string");if(firstTypedVariant){const{anyOf:_anyOf2,...rest2}=decorated;return{...firstTypedVariant,...rest2}}const{anyOf:_anyOf,...rest}=decorated;return{...rest,type:"string"}}function buildProviderCompatibleToolSchema(){const properties={action:{type:"string",description:PM_TOOL_PARAMETER_METADATA.action?.description??"Tool action to execute."},options:{type:"object",additionalProperties:!0,description:"Advanced command options object forwarded to the selected pm action."}};for(const key of Object.keys(PM_TOOL_PARAMETER_PROPERTIES).sort())properties[key]=toProviderCompatibleParameterDefinition(key,PM_TOOL_PARAMETER_PROPERTIES[key]);return{title:"pm-cli tool parameters (provider-compatible flat schema)","x-schema-version":PM_PROVIDER_TOOL_PARAMETERS_SCHEMA_VERSION,type:"object",additionalProperties:!1,required:["action"],properties}}const PM_PROVIDER_TOOL_PARAMETERS_SCHEMA=createLazyContractSchema(buildProviderCompatibleToolSchema),_testOnlyCliContracts={buildActionScopedToolSchema,buildProviderCompatibleToolSchema,decorateActionScopedToolParameterDefinition,decorateToolParameterDefinition,toolActionSchemaContracts:PM_TOOL_ACTION_SCHEMA_CONTRACTS,toolParameterMetadata:PM_TOOL_PARAMETER_METADATA,toProviderCompatibleParameterDefinition,toUniqueFlagContracts,withFlagAliasMetadata};export{CLOSE_ACTION_OPTION_KEYS,PLAN_CREATE_METADATA_PARAMETER_KEYS,PM_PROVIDER_TOOL_PARAMETERS_SCHEMA,PM_PROVIDER_TOOL_PARAMETERS_SCHEMA_VERSION,PM_TOOL_ACTION_PARAMETER_CONTRACTS,PM_TOOL_PARAMETERS_SCHEMA,PM_TOOL_PARAMETERS_SCHEMA_MAJOR,PM_TOOL_PARAMETERS_SCHEMA_VERSION,PM_TOOL_RESERVED_CUSTOM_FIELD_PROPERTIES,_testOnlyCliContracts,buildPmActionToolInputSchema,pmToolActionNestedOptionKeys,pmToolActionParameterKeys,resolvePmToolCustomFieldCollision};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d0f3cb59-fe77-5333-83f6-11247bf91e2a")}catch{}})();import{normalizeUniqueStringList}from"./string-lists.js";import{PM_EXPECT_HASH_ACTIONS,PM_TOOL_ACTIONS}from"./enum-contracts.js";import{TOOL_CREATE_OPTION_CONTRACTS,TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS,TOOL_UPDATE_OPTION_CONTRACTS,TOOL_UPDATE_MANY_FILTER_OPTION_CONTRACTS,TOOL_CONTEXT_OPTION_CONTRACTS,TOOL_ACTIVITY_OPTION_CONTRACTS,TOOL_LIST_FILTER_OPTION_CONTRACTS,TOOL_AGGREGATE_OPTION_CONTRACTS,TOOL_SEARCH_FILTER_OPTION_CONTRACTS,TOOL_CLOSE_MANY_FILTER_OPTION_CONTRACTS}from"./tool-option-contracts.js";import{PM_TOOL_PARAMETER_PROPERTIES as BASE_TOOL_PARAMETER_PROPERTIES,PM_TOOL_PARAMETER_METADATA as BASE_TOOL_PARAMETER_METADATA,PM_TOOL_ACTION_SCOPED_PARAMETER_PROPERTIES as BASE_ACTION_SCOPED_PARAMETER_PROPERTIES,PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA,PLAN_ACTION_PARAMETER_PROPERTIES,PLAN_ACTION_PARAMETER_METADATA}from"./tool-parameter-tables.js";import{toUniqueFlagContracts,withFlagAliasMetadata}from"./flag-contracts.js";import{resolveReadOutputSurface}from"../read-output-contracts.js";import{CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS}from"./commander-mutation-options.js";const PM_TOOL_ACTION_SCOPED_PARAMETER_PROPERTIES={...BASE_ACTION_SCOPED_PARAMETER_PROPERTIES,"history-attest":{verify:{type:"object",additionalProperties:!0},output:{not:{}}}},PM_TOOL_PARAMETER_PROPERTIES={...BASE_TOOL_PARAMETER_PROPERTIES,pause:{type:"boolean"},handoff:{type:"string"},releaseAssignment:{type:"boolean"},hashAlgorithm:{type:"string",enum:["sha256","sha512"]}},PM_TOOL_PARAMETER_METADATA={...BASE_TOOL_PARAMETER_METADATA,pause:{description:"Return work to its configured open status before releasing ownership."},handoff:{description:"Release into a configured non-terminal queue with a required evidence message."},releaseAssignment:{description:"Release assignment after recording closure evidence."},hashAlgorithm:{description:"Digest for detached history bundles; defaults to sha256."}},PM_TOOL_GLOBAL_PARAMETER_KEYS=["json","quiet","profile","noExtensions","noPager","tokenAccounting","path","pmExecutable","timeoutMs"],PM_TOOL_READ_OUTPUT_PARAMETER_KEYS=["outputInclude","outputLimit","outputBudget","outputFormat","outputSession","outputCursor","outputRowContract"],PM_TOOL_RESERVED_CUSTOM_FIELD_PROPERTIES=new Set(["action","cwd","options",...Object.keys(PM_TOOL_PARAMETER_PROPERTIES).filter(property=>property!=="severity")]);function resolvePmToolCustomFieldCollision(field){const normalized=field.trim().toLowerCase();let property="";for(let index=0;index<normalized.length;index+=1){const character=normalized[index];if(character!=="-"&&character!=="_"){property+=character;continue}let nextIndex=index+1;for(;normalized[nextIndex]==="-"||normalized[nextIndex]==="_";)nextIndex+=1;const nextCharacter=normalized[nextIndex];if(nextCharacter!==void 0&&(nextCharacter>="a"&&nextCharacter<="z"||nextCharacter>="0"&&nextCharacter<="9")){property+=nextCharacter.toUpperCase(),index=nextIndex;continue}property+=normalized.slice(index,nextIndex),index=nextIndex-1}return PM_TOOL_RESERVED_CUSTOM_FIELD_PROPERTIES.has(property)?{field,property,owner:"mcp_tool_input",nested_path:property==="expectHash"?`options.field (${field}=<value>)`:`options.${property}`}:void 0}const PM_TOOL_ACTION_MUTATION_PARAMETER_KEYS={create:["fullChangedFields","idOnly"],copy:["fullChangedFields","idOnly"],update:["fullChangedFields","idOnly"],"item-reopen":["fullChangedFields","idOnly"],close:["fullChangedFields","idOnly"],claim:["fullChangedFields","idOnly"],release:["fullChangedFields","idOnly"],"start-task":["fullChangedFields","idOnly"],"pause-task":["fullChangedFields","idOnly"],"close-task":["fullChangedFields","idOnly"],restore:["fullChangedFields","idOnly"],append:["fullChangedFields"],"update-many":["fullChangedFields"],"close-many":["fullChangedFields"],assurance:["fullChangedFields","idOnly"]},PLAN_CREATE_METADATA_PARAMETER_KEYS=["createMode","status","deadline","estimate","acceptanceCriteria","definitionOfReady","order","rank","goal","objective","value","impact","outcome","whyNow","assignee","reviewer","risk","confidence","sprint","release","blockedReason","unblockNote","reporter","severity","environment","reproSteps","resolution","expectedResult","actualResult","affectedVersion","fixedVersion","component","regression","customerImpact","comment","note","learning","reminder","event","typeOption"],PM_TOOL_ACTION_NESTED_OPTION_COMPATIBILITY_KEYS=Object.freeze({"close-many":["list","expected_result","expected","actual_result","actual","validate_close","dry_run","checkpoint","no_checkpoint","filterAssignee_filter"],"update-many":["list","update","dry_run","checkpoint","no_checkpoint","filterAssignee_filter"],...Object.fromEntries(PM_TOOL_ACTIONS.filter(action=>action==="upgrade"||action==="install"||action==="extension"||action==="package"||action.startsWith("extension-")||action.startsWith("package-")).map(action=>[action,["project","local","global"]]))});function toSchemaKeyList(values){return normalizeUniqueStringList(values)}const CREATE_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_CREATE_OPTION_CONTRACTS.map(entry=>entry.param),...TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS.map(entry=>entry.param)]),UPDATE_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_UPDATE_OPTION_CONTRACTS.map(entry=>entry.param),...TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS.map(entry=>entry.param),"force"]),UPDATE_MANY_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_UPDATE_MANY_FILTER_OPTION_CONTRACTS.map(entry=>entry.param),...UPDATE_CONTRACT_PARAMETER_KEYS.filter(key=>key!=="allowMissingParent"&&key!=="completedAt"),"dryRun","rollback","noCheckpoint"]),CLOSE_MANY_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_CLOSE_MANY_FILTER_OPTION_CONTRACTS.map(entry=>entry.param),"reason","completedAt","resolution","expectedResult","actualResult","validateClose","dryRun","rollback","noCheckpoint","author","message","force"]),CONTEXT_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_CONTEXT_OPTION_CONTRACTS.map(entry=>entry.param),"past","section"]),ACTIVITY_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_ACTIVITY_OPTION_CONTRACTS.map(entry=>entry.param),"stream"]),LIST_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_LIST_FILTER_OPTION_CONTRACTS.map(entry=>entry.param),"all","includeBody","noTruncate","strictRead","compact","brief","full"]),FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS=LIST_CONTRACT_PARAMETER_KEYS.filter(parameter=>parameter!=="all"&¶meter!=="status"),LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS=[[{property:"today",schema:{const:!0}},{property:"recent",schema:{const:!0}}],[{property:"today",schema:{const:!0}},{property:"updatedAfter",schema:{type:"string",pattern:"\\S"}}],[{property:"recent",schema:{const:!0}},{property:"updatedAfter",schema:{type:"string",pattern:"\\S"}}]],CONTRACTS_PROJECTION_MUTUALLY_EXCLUSIVE_GROUPS=[[{property:"summary",schema:{const:!0}},{property:"schemaOnly",schema:{const:!0}}],[{property:"summary",schema:{const:!0}},{property:"flagsOnly",schema:{const:!0}}],[{property:"summary",schema:{const:!0}},{property:"availabilityOnly",schema:{const:!0}}],[{property:"schemaOnly",schema:{const:!0}},{property:"flagsOnly",schema:{const:!0}}],[{property:"schemaOnly",schema:{const:!0}},{property:"availabilityOnly",schema:{const:!0}}],[{property:"flagsOnly",schema:{const:!0}},{property:"availabilityOnly",schema:{const:!0}}]],AGGREGATE_CONTRACT_PARAMETER_KEYS=toSchemaKeyList([...TOOL_AGGREGATE_OPTION_CONTRACTS.map(entry=>entry.param),"count","completion","includeUnparented"]),SEARCH_CONTRACT_PARAMETER_KEYS=toSchemaKeyList(["query","keywords","mode","semantic","hybrid","includeLinked","titleExact","phraseExact","highlight","compact","full",...TOOL_SEARCH_FILTER_OPTION_CONTRACTS.map(entry=>entry.param)]),NEXT_CONTRACT_PARAMETER_KEYS=toSchemaKeyList(["type","tag","priority","assignee","assigneeFilter","sprint","release","parent","limit","blockedLimit","readyOnly","format","includeDecisions","includeGates","includeContainers","tokenBudget","explainRanking"]),AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS=["author","message","force"],CLOSE_ACTION_OPTION_KEYS=["releaseAssignment","text","reason","closeReason","completedAt","duplicateOf","validateClose","resolution","expectedResult","actualResult"],LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS=["author","assignee","message","force"],MANAGED_EXTENSION_PACKAGE_OPTION_KEYS=["dryRun","target","scope","capability","declarative","github","ref","init","install","uninstall","explore","manage","offline","describe","markdown","output","reload","doctor","catalog","list","adopt","adoptAll","activate","deactivate","runtimeProbe","fixManagedState","isolated","ignoreGlobal","detail","trace","watch","strictExit","failOnWarn"];function managedLifecycleSchemaContracts(prefix){return{[`${prefix}-init`]:{required:["target"],optional:["scope","capability",...prefix==="package"?["declarative"]:[]]},[`${prefix}-install`]:{optional:["target","github","scope","ref","dryRun"],anyOfRequired:[["target"],["github"]]},[`${prefix}-uninstall`]:{required:["target"],optional:["scope"]},[`${prefix}-explore`]:{optional:["scope"]},[`${prefix}-manage`]:{optional:["scope","runtimeProbe","fixManagedState","offline"]},[`${prefix}-describe`]:{optional:["target","scope","markdown","output"]},[`${prefix}-reload`]:{optional:["scope","watch"]},[`${prefix}-doctor`]:{optional:["scope","detail","trace","fixManagedState","isolated","ignoreGlobal","strictExit","failOnWarn"]},[`${prefix}-catalog`]:{optional:["scope","fields"]},[`${prefix}-adopt`]:{required:["target"],optional:["scope","github","ref"]},[`${prefix}-adopt-all`]:{optional:["scope"]},[`${prefix}-activate`]:{required:["target"],optional:["scope"]},[`${prefix}-deactivate`]:{required:["target"],optional:["scope"]},[prefix]:{optional:MANAGED_EXTENSION_PACKAGE_OPTION_KEYS,dependentAnyOfRequired:[{property:"dryRun",value:!0,anyOfRequired:[["install","target"],["install","github"]]}],mutuallyExclusiveWhen:[[{property:"dryRun",schema:{const:!0}},{property:"install",schema:{const:!1}}]]}}}const SCHEDULING_ACTION_SCHEMA_CONTRACT={required:["title"],optional:["start","duration","end","location","timezone","allDay","parent","inheritFocus","allowMissingParent","tags","priority","body","description","author","message"]},UPGRADE_ACTION_SCHEMA_CONTRACT={optional:["target","scope","dryRun","cliOnly","packagesOnly","repair","tag","packageName"]},PM_TOOL_ACTION_SCHEMA_CONTRACTS={init:{optional:["prefix","idPrefix","workspace","preset","typePreset","defaults","author","agentGuidance","withPackages","mergeFence","force","verbose"]},config:{required:["scope","configAction"],optional:["key","value","criterion","clearCriteria","format","policy"]},...managedLifecycleSchemaContracts("extension"),...managedLifecycleSchemaContracts("package"),"package-upgrade":UPGRADE_ACTION_SCHEMA_CONTRACT,install:{optional:["target","github","scope","ref","dryRun"],anyOfRequired:[["target"],["github"]]},upgrade:UPGRADE_ACTION_SCHEMA_CONTRACT,create:{required:["title","description","type","status","priority","message"],optional:CREATE_CONTRACT_PARAMETER_KEYS},copy:{required:["id"],optional:["title","author","message","allowDuplicate"]},focus:{optional:["id","clear"],mutuallyExclusive:[["id","clear"]]},list:{optional:LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-all":{optional:LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-draft":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-open":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-in-progress":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-blocked":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-closed":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},"list-canceled":{optional:FIXED_STATUS_LIST_CONTRACT_PARAMETER_KEYS,mutuallyExclusiveWhen:LIST_WINDOW_MUTUALLY_EXCLUSIVE_GROUPS},aggregate:{optional:AGGREGATE_CONTRACT_PARAMETER_KEYS},guide:{optional:["list","format","depth"]},context:{optional:CONTEXT_CONTRACT_PARAMETER_KEYS},ctx:{optional:CONTEXT_CONTRACT_PARAMETER_KEYS},get:{required:["id"],optional:["for","tokenBudget","at","depth","full","fields","tree","treeDepth","format"]},search:{optional:SEARCH_CONTRACT_PARAMETER_KEYS,anyOfRequired:[["query"],["keywords"]]},eval:{optional:["mode","k","failUnder","queries","format"]},events:{optional:["verify","since","type","author","item","limit","full","provenance","provenanceSummary","harness","agentInstance","provenanceFilter","cursorMode"]},merge:{required:["subcommand"],optional:["dryRun","preCommitHook","stage","author","message","force","includeReconciled","artifact","basePath","oursPath","theirsPath","output","outputPath","itemPath","prefer"]},workspace:{required:["subcommand"],optional:["snapshotAction","name","target","dryRun","force","author","message","lockTtlSeconds","lockWaitMs"],conditionalRequired:[{property:"subcommand",value:"snapshot",required:["snapshotAction"]}]},meet:SCHEDULING_ACTION_SCHEMA_CONTRACT,event:SCHEDULING_ACTION_SCHEMA_CONTRACT,remind:{required:["title"],optional:["at","text","parent","inheritFocus","allowMissingParent","tags","priority","body","description","author","message"]},next:{optional:[...NEXT_CONTRACT_PARAMETER_KEYS,"for"]},reindex:{optional:["mode","progress"]},history:{required:["id"],optional:["limit","order","compact","full","provenance","provenanceSummary","harness","agentInstance","provenanceFilter","diff","verify","field","strictExit","failOnWarn","format"]},"history-attest":{optional:["verify","output","hashAlgorithm"],mutuallyExclusive:[["verify","hashAlgorithm"]]},"history-redact":{required:["id"],optional:["literal","regex","replacement","dryRun",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],anyOfRequired:[["literal"],["regex"]]},"history-repair":{optional:["id","all","dryRun","normalizeProvenance","salvageTail",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],oneOfRequired:[["id"],["all"]],mutuallyExclusiveWhen:[[{property:"salvageTail",schema:{const:!0}},{property:"all",schema:{const:!0}}],[{property:"salvageTail",schema:{const:!0}},{property:"normalizeProvenance",schema:{const:!0}}]]},"history-author-acknowledge":{optional:["historyEvent","allActionable","dryRun","planFingerprint","limit","attributedAuthor","reviewer","reason"],oneOfRequired:[["historyEvent"],["allActionable"]]},"history-compact":{optional:["id","before","ids","allOver","closed","allStreams","minEntries","dryRun",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},schema:{mutuallyExclusiveWhen:[[{property:"subcommand",schema:{const:"policy-mode"}},{property:"name",schema:{not:{enum:["advise","refuse"]}}}]],required:["subcommand"],optional:["definition","policy","message","name","description","defaultStatus","folder","alias","role","order","fieldType","commands","cliFlag","required","requiredOnCreate","allowUnset","requiredTypes","typePreset","infer","minCount","apply","to","migrationId","fieldTypeScope","dryRun","author","force"],conditionalRequired:[{property:"subcommand",value:"policy-put",required:["definition"]},{property:"subcommand",value:"policy-remove",required:["name"]},{property:"subcommand",value:"policy-mode",required:["name"]},{property:"subcommand",value:"policy-check",required:["name"]},{property:"subcommand",value:"policy-approve",required:["name","policy"]},{property:"subcommand",value:"show",required:["name"]},{property:"subcommand",value:"show-status",required:["name"]},{property:"subcommand",value:"add-type",required:["name"]},{property:"subcommand",value:"remove-type",required:["name"]},{property:"subcommand",value:"add-status",required:["name"]},{property:"subcommand",value:"remove-status",required:["name"]},{property:"subcommand",value:"add-field",required:["name"]},{property:"subcommand",value:"remove-field",required:["name"]},{property:"subcommand",value:"show-field",required:["name"]},{property:"subcommand",value:"rename-type",required:["name","to"]},{property:"subcommand",value:"rename-field",required:["name","to"]},{property:"subcommand",value:"remap-status",required:["name","to"]},{property:"subcommand",value:"apply-preset",required:["typePreset"]}]},profile:{required:["subcommand"],optional:["name","dryRun","author","force"],conditionalRequired:[{property:"subcommand",value:"show",required:["name"]},{property:"subcommand",value:"apply",required:["name"]},{property:"subcommand",value:"lint",required:["name"]}]},plan:{required:["subcommand"],optional:["id","stepRef","reorderTo","title","description","template","scope","parent","inheritFocus","related","blocks","blockedBy","harness","mode","resumeContext","tags","priority",...PLAN_CREATE_METADATA_PARAMETER_KEYS,"body","claim","fromSearch","stepTitle","step","stepBody","stepOwner","stepStatus","stepEvidence","stepBlockedReason","stepReplacement","dependsOn","link","linkKind","linkNote","promoteToItemDep","allowMultipleActive","file","test","doc","decisionText","decision","decisionRationale","decisionEvidence","discoveryText","discovery","validationText","validation","validationCommand","validationExpected","depth","fields","steps","materializeType","materializeParent","materializeTags","field",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},activity:{optional:ACTIVITY_CONTRACT_PARAMETER_KEYS},restore:{required:["id","target"],optional:AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},update:{required:["id"],optional:UPDATE_CONTRACT_PARAMETER_KEYS,mutuallyExclusive:[["acceptanceCriteria","addAc"],["acceptanceCriteria","removeAc"]]},"update-many":{optional:UPDATE_MANY_CONTRACT_PARAMETER_KEYS,mutuallyExclusive:[["acceptanceCriteria","addAc"],["acceptanceCriteria","removeAc"]]},close:{required:["id"],optional:[...CLOSE_ACTION_OPTION_KEYS,...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},"close-many":{optional:CLOSE_MANY_CONTRACT_PARAMETER_KEYS},delete:{required:["id"],optional:["dryRun",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},append:{required:["id","body"],optional:AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},comments:{required:["id"],optional:["text","add","stdin","edit","delete","limit","full","ifAbsent",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],mutuallyExclusive:[["edit","ifAbsent"],["delete","ifAbsent"]]},notes:{required:["id"],optional:["text","add","addJson","stdin","edit","delete","limit","since","eventType","includeMeta","full","ifAbsent",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],mutuallyExclusive:[["addJson","add"],["addJson","stdin"],["addJson","file"],["addJson","edit"],["addJson","delete"],["edit","ifAbsent"],["delete","ifAbsent"]]},learnings:{required:["id"],optional:["text","add","stdin","edit","delete","limit","full","ifAbsent",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],mutuallyExclusive:[["edit","ifAbsent"],["delete","ifAbsent"]]},files:{required:[],optional:["id","add","addGlob","remove","migrate","list","addNote","discover","apply","discoveryNote","appendStable","validatePaths","lookupPath","scope","limit","offset","noTruncate","strictRead","explain","lines","decisionDepth",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],anyOfRequired:[["id"],["lookupPath"]],dependentAnyOfRequired:[{property:"addNote",anyOfRequired:[["add"],["addGlob"]]}]},docs:{required:["id"],optional:["add","addGlob","remove","migrate","addNote","list","validatePaths",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],dependentAnyOfRequired:[{property:"addNote",anyOfRequired:[["add"],["addGlob"]]}]},deps:{required:["id"],optional:["format","maxDepth","collapse","summary","full","nodeLimit","edgeLimit","tokenBudget","cursor","direction","kind"]},graph:{required:["subcommand"],optional:["id","target","kind","maxDepth","limit","after","direction","maxPaths","sample","exemptIsolate","exemptIsolateType","saveBaseline","rebuild","clear","summary","full"]},test:{required:["id"],optional:["list","add","addJson","remove","removeIndex","update","updateIndex","setJson","run","match","onlyIndex","onlyLast","background","timeout","progress","envSet","envClear","sharedHostSafe","pmContext","overrideLinkedPmContext","workspaceContext","overrideLinkedWorkspaceContext","allowUntrustedLinkedTests","acknowledgeLinkedTests","failOnContextMismatch","failOnSkipped","failOnEmptyTestRun","requireAssertionsForPm","checkContext","autoPmContext","measure","metricBelow","metricDiff",...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],dependentAnyOfRequired:[{property:"update",anyOfRequired:[["setJson"]]},{property:"updateIndex",anyOfRequired:[["setJson"]]},{property:"setJson",anyOfRequired:[["update"],["updateIndex"]]}],mutuallyExclusive:[["update","updateIndex"],["acknowledgeLinkedTests","run"],["acknowledgeLinkedTests","background"]]},"test-all":{optional:["status","limit","offset","background","timeout","progress","envSet","envClear","sharedHostSafe","pmContext","overrideLinkedPmContext","workspaceContext","overrideLinkedWorkspaceContext","allowUntrustedLinkedTests","failOnContextMismatch","failOnSkipped","failOnEmptyTestRun","requireAssertionsForPm","checkContext","autoPmContext"]},telemetry:{optional:["subcommand","limit"]},"test-runs-list":{optional:["status","limit"]},"test-runs-status":{required:["runId"]},"test-runs-logs":{required:["runId"],optional:["stream","tail"]},"test-runs-stop":{required:["runId"],optional:["force"]},"test-runs-resume":{required:["runId"],optional:["author"]},stats:{optional:["includeEmpty","storage","metadataCoverage","fieldUtilization","byAssignee","byTag","byPriority","tagPrefix","measurements","metric","measurementLimit","observe","improvementDirection","measurementSource","measurementItem","measurementRevision","author","message","provenanceCoverage","fleetAttribution","since","eventLimit","minimumSample"]},duplicates:{optional:["status","since","threshold","limit","exhaustive"]},health:{optional:["strictDirectories","requireMergeDrivers","strictExit","failOnWarn","checkOnly","checkTelemetry","noRefresh","refreshVectors","verboseStaleItems","verboseAuthorEvents","brief","summary","skipVectors","skipIntegrity","skipDrift","full"]},validate:{optional:["checkCompleteness","checkStorageIntegrity","checkMetadata","metadataProfile","checkResolution","checkLifecycle","checkStaleBlockers","dependencyCycleSeverity","parentCycleSeverity","checkFiles","scanMode","includePmInternals","verboseFileLists","verboseDiagnostics","allAffectedIds","strictExit","failOnWarn","fixHints","autoFix","dryRun","fixScope","pruneMissing","checkHistoryDrift","checkCommandReferences","counts","full"]},assurance:{required:["subcommand"],optional:["kind","id","definition","trigger","treeId","gate","limit","dryRun","author","message","preset","owner","apply","enforcement"],conditionalRequired:[{property:"subcommand",value:"list",required:["kind"]},{property:"subcommand",value:"show",required:["kind","id"]},{property:"subcommand",value:"put",required:["kind","id","definition"]},{property:"subcommand",value:"remove",required:["kind","id"]},{property:"subcommand",value:"run",required:["id","trigger"]},{property:"subcommand",value:"apply",required:["preset","owner"]},{property:"subcommand",value:"derive",required:["owner"]},{property:"subcommand",value:"risk",required:["definition"]},{property:"subcommand",value:"lineages",required:["definition"]},{property:"subcommand",value:"promote",required:["id","enforcement"]}],mutuallyExclusiveWhen:[[{property:"subcommand",schema:{const:"risk"}},{property:"definition",schema:{not:{required:["policy","change"]}}}],[{property:"subcommand",schema:{const:"lineages"}},{property:"definition",schema:{anyOf:[{required:["change"]},{not:{required:["policy"]}}]}}]]},gc:{optional:["dryRun","gcScope"]},contracts:{optional:["contractAction","command","summary","schemaOnly","flagsOnly","availabilityOnly","runtimeOnly","activeOnly","full"],mutuallyExclusiveWhen:CONTRACTS_PROJECTION_MUTUALLY_EXCLUSIVE_GROUPS},completion:{required:["shell"],optional:["eagerTags"]},claim:{optional:["start","id","next","ifAvailable","maxAttempts","includeDecisions",...NEXT_CONTRACT_PARAMETER_KEYS,...LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],oneOfRequired:[["id"],["next"]],mutuallyExclusiveWhen:[[{property:"start",schema:{const:!0}},{property:"ifAvailable",schema:{const:!0}},{property:"id",schema:{type:"string"}}]]},release:{required:["id"],optional:["pause","handoff",...LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS],dependentAnyOfRequired:[{property:"handoff",anyOfRequired:[["message"]]}],mutuallyExclusiveWhen:[[{property:"pause",schema:{const:!0}},{property:"handoff",schema:{type:"string"}}]]},"start-task":{required:["id"],optional:LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},"pause-task":{required:["id"],optional:LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS},"close-task":{required:["id"],optional:["text","validateClose",...LIFECYCLE_AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS]},"item-reopen":{required:["id","reason"],optional:["status","expectedResult","author","message","force"]}},PM_TOOL_ACTION_PARAMETER_CONTRACTS=Object.freeze(Object.fromEntries(PM_TOOL_ACTIONS.map(action=>[action,PM_TOOL_ACTION_SCHEMA_CONTRACTS[action]])));function fallbackToolParameterDescription(key){return key.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]/g," ").trim().replace(/^./,value=>value.toUpperCase()).concat(".")}function decorateToolParameterDefinition(key,definition){const baseDefinition=typeof definition=="object"&&definition!==null?{...definition}:{},metadata=PM_TOOL_PARAMETER_METADATA[key];return{...baseDefinition,description:metadata?.description??fallbackToolParameterDescription(key),...metadata?.examples?{examples:metadata.examples}:{}}}function actionScopedToolParameterMetadata(action,key){if(action==="history-attest"&&key==="verify")return{description:"Compare all retained history streams with a detached JSON proof object. Server-local proof paths are not accepted over MCP."};if(action==="history-attest"&&key==="output")return{description:"Local CLI/SDK only. MCP rejects this field; save the returned JSON bundle on the client."};if(action==="claim"&&key==="start")return{description:"Move the claimed item to its configured in-progress status; with next, the selected item is claimed and started in one locked write."};if((action==="list"||action.startsWith("list-"))&&key==="all")return{description:"Return items from every lifecycle status instead of the default active-status set."};if(action==="plan"&&Object.prototype.hasOwnProperty.call(PLAN_ACTION_PARAMETER_METADATA,key))return PLAN_ACTION_PARAMETER_METADATA[key];const actionOverrides=PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA[action];return actionOverrides&&Object.prototype.hasOwnProperty.call(actionOverrides,key)?actionOverrides[key]:PM_TOOL_PARAMETER_METADATA[key]}function decorateActionScopedToolParameterDefinition(action,key,definition){const baseDefinition=typeof definition=="object"&&definition!==null?{...definition}:{},metadata=actionScopedToolParameterMetadata(action,key);return{...baseDefinition,description:metadata?.description??fallbackToolParameterDescription(key),...metadata?.examples?{examples:metadata.examples}:{}}}function actionScopedToolParameterDefinition(action,key){if(action==="claim"&&key==="start")return{type:"boolean"};const actionProperties=PM_TOOL_ACTION_SCOPED_PARAMETER_PROPERTIES[action];return actionProperties&&Object.prototype.hasOwnProperty.call(actionProperties,key)?actionProperties[key]:action==="plan"&&Object.prototype.hasOwnProperty.call(PLAN_ACTION_PARAMETER_PROPERTIES,key)?PLAN_ACTION_PARAMETER_PROPERTIES[key]:(action==="get"||action==="history"||action==="search")&&key==="format"?{type:"string",enum:["json","toon"]}:key==="pause"||key==="handoff"||key==="releaseAssignment"||key==="hashAlgorithm"?PM_TOOL_PARAMETER_PROPERTIES[key]:BASE_TOOL_PARAMETER_PROPERTIES[key]}function buildActionScopedSchemaProperties(action,allowedKeys){const properties={action:{const:action,description:PM_TOOL_PARAMETER_METADATA.action?.description??"Tool action to execute."}};for(const key of allowedKeys){if(key==="action")continue;const definition=actionScopedToolParameterDefinition(action,key);definition&&(properties[key]=decorateActionScopedToolParameterDefinition(action,key,definition))}return properties}function buildOneOfSchemaEntries(action,oneOfRequiredGroups){const allOneOfFields=oneOfRequiredGroups.flat();return oneOfRequiredGroups.map(requiredFields=>{const otherFields=allOneOfFields.filter(field=>!requiredFields.includes(field));return{required:[...requiredFields],...otherFields.length>0?{not:{anyOf:otherFields.map(field=>({required:[field]}))}}:{},...action==="history-repair"&&requiredFields.includes("all")?{properties:{all:{const:!0}}}:action==="claim"&&requiredFields.includes("next")?{properties:{next:{const:!0}}}:{}}})}function schemaPropertyCondition(property,value){return{...value===void 0?{}:{properties:{[property]:{const:value}}},required:[property]}}function buildActionScopedAllOf(contract){const allOf=[];if(contract.conditionalRequired&&contract.conditionalRequired.length>0)for(const entry of contract.conditionalRequired)allOf.push({if:schemaPropertyCondition(entry.property,entry.value),then:{required:entry.required}});if(contract.dependentAnyOfRequired&&contract.dependentAnyOfRequired.length>0)for(const entry of contract.dependentAnyOfRequired)allOf.push({if:schemaPropertyCondition(entry.property,entry.value),then:{anyOf:entry.anyOfRequired.map(requiredFields=>({required:[...requiredFields]}))}});if(contract.mutuallyExclusive&&contract.mutuallyExclusive.length>0)for(const group of contract.mutuallyExclusive)allOf.push({not:{required:toSchemaKeyList(group)}});if(contract.mutuallyExclusiveWhen&&contract.mutuallyExclusiveWhen.length>0)for(const group of contract.mutuallyExclusiveWhen)allOf.push({not:{allOf:group.map(condition=>({properties:{[condition.property]:condition.schema},required:[condition.property]}))}});return allOf}function pmToolActionParameterKeys(action){if(!Object.prototype.hasOwnProperty.call(PM_TOOL_ACTION_SCHEMA_CONTRACTS,action))return;const contract=PM_TOOL_ACTION_SCHEMA_CONTRACTS[action],mutationParameterKeys=PM_TOOL_ACTION_MUTATION_PARAMETER_KEYS[action]??[];return toSchemaKeyList(["action",...PM_TOOL_GLOBAL_PARAMETER_KEYS,...resolveReadOutputSurface(action)!==void 0?PM_TOOL_READ_OUTPUT_PARAMETER_KEYS:[],...mutationParameterKeys,...PM_EXPECT_HASH_ACTIONS.has(action)?["expectHash"]:[],...contract.required??[],...contract.optional??[]])}function pmToolActionNestedOptionKeys(action){const parameterKeys=pmToolActionParameterKeys(action);if(parameterKeys===void 0)return;const mutationContracts=action==="create"?CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS:action==="update"?UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS:[];return toSchemaKeyList([...parameterKeys,...mutationContracts.flatMap(({keys,target})=>[target,...keys]),...PM_TOOL_ACTION_NESTED_OPTION_COMPATIBILITY_KEYS[action]??[]])}function buildActionScopedToolSchema(action){const contract=PM_TOOL_ACTION_SCHEMA_CONTRACTS[action],required=toSchemaKeyList(contract.required??[]),allowedKeys=pmToolActionParameterKeys(action),schema={type:"object",additionalProperties:!1,required:["action",...required],title:`pm action "${action}" parameters`,properties:buildActionScopedSchemaProperties(action,allowedKeys)};contract.anyOfRequired&&contract.anyOfRequired.length>0&&(schema.anyOf=contract.anyOfRequired.map(requiredFields=>({required:[...requiredFields]}))),contract.oneOfRequired&&contract.oneOfRequired.length>0&&(schema.oneOf=buildOneOfSchemaEntries(action,contract.oneOfRequired));const allOf=buildActionScopedAllOf(contract);return allOf.length>0&&(schema.allOf=allOf),schema}function buildPmActionToolInputSchema(action,options={}){const actionSchema=buildActionScopedToolSchema(action),actionProperties={...actionSchema.properties};delete actionProperties.action;const conditionalBranches=[...actionSchema.anyOf??[],...actionSchema.oneOf??[]],required=(options.required??actionSchema.required.map(String)).filter(key=>key==="action"?!1:options.required===void 0?!0:!conditionalBranches.some(branch=>branch.required?.map(String).includes(key))),schema={type:"object",additionalProperties:options.additionalProperties??!0,properties:{...actionProperties,options:{type:"object",additionalProperties:!0,description:"Advanced command options forwarded to the selected pm action."},...options.properties},required};return actionSchema.anyOf!==void 0&&(schema.anyOf=actionSchema.anyOf),actionSchema.oneOf!==void 0&&(schema.oneOf=actionSchema.oneOf),actionSchema.allOf!==void 0&&(schema.allOf=actionSchema.allOf),schema}function createLazyContractSchema(build){let value;const resolve=()=>value??=build();return new Proxy({},{get:(_target,prop)=>resolve()[prop],has:(_target,prop)=>prop in resolve(),ownKeys:()=>Reflect.ownKeys(resolve()),getOwnPropertyDescriptor:(_target,prop)=>{const descriptor=Reflect.getOwnPropertyDescriptor(resolve(),prop);return descriptor&&(descriptor.configurable=!0),descriptor}})}const PM_TOOL_PARAMETERS_SCHEMA_VERSION="4.23.0",PM_TOOL_PARAMETERS_SCHEMA_MAJOR=PM_TOOL_PARAMETERS_SCHEMA_VERSION.split(".")[0],PM_PROVIDER_TOOL_PARAMETERS_SCHEMA_VERSION="1.12.0",PM_TOOL_PARAMETERS_SCHEMA=createLazyContractSchema(()=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://schema.unbrained.dev/pm-cli/tool-parameters-v${PM_TOOL_PARAMETERS_SCHEMA_MAJOR}.schema.json`,title:"pm-cli tool parameters (action-scoped strict schema)","x-schema-version":PM_TOOL_PARAMETERS_SCHEMA_VERSION,type:"object",oneOf:PM_TOOL_ACTIONS.map(action=>buildActionScopedToolSchema(action))}));function toProviderCompatibleParameterDefinition(key,definition){const decorated=decorateToolParameterDefinition(key,definition);if(typeof decorated.type=="string")return decorated;const firstTypedVariant=(Array.isArray(decorated.anyOf)?decorated.anyOf:[]).find(variant=>typeof variant.type=="string");if(firstTypedVariant){const{anyOf:_anyOf2,...rest2}=decorated;return{...firstTypedVariant,...rest2}}const{anyOf:_anyOf,...rest}=decorated;return{...rest,type:"string"}}function buildProviderCompatibleToolSchema(){const properties={action:{type:"string",description:PM_TOOL_PARAMETER_METADATA.action?.description??"Tool action to execute."},options:{type:"object",additionalProperties:!0,description:"Advanced command options object forwarded to the selected pm action."}};for(const key of Object.keys(PM_TOOL_PARAMETER_PROPERTIES).sort())properties[key]=toProviderCompatibleParameterDefinition(key,PM_TOOL_PARAMETER_PROPERTIES[key]);return{title:"pm-cli tool parameters (provider-compatible flat schema)","x-schema-version":PM_PROVIDER_TOOL_PARAMETERS_SCHEMA_VERSION,type:"object",additionalProperties:!1,required:["action"],properties}}const PM_PROVIDER_TOOL_PARAMETERS_SCHEMA=createLazyContractSchema(buildProviderCompatibleToolSchema),_testOnlyCliContracts={buildActionScopedToolSchema,buildProviderCompatibleToolSchema,decorateActionScopedToolParameterDefinition,decorateToolParameterDefinition,toolActionSchemaContracts:PM_TOOL_ACTION_SCHEMA_CONTRACTS,toolParameterMetadata:PM_TOOL_PARAMETER_METADATA,toProviderCompatibleParameterDefinition,toUniqueFlagContracts,withFlagAliasMetadata};export{CLOSE_ACTION_OPTION_KEYS,PLAN_CREATE_METADATA_PARAMETER_KEYS,PM_PROVIDER_TOOL_PARAMETERS_SCHEMA,PM_PROVIDER_TOOL_PARAMETERS_SCHEMA_VERSION,PM_TOOL_ACTION_PARAMETER_CONTRACTS,PM_TOOL_PARAMETERS_SCHEMA,PM_TOOL_PARAMETERS_SCHEMA_MAJOR,PM_TOOL_PARAMETERS_SCHEMA_VERSION,PM_TOOL_RESERVED_CUSTOM_FIELD_PROPERTIES,_testOnlyCliContracts,buildPmActionToolInputSchema,pmToolActionNestedOptionKeys,pmToolActionParameterKeys,resolvePmToolCustomFieldCollision};
|
|
2
2
|
//# sourceMappingURL=tool-schema.js.map
|
package/dist/sdk/cli-program.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a851f5ac-99a5-5061-a0c3-a08d898ea20b")}catch{}})();import{Command}from"commander";import{writeStdout}from"../core/output/output.js";function createPmCliProgram(version){return new Command().name("pm").description("Universal, flexible, extensible, agent-optimized project management CLI for any project or programming language.").version(version).showHelpAfterError(!1).allowExcessArguments(!1).allowUnknownOption(!1).configureOutput({writeOut:value=>{writeStdout(value)},writeErr:()=>{}}).option("--json","Output JSON instead of TOON; mutations emit a flat receipt with top-level id/status/changed_field_count while reads use documented entity or collection envelopes").option("--lean","Omit null and empty containers from JSON output").option("--token-accounting","Attach a bounded per-section token-cost receipt to command output").option("--output-include <fields>","Retain comma-separated fields or sections in read output").option("--output-limit <count>","Bound rows in read output").option("--output-budget <tokens|unbounded>","Bound estimated tokens in read output or explicitly disable the default ceiling").option("--output-format <toon|json>","Select the result encoding for reads and mutations").option("--output-session <state>","Carry a JSON session budget and served-item ledger across read calls").option("--output-cursor <cursor>","Resume continuation_kind=output_cursor").option("--output-row-contract","Include row selectors, encoding metadata, and read-output receipts").option("--quiet","Suppress stdout output").option("--no-changed-fields","Omit the changed_fields array from mutation output (keeps changed_field_count)").option("--full-changed-fields","Restore the legacy full mutation envelope and changed_fields array").option("--id-only","Print only id and status for single-item mutation output").option("--pm-path <dir>","Explicit tracker storage path for this command (preferred over --path)").option("--path <dir>","Backward-compatible alias for --pm-path; this is the tracker storage path, not a workspace cwd").option("--no-extensions","Disable extension loading").option("--no-pager","Disable pager integration for help and long output").option("--explain","Render extended rationale and examples in help output").option("--all","Reveal every public command and compatibility alias").option("--profile","Print deterministic timing diagnostics").option("--author <id>","Override mutation author for this invocation").option("--expect-hash <revision>","Refuse writes to the named item unless it is still at this item_hash from pm get (a bare hash names the command's <id>; guard each other item with <id>=<item_hash>, repeatable)",(value,previous)=>[...previous??[],value]).exitOverride()}export{createPmCliProgram};
|
|
2
2
|
//# sourceMappingURL=cli-program.js.map
|
package/dist/sdk/config.d.ts
CHANGED
|
@@ -146,7 +146,7 @@ declare function normalizeGovernancePreset(value:string | undefined):GovernanceP
|
|
|
146
146
|
declare function normalizeGovernanceOwnershipEnforcement(value:string | undefined):GovernanceOwnershipEnforcement;
|
|
147
147
|
declare function normalizeGovernanceCreateModeDefault(value:string | undefined):GovernanceCreateModeDefault;
|
|
148
148
|
declare function normalizeGovernanceCloseValidationDefault(value:string | undefined):GovernanceCloseValidationDefault;
|
|
149
|
-
declare function normalizeGovernanceWorkflowEnforcement(value:unknown):GovernanceWorkflowEnforcement;
|
|
149
|
+
declare function normalizeGovernanceWorkflowEnforcement(value:unknown,key?:string):GovernanceWorkflowEnforcement;
|
|
150
150
|
declare function normalizeGovernanceForceRequiredForStaleLockPolicy(value:string | undefined):GovernanceForceRequiredForStaleLockPolicy;
|
|
151
151
|
declare function normalizeGovernanceRequireCloseReasonPolicy(value:string | undefined):GovernanceRequireCloseReasonPolicy;
|
|
152
152
|
declare function normalizePolicyForConflict(key:ConfigKey | undefined,value:string):string;
|
package/dist/sdk/config.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e8446c93-c40c-572d-86fa-d78535a6f66e")}catch{}})();import{resolveConfigPositionalValue}from"../core/config/positional-value.js";import{NESTED_SETTING_DESCRIPTORS,parseNestedSettingValue,readNestedSettingValue,resolveNestedSettingDescriptor,writeNestedSettingValue}from"../core/config/nested-settings.js";import{getActiveExtensionRegistrations}from"../core/extensions/index.js";import{normalizeParentReferencePolicy}from"../core/item/parent-reference-policy.js";import{normalizeSprintReleaseFormatPolicy}from"../core/item/sprint-release-format.js";import{resolveItemTypeRegistry,resolveTypeName}from"../core/item/type-registry.js";import{buildInvalidTypeError}from"../core/schema/item-types-file.js";import{resolveItemTypesFilePath}from"../core/schema/runtime-schema.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{planAgentIdentityVocabularyMutation,summarizeAgentIdentityVocabulary}from"./agent/identity-config.js";import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{migrateItemFilesToFormat}from"../core/store/item-format-migration.js";import{getSettingsPath,resolveGlobalPmRoot,resolvePmRoot}from"../core/store/paths.js";import{isSettingsReadFallback,readSettings,readSettingsWithMetadata,writeSettings}from"../core/store/settings.js";import{CONTEXT_DEPTH_VALUES}from"../types/index.js";const CONFIG_SCOPE_VALUES=["project","global"],CONFIG_KEY_ALIASES={definition_of_done:["definition-of-done","definition_of_done"],item_format:["item-format","item_format"],history_missing_stream_policy:["history-missing-stream-policy","history_missing_stream_policy"],sprint_release_format_policy:["sprint-release-format-policy","sprint_release_format_policy"],parent_reference_policy:["parent-reference-policy","parent_reference_policy"],metadata_validation_profile:["metadata-validation-profile","metadata_validation_profile"],metadata_required_fields:["metadata-required-fields","metadata_required_fields"],lifecycle_stale_blocker_reason_patterns:["lifecycle-stale-blocker-reason-patterns","lifecycle_stale_blocker_reason_patterns"],lifecycle_closure_like_blocked_reason_patterns:["lifecycle-closure-like-blocked-reason-patterns","lifecycle_closure_like_blocked_reason_patterns"],lifecycle_closure_like_resolution_patterns:["lifecycle-closure-like-resolution-patterns","lifecycle_closure_like_resolution_patterns"],lifecycle_closure_like_actual_result_patterns:["lifecycle-closure-like-actual-result-patterns","lifecycle_closure_like_actual_result_patterns"],governance_preset:["governance-preset","governance_preset"],governance_ownership_enforcement:["governance-ownership-enforcement","governance_ownership_enforcement"],governance_create_mode_default:["governance-create-mode-default","governance_create_mode_default"],governance_close_validation_default:["governance-close-validation-default","governance_close_validation_default"],governance_require_close_reason:["governance-require-close-reason","governance_require_close_reason"],governance_create_default_type:["governance-create-default-type","governance_create_default_type"],governance_workflow_enforcement:["governance-workflow-enforcement","governance_workflow_enforcement"],governance_parent_reference_policy:["governance-parent-reference-policy","governance_parent_reference_policy"],governance_metadata_validation_profile:["governance-metadata-validation-profile","governance_metadata_validation_profile"],governance_force_required_for_stale_lock:["governance-force-required-for-stale-lock","governance_force_required_for_stale_lock"],test_result_tracking:["test-result-tracking","test_result_tracking"],untrusted_linked_test_execution:["untrusted-linked-test-execution","untrusted_linked_test_execution"],telemetry_tracking:["telemetry-tracking","telemetry_tracking"],agent_identity_vocabulary:["agent-identity-vocabulary","agent_identity_vocabulary"],context:["context"]},CANONICAL_CONFIG_KEYS=Object.keys(CONFIG_KEY_ALIASES).map(candidate=>CONFIG_KEY_ALIASES[candidate][0]),CONFIG_KEY_BY_ALIAS=Object.fromEntries(Object.keys(CONFIG_KEY_ALIASES).flatMap(key=>CONFIG_KEY_ALIASES[key].map(alias=>[alias,key]))),CONFIG_KEY_SUMMARIES={definition_of_done:"Definition of Done criteria list.",item_format:"Default item file format.",history_missing_stream_policy:"Missing history stream handling policy.",sprint_release_format_policy:"Sprint/release format validation policy.",parent_reference_policy:"Parent reference validation policy.",metadata_validation_profile:"Validate metadata profile policy (core|strict|custom).",metadata_required_fields:"Validate custom metadata required-fields list.",lifecycle_stale_blocker_reason_patterns:"Validate lifecycle stale-blocker reason substring patterns (criteria list).",lifecycle_closure_like_blocked_reason_patterns:"Validate lifecycle closure-like blocked_reason substring patterns (criteria list).",lifecycle_closure_like_resolution_patterns:"Validate lifecycle closure-like resolution substring patterns (criteria list).",lifecycle_closure_like_actual_result_patterns:"Validate lifecycle closure-like actual_result substring patterns (criteria list).",governance_preset:"Governance preset policy (minimal|default|strict|custom).",governance_ownership_enforcement:"Governance ownership enforcement policy (none|warn|strict).",governance_create_mode_default:"Governance default create mode (progressive|strict).",governance_close_validation_default:"Governance default close validation mode (off|warn|strict).",governance_require_close_reason:"Governance close-reason requirement policy (enabled|disabled).",governance_create_default_type:"Governance default item type for `pm create` when --type is omitted.",governance_workflow_enforcement:"Governance per-type transition enforcement mode (off|warn|strict).",governance_parent_reference_policy:"Governance parent reference policy (warn|strict_error).",governance_metadata_validation_profile:"Governance metadata validation profile (core|strict|custom).",governance_force_required_for_stale_lock:"Governance stale-lock force policy (enabled|disabled).",test_result_tracking:"Item-level linked test result persistence policy.",untrusted_linked_test_execution:"Permit an explicit per-run override for commands not trusted by this clone.",telemetry_tracking:"Telemetry usage reporting policy.",agent_identity_vocabulary:"Versioned exact legacy-author interpretation vocabulary (summary only).",context:"Context command settings (depth, section toggles, limits)."},LIFECYCLE_PATTERN_CONFIG_KEYS=["lifecycle_stale_blocker_reason_patterns","lifecycle_closure_like_blocked_reason_patterns","lifecycle_closure_like_resolution_patterns","lifecycle_closure_like_actual_result_patterns"],CRITERIA_CONFIG_KEYS=new Set(["metadata_required_fields",...LIFECYCLE_PATTERN_CONFIG_KEYS]),TRACKING_CONFIG_KEYS=new Set(["test_result_tracking","untrusted_linked_test_execution","telemetry_tracking"]),GOVERNANCE_BOOLEAN_CONFIG_KEYS=new Set(["governance_require_close_reason","governance_force_required_for_stale_lock"]),GOVERNANCE_POLICY_CONFIG_KEYS=new Set(["governance_ownership_enforcement","governance_create_mode_default","governance_close_validation_default"]),GOVERNANCE_VALIDATION_CONFIG_KEYS=new Set(["governance_parent_reference_policy","governance_metadata_validation_profile","governance_workflow_enforcement"]),GOVERNANCE_PRESET_OR_TYPE_CONFIG_KEYS=new Set(["governance_preset","governance_create_default_type"]),isCriteriaValueConfigKey=key=>CRITERIA_CONFIG_KEYS.has(key),isGovernancePolicyConfigKey=key=>GOVERNANCE_POLICY_CONFIG_KEYS.has(key),isGovernanceValidationConfigKey=key=>GOVERNANCE_VALIDATION_CONFIG_KEYS.has(key),isGovernancePresetOrTypeConfigKey=key=>GOVERNANCE_PRESET_OR_TYPE_CONFIG_KEYS.has(key);function isCriteriaConfigKey(key){return key==="definition_of_done"||isCriteriaValueConfigKey(key)}function normalizeScope(value){if(CONFIG_SCOPE_VALUES.includes(value))return value;throw new PmCliError(`Invalid config scope "${value}". Allowed: ${CONFIG_SCOPE_VALUES.join(", ")}`,EXIT_CODE.USAGE)}function normalizeAction(value){if(value==="get"||value==="set"||value==="list"||value==="export")return value;throw createUnknownSubcommandError({command_path:"config",token:value.trim()||"<empty>",allowed:["export","get","list","set"],token_kind:"action"})}function normalizeKey(value){const key=CONFIG_KEY_BY_ALIAS[value];if(key)return key;const nestedKeys=NESTED_SETTING_DESCRIPTORS.map(descriptor=>descriptor.key).join(", ");throw new PmCliError(`Invalid config key "${value}". Supported: ${CANONICAL_CONFIG_KEYS.join(", ")} (underscore variants also accepted). Nested leaf settings: ${nestedKeys}.`,EXIT_CODE.USAGE)}function normalizeCriteria(values,clearCriteria){const normalized=[...new Set((values??[]).map(value=>value.trim()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right));if(clearCriteria){if(normalized.length>0)throw new PmCliError("Config set definition-of-done cannot combine --clear-criteria with --criterion values",EXIT_CODE.USAGE);return[]}if(normalized.length===0)throw new PmCliError("Config set definition-of-done requires at least one non-empty --criterion value (or --clear-criteria to clear)",EXIT_CODE.USAGE);return normalized}function normalizeItemFormat(value){const normalized=value?.trim().toLowerCase();if(normalized==="toon")return"toon";throw normalized==="json_markdown"?new PmCliError("Config set item-format no longer accepts json_markdown. Markdown item files are legacy read/migration input only.",EXIT_CODE.USAGE):new PmCliError("Config set item-format requires --format toon",EXIT_CODE.USAGE)}function normalizeHistoryMissingStreamPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="auto_create"||normalized==="strict_error")return normalized;throw new PmCliError("Config set history-missing-stream-policy requires --policy with one of: auto_create, strict_error",EXIT_CODE.USAGE)}function normalizeTestResultTrackingPolicy(value){return normalizeEnabledDisabledPolicy(value,"test-result-tracking")}function normalizeEnabledDisabledPolicy(value,key){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError(`Config set ${key} requires --policy with one of: enabled, disabled`,EXIT_CODE.USAGE)}function normalizeTelemetryTrackingPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError("Config set telemetry-tracking requires --policy with one of: enabled, disabled",EXIT_CODE.USAGE)}function normalizeValidateMetadataProfile(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="core"||normalized==="strict"||normalized==="custom")return normalized;throw new PmCliError("Config set metadata-validation-profile requires --policy with one of: core, strict, custom",EXIT_CODE.USAGE)}function normalizeGovernancePreset(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="minimal"||normalized==="default"||normalized==="strict"||normalized==="custom")return normalized;throw new PmCliError("Config set governance-preset requires --policy with one of: minimal, default, strict, custom",EXIT_CODE.USAGE)}function normalizeGovernanceOwnershipEnforcement(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="none"||normalized==="warn"||normalized==="strict")return normalized;throw new PmCliError("Config set governance-ownership-enforcement requires --policy with one of: none, warn, strict",EXIT_CODE.USAGE)}function normalizeGovernanceCreateModeDefault(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="progressive"||normalized==="strict")return normalized;throw new PmCliError("Config set governance-create-mode-default requires --policy with one of: progressive, strict",EXIT_CODE.USAGE)}function normalizeGovernanceCloseValidationDefault(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="off"||normalized==="warn"||normalized==="strict")return normalized;if(normalized==="none"||normalized==="disabled")return"off";throw new PmCliError("Config set governance-close-validation-default requires --policy with one of: off, warn, strict",EXIT_CODE.USAGE)}function normalizeGovernanceWorkflowEnforcement(value){const normalized=typeof value=="string"?value.trim().toLowerCase().replaceAll("-","_"):void 0;if(normalized==="off"||normalized==="warn"||normalized==="strict")return normalized;if(normalized==="none"||normalized==="disabled")return"off";throw new PmCliError("Config set governance-workflow-enforcement requires one of: off, warn, strict",EXIT_CODE.USAGE)}function normalizeGovernanceForceRequiredForStaleLockPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError("Config set governance-force-required-for-stale-lock requires --policy with one of: enabled, disabled",EXIT_CODE.USAGE)}function normalizeGovernanceRequireCloseReasonPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError("Config set governance-require-close-reason requires --policy with one of: enabled, disabled",EXIT_CODE.USAGE)}const ENABLED_DISABLED_CONFLICT_POLICY_KEYS={test_result_tracking:"test-result-tracking",untrusted_linked_test_execution:"untrusted-linked-test-execution"};function normalizePolicyForConflict(key,value){const enabledDisabledKey=ENABLED_DISABLED_CONFLICT_POLICY_KEYS[key];if(enabledDisabledKey)return normalizeEnabledDisabledPolicy(value,enabledDisabledKey);switch(key){case"history_missing_stream_policy":return normalizeHistoryMissingStreamPolicy(value);case"sprint_release_format_policy":return normalizeSprintReleaseFormatPolicy(value);case"parent_reference_policy":case"governance_parent_reference_policy":return normalizeParentReferencePolicy(value);case"metadata_validation_profile":case"governance_metadata_validation_profile":return normalizeValidateMetadataProfile(value);case"governance_preset":return normalizeGovernancePreset(value);case"governance_ownership_enforcement":return normalizeGovernanceOwnershipEnforcement(value);case"governance_create_mode_default":return normalizeGovernanceCreateModeDefault(value);case"governance_close_validation_default":return normalizeGovernanceCloseValidationDefault(value);case"governance_require_close_reason":return normalizeGovernanceRequireCloseReasonPolicy(value);case"governance_workflow_enforcement":return normalizeGovernanceWorkflowEnforcement(value);case"governance_force_required_for_stale_lock":return normalizeGovernanceForceRequiredForStaleLockPolicy(value);case"telemetry_tracking":return normalizeTelemetryTrackingPolicy(value);default:return value.trim().toLowerCase().replaceAll("-","_")}}const METADATA_REQUIRED_FIELD_ALIAS_MAP={author:"author",acceptance_criteria:"acceptance_criteria","acceptance-criteria":"acceptance_criteria",estimated_minutes:"estimated_minutes","estimated-minutes":"estimated_minutes",estimate:"estimated_minutes",close_reason:"close_reason","close-reason":"close_reason",reviewer:"reviewer",risk:"risk",confidence:"confidence",sprint:"sprint",release:"release"},METADATA_REQUIRED_FIELD_OPTIONS=["author","acceptance_criteria","estimated_minutes","close_reason","reviewer","risk","confidence","sprint","release"];function normalizeMetadataRequiredFields(values,clearCriteria){const normalized=[...new Set((values??[]).map(value=>value.trim()).filter(value=>value.length>0))];if(clearCriteria){if(normalized.length>0)throw new PmCliError("Config set metadata-required-fields cannot combine --clear-criteria with --criterion values",EXIT_CODE.USAGE);return[]}if(normalized.length===0)throw new PmCliError("Config set metadata-required-fields requires at least one --criterion value (or --clear-criteria to clear)",EXIT_CODE.USAGE);const lowered=normalized.map(value=>value.toLowerCase().replaceAll("-","_")),unsupported=lowered.filter(value=>METADATA_REQUIRED_FIELD_ALIAS_MAP[value]===void 0);if(unsupported.length>0)throw new PmCliError(`Config set metadata-required-fields received unsupported values: ${unsupported.join(", ")}. Supported values: ${METADATA_REQUIRED_FIELD_OPTIONS.join(", ")}`,EXIT_CODE.USAGE);return[...new Set(lowered.map(value=>METADATA_REQUIRED_FIELD_ALIAS_MAP[value]))].sort((left,right)=>left.localeCompare(right))}function normalizeLifecyclePatternCriteria(key,values,clearCriteria){const normalized=[...new Set((values??[]).map(value=>value.trim().toLowerCase()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right));if(clearCriteria){if(normalized.length>0)throw new PmCliError(`Config set ${CONFIG_KEY_ALIASES[key][0]} cannot combine --clear-criteria with --criterion values`,EXIT_CODE.USAGE);return[]}if(normalized.length===0)throw new PmCliError(`Config set ${CONFIG_KEY_ALIASES[key][0]} requires at least one --criterion value (or --clear-criteria to clear)`,EXIT_CODE.USAGE);return normalized}function normalizeWarnings(values){return[...new Set(values)].sort((left,right)=>left.localeCompare(right))}function normalizeKeyForAction(action,value){if(action==="list"||action==="export"){if(typeof value=="string"&&value.trim().length>0)throw new PmCliError(`Config action "${action}" does not accept <key>`,EXIT_CODE.USAGE);return}if(typeof value!="string"||value.trim().length===0)throw new PmCliError(`Config action "${action}" requires <key>`,EXIT_CODE.USAGE);return normalizeKey(value)}function assertConfigKeyDefined(key){if(!key)throw new PmCliError("Config action requires <key>",EXIT_CODE.USAGE)}const CONFIG_VALUE_READERS={definition_of_done:settings=>[...settings.workflow.definition_of_done],item_format:settings=>settings.item_format,history_missing_stream_policy:settings=>settings.history.missing_stream,sprint_release_format_policy:settings=>settings.validation.sprint_release_format,parent_reference_policy:settings=>settings.validation.parent_reference,metadata_validation_profile:settings=>settings.validation.metadata_profile,metadata_required_fields:settings=>[...settings.validation.metadata_required_fields],lifecycle_stale_blocker_reason_patterns:settings=>[...settings.validation.lifecycle_stale_blocker_reason_patterns],lifecycle_closure_like_blocked_reason_patterns:settings=>[...settings.validation.lifecycle_closure_like_blocked_reason_patterns],lifecycle_closure_like_resolution_patterns:settings=>[...settings.validation.lifecycle_closure_like_resolution_patterns],lifecycle_closure_like_actual_result_patterns:settings=>[...settings.validation.lifecycle_closure_like_actual_result_patterns],governance_preset:settings=>settings.governance.preset,governance_ownership_enforcement:settings=>settings.governance.ownership_enforcement,governance_create_mode_default:settings=>settings.governance.create_mode_default,governance_close_validation_default:settings=>settings.governance.close_validation_default,governance_require_close_reason:settings=>settings.governance.require_close_reason?"enabled":"disabled",governance_create_default_type:settings=>settings.governance.create_default_type??"",governance_workflow_enforcement:settings=>settings.governance.workflow_enforcement??"off",governance_parent_reference_policy:settings=>settings.governance.parent_reference,governance_metadata_validation_profile:settings=>settings.governance.metadata_profile,governance_force_required_for_stale_lock:settings=>settings.governance.force_required_for_stale_lock?"enabled":"disabled",test_result_tracking:settings=>settings.testing.record_results_to_items?"enabled":"disabled",untrusted_linked_test_execution:settings=>settings.testing.allow_untrusted_linked_tests?"enabled":"disabled",telemetry_tracking:settings=>settings.telemetry.enabled?"enabled":"disabled",agent_identity_vocabulary:settings=>summarizeAgentIdentityVocabulary(settings.agent_identity?.identity_vocabulary),context:settings=>({default_depth:settings.context.default_depth,activity_limit:settings.context.activity_limit,stale_threshold_days:settings.context.stale_threshold_days,next_ranking_policy:settings.context.next_ranking_policy,sections:{...settings.context.sections}})};function readConfigValue(settings,key){return CONFIG_VALUE_READERS[key](settings)}function withWarnings(result,warnings){return warnings.length===0?result:{...result,warnings}}async function resolveSettingsTarget(scope,global2){const cwd=process.cwd(),pmRoot=scope==="project"?resolvePmRoot(cwd,global2.path):resolveGlobalPmRoot(cwd),settingsPath=getSettingsPath(pmRoot);return scope==="project"&&await assertInitializedTracker(pmRoot),{pmRoot,settingsPath}}function parseSectionToggle(raw){if(raw===void 0)return;const normalized=raw.trim().toLowerCase();if(normalized==="true"||normalized==="enabled"||normalized==="on"||normalized==="1")return!0;if(normalized==="false"||normalized==="disabled"||normalized==="off"||normalized==="0")return!1;throw new PmCliError(`Context section toggle must be true|false|enabled|disabled, got "${raw}"`,EXIT_CODE.USAGE)}function parsePositiveContextInteger(rawValue,option){const raw=rawValue.trim(),parsed=Number(raw);if(/^\d+$/u.test(raw)&&Number.isSafeInteger(parsed)&&parsed>0)return parsed;throw new PmCliError(`Context ${option} must be a positive integer`,EXIT_CODE.USAGE)}async function applyContextConfig(settings,options,target,scope,warnings){let changed=!1;const ctx=settings.context,assignedPaths=[];if(options.defaultDepth!==void 0){const normalized=options.defaultDepth.trim().toLowerCase();if(!CONTEXT_DEPTH_VALUES.includes(normalized))throw new PmCliError(`Context --default-depth must be one of ${CONTEXT_DEPTH_VALUES.join("|")}`,EXIT_CODE.USAGE);assignedPaths.push("context.default_depth"),ctx.default_depth!==normalized&&(ctx.default_depth=normalized,changed=!0)}if(options.activityLimit!==void 0){const parsed=parsePositiveContextInteger(options.activityLimit,"--activity-limit");assignedPaths.push("context.activity_limit"),ctx.activity_limit!==parsed&&(ctx.activity_limit=parsed,changed=!0)}if(options.staleThresholdDays!==void 0){const parsed=parsePositiveContextInteger(options.staleThresholdDays,"--stale-threshold-days");assignedPaths.push("context.stale_threshold_days"),ctx.stale_threshold_days!==parsed&&(ctx.stale_threshold_days=parsed,changed=!0)}const sectionToggles=[["hierarchy",options.sectionHierarchy],["activity",options.sectionActivity],["progress",options.sectionProgress],["blockers",options.sectionBlockers],["files",options.sectionFiles],["workload",options.sectionWorkload],["staleness",options.sectionStaleness],["tests",options.sectionTests]];for(const[sectionName,rawValue]of sectionToggles){const toggle=parseSectionToggle(rawValue);if(toggle!==void 0){const key=sectionName;assignedPaths.push(`context.sections.${sectionName}`),ctx.sections[key]!==toggle&&(ctx.sections[key]=toggle,changed=!0)}}return(changed||isSettingsReadFallback(settings))&&(await writeSettings(target.pmRoot,settings,"config:set:context",{assignedPaths}),changed=!0),withWarnings({scope,key:"context",context_settings:{default_depth:ctx.default_depth,activity_limit:ctx.activity_limit,stale_threshold_days:ctx.stale_threshold_days,next_ranking_policy:ctx.next_ranking_policy,sections:{...ctx.sections}},settings_path:target.settingsPath,changed},warnings)}function applyNestedSettingPositionalValue(keyValue,valueValue,options){if(options.value!==void 0&&options.value!==valueValue)throw new PmCliError(`Config set ${keyValue} received both positional value "${valueValue}" and --value "${options.value}". Pass only one.`,EXIT_CODE.USAGE);return{...options,value:valueValue}}function applyPositionalValue(action,keyValue,normalizedKey,nestedSetting,valueValue,options){if(valueValue===void 0)return options;if(action!=="set")throw new PmCliError(`Config action "${action}" does not accept a positional value. Only "set" takes <value>.`,EXIT_CODE.USAGE);if(typeof keyValue!="string"||keyValue.trim().length===0)throw new PmCliError('Config action "set" requires <key> before a positional <value>.',EXIT_CODE.USAGE);if(nestedSetting)return applyNestedSettingPositionalValue(keyValue,valueValue,options);assertConfigKeyDefined(normalizedKey);const routed=resolveConfigPositionalValue(normalizedKey,valueValue);if(!routed.routable)throw new PmCliError(routed.reason,EXIT_CODE.USAGE);if(routed.flag==="criterion"){if(options.criterion!==void 0&&options.criterion.length>0)throw new PmCliError(`Config set ${keyValue} received both positional value "${valueValue}" and --criterion. Pass criteria via --criterion only when supplying more than one value.`,EXIT_CODE.USAGE);return{...options,criterion:routed.values}}if(routed.flag==="format")return{...options,format:routed.value};if(options.policy!==void 0&&normalizePolicyForConflict(normalizedKey,options.policy)!==normalizePolicyForConflict(normalizedKey,routed.value))throw new PmCliError(`Config set ${keyValue} received both positional value "${valueValue}" and --policy "${options.policy}". Pass only one.`,EXIT_CODE.USAGE);return{...options,policy:routed.value}}function buildConfigListResult(context){const keys=Object.keys(CONFIG_KEY_ALIASES).map(candidate=>({key:candidate,aliases:CONFIG_KEY_ALIASES[candidate],value_kind:candidate==="context"||candidate==="agent_identity_vocabulary"?"object":isCriteriaConfigKey(candidate)?"string_array":"enum",set_flags:candidate==="context"?["--default-depth","--activity-limit","--stale-threshold-days","--section-<name>"]:candidate==="agent_identity_vocabulary"?["--policy","--value","--criterion"]:isCriteriaConfigKey(candidate)?["--criterion","--clear-criteria"]:candidate==="item_format"?["--format"]:["--policy"],summary:CONFIG_KEY_SUMMARIES[candidate],value:readConfigValue(context.settings,candidate)})),nestedSettings=NESTED_SETTING_DESCRIPTORS.map(descriptor=>({key:descriptor.key,canonical_key:descriptor.key.replaceAll("_","-"),path:descriptor.path,kind:descriptor.kind,value:readNestedSettingValue(context.settings,descriptor),summary:descriptor.summary,...descriptor.choices?{choices:[...descriptor.choices]}:{},...descriptor.min===void 0?{}:{min:descriptor.min},...descriptor.max===void 0?{}:{max:descriptor.max}}));return withWarnings({scope:context.scope,keys,nested_settings:nestedSettings,count:keys.length,settings_path:context.target.settingsPath,changed:!1},context.warnings)}function buildConfigExportResult(context){const values=Object.fromEntries(Object.keys(CONFIG_KEY_ALIASES).map(key=>[key,readConfigValue(context.settings,key)]));return withWarnings({scope:context.scope,values,settings_path:context.target.settingsPath,changed:!1},context.warnings)}function buildConfigGetResult(context,key){const value=readConfigValue(context.settings,key),base={scope:context.scope,key,settings_path:context.target.settingsPath,changed:!1};return key==="item_format"?withWarnings({...base,format:context.settings.item_format,has_explicit_item_format:context.metadata.has_explicit_item_format},context.warnings):key==="context"?withWarnings({...base,context_settings:value},context.warnings):key==="agent_identity_vocabulary"?withWarnings({...base,identity_vocabulary:value},context.warnings):Array.isArray(value)?withWarnings({...base,criteria:value},context.warnings):withWarnings({...base,policy:value},context.warnings)}async function buildNestedSettingResult(context,action,nestedSetting,options){if(action==="get"){const currentValue=readNestedSettingValue(context.settings,nestedSetting);return withWarnings({scope:context.scope,key:nestedSetting.key,nested_setting:{key:nestedSetting.key,path:nestedSetting.path,kind:nestedSetting.kind,value:currentValue},settings_path:context.target.settingsPath,changed:!1},context.warnings)}const rawValue=options.value;if(typeof rawValue!="string")throw new PmCliError(`Config set ${nestedSetting.key} requires a value. Pass it positionally (\`pm config ${context.scope} set ${nestedSetting.key} <value>\`) or via --value.`,EXIT_CODE.USAGE);const parsed=parseNestedSettingValue(nestedSetting,rawValue);if(!parsed.ok)throw new PmCliError(parsed.error.message,EXIT_CODE.USAGE);const changed=writeNestedSettingValue(context.settings,nestedSetting,parsed.parsed.value)||isSettingsReadFallback(context.settings);return changed&&await writeSettings(context.target.pmRoot,context.settings,`config:set:${nestedSetting.path}`,{assignedPaths:[nestedSetting.path]}),withWarnings({scope:context.scope,key:nestedSetting.key,nested_setting:{key:nestedSetting.key,path:nestedSetting.path,kind:nestedSetting.kind,value:parsed.parsed.value},settings_path:context.target.settingsPath,changed},context.warnings)}async function writeConfigSettingsIfChanged(context,changed,reason,assignedPaths=[]){(changed||isSettingsReadFallback(context.settings))&&(await writeSettings(context.target.pmRoot,context.settings,reason,{assignedPaths}),isSettingsReadFallback(context.settings)&&(context.fallbackRepairWritten=!0))}function hasGovernanceValidationMirrorChange(governanceValue,validationValue,nextPolicy){return governanceValue!==nextPolicy||validationValue!==nextPolicy}function buildPolicyResult(context,key,policy,changed){return withWarnings({scope:context.scope,key,policy,settings_path:context.target.settingsPath,changed},context.warnings)}function buildCriteriaResult(context,key,criteria,changed){return withWarnings({scope:context.scope,key,criteria,settings_path:context.target.settingsPath,changed},context.warnings)}async function migrateItemsForFormatChange(pmRoot,settings,nextFormat){const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),migrated=await migrateItemFilesToFormat(pmRoot,nextFormat,"config:set:item_format:migrate",typeRegistry.type_to_folder,settings.schema);return{target_format:migrated.target_format,scanned:migrated.scanned,migrated:migrated.migrated,removed:migrated.removed,warnings:migrated.warnings}}async function setItemFormatConfig(context,options){const nextFormat=normalizeItemFormat(options.format),changed=context.settings.item_format!==nextFormat||!context.metadata.has_explicit_item_format;let migration;if(changed){context.settings.item_format=nextFormat;const writeOptions={assignedPaths:["item_format"]};isSettingsReadFallback(context.settings)?(await writeSettings(context.target.pmRoot,context.settings,"config:set:item_format",writeOptions),context.fallbackRepairWritten=!0,migration=await migrateItemsForFormatChange(context.target.pmRoot,await readSettings(context.target.pmRoot),nextFormat)):(migration=await migrateItemsForFormatChange(context.target.pmRoot,context.settings,nextFormat),await writeSettings(context.target.pmRoot,context.settings,"config:set:item_format",writeOptions))}return withWarnings({scope:context.scope,key:"item_format",format:context.settings.item_format,has_explicit_item_format:!0,migration,settings_path:context.target.settingsPath,changed},context.warnings)}async function setValidationConfig(context,key,options){if(key==="history_missing_stream_policy"){const nextPolicy2=normalizeHistoryMissingStreamPolicy(options.policy),changed2=context.settings.history.missing_stream!==nextPolicy2;return context.settings.history.missing_stream=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:history_missing_stream_policy",["history.missing_stream"]),buildPolicyResult(context,key,context.settings.history.missing_stream,changed2)}if(key==="sprint_release_format_policy"){const nextPolicy2=normalizeSprintReleaseFormatPolicy(options.policy),changed2=context.settings.validation.sprint_release_format!==nextPolicy2;return context.settings.validation.sprint_release_format=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:sprint_release_format_policy",["validation.sprint_release_format"]),buildPolicyResult(context,key,context.settings.validation.sprint_release_format,changed2)}if(key==="parent_reference_policy"){const nextPolicy2=normalizeParentReferencePolicy(options.policy),changed2=context.settings.validation.parent_reference!==nextPolicy2||context.settings.governance.preset!=="custom"||context.settings.governance.parent_reference!==nextPolicy2;return context.settings.validation.parent_reference=nextPolicy2,context.settings.governance.preset="custom",context.settings.governance.parent_reference=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:parent_reference_policy",["validation.parent_reference","governance.preset","governance.parent_reference"]),buildPolicyResult(context,key,context.settings.validation.parent_reference,changed2)}const nextPolicy=normalizeValidateMetadataProfile(options.policy),changed=context.settings.validation.metadata_profile!==nextPolicy||context.settings.governance.preset!=="custom"||context.settings.governance.metadata_profile!==nextPolicy;return context.settings.validation.metadata_profile=nextPolicy,context.settings.governance.preset="custom",context.settings.governance.metadata_profile=nextPolicy,await writeConfigSettingsIfChanged(context,changed,"config:set:metadata_validation_profile",["validation.metadata_profile","governance.preset","governance.metadata_profile"]),buildPolicyResult(context,key,context.settings.validation.metadata_profile,changed)}async function setCriteriaConfig(context,key,options){if(key==="metadata_required_fields"){const nextCriteria2=normalizeMetadataRequiredFields(options.criterion,options.clearCriteria),changed2=nextCriteria2.length!==context.settings.validation.metadata_required_fields.length||nextCriteria2.some((value,index)=>value!==context.settings.validation.metadata_required_fields[index]);return context.settings.validation.metadata_required_fields=nextCriteria2,await writeConfigSettingsIfChanged(context,changed2,"config:set:metadata_required_fields",["validation.metadata_required_fields"]),buildCriteriaResult(context,key,[...context.settings.validation.metadata_required_fields],changed2)}const currentCriteria={lifecycle_stale_blocker_reason_patterns:context.settings.validation.lifecycle_stale_blocker_reason_patterns,lifecycle_closure_like_blocked_reason_patterns:context.settings.validation.lifecycle_closure_like_blocked_reason_patterns,lifecycle_closure_like_resolution_patterns:context.settings.validation.lifecycle_closure_like_resolution_patterns,lifecycle_closure_like_actual_result_patterns:context.settings.validation.lifecycle_closure_like_actual_result_patterns}[key],nextCriteria=normalizeLifecyclePatternCriteria(key,options.criterion,options.clearCriteria),changed=nextCriteria.length!==currentCriteria.length||nextCriteria.some((value,index)=>value!==currentCriteria[index]);return currentCriteria.splice(0,currentCriteria.length,...nextCriteria),await writeConfigSettingsIfChanged(context,changed,`config:set:${key}`,[`validation.${key}`]),buildCriteriaResult(context,key,[...currentCriteria],changed)}async function setGovernancePresetOrTypeConfig(context,key,options){if(key==="governance_preset"){const nextPolicy=normalizeGovernancePreset(options.policy),changed2=context.settings.governance.preset!==nextPolicy;return context.settings.governance.preset=nextPolicy,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_preset",["governance.preset"]),buildPolicyResult(context,key,context.settings.governance.preset,changed2)}const policyProvided=typeof options.policy=="string",rawType=policyProvided?options.policy.trim():"";if(policyProvided&&rawType.length===0){const changed2=context.settings.governance.create_default_type!==void 0;return delete context.settings.governance.create_default_type,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_create_default_type",["governance.create_default_type"]),buildPolicyResult(context,key,context.settings.governance.create_default_type??"",changed2)}if(rawType.length===0)throw new PmCliError('Config set governance-create-default-type requires an item type value (or an empty value "" to clear it)',EXIT_CODE.USAGE);const typeRegistry=resolveItemTypeRegistry(context.settings,getActiveExtensionRegistrations()),resolvedType=resolveTypeName(rawType,typeRegistry);if(!resolvedType)throw new PmCliError(buildInvalidTypeError(rawType,typeRegistry.types,resolveItemTypesFilePath(context.target.pmRoot,context.settings.schema)),EXIT_CODE.USAGE);const changed=context.settings.governance.create_default_type!==resolvedType;return context.settings.governance.create_default_type=resolvedType,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_create_default_type",["governance.create_default_type"]),buildPolicyResult(context,key,context.settings.governance.create_default_type,changed)}async function setGovernancePolicyConfig(context,key,options){if(key==="governance_ownership_enforcement"){const nextPolicy2=normalizeGovernanceOwnershipEnforcement(options.policy),changed2=context.settings.governance.preset!=="custom"||context.settings.governance.ownership_enforcement!==nextPolicy2;return context.settings.governance.preset="custom",context.settings.governance.ownership_enforcement=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_ownership_enforcement",["governance.preset","governance.ownership_enforcement"]),buildPolicyResult(context,key,context.settings.governance.ownership_enforcement,changed2)}if(key==="governance_create_mode_default"){const nextPolicy2=normalizeGovernanceCreateModeDefault(options.policy),changed2=context.settings.governance.preset!=="custom"||context.settings.governance.create_mode_default!==nextPolicy2;return context.settings.governance.preset="custom",context.settings.governance.create_mode_default=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_create_mode_default",["governance.preset","governance.create_mode_default"]),buildPolicyResult(context,key,context.settings.governance.create_mode_default,changed2)}const nextPolicy=normalizeGovernanceCloseValidationDefault(options.policy),changed=context.settings.governance.preset!=="custom"||context.settings.governance.close_validation_default!==nextPolicy;return context.settings.governance.preset="custom",context.settings.governance.close_validation_default=nextPolicy,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_close_validation_default",["governance.preset","governance.close_validation_default"]),buildPolicyResult(context,key,context.settings.governance.close_validation_default,changed)}async function setGovernanceValidationConfig(context,key,options){if(key==="governance_parent_reference_policy"){const nextPolicy2=normalizeParentReferencePolicy(options.policy),changed2=context.settings.governance.preset!=="custom"||hasGovernanceValidationMirrorChange(context.settings.governance.parent_reference,context.settings.validation.parent_reference,nextPolicy2);return context.settings.governance.preset="custom",context.settings.governance.parent_reference=nextPolicy2,context.settings.validation.parent_reference=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_parent_reference_policy",["governance.preset","governance.parent_reference","validation.parent_reference"]),buildPolicyResult(context,key,context.settings.governance.parent_reference,changed2)}if(key==="governance_metadata_validation_profile"){const nextPolicy2=normalizeValidateMetadataProfile(options.policy),changed2=context.settings.governance.preset!=="custom"||hasGovernanceValidationMirrorChange(context.settings.governance.metadata_profile,context.settings.validation.metadata_profile,nextPolicy2);return context.settings.governance.preset="custom",context.settings.governance.metadata_profile=nextPolicy2,context.settings.validation.metadata_profile=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_metadata_validation_profile",["governance.preset","governance.metadata_profile","validation.metadata_profile"]),buildPolicyResult(context,key,context.settings.governance.metadata_profile,changed2)}const nextPolicy=normalizeGovernanceWorkflowEnforcement(options.policy),changed=(context.settings.governance.workflow_enforcement??"off")!==nextPolicy;return context.settings.governance.workflow_enforcement=nextPolicy,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_workflow_enforcement",["governance.workflow_enforcement"]),buildPolicyResult(context,key,context.settings.governance.workflow_enforcement,changed)}async function setGovernanceBooleanConfig(context,key,options){if(key==="governance_require_close_reason"){const nextEnabled2=normalizeGovernanceRequireCloseReasonPolicy(options.policy)==="enabled",changed2=context.settings.governance.require_close_reason!==nextEnabled2;return context.settings.governance.require_close_reason=nextEnabled2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_require_close_reason",["governance.require_close_reason"]),buildPolicyResult(context,key,context.settings.governance.require_close_reason?"enabled":"disabled",changed2)}const nextEnabled=normalizeGovernanceForceRequiredForStaleLockPolicy(options.policy)==="enabled",changed=context.settings.governance.preset!=="custom"||context.settings.governance.force_required_for_stale_lock!==nextEnabled;return context.settings.governance.preset="custom",context.settings.governance.force_required_for_stale_lock=nextEnabled,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_force_required_for_stale_lock",["governance.preset","governance.force_required_for_stale_lock"]),buildPolicyResult(context,key,context.settings.governance.force_required_for_stale_lock?"enabled":"disabled",changed)}async function setTrackingConfig(context,key,options){if(key==="test_result_tracking"){const nextEnabled2=normalizeTestResultTrackingPolicy(options.policy)==="enabled",changed2=context.settings.testing.record_results_to_items!==nextEnabled2;return context.settings.testing.record_results_to_items=nextEnabled2,await writeConfigSettingsIfChanged(context,changed2,"config:set:test_result_tracking",["testing.record_results_to_items"]),buildPolicyResult(context,key,context.settings.testing.record_results_to_items?"enabled":"disabled",changed2)}if(key==="untrusted_linked_test_execution"){const nextEnabled2=normalizeEnabledDisabledPolicy(options.policy,"untrusted-linked-test-execution")==="enabled",changed2=context.settings.testing.allow_untrusted_linked_tests!==nextEnabled2;return context.settings.testing.allow_untrusted_linked_tests=nextEnabled2,await writeConfigSettingsIfChanged(context,changed2,"config:set:untrusted_linked_test_execution",["testing.allow_untrusted_linked_tests"]),buildPolicyResult(context,key,context.settings.testing.allow_untrusted_linked_tests?"enabled":"disabled",changed2)}const nextEnabled=normalizeTelemetryTrackingPolicy(options.policy)==="enabled",changed=context.settings.telemetry.enabled!==nextEnabled||!context.settings.telemetry.first_run_prompt_completed;return context.settings.telemetry.enabled=nextEnabled,context.settings.telemetry.first_run_prompt_completed=!0,await writeConfigSettingsIfChanged(context,changed,"config:set:telemetry_tracking",["telemetry.enabled","telemetry.first_run_prompt_completed"]),buildPolicyResult(context,key,context.settings.telemetry.enabled?"enabled":"disabled",changed)}async function setDefinitionOfDoneConfig(context,key,options){const nextCriteria=normalizeCriteria(options.criterion,options.clearCriteria),changed=nextCriteria.length!==context.settings.workflow.definition_of_done.length||nextCriteria.some((value,index)=>value!==context.settings.workflow.definition_of_done[index]);return context.settings.workflow.definition_of_done=nextCriteria,await writeConfigSettingsIfChanged(context,changed,"config:set:definition_of_done",["workflow.definition_of_done"]),buildCriteriaResult(context,key,[...context.settings.workflow.definition_of_done],changed)}function parseAgentIdentityVocabularyOperation(raw){const policy=raw?.trim().toLowerCase().replaceAll("_","-"),dryRun=policy?.startsWith("preview-")===!0,operation=dryRun?policy.slice(8):policy;if(operation==="add"||operation==="remove"||operation==="clear")return{operation,dryRun};throw new PmCliError("Config set agent-identity-vocabulary requires --policy add|remove|clear|preview-add|preview-remove|preview-clear",EXIT_CODE.USAGE)}function parseAgentIdentityVocabularyMutationValue(operation,value){if(operation==="add"){const separator=value?.lastIndexOf("=")??-1;if(separator<=0||separator===value.length-1)throw new PmCliError('Config set agent-identity-vocabulary --policy add requires --value "<legacy-author>=<canonical-harness>"',EXIT_CODE.USAGE);return{legacy_author:value.slice(0,separator),canonical_harness:value.slice(separator+1)}}if(operation==="remove"){if(value===void 0)throw new PmCliError("Config set agent-identity-vocabulary --policy remove requires --value <legacy-author>",EXIT_CODE.USAGE);return{legacy_author:value}}if(value!==void 0)throw new PmCliError("Config set agent-identity-vocabulary --policy clear does not accept --value",EXIT_CODE.USAGE);return{}}async function setAgentIdentityVocabularyConfig(context,options){const{operation,dryRun}=parseAgentIdentityVocabularyOperation(options.policy),mutationValue=parseAgentIdentityVocabularyMutationValue(operation,options.value);let planned;try{planned=planAgentIdentityVocabularyMutation(context.settings.agent_identity?.identity_vocabulary,{operation,...mutationValue,observed_authors:options.criterion})}catch(error){throw new PmCliError(error.message,EXIT_CODE.USAGE)}return planned.preview.changed&&!dryRun&&(context.settings.agent_identity={...context.settings.agent_identity,identity_vocabulary:planned.vocabulary},await writeConfigSettingsIfChanged(context,!0,`config:set:agent_identity.identity_vocabulary:${operation}:v${planned.preview.version_after}`,["agent_identity"])),withWarnings({scope:context.scope,key:"agent_identity_vocabulary",identity_vocabulary:summarizeAgentIdentityVocabulary(dryRun?context.settings.agent_identity?.identity_vocabulary:planned.vocabulary),vocabulary_mutation:planned.preview,settings_path:context.target.settingsPath,changed:planned.preview.changed&&!dryRun},context.warnings)}async function setConfigValue(context,key,options){const result=await dispatchConfigSetValue(context,key,options);return context.fallbackRepairWritten===!0?{...result,changed:!0}:result}async function dispatchConfigSetValue(context,key,options){if(options.clearCriteria===!0&&!isCriteriaConfigKey(key))throw new PmCliError("--clear-criteria is only supported with config set criteria-list keys",EXIT_CODE.USAGE);return key==="item_format"?setItemFormatConfig(context,options):key==="context"?applyContextConfig(context.settings,options,context.target,context.scope,context.warnings):key==="agent_identity_vocabulary"?setAgentIdentityVocabularyConfig(context,options):key==="definition_of_done"?setDefinitionOfDoneConfig(context,key,options):isCriteriaValueConfigKey(key)?setCriteriaConfig(context,key,options):TRACKING_CONFIG_KEYS.has(key)?setTrackingConfig(context,key,options):GOVERNANCE_BOOLEAN_CONFIG_KEYS.has(key)?setGovernanceBooleanConfig(context,key,options):isGovernancePolicyConfigKey(key)?setGovernancePolicyConfig(context,key,options):isGovernanceValidationConfigKey(key)?setGovernanceValidationConfig(context,key,options):isGovernancePresetOrTypeConfigKey(key)?setGovernancePresetOrTypeConfig(context,key,options):setValidationConfig(context,key,options)}async function runConfig(scopeValue,actionValue,keyValue,options,global2,valueValue){const scope=normalizeScope(scopeValue),action=normalizeAction(actionValue),nestedSetting=action==="get"||action==="set"?resolveNestedSettingDescriptor(keyValue):void 0,key=nestedSetting?void 0:normalizeKeyForAction(action,keyValue),routedOptions=applyPositionalValue(action,keyValue,key,nestedSetting,valueValue,options),target=await resolveSettingsTarget(scope,global2),{settings,metadata,warnings:settingsReadWarnings}=await readSettingsWithMetadata(target.pmRoot),context={scope,target,settings,metadata,warnings:normalizeWarnings(settingsReadWarnings)};return nestedSetting?buildNestedSettingResult(context,action,nestedSetting,routedOptions):action==="list"?buildConfigListResult(context):action==="export"?buildConfigExportResult(context):(assertConfigKeyDefined(key),action==="get"?buildConfigGetResult(context,key):setConfigValue(context,key,routedOptions))}const _testOnlyConfigCommand={hasGovernanceValidationMirrorChange,applyPositionalValue,normalizeAction,normalizeCriteria,normalizeGovernanceCloseValidationDefault,normalizeGovernanceCreateModeDefault,normalizeGovernanceForceRequiredForStaleLockPolicy,normalizeGovernanceOwnershipEnforcement,normalizeGovernancePreset,normalizeGovernanceRequireCloseReasonPolicy,normalizeGovernanceWorkflowEnforcement,normalizeHistoryMissingStreamPolicy,normalizeItemFormat,normalizeKey,normalizeMetadataRequiredFields,normalizePolicyForConflict,normalizeScope,normalizeTelemetryTrackingPolicy,normalizeTestResultTrackingPolicy,normalizeValidateMetadataProfile,normalizeWarnings};export{_testOnlyConfigCommand,runConfig};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9ce54ccd-1956-5fc0-994d-a43b5000e917")}catch{}})();import{resolveConfigPositionalValue}from"../core/config/positional-value.js";import{NESTED_SETTING_DESCRIPTORS,parseNestedSettingValue,readNestedSettingValue,resolveNestedSettingDescriptor,writeNestedSettingValue}from"../core/config/nested-settings.js";import{getActiveExtensionRegistrations}from"../core/extensions/index.js";import{normalizeParentReferencePolicy}from"../core/item/parent-reference-policy.js";import{normalizeSprintReleaseFormatPolicy}from"../core/item/sprint-release-format.js";import{resolveItemTypeRegistry,resolveTypeName}from"../core/item/type-registry.js";import{buildInvalidTypeError}from"../core/schema/item-types-file.js";import{resolveItemTypesFilePath}from"../core/schema/runtime-schema.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{planAgentIdentityVocabularyMutation,summarizeAgentIdentityVocabulary}from"./agent/identity-config.js";import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{migrateItemFilesToFormat}from"../core/store/item-format-migration.js";import{getSettingsPath,resolveGlobalPmRoot,resolvePmRoot}from"../core/store/paths.js";import{isSettingsReadFallback,readSettings,readSettingsWithMetadata,writeSettings}from"../core/store/settings.js";import{CONTEXT_DEPTH_VALUES}from"../types/index.js";const CONFIG_SCOPE_VALUES=["project","global"],CONFIG_KEY_ALIASES={definition_of_done:["definition-of-done","definition_of_done"],item_format:["item-format","item_format"],history_missing_stream_policy:["history-missing-stream-policy","history_missing_stream_policy"],sprint_release_format_policy:["sprint-release-format-policy","sprint_release_format_policy"],parent_reference_policy:["parent-reference-policy","parent_reference_policy"],metadata_validation_profile:["metadata-validation-profile","metadata_validation_profile"],metadata_required_fields:["metadata-required-fields","metadata_required_fields"],lifecycle_stale_blocker_reason_patterns:["lifecycle-stale-blocker-reason-patterns","lifecycle_stale_blocker_reason_patterns"],lifecycle_closure_like_blocked_reason_patterns:["lifecycle-closure-like-blocked-reason-patterns","lifecycle_closure_like_blocked_reason_patterns"],lifecycle_closure_like_resolution_patterns:["lifecycle-closure-like-resolution-patterns","lifecycle_closure_like_resolution_patterns"],lifecycle_closure_like_actual_result_patterns:["lifecycle-closure-like-actual-result-patterns","lifecycle_closure_like_actual_result_patterns"],governance_preset:["governance-preset","governance_preset"],governance_ownership_enforcement:["governance-ownership-enforcement","governance_ownership_enforcement"],governance_create_mode_default:["governance-create-mode-default","governance_create_mode_default"],governance_close_validation_default:["governance-close-validation-default","governance_close_validation_default"],governance_require_close_reason:["governance-require-close-reason","governance_require_close_reason"],governance_create_default_type:["governance-create-default-type","governance_create_default_type"],governance_workflow_enforcement:["governance-workflow-enforcement","governance_workflow_enforcement"],governance_start_blocker_enforcement:["governance-start-blocker-enforcement","governance_start_blocker_enforcement"],governance_parent_reference_policy:["governance-parent-reference-policy","governance_parent_reference_policy"],governance_metadata_validation_profile:["governance-metadata-validation-profile","governance_metadata_validation_profile"],governance_force_required_for_stale_lock:["governance-force-required-for-stale-lock","governance_force_required_for_stale_lock"],test_result_tracking:["test-result-tracking","test_result_tracking"],untrusted_linked_test_execution:["untrusted-linked-test-execution","untrusted_linked_test_execution"],telemetry_tracking:["telemetry-tracking","telemetry_tracking"],agent_identity_vocabulary:["agent-identity-vocabulary","agent_identity_vocabulary"],context:["context"]},CANONICAL_CONFIG_KEYS=Object.keys(CONFIG_KEY_ALIASES).map(candidate=>CONFIG_KEY_ALIASES[candidate][0]),CONFIG_KEY_BY_ALIAS=Object.fromEntries(Object.keys(CONFIG_KEY_ALIASES).flatMap(key=>CONFIG_KEY_ALIASES[key].map(alias=>[alias,key]))),CONFIG_KEY_SUMMARIES={definition_of_done:"Definition of Done criteria list.",item_format:"Default item file format.",history_missing_stream_policy:"Missing history stream handling policy.",sprint_release_format_policy:"Sprint/release format validation policy.",parent_reference_policy:"Parent reference validation policy.",metadata_validation_profile:"Validate metadata profile policy (core|strict|custom).",metadata_required_fields:"Validate custom metadata required-fields list.",lifecycle_stale_blocker_reason_patterns:"Validate lifecycle stale-blocker reason substring patterns (criteria list).",lifecycle_closure_like_blocked_reason_patterns:"Validate lifecycle closure-like blocked_reason substring patterns (criteria list).",lifecycle_closure_like_resolution_patterns:"Validate lifecycle closure-like resolution substring patterns (criteria list).",lifecycle_closure_like_actual_result_patterns:"Validate lifecycle closure-like actual_result substring patterns (criteria list).",governance_preset:"Governance preset policy (minimal|default|strict|custom).",governance_ownership_enforcement:"Governance ownership enforcement policy (none|warn|strict).",governance_create_mode_default:"Governance default create mode (progressive|strict).",governance_close_validation_default:"Governance default close validation mode (off|warn|strict).",governance_require_close_reason:"Governance close-reason requirement policy (enabled|disabled).",governance_create_default_type:"Governance default item type for `pm create` when --type is omitted.",governance_workflow_enforcement:"Governance per-type transition enforcement mode (off|warn|strict).",governance_start_blocker_enforcement:"Governance admission for starting an item whose declared blocker is still open (off|warn|strict; strict by default).",governance_parent_reference_policy:"Governance parent reference policy (warn|strict_error).",governance_metadata_validation_profile:"Governance metadata validation profile (core|strict|custom).",governance_force_required_for_stale_lock:"Governance stale-lock force policy (enabled|disabled).",test_result_tracking:"Item-level linked test result persistence policy.",untrusted_linked_test_execution:"Permit an explicit per-run override for commands not trusted by this clone.",telemetry_tracking:"Telemetry usage reporting policy.",agent_identity_vocabulary:"Versioned exact legacy-author interpretation vocabulary (summary only).",context:"Context command settings (depth, section toggles, limits)."},LIFECYCLE_PATTERN_CONFIG_KEYS=["lifecycle_stale_blocker_reason_patterns","lifecycle_closure_like_blocked_reason_patterns","lifecycle_closure_like_resolution_patterns","lifecycle_closure_like_actual_result_patterns"],CRITERIA_CONFIG_KEYS=new Set(["metadata_required_fields",...LIFECYCLE_PATTERN_CONFIG_KEYS]),TRACKING_CONFIG_KEYS=new Set(["test_result_tracking","untrusted_linked_test_execution","telemetry_tracking"]),GOVERNANCE_BOOLEAN_CONFIG_KEYS=new Set(["governance_require_close_reason","governance_force_required_for_stale_lock"]),GOVERNANCE_POLICY_CONFIG_KEYS=new Set(["governance_ownership_enforcement","governance_create_mode_default","governance_close_validation_default"]),GOVERNANCE_VALIDATION_CONFIG_KEYS=new Set(["governance_parent_reference_policy","governance_metadata_validation_profile","governance_workflow_enforcement","governance_start_blocker_enforcement"]),GOVERNANCE_PRESET_OR_TYPE_CONFIG_KEYS=new Set(["governance_preset","governance_create_default_type"]),isCriteriaValueConfigKey=key=>CRITERIA_CONFIG_KEYS.has(key),isGovernancePolicyConfigKey=key=>GOVERNANCE_POLICY_CONFIG_KEYS.has(key),isGovernanceValidationConfigKey=key=>GOVERNANCE_VALIDATION_CONFIG_KEYS.has(key),isGovernancePresetOrTypeConfigKey=key=>GOVERNANCE_PRESET_OR_TYPE_CONFIG_KEYS.has(key);function isCriteriaConfigKey(key){return key==="definition_of_done"||isCriteriaValueConfigKey(key)}function normalizeScope(value){if(CONFIG_SCOPE_VALUES.includes(value))return value;throw new PmCliError(`Invalid config scope "${value}". Allowed: ${CONFIG_SCOPE_VALUES.join(", ")}`,EXIT_CODE.USAGE)}function normalizeAction(value){if(value==="get"||value==="set"||value==="list"||value==="export")return value;throw createUnknownSubcommandError({command_path:"config",token:value.trim()||"<empty>",allowed:["export","get","list","set"],token_kind:"action"})}function normalizeKey(value){const key=CONFIG_KEY_BY_ALIAS[value];if(key)return key;const nestedKeys=NESTED_SETTING_DESCRIPTORS.map(descriptor=>descriptor.key).join(", ");throw new PmCliError(`Invalid config key "${value}". Supported: ${CANONICAL_CONFIG_KEYS.join(", ")} (underscore variants also accepted). Nested leaf settings: ${nestedKeys}.`,EXIT_CODE.USAGE)}function normalizeCriteria(values,clearCriteria){const normalized=[...new Set((values??[]).map(value=>value.trim()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right));if(clearCriteria){if(normalized.length>0)throw new PmCliError("Config set definition-of-done cannot combine --clear-criteria with --criterion values",EXIT_CODE.USAGE);return[]}if(normalized.length===0)throw new PmCliError("Config set definition-of-done requires at least one non-empty --criterion value (or --clear-criteria to clear)",EXIT_CODE.USAGE);return normalized}function normalizeItemFormat(value){const normalized=value?.trim().toLowerCase();if(normalized==="toon")return"toon";throw normalized==="json_markdown"?new PmCliError("Config set item-format no longer accepts json_markdown. Markdown item files are legacy read/migration input only.",EXIT_CODE.USAGE):new PmCliError("Config set item-format requires --format toon",EXIT_CODE.USAGE)}function normalizeHistoryMissingStreamPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="auto_create"||normalized==="strict_error")return normalized;throw new PmCliError("Config set history-missing-stream-policy requires --policy with one of: auto_create, strict_error",EXIT_CODE.USAGE)}function normalizeTestResultTrackingPolicy(value){return normalizeEnabledDisabledPolicy(value,"test-result-tracking")}function normalizeEnabledDisabledPolicy(value,key){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError(`Config set ${key} requires --policy with one of: enabled, disabled`,EXIT_CODE.USAGE)}function normalizeTelemetryTrackingPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError("Config set telemetry-tracking requires --policy with one of: enabled, disabled",EXIT_CODE.USAGE)}function normalizeValidateMetadataProfile(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="core"||normalized==="strict"||normalized==="custom")return normalized;throw new PmCliError("Config set metadata-validation-profile requires --policy with one of: core, strict, custom",EXIT_CODE.USAGE)}function normalizeGovernancePreset(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="minimal"||normalized==="default"||normalized==="strict"||normalized==="custom")return normalized;throw new PmCliError("Config set governance-preset requires --policy with one of: minimal, default, strict, custom",EXIT_CODE.USAGE)}function normalizeGovernanceOwnershipEnforcement(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="none"||normalized==="warn"||normalized==="strict")return normalized;throw new PmCliError("Config set governance-ownership-enforcement requires --policy with one of: none, warn, strict",EXIT_CODE.USAGE)}function normalizeGovernanceCreateModeDefault(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="progressive"||normalized==="strict")return normalized;throw new PmCliError("Config set governance-create-mode-default requires --policy with one of: progressive, strict",EXIT_CODE.USAGE)}function normalizeGovernanceCloseValidationDefault(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="off"||normalized==="warn"||normalized==="strict")return normalized;if(normalized==="none"||normalized==="disabled")return"off";throw new PmCliError("Config set governance-close-validation-default requires --policy with one of: off, warn, strict",EXIT_CODE.USAGE)}function normalizeGovernanceWorkflowEnforcement(value,key="governance-workflow-enforcement"){const normalized=typeof value=="string"?value.trim().toLowerCase().replaceAll("-","_"):void 0;if(normalized==="off"||normalized==="warn"||normalized==="strict")return normalized;if(normalized==="none"||normalized==="disabled")return"off";throw new PmCliError(`Config set ${key} requires one of: off, warn, strict`,EXIT_CODE.USAGE)}function normalizeGovernanceForceRequiredForStaleLockPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError("Config set governance-force-required-for-stale-lock requires --policy with one of: enabled, disabled",EXIT_CODE.USAGE)}function normalizeGovernanceRequireCloseReasonPolicy(value){const normalized=value?.trim().toLowerCase().replaceAll("-","_");if(normalized==="enabled"||normalized==="disabled")return normalized;throw new PmCliError("Config set governance-require-close-reason requires --policy with one of: enabled, disabled",EXIT_CODE.USAGE)}const ENABLED_DISABLED_CONFLICT_POLICY_KEYS={test_result_tracking:"test-result-tracking",untrusted_linked_test_execution:"untrusted-linked-test-execution"},ENFORCEMENT_MODE_CONFLICT_POLICY_KEYS={governance_workflow_enforcement:"governance-workflow-enforcement",governance_start_blocker_enforcement:"governance-start-blocker-enforcement"};function normalizePolicyForConflict(key,value){const enabledDisabledKey=ENABLED_DISABLED_CONFLICT_POLICY_KEYS[key];if(enabledDisabledKey)return normalizeEnabledDisabledPolicy(value,enabledDisabledKey);const enforcementKey=ENFORCEMENT_MODE_CONFLICT_POLICY_KEYS[key];if(enforcementKey)return normalizeGovernanceWorkflowEnforcement(value,enforcementKey);switch(key){case"history_missing_stream_policy":return normalizeHistoryMissingStreamPolicy(value);case"sprint_release_format_policy":return normalizeSprintReleaseFormatPolicy(value);case"parent_reference_policy":case"governance_parent_reference_policy":return normalizeParentReferencePolicy(value);case"metadata_validation_profile":case"governance_metadata_validation_profile":return normalizeValidateMetadataProfile(value);case"governance_preset":return normalizeGovernancePreset(value);case"governance_ownership_enforcement":return normalizeGovernanceOwnershipEnforcement(value);case"governance_create_mode_default":return normalizeGovernanceCreateModeDefault(value);case"governance_close_validation_default":return normalizeGovernanceCloseValidationDefault(value);case"governance_require_close_reason":return normalizeGovernanceRequireCloseReasonPolicy(value);case"governance_force_required_for_stale_lock":return normalizeGovernanceForceRequiredForStaleLockPolicy(value);case"telemetry_tracking":return normalizeTelemetryTrackingPolicy(value);default:return value.trim().toLowerCase().replaceAll("-","_")}}const METADATA_REQUIRED_FIELD_ALIAS_MAP={author:"author",acceptance_criteria:"acceptance_criteria","acceptance-criteria":"acceptance_criteria",estimated_minutes:"estimated_minutes","estimated-minutes":"estimated_minutes",estimate:"estimated_minutes",close_reason:"close_reason","close-reason":"close_reason",reviewer:"reviewer",risk:"risk",confidence:"confidence",sprint:"sprint",release:"release"},METADATA_REQUIRED_FIELD_OPTIONS=["author","acceptance_criteria","estimated_minutes","close_reason","reviewer","risk","confidence","sprint","release"];function normalizeMetadataRequiredFields(values,clearCriteria){const normalized=[...new Set((values??[]).map(value=>value.trim()).filter(value=>value.length>0))];if(clearCriteria){if(normalized.length>0)throw new PmCliError("Config set metadata-required-fields cannot combine --clear-criteria with --criterion values",EXIT_CODE.USAGE);return[]}if(normalized.length===0)throw new PmCliError("Config set metadata-required-fields requires at least one --criterion value (or --clear-criteria to clear)",EXIT_CODE.USAGE);const lowered=normalized.map(value=>value.toLowerCase().replaceAll("-","_")),unsupported=lowered.filter(value=>METADATA_REQUIRED_FIELD_ALIAS_MAP[value]===void 0);if(unsupported.length>0)throw new PmCliError(`Config set metadata-required-fields received unsupported values: ${unsupported.join(", ")}. Supported values: ${METADATA_REQUIRED_FIELD_OPTIONS.join(", ")}`,EXIT_CODE.USAGE);return[...new Set(lowered.map(value=>METADATA_REQUIRED_FIELD_ALIAS_MAP[value]))].sort((left,right)=>left.localeCompare(right))}function normalizeLifecyclePatternCriteria(key,values,clearCriteria){const normalized=[...new Set((values??[]).map(value=>value.trim().toLowerCase()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right));if(clearCriteria){if(normalized.length>0)throw new PmCliError(`Config set ${CONFIG_KEY_ALIASES[key][0]} cannot combine --clear-criteria with --criterion values`,EXIT_CODE.USAGE);return[]}if(normalized.length===0)throw new PmCliError(`Config set ${CONFIG_KEY_ALIASES[key][0]} requires at least one --criterion value (or --clear-criteria to clear)`,EXIT_CODE.USAGE);return normalized}function normalizeWarnings(values){return[...new Set(values)].sort((left,right)=>left.localeCompare(right))}function normalizeKeyForAction(action,value){if(action==="list"||action==="export"){if(typeof value=="string"&&value.trim().length>0)throw new PmCliError(`Config action "${action}" does not accept <key>`,EXIT_CODE.USAGE);return}if(typeof value!="string"||value.trim().length===0)throw new PmCliError(`Config action "${action}" requires <key>`,EXIT_CODE.USAGE);return normalizeKey(value)}function assertConfigKeyDefined(key){if(!key)throw new PmCliError("Config action requires <key>",EXIT_CODE.USAGE)}const CONFIG_VALUE_READERS={definition_of_done:settings=>[...settings.workflow.definition_of_done],item_format:settings=>settings.item_format,history_missing_stream_policy:settings=>settings.history.missing_stream,sprint_release_format_policy:settings=>settings.validation.sprint_release_format,parent_reference_policy:settings=>settings.validation.parent_reference,metadata_validation_profile:settings=>settings.validation.metadata_profile,metadata_required_fields:settings=>[...settings.validation.metadata_required_fields],lifecycle_stale_blocker_reason_patterns:settings=>[...settings.validation.lifecycle_stale_blocker_reason_patterns],lifecycle_closure_like_blocked_reason_patterns:settings=>[...settings.validation.lifecycle_closure_like_blocked_reason_patterns],lifecycle_closure_like_resolution_patterns:settings=>[...settings.validation.lifecycle_closure_like_resolution_patterns],lifecycle_closure_like_actual_result_patterns:settings=>[...settings.validation.lifecycle_closure_like_actual_result_patterns],governance_preset:settings=>settings.governance.preset,governance_ownership_enforcement:settings=>settings.governance.ownership_enforcement,governance_create_mode_default:settings=>settings.governance.create_mode_default,governance_close_validation_default:settings=>settings.governance.close_validation_default,governance_require_close_reason:settings=>settings.governance.require_close_reason?"enabled":"disabled",governance_create_default_type:settings=>settings.governance.create_default_type??"",governance_workflow_enforcement:settings=>settings.governance.workflow_enforcement??"off",governance_start_blocker_enforcement:settings=>settings.governance.start_blocker_enforcement??"strict",governance_parent_reference_policy:settings=>settings.governance.parent_reference,governance_metadata_validation_profile:settings=>settings.governance.metadata_profile,governance_force_required_for_stale_lock:settings=>settings.governance.force_required_for_stale_lock?"enabled":"disabled",test_result_tracking:settings=>settings.testing.record_results_to_items?"enabled":"disabled",untrusted_linked_test_execution:settings=>settings.testing.allow_untrusted_linked_tests?"enabled":"disabled",telemetry_tracking:settings=>settings.telemetry.enabled?"enabled":"disabled",agent_identity_vocabulary:settings=>summarizeAgentIdentityVocabulary(settings.agent_identity?.identity_vocabulary),context:settings=>({default_depth:settings.context.default_depth,activity_limit:settings.context.activity_limit,stale_threshold_days:settings.context.stale_threshold_days,next_ranking_policy:settings.context.next_ranking_policy,sections:{...settings.context.sections}})};function readConfigValue(settings,key){return CONFIG_VALUE_READERS[key](settings)}function withWarnings(result,warnings){return warnings.length===0?result:{...result,warnings}}async function resolveSettingsTarget(scope,global2){const cwd=process.cwd(),pmRoot=scope==="project"?resolvePmRoot(cwd,global2.path):resolveGlobalPmRoot(cwd),settingsPath=getSettingsPath(pmRoot);return scope==="project"&&await assertInitializedTracker(pmRoot),{pmRoot,settingsPath}}function parseSectionToggle(raw){if(raw===void 0)return;const normalized=raw.trim().toLowerCase();if(normalized==="true"||normalized==="enabled"||normalized==="on"||normalized==="1")return!0;if(normalized==="false"||normalized==="disabled"||normalized==="off"||normalized==="0")return!1;throw new PmCliError(`Context section toggle must be true|false|enabled|disabled, got "${raw}"`,EXIT_CODE.USAGE)}function parsePositiveContextInteger(rawValue,option){const raw=rawValue.trim(),parsed=Number(raw);if(/^\d+$/u.test(raw)&&Number.isSafeInteger(parsed)&&parsed>0)return parsed;throw new PmCliError(`Context ${option} must be a positive integer`,EXIT_CODE.USAGE)}async function applyContextConfig(settings,options,target,scope,warnings){let changed=!1;const ctx=settings.context,assignedPaths=[];if(options.defaultDepth!==void 0){const normalized=options.defaultDepth.trim().toLowerCase();if(!CONTEXT_DEPTH_VALUES.includes(normalized))throw new PmCliError(`Context --default-depth must be one of ${CONTEXT_DEPTH_VALUES.join("|")}`,EXIT_CODE.USAGE);assignedPaths.push("context.default_depth"),ctx.default_depth!==normalized&&(ctx.default_depth=normalized,changed=!0)}if(options.activityLimit!==void 0){const parsed=parsePositiveContextInteger(options.activityLimit,"--activity-limit");assignedPaths.push("context.activity_limit"),ctx.activity_limit!==parsed&&(ctx.activity_limit=parsed,changed=!0)}if(options.staleThresholdDays!==void 0){const parsed=parsePositiveContextInteger(options.staleThresholdDays,"--stale-threshold-days");assignedPaths.push("context.stale_threshold_days"),ctx.stale_threshold_days!==parsed&&(ctx.stale_threshold_days=parsed,changed=!0)}const sectionToggles=[["hierarchy",options.sectionHierarchy],["activity",options.sectionActivity],["progress",options.sectionProgress],["blockers",options.sectionBlockers],["files",options.sectionFiles],["workload",options.sectionWorkload],["staleness",options.sectionStaleness],["tests",options.sectionTests]];for(const[sectionName,rawValue]of sectionToggles){const toggle=parseSectionToggle(rawValue);if(toggle!==void 0){const key=sectionName;assignedPaths.push(`context.sections.${sectionName}`),ctx.sections[key]!==toggle&&(ctx.sections[key]=toggle,changed=!0)}}return(changed||isSettingsReadFallback(settings))&&(await writeSettings(target.pmRoot,settings,"config:set:context",{assignedPaths}),changed=!0),withWarnings({scope,key:"context",context_settings:{default_depth:ctx.default_depth,activity_limit:ctx.activity_limit,stale_threshold_days:ctx.stale_threshold_days,next_ranking_policy:ctx.next_ranking_policy,sections:{...ctx.sections}},settings_path:target.settingsPath,changed},warnings)}function applyNestedSettingPositionalValue(keyValue,valueValue,options){if(options.value!==void 0&&options.value!==valueValue)throw new PmCliError(`Config set ${keyValue} received both positional value "${valueValue}" and --value "${options.value}". Pass only one.`,EXIT_CODE.USAGE);return{...options,value:valueValue}}function applyPositionalValue(action,keyValue,normalizedKey,nestedSetting,valueValue,options){if(valueValue===void 0)return options;if(action!=="set")throw new PmCliError(`Config action "${action}" does not accept a positional value. Only "set" takes <value>.`,EXIT_CODE.USAGE);if(typeof keyValue!="string"||keyValue.trim().length===0)throw new PmCliError('Config action "set" requires <key> before a positional <value>.',EXIT_CODE.USAGE);if(nestedSetting)return applyNestedSettingPositionalValue(keyValue,valueValue,options);assertConfigKeyDefined(normalizedKey);const routed=resolveConfigPositionalValue(normalizedKey,valueValue);if(!routed.routable)throw new PmCliError(routed.reason,EXIT_CODE.USAGE);if(routed.flag==="criterion"){if(options.criterion!==void 0&&options.criterion.length>0)throw new PmCliError(`Config set ${keyValue} received both positional value "${valueValue}" and --criterion. Pass criteria via --criterion only when supplying more than one value.`,EXIT_CODE.USAGE);return{...options,criterion:routed.values}}if(routed.flag==="format")return{...options,format:routed.value};if(options.policy!==void 0&&normalizePolicyForConflict(normalizedKey,options.policy)!==normalizePolicyForConflict(normalizedKey,routed.value))throw new PmCliError(`Config set ${keyValue} received both positional value "${valueValue}" and --policy "${options.policy}". Pass only one.`,EXIT_CODE.USAGE);return{...options,policy:routed.value}}function buildConfigListResult(context){const keys=Object.keys(CONFIG_KEY_ALIASES).map(candidate=>({key:candidate,aliases:CONFIG_KEY_ALIASES[candidate],value_kind:candidate==="context"||candidate==="agent_identity_vocabulary"?"object":isCriteriaConfigKey(candidate)?"string_array":"enum",set_flags:candidate==="context"?["--default-depth","--activity-limit","--stale-threshold-days","--section-<name>"]:candidate==="agent_identity_vocabulary"?["--policy","--value","--criterion"]:isCriteriaConfigKey(candidate)?["--criterion","--clear-criteria"]:candidate==="item_format"?["--format"]:["--policy"],summary:CONFIG_KEY_SUMMARIES[candidate],value:readConfigValue(context.settings,candidate)})),nestedSettings=NESTED_SETTING_DESCRIPTORS.map(descriptor=>({key:descriptor.key,canonical_key:descriptor.key.replaceAll("_","-"),path:descriptor.path,kind:descriptor.kind,value:readNestedSettingValue(context.settings,descriptor),summary:descriptor.summary,...descriptor.choices?{choices:[...descriptor.choices]}:{},...descriptor.min===void 0?{}:{min:descriptor.min},...descriptor.max===void 0?{}:{max:descriptor.max}}));return withWarnings({scope:context.scope,keys,nested_settings:nestedSettings,count:keys.length,settings_path:context.target.settingsPath,changed:!1},context.warnings)}function buildConfigExportResult(context){const values=Object.fromEntries(Object.keys(CONFIG_KEY_ALIASES).map(key=>[key,readConfigValue(context.settings,key)]));return withWarnings({scope:context.scope,values,settings_path:context.target.settingsPath,changed:!1},context.warnings)}function buildConfigGetResult(context,key){const value=readConfigValue(context.settings,key),base={scope:context.scope,key,settings_path:context.target.settingsPath,changed:!1};return key==="item_format"?withWarnings({...base,format:context.settings.item_format,has_explicit_item_format:context.metadata.has_explicit_item_format},context.warnings):key==="context"?withWarnings({...base,context_settings:value},context.warnings):key==="agent_identity_vocabulary"?withWarnings({...base,identity_vocabulary:value},context.warnings):Array.isArray(value)?withWarnings({...base,criteria:value},context.warnings):withWarnings({...base,policy:value},context.warnings)}async function buildNestedSettingResult(context,action,nestedSetting,options){if(action==="get"){const currentValue=readNestedSettingValue(context.settings,nestedSetting);return withWarnings({scope:context.scope,key:nestedSetting.key,nested_setting:{key:nestedSetting.key,path:nestedSetting.path,kind:nestedSetting.kind,value:currentValue},settings_path:context.target.settingsPath,changed:!1},context.warnings)}const rawValue=options.value;if(typeof rawValue!="string")throw new PmCliError(`Config set ${nestedSetting.key} requires a value. Pass it positionally (\`pm config ${context.scope} set ${nestedSetting.key} <value>\`) or via --value.`,EXIT_CODE.USAGE);const parsed=parseNestedSettingValue(nestedSetting,rawValue);if(!parsed.ok)throw new PmCliError(parsed.error.message,EXIT_CODE.USAGE);const changed=writeNestedSettingValue(context.settings,nestedSetting,parsed.parsed.value)||isSettingsReadFallback(context.settings);return changed&&await writeSettings(context.target.pmRoot,context.settings,`config:set:${nestedSetting.path}`,{assignedPaths:[nestedSetting.path]}),withWarnings({scope:context.scope,key:nestedSetting.key,nested_setting:{key:nestedSetting.key,path:nestedSetting.path,kind:nestedSetting.kind,value:parsed.parsed.value},settings_path:context.target.settingsPath,changed},context.warnings)}async function writeConfigSettingsIfChanged(context,changed,reason,assignedPaths=[]){(changed||isSettingsReadFallback(context.settings))&&(await writeSettings(context.target.pmRoot,context.settings,reason,{assignedPaths}),isSettingsReadFallback(context.settings)&&(context.fallbackRepairWritten=!0))}function hasGovernanceValidationMirrorChange(governanceValue,validationValue,nextPolicy){return governanceValue!==nextPolicy||validationValue!==nextPolicy}function buildPolicyResult(context,key,policy,changed){return withWarnings({scope:context.scope,key,policy,settings_path:context.target.settingsPath,changed},context.warnings)}function buildCriteriaResult(context,key,criteria,changed){return withWarnings({scope:context.scope,key,criteria,settings_path:context.target.settingsPath,changed},context.warnings)}async function migrateItemsForFormatChange(pmRoot,settings,nextFormat){const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),migrated=await migrateItemFilesToFormat(pmRoot,nextFormat,"config:set:item_format:migrate",typeRegistry.type_to_folder,settings.schema);return{target_format:migrated.target_format,scanned:migrated.scanned,migrated:migrated.migrated,removed:migrated.removed,warnings:migrated.warnings}}async function setItemFormatConfig(context,options){const nextFormat=normalizeItemFormat(options.format),changed=context.settings.item_format!==nextFormat||!context.metadata.has_explicit_item_format;let migration;if(changed){context.settings.item_format=nextFormat;const writeOptions={assignedPaths:["item_format"]};isSettingsReadFallback(context.settings)?(await writeSettings(context.target.pmRoot,context.settings,"config:set:item_format",writeOptions),context.fallbackRepairWritten=!0,migration=await migrateItemsForFormatChange(context.target.pmRoot,await readSettings(context.target.pmRoot),nextFormat)):(migration=await migrateItemsForFormatChange(context.target.pmRoot,context.settings,nextFormat),await writeSettings(context.target.pmRoot,context.settings,"config:set:item_format",writeOptions))}return withWarnings({scope:context.scope,key:"item_format",format:context.settings.item_format,has_explicit_item_format:!0,migration,settings_path:context.target.settingsPath,changed},context.warnings)}async function setValidationConfig(context,key,options){if(key==="history_missing_stream_policy"){const nextPolicy2=normalizeHistoryMissingStreamPolicy(options.policy),changed2=context.settings.history.missing_stream!==nextPolicy2;return context.settings.history.missing_stream=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:history_missing_stream_policy",["history.missing_stream"]),buildPolicyResult(context,key,context.settings.history.missing_stream,changed2)}if(key==="sprint_release_format_policy"){const nextPolicy2=normalizeSprintReleaseFormatPolicy(options.policy),changed2=context.settings.validation.sprint_release_format!==nextPolicy2;return context.settings.validation.sprint_release_format=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:sprint_release_format_policy",["validation.sprint_release_format"]),buildPolicyResult(context,key,context.settings.validation.sprint_release_format,changed2)}if(key==="parent_reference_policy"){const nextPolicy2=normalizeParentReferencePolicy(options.policy),changed2=context.settings.validation.parent_reference!==nextPolicy2||context.settings.governance.preset!=="custom"||context.settings.governance.parent_reference!==nextPolicy2;return context.settings.validation.parent_reference=nextPolicy2,context.settings.governance.preset="custom",context.settings.governance.parent_reference=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:parent_reference_policy",["validation.parent_reference","governance.preset","governance.parent_reference"]),buildPolicyResult(context,key,context.settings.validation.parent_reference,changed2)}const nextPolicy=normalizeValidateMetadataProfile(options.policy),changed=context.settings.validation.metadata_profile!==nextPolicy||context.settings.governance.preset!=="custom"||context.settings.governance.metadata_profile!==nextPolicy;return context.settings.validation.metadata_profile=nextPolicy,context.settings.governance.preset="custom",context.settings.governance.metadata_profile=nextPolicy,await writeConfigSettingsIfChanged(context,changed,"config:set:metadata_validation_profile",["validation.metadata_profile","governance.preset","governance.metadata_profile"]),buildPolicyResult(context,key,context.settings.validation.metadata_profile,changed)}async function setCriteriaConfig(context,key,options){if(key==="metadata_required_fields"){const nextCriteria2=normalizeMetadataRequiredFields(options.criterion,options.clearCriteria),changed2=nextCriteria2.length!==context.settings.validation.metadata_required_fields.length||nextCriteria2.some((value,index)=>value!==context.settings.validation.metadata_required_fields[index]);return context.settings.validation.metadata_required_fields=nextCriteria2,await writeConfigSettingsIfChanged(context,changed2,"config:set:metadata_required_fields",["validation.metadata_required_fields"]),buildCriteriaResult(context,key,[...context.settings.validation.metadata_required_fields],changed2)}const currentCriteria={lifecycle_stale_blocker_reason_patterns:context.settings.validation.lifecycle_stale_blocker_reason_patterns,lifecycle_closure_like_blocked_reason_patterns:context.settings.validation.lifecycle_closure_like_blocked_reason_patterns,lifecycle_closure_like_resolution_patterns:context.settings.validation.lifecycle_closure_like_resolution_patterns,lifecycle_closure_like_actual_result_patterns:context.settings.validation.lifecycle_closure_like_actual_result_patterns}[key],nextCriteria=normalizeLifecyclePatternCriteria(key,options.criterion,options.clearCriteria),changed=nextCriteria.length!==currentCriteria.length||nextCriteria.some((value,index)=>value!==currentCriteria[index]);return currentCriteria.splice(0,currentCriteria.length,...nextCriteria),await writeConfigSettingsIfChanged(context,changed,`config:set:${key}`,[`validation.${key}`]),buildCriteriaResult(context,key,[...currentCriteria],changed)}async function setGovernancePresetOrTypeConfig(context,key,options){if(key==="governance_preset"){const nextPolicy=normalizeGovernancePreset(options.policy),changed2=context.settings.governance.preset!==nextPolicy;return context.settings.governance.preset=nextPolicy,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_preset",["governance.preset"]),buildPolicyResult(context,key,context.settings.governance.preset,changed2)}const policyProvided=typeof options.policy=="string",rawType=policyProvided?options.policy.trim():"";if(policyProvided&&rawType.length===0){const changed2=context.settings.governance.create_default_type!==void 0;return delete context.settings.governance.create_default_type,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_create_default_type",["governance.create_default_type"]),buildPolicyResult(context,key,context.settings.governance.create_default_type??"",changed2)}if(rawType.length===0)throw new PmCliError('Config set governance-create-default-type requires an item type value (or an empty value "" to clear it)',EXIT_CODE.USAGE);const typeRegistry=resolveItemTypeRegistry(context.settings,getActiveExtensionRegistrations()),resolvedType=resolveTypeName(rawType,typeRegistry);if(!resolvedType)throw new PmCliError(buildInvalidTypeError(rawType,typeRegistry.types,resolveItemTypesFilePath(context.target.pmRoot,context.settings.schema)),EXIT_CODE.USAGE);const changed=context.settings.governance.create_default_type!==resolvedType;return context.settings.governance.create_default_type=resolvedType,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_create_default_type",["governance.create_default_type"]),buildPolicyResult(context,key,context.settings.governance.create_default_type,changed)}async function setGovernancePolicyConfig(context,key,options){if(key==="governance_ownership_enforcement"){const nextPolicy2=normalizeGovernanceOwnershipEnforcement(options.policy),changed2=context.settings.governance.preset!=="custom"||context.settings.governance.ownership_enforcement!==nextPolicy2;return context.settings.governance.preset="custom",context.settings.governance.ownership_enforcement=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_ownership_enforcement",["governance.preset","governance.ownership_enforcement"]),buildPolicyResult(context,key,context.settings.governance.ownership_enforcement,changed2)}if(key==="governance_create_mode_default"){const nextPolicy2=normalizeGovernanceCreateModeDefault(options.policy),changed2=context.settings.governance.preset!=="custom"||context.settings.governance.create_mode_default!==nextPolicy2;return context.settings.governance.preset="custom",context.settings.governance.create_mode_default=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_create_mode_default",["governance.preset","governance.create_mode_default"]),buildPolicyResult(context,key,context.settings.governance.create_mode_default,changed2)}const nextPolicy=normalizeGovernanceCloseValidationDefault(options.policy),changed=context.settings.governance.preset!=="custom"||context.settings.governance.close_validation_default!==nextPolicy;return context.settings.governance.preset="custom",context.settings.governance.close_validation_default=nextPolicy,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_close_validation_default",["governance.preset","governance.close_validation_default"]),buildPolicyResult(context,key,context.settings.governance.close_validation_default,changed)}async function setGovernanceValidationConfig(context,key,options){if(key==="governance_parent_reference_policy"){const nextPolicy2=normalizeParentReferencePolicy(options.policy),changed2=context.settings.governance.preset!=="custom"||hasGovernanceValidationMirrorChange(context.settings.governance.parent_reference,context.settings.validation.parent_reference,nextPolicy2);return context.settings.governance.preset="custom",context.settings.governance.parent_reference=nextPolicy2,context.settings.validation.parent_reference=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_parent_reference_policy",["governance.preset","governance.parent_reference","validation.parent_reference"]),buildPolicyResult(context,key,context.settings.governance.parent_reference,changed2)}if(key==="governance_metadata_validation_profile"){const nextPolicy2=normalizeValidateMetadataProfile(options.policy),changed2=context.settings.governance.preset!=="custom"||hasGovernanceValidationMirrorChange(context.settings.governance.metadata_profile,context.settings.validation.metadata_profile,nextPolicy2);return context.settings.governance.preset="custom",context.settings.governance.metadata_profile=nextPolicy2,context.settings.validation.metadata_profile=nextPolicy2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_metadata_validation_profile",["governance.preset","governance.metadata_profile","validation.metadata_profile"]),buildPolicyResult(context,key,context.settings.governance.metadata_profile,changed2)}if(key==="governance_start_blocker_enforcement"){const nextStartPolicy=normalizeGovernanceWorkflowEnforcement(options.policy,"governance-start-blocker-enforcement"),changed2=(context.settings.governance.start_blocker_enforcement??"strict")!==nextStartPolicy;return context.settings.governance.start_blocker_enforcement=nextStartPolicy,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_start_blocker_enforcement",["governance.start_blocker_enforcement"]),buildPolicyResult(context,key,nextStartPolicy,changed2)}const nextPolicy=normalizeGovernanceWorkflowEnforcement(options.policy),changed=(context.settings.governance.workflow_enforcement??"off")!==nextPolicy;return context.settings.governance.workflow_enforcement=nextPolicy,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_workflow_enforcement",["governance.workflow_enforcement"]),buildPolicyResult(context,key,context.settings.governance.workflow_enforcement,changed)}async function setGovernanceBooleanConfig(context,key,options){if(key==="governance_require_close_reason"){const nextEnabled2=normalizeGovernanceRequireCloseReasonPolicy(options.policy)==="enabled",changed2=context.settings.governance.require_close_reason!==nextEnabled2;return context.settings.governance.require_close_reason=nextEnabled2,await writeConfigSettingsIfChanged(context,changed2,"config:set:governance_require_close_reason",["governance.require_close_reason"]),buildPolicyResult(context,key,context.settings.governance.require_close_reason?"enabled":"disabled",changed2)}const nextEnabled=normalizeGovernanceForceRequiredForStaleLockPolicy(options.policy)==="enabled",changed=context.settings.governance.preset!=="custom"||context.settings.governance.force_required_for_stale_lock!==nextEnabled;return context.settings.governance.preset="custom",context.settings.governance.force_required_for_stale_lock=nextEnabled,await writeConfigSettingsIfChanged(context,changed,"config:set:governance_force_required_for_stale_lock",["governance.preset","governance.force_required_for_stale_lock"]),buildPolicyResult(context,key,context.settings.governance.force_required_for_stale_lock?"enabled":"disabled",changed)}async function setTrackingConfig(context,key,options){if(key==="test_result_tracking"){const nextEnabled2=normalizeTestResultTrackingPolicy(options.policy)==="enabled",changed2=context.settings.testing.record_results_to_items!==nextEnabled2;return context.settings.testing.record_results_to_items=nextEnabled2,await writeConfigSettingsIfChanged(context,changed2,"config:set:test_result_tracking",["testing.record_results_to_items"]),buildPolicyResult(context,key,context.settings.testing.record_results_to_items?"enabled":"disabled",changed2)}if(key==="untrusted_linked_test_execution"){const nextEnabled2=normalizeEnabledDisabledPolicy(options.policy,"untrusted-linked-test-execution")==="enabled",changed2=context.settings.testing.allow_untrusted_linked_tests!==nextEnabled2;return context.settings.testing.allow_untrusted_linked_tests=nextEnabled2,await writeConfigSettingsIfChanged(context,changed2,"config:set:untrusted_linked_test_execution",["testing.allow_untrusted_linked_tests"]),buildPolicyResult(context,key,context.settings.testing.allow_untrusted_linked_tests?"enabled":"disabled",changed2)}const nextEnabled=normalizeTelemetryTrackingPolicy(options.policy)==="enabled",changed=context.settings.telemetry.enabled!==nextEnabled||!context.settings.telemetry.first_run_prompt_completed;return context.settings.telemetry.enabled=nextEnabled,context.settings.telemetry.first_run_prompt_completed=!0,await writeConfigSettingsIfChanged(context,changed,"config:set:telemetry_tracking",["telemetry.enabled","telemetry.first_run_prompt_completed"]),buildPolicyResult(context,key,context.settings.telemetry.enabled?"enabled":"disabled",changed)}async function setDefinitionOfDoneConfig(context,key,options){const nextCriteria=normalizeCriteria(options.criterion,options.clearCriteria),changed=nextCriteria.length!==context.settings.workflow.definition_of_done.length||nextCriteria.some((value,index)=>value!==context.settings.workflow.definition_of_done[index]);return context.settings.workflow.definition_of_done=nextCriteria,await writeConfigSettingsIfChanged(context,changed,"config:set:definition_of_done",["workflow.definition_of_done"]),buildCriteriaResult(context,key,[...context.settings.workflow.definition_of_done],changed)}function parseAgentIdentityVocabularyOperation(raw){const policy=raw?.trim().toLowerCase().replaceAll("_","-"),dryRun=policy?.startsWith("preview-")===!0,operation=dryRun?policy.slice(8):policy;if(operation==="add"||operation==="remove"||operation==="clear")return{operation,dryRun};throw new PmCliError("Config set agent-identity-vocabulary requires --policy add|remove|clear|preview-add|preview-remove|preview-clear",EXIT_CODE.USAGE)}function parseAgentIdentityVocabularyMutationValue(operation,value){if(operation==="add"){const separator=value?.lastIndexOf("=")??-1;if(separator<=0||separator===value.length-1)throw new PmCliError('Config set agent-identity-vocabulary --policy add requires --value "<legacy-author>=<canonical-harness>"',EXIT_CODE.USAGE);return{legacy_author:value.slice(0,separator),canonical_harness:value.slice(separator+1)}}if(operation==="remove"){if(value===void 0)throw new PmCliError("Config set agent-identity-vocabulary --policy remove requires --value <legacy-author>",EXIT_CODE.USAGE);return{legacy_author:value}}if(value!==void 0)throw new PmCliError("Config set agent-identity-vocabulary --policy clear does not accept --value",EXIT_CODE.USAGE);return{}}async function setAgentIdentityVocabularyConfig(context,options){const{operation,dryRun}=parseAgentIdentityVocabularyOperation(options.policy),mutationValue=parseAgentIdentityVocabularyMutationValue(operation,options.value);let planned;try{planned=planAgentIdentityVocabularyMutation(context.settings.agent_identity?.identity_vocabulary,{operation,...mutationValue,observed_authors:options.criterion})}catch(error){throw new PmCliError(error.message,EXIT_CODE.USAGE)}return planned.preview.changed&&!dryRun&&(context.settings.agent_identity={...context.settings.agent_identity,identity_vocabulary:planned.vocabulary},await writeConfigSettingsIfChanged(context,!0,`config:set:agent_identity.identity_vocabulary:${operation}:v${planned.preview.version_after}`,["agent_identity"])),withWarnings({scope:context.scope,key:"agent_identity_vocabulary",identity_vocabulary:summarizeAgentIdentityVocabulary(dryRun?context.settings.agent_identity?.identity_vocabulary:planned.vocabulary),vocabulary_mutation:planned.preview,settings_path:context.target.settingsPath,changed:planned.preview.changed&&!dryRun},context.warnings)}async function setConfigValue(context,key,options){const result=await dispatchConfigSetValue(context,key,options);return context.fallbackRepairWritten===!0?{...result,changed:!0}:result}async function dispatchConfigSetValue(context,key,options){if(options.clearCriteria===!0&&!isCriteriaConfigKey(key))throw new PmCliError("--clear-criteria is only supported with config set criteria-list keys",EXIT_CODE.USAGE);return key==="item_format"?setItemFormatConfig(context,options):key==="context"?applyContextConfig(context.settings,options,context.target,context.scope,context.warnings):key==="agent_identity_vocabulary"?setAgentIdentityVocabularyConfig(context,options):key==="definition_of_done"?setDefinitionOfDoneConfig(context,key,options):isCriteriaValueConfigKey(key)?setCriteriaConfig(context,key,options):TRACKING_CONFIG_KEYS.has(key)?setTrackingConfig(context,key,options):GOVERNANCE_BOOLEAN_CONFIG_KEYS.has(key)?setGovernanceBooleanConfig(context,key,options):isGovernancePolicyConfigKey(key)?setGovernancePolicyConfig(context,key,options):isGovernanceValidationConfigKey(key)?setGovernanceValidationConfig(context,key,options):isGovernancePresetOrTypeConfigKey(key)?setGovernancePresetOrTypeConfig(context,key,options):setValidationConfig(context,key,options)}async function runConfig(scopeValue,actionValue,keyValue,options,global2,valueValue){const scope=normalizeScope(scopeValue),action=normalizeAction(actionValue),nestedSetting=action==="get"||action==="set"?resolveNestedSettingDescriptor(keyValue):void 0,key=nestedSetting?void 0:normalizeKeyForAction(action,keyValue),routedOptions=applyPositionalValue(action,keyValue,key,nestedSetting,valueValue,options),target=await resolveSettingsTarget(scope,global2),{settings,metadata,warnings:settingsReadWarnings}=await readSettingsWithMetadata(target.pmRoot),context={scope,target,settings,metadata,warnings:normalizeWarnings(settingsReadWarnings)};return nestedSetting?buildNestedSettingResult(context,action,nestedSetting,routedOptions):action==="list"?buildConfigListResult(context):action==="export"?buildConfigExportResult(context):(assertConfigKeyDefined(key),action==="get"?buildConfigGetResult(context,key):setConfigValue(context,key,routedOptions))}const _testOnlyConfigCommand={hasGovernanceValidationMirrorChange,applyPositionalValue,normalizeAction,normalizeCriteria,normalizeGovernanceCloseValidationDefault,normalizeGovernanceCreateModeDefault,normalizeGovernanceForceRequiredForStaleLockPolicy,normalizeGovernanceOwnershipEnforcement,normalizeGovernancePreset,normalizeGovernanceRequireCloseReasonPolicy,normalizeGovernanceWorkflowEnforcement,normalizeHistoryMissingStreamPolicy,normalizeItemFormat,normalizeKey,normalizeMetadataRequiredFields,normalizePolicyForConflict,normalizeScope,normalizeTelemetryTrackingPolicy,normalizeTestResultTrackingPolicy,normalizeValidateMetadataProfile,normalizeWarnings};export{_testOnlyConfigCommand,runConfig};
|
|
2
2
|
//# sourceMappingURL=config.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2b3d7667-1c63-565a-b314-3a74cc8d6b7d")}catch{}})();import fs from"node:fs";import path from"node:path";import{createRequire}from"node:module";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";const PACKAGE_NAME="@unbrained/pm-cli",MUTATING_COMMANDS=new Set(["append","claim","changelog","close","close-many","close-task","comments","config","copy","create","dedupe-merge","delete","deps","docs","extension","event","events","files","focus","gc","history-author-acknowledge","history-compact","history-redact","history-repair","init","install","item","learnings","meet","merge","normalize","notes","package","packages","pause-task","plan","profile","reindex","release","remind","restore","schema","start-task","test","test-all","test-runs","test-runs-worker","telemetry","templates","twin","update","update-many","upgrade","vcs","workspace"]),GLOBAL_VALUE_FLAGS=new Set(["--author","--expect-hash","--output-budget","--output-format","--output-include","--output-limit","--output-session","--path","--pm-path"]),VERSION_PATTERN=/\b(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-(\d+))?\b/u,HISTORY_ITEM_HASH_VERSION_3_INTRODUCED_IN="2026.8.31";function hasAnyToken(argv,tokens){return argv.some(token=>tokens.includes(token.split("=",1)[0]))}function isPackageMutation(argv,positionals){return["activate","adopt","adopt-all","deactivate","init","install","migrate","reload","uninstall"].includes(positionals[0]??"")||hasAnyToken(argv,["--activate","--adopt","--adopt-all","--deactivate","--fix-managed-state","--init","--install","--output","--reload","--scaffold","--uninstall"])}const MIXED_COMMAND_CLASSIFIERS={changelog:(argv,positionals)=>{if(positionals[0]==="generate")return!hasAnyToken(argv,["--check"]);const exportIndex=argv.indexOf("export");return positionals[0]==="export"&&(hasAnyToken(argv,["--output"])||exportIndex>=0&&argv[exportIndex+1]!==void 0&&!argv[exportIndex+1].startsWith("-"))},comments:argv=>hasAnyToken(argv,["--add","--delete","--edit","--file","--stdin"]),config:(_argv,positionals)=>(positionals[0]==="project"||positionals[0]==="global"?positionals[1]:positionals[0])==="set",deps:()=>!1,docs:argv=>hasAnyToken(argv,["--add","--add-glob","--migrate","--remove"]),duplicates:()=>!1,events:()=>!1,extension:isPackageMutation,files:(argv,positionals)=>hasAnyToken(argv,["--add","--add-glob","--migrate","--remove"])||positionals[0]==="discover"&&hasAnyToken(argv,["--apply"]),health:argv=>!hasAnyToken(argv,["--check-only","--no-refresh","--skip-vectors"]),learnings:argv=>hasAnyToken(argv,["--add","--delete","--edit","--file","--stdin"]),merge:(_argv,positionals)=>positionals[0]!=="report",notes:argv=>hasAnyToken(argv,["--add","--delete","--edit","--file","--stdin"]),package:isPackageMutation,packages:isPackageMutation,profile:(_argv,positionals)=>positionals[0]==="apply",schema:(argv,positionals)=>["add-field","add-status","add-type","remove-field","remove-status","remove-type","remap-status","rename-field","rename-type"].includes(positionals[0]??"")&&!(hasAnyToken(argv,["--infer"])&&!hasAnyToken(argv,["--apply"])),telemetry:(_argv,positionals)=>positionals.slice(0,2).some(token=>["clear","flush"].includes(token)),templates:(_argv,positionals)=>positionals[0]==="save",test:argv=>hasAnyToken(argv,["--update","--update-index","--add","--add-json","--background","--measure","--remove","--resume","--run","--stop"]),validate:argv=>hasAnyToken(argv,["--auto-fix","--prune-missing"]),vcs:(_argv,positionals)=>["abandon","create","merge","propose","ref-create"].includes(positionals[0]??""),workspace:(_argv,positionals)=>positionals[0]==="snapshot"&&["create","delete","restore"].includes(positionals[1]??"")};function parseDateVersion(value){const match=value.match(VERSION_PATTERN);return match?[Number(match[1]),Number(match[2]),Number(match[3]),Number(match[4]??0)]:null}function comparePmDateVersions(left,right){const leftParts=parseDateVersion(left),rightParts=parseDateVersion(right);if(!leftParts||!rightParts)return null;for(let index=0;index<leftParts.length;index+=1){const delta=leftParts[index]-rightParts[index];if(delta!==0)return Math.sign(delta)}return 0}function historyItemHashVersionForRuntime(version){return comparePmDateVersions(version,HISTORY_ITEM_HASH_VERSION_3_INTRODUCED_IN)!==-1?3:2}function findIncompatibleHistoryEpochPin(pins,writerItemHashVersion){if(writerItemHashVersion===3)return pins.filter(pin=>pin.history_epoch_compatible===!1).map(pin=>({...pin,declaration:pin.declaration??pin.version})).sort((left,right)=>comparePmDateVersions(left.version,right.version))[0]}function readJsonRecord(filePath){try{const parsed=JSON.parse(fs.readFileSync(filePath,"utf8"));return typeof parsed=="object"&&parsed!==null&&!Array.isArray(parsed)?parsed:null}catch{return null}}function rangeUpperBounds(alternative){const comparators=[...alternative.matchAll(/(<=|<)\s*v?(\d{4}\.\d{1,2}\.\d{1,2}(?:-\d+)?)/gu)].map(match=>({inclusive:match[1]==="<=",version:match[2]})),hyphen=alternative.match(/\b\d{4}\.\d{1,2}\.\d{1,2}(?:-\d+)?\s+-\s+v?(\d{4}\.\d{1,2}\.\d{1,2}(?:-\d+)?)/u);return hyphen?[...comparators,{inclusive:!0,version:hyphen[1]}]:comparators}function analyzeHistoryEpochRange(specification){const alternativeBounds=specification.split("||").map(alternative=>rangeUpperBounds(alternative));return{bounded:alternativeBounds.some(bounds=>bounds.length>0),compatible:alternativeBounds.some(bounds=>bounds.every(bound=>{const comparison=comparePmDateVersions(HISTORY_ITEM_HASH_VERSION_3_INTRODUCED_IN,bound.version);return comparison!==null&&(bound.inclusive?comparison!==1:comparison===-1)}))}}function dependencyDeclarations(packageJson){return["dependencies","devDependencies","optionalDependencies","peerDependencies"].flatMap(field=>{const dependencies=packageJson[field];if(typeof dependencies!="object"||dependencies===null)return[];const value=dependencies[PACKAGE_NAME];return typeof value=="string"?[value.trim()]:[]})}function dependencyPins(packageJson){return dependencyDeclarations(packageJson).flatMap(specification=>{const version=/^[<!]/u.test(specification)?void 0:specification.match(VERSION_PATTERN)?.[0];if(!version)return[];const exact=/^(?:=|v)?\d{4}\.\d{1,2}\.\d{1,2}(?:-\d+)?$/u.test(specification),range=analyzeHistoryEpochRange(specification);return[{version,constraint:exact?"exact":range.bounded?"range":"minimum",...exact?{}:{declaration:specification},history_epoch_compatible:exact?comparePmDateVersions(version,HISTORY_ITEM_HASH_VERSION_3_INTRODUCED_IN)!==-1:range.compatible}]})}function packageLockPin(projectRoot){const packages=readJsonRecord(path.join(projectRoot,"package-lock.json"))?.packages;if(typeof packages!="object"||packages===null)return;const installed=packages["node_modules/@unbrained/pm-cli"];if(typeof installed!="object"||installed===null)return;const version=installed.version;return typeof version=="string"?version:void 0}function textLockPin(projectRoot,file){try{const lines=fs.readFileSync(path.join(projectRoot,file),"utf8").split(/\r?\n/u),packageLineIndex=lines.findIndex(line=>line.includes(PACKAGE_NAME));if(packageLineIndex<0)return;const packageIndent=lines[packageLineIndex].match(/^\s*/u)[0].length,entry=[lines[packageLineIndex]];for(let index=packageLineIndex+1;index<lines.length;index+=1){const line=lines[index],trimmed=line.trim(),indent=line.match(/^\s*/u)[0].length;if(trimmed.length>0&&indent<=packageIndent)break;entry.push(line)}return entry.join(`
|
|
2
2
|
`).match(/^\s*version(?::\s*|\s+)["']?(\d{4}\.\d{1,2}\.\d{1,2}(?:-\d+)?)/mu)?.[1]??entry[0].match(VERSION_PATTERN)?.[0]}catch{return}}function discoverProjectRuntimeVersionPins(projectRoot){const pins=[],projectPackage=readJsonRecord(path.join(projectRoot,"package.json"));projectPackage&&pins.push(...dependencyPins(projectPackage).map(pin=>({...pin,source:"package.json"})));const installedVersion=readJsonRecord(path.join(projectRoot,"node_modules","@unbrained","pm-cli","package.json"))?.version;typeof installedVersion=="string"&&parseDateVersion(installedVersion)&&pins.push({version:installedVersion,source:"installed-package",constraint:"exact",history_epoch_compatible:historyItemHashVersionForRuntime(installedVersion)===3});const packageLockVersion=packageLockPin(projectRoot);packageLockVersion&&parseDateVersion(packageLockVersion)&&pins.push({version:packageLockVersion,source:"package-lock.json",constraint:"exact",history_epoch_compatible:historyItemHashVersionForRuntime(packageLockVersion)===3});for(const file of["pnpm-lock.yaml","yarn.lock"]){const version=textLockPin(projectRoot,file);version&&pins.push({version,source:file,constraint:"exact",history_epoch_compatible:historyItemHashVersionForRuntime(version)===3})}return pins}function assertProjectRuntimeFormatGuard(projectRoot,formatVersion){if(formatVersion<=1)return;const{minVersion,lt}=createRequire(import.meta.url)("semver"),declaration=dependencyDeclarations(readJsonRecord(path.join(projectRoot,"package.json"))??{}).find(specification=>{try{const minimum=minVersion(specification);return minimum!==null&<(minimum,"2026.10.10")}catch{return!1}}),incompatible=declaration===void 0?discoverProjectRuntimeVersionPins(projectRoot).find(pin=>comparePmDateVersions(pin.version,"2026.10.10")===-1):{version:declaration,source:"package.json"};if(incompatible)throw new PmCliError(`The project selects pm ${incompatible.version}, which cannot safely refuse item format ${formatVersion}.`,EXIT_CODE.CONFLICT,{code:"project_runtime_item_format_incompatible",reason:incompatible.source,required:"Upgrade project pins, installed SDKs, CI hosts and Git merge drivers before writing guarded item formats.",nextSteps:["Use a pm runtime supporting the required item format throughout the project; preserve original item and history bytes, and never re-anchor history to satisfy an older host."]})}function commandTokenFromArgv(argv){for(let index=0;index<argv.length;index+=1){const token=argv[index];if(GLOBAL_VALUE_FLAGS.has(token)){index+=1;continue}if(!token.startsWith("-"))return{command:token.toLowerCase(),index}}}function isProjectMutatingInvocation(argv){const commandToken=commandTokenFromArgv(argv);if(!commandToken||hasAnyToken(argv,["--help","-h","--dry-run"]))return!1;const{command,index:commandIndex}=commandToken,positionals=[];for(let index=commandIndex+1;index<argv.length;index+=1){const token=argv[index];if(GLOBAL_VALUE_FLAGS.has(token)){index+=1;continue}token.startsWith("-")||positionals.push(token.toLowerCase())}const mixedClassifier=MIXED_COMMAND_CLASSIFIERS[command];return mixedClassifier?mixedClassifier(argv,positionals):MUTATING_COMMANDS.has(command)}function inspectProjectRuntimeCompatibility(options){const command=commandTokenFromArgv(options.argv)?.command,mutating=isProjectMutatingInvocation(options.argv),pins=discoverProjectRuntimeVersionPins(options.projectRoot).filter(pin=>comparePmDateVersions(pin.version,options.executingVersion)!==null).sort((left,right)=>comparePmDateVersions(right.version,left.version)),newest=pins[0],stale=newest!==void 0&&comparePmDateVersions(options.executingVersion,newest.version)===-1,writerItemHashVersion=historyItemHashVersionForRuntime(options.executingVersion),incompatibleEpochPin=findIncompatibleHistoryEpochPin(pins,writerItemHashVersion),historyEpochIncompatible=mutating&&incompatibleEpochPin!==void 0,warning=stale&&!mutating?{code:"project_runtime_stale_read",executing_version:options.executingVersion,project_version:newest.version,source:newest.source,message:"This read is using an older pm runtime than the project requires.",next_steps:[`Run the command through the project's installed ${PACKAGE_NAME} ${newest.version}.`,"Install the project dependencies with its declared package manager if the local executable is missing."]}:void 0;return{compatible:!mutating||!stale&&!historyEpochIncompatible||options.allowStale===!0,executing_version:options.executingVersion,...newest?{project_version:newest.version,source:newest.source}:{},...command?{command}:{},mutating,stale,history_epoch_incompatible:historyEpochIncompatible,writer_item_hash_version:writerItemHashVersion,...incompatibleEpochPin?{incompatible_project_version:incompatibleEpochPin.declaration,incompatible_source:incompatibleEpochPin.source}:{},...warning?{warning}:{},override_applied:mutating&&(stale||historyEpochIncompatible)&&options.allowStale===!0}}function assertProjectRuntimeCompatibility(options){const result=inspectProjectRuntimeCompatibility(options);if(result.compatible)return result;throw result.history_epoch_incompatible?new PmCliError(`pm ${result.executing_version} cannot write item-hash epoch ${result.writer_item_hash_version} into a project pinned to pm ${result.incompatible_project_version}.`,EXIT_CODE.CONFLICT,{code:"project_runtime_history_epoch_incompatible",reason:result.incompatible_source,why:`The pinned runtime cannot read item_hash_version ${result.writer_item_hash_version}; allowing the write would break its health and validation gates.`,nextSteps:[`Upgrade the project's ${PACKAGE_NAME} pin to ${HISTORY_ITEM_HASH_VERSION_3_INTRODUCED_IN} or newer before mutating tracker history.`,"For an intentional coordinated migration only, set PM_ALLOW_STALE_CLI=1 for this invocation and record why.","Read-only commands remain available without an override."]}):new PmCliError(`pm ${result.executing_version} cannot mutate a project pinned to newer pm ${result.project_version}.`,EXIT_CODE.CONFLICT,{code:"project_runtime_stale_mutation",reason:result.source,why:"An older runtime can write storage, history, and merge contracts it does not understand.",nextSteps:[`Run this command through the project's installed ${PACKAGE_NAME} ${result.project_version}.`,"For an intentional recovery only, set PM_ALLOW_STALE_CLI=1 for this invocation and record why.","Read-only commands remain available without an override."]})}export{HISTORY_ITEM_HASH_VERSION_3_INTRODUCED_IN,PmCliError,assertProjectRuntimeCompatibility,assertProjectRuntimeFormatGuard,comparePmDateVersions,discoverProjectRuntimeVersionPins,historyItemHashVersionForRuntime,inspectProjectRuntimeCompatibility,isProjectMutatingInvocation};
|
|
3
3
|
//# sourceMappingURL=project-runtime-compatibility.js.map
|