@unbrained/pm-cli 2026.10.22 → 2026.10.24
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 +38 -0
- package/dist/cli/error-guidance.d.ts +12 -0
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli/register-setup.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/{chunk-2B5HAZFK.js → chunk-3S5FLCG7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PCPOTFJP.js → chunk-3VI4XDP2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UYYTV2TX.js → chunk-4PNAUT2E.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-E3JC3WQL.js → chunk-CDR5ES7Q.js} +54 -54
- package/dist/cli-bundle/chunks/chunk-CNEUJHA4.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-AOAQDCXX.js → chunk-CSE47ZAN.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-MV3KYY2A.js → chunk-FASDGYQC.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-HZNFNETE.js +127 -0
- package/dist/cli-bundle/chunks/{chunk-7OTYULIJ.js → chunk-KGZGXC7T.js} +29 -29
- package/dist/cli-bundle/chunks/{chunk-HC2DCGFA.js → chunk-MA7SNKYK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-GWIGZDRS.js → chunk-R7KWBFM2.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TZYQ4JDZ.js +6 -0
- package/dist/cli-bundle/chunks/chunk-URZB3USE.js +113 -0
- package/dist/cli-bundle/chunks/chunk-UY5UHI4I.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-TNU3XVPC.js → chunk-VPMQEVU6.js} +14 -14
- package/dist/cli-bundle/chunks/{chunk-URV4VHQ4.js → chunk-VSSHB6XI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-LIC5EUQS.js → chunk-YEI4N4A6.js} +48 -48
- package/dist/cli-bundle/chunks/chunk-Z62RXNHW.js +3 -0
- package/dist/cli-bundle/chunks/chunk-ZDVTXLA6.js +9 -0
- package/dist/cli-bundle/chunks/{indexed-receipt-blobs-L3BOTMZN.js → indexed-receipt-blobs-XANVELIV.js} +2 -2
- package/dist/cli-bundle/chunks/{mutation-admission-TATOFEXF.js → mutation-admission-NVTBZ7DH.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-GULR2IYO.js → register-list-query-2FE6K7FQ.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-HLSQ4WVW.js → register-mutation-KZXQUZUH.js} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-FE3GGA7O.js → register-operations-BOCBWNKJ.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-P3VLCTDY.js +2 -0
- package/dist/cli-bundle/chunks/{settlement-hook-UVFYSBMU.js → settlement-hook-YUVCO65H.js} +2 -2
- package/dist/cli-bundle/chunks/{stage-QCPZBZRC.js → stage-WRDTMCCF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-UQ5JPBY2.js → chunk-3QYTS4OY.js} +4 -4
- package/dist/cli-bundle/focused-chunks/{chunk-46HBJC6J.js → chunk-5MKNVJCM.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-QGDKWULS.js → chunk-6HJCSHBG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-7RQOFHMH.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-AGCEWJ27.js +21 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3LWH2RJC.js → chunk-BUZ2Z4P3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-2GFTVXKZ.js → chunk-CEEOWDB7.js} +3 -3
- package/dist/cli-bundle/focused-chunks/{chunk-25NQRZ7J.js → chunk-ES2NGVHZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-GXAXDPD4.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-VYAZND5Q.js → chunk-IUAYTD2S.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-TMN3RAXZ.js → chunk-JYXA4JIP.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-A52W6GLA.js → chunk-NFFPNMTH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-KM77WU5U.js → chunk-NX7TVNUM.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-CX5FNEFC.js → chunk-POLMFGPQ.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-R536272H.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-W2CND3BD.js → chunk-RSEGFZTY.js} +54 -54
- package/dist/cli-bundle/focused-chunks/{chunk-EHPRSWJE.js → chunk-RVUGTIIU.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-CB7TSZ7P.js → chunk-SBJ2IKTH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SXVJRLLP.js → chunk-SHUPX6G2.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-GVKYTDOH.js → chunk-TAHSXKAT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-X5YRJMAY.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XTYEASIY.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZMWLV2CE.js +91 -0
- package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-AAQOKO5B.js → indexed-receipt-blobs-FVOA3XMI.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{mutation-admission-TBKR4KRM.js → mutation-admission-PB6YFY7S.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{settlement-hook-MNCHFCAX.js → settlement-hook-2VXEB6PP.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{stage-RM6MJIMT.js → stage-MQE4PFWT.js} +2 -2
- package/dist/cli-bundle/main.js +21 -21
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +5 -2
- package/dist/cli-bundle/sdk-core.js +33 -33
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +58 -58
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +12 -9
- package/dist/core/checkpoint/mutation-checkpoint.d.ts +6 -3
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
- package/dist/core/checkpoint/mutation-context.d.ts +10 -0
- package/dist/core/checkpoint/mutation-context.js +2 -0
- package/dist/core/config/nested-settings.js +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/version-diagnostics.d.ts +2 -0
- package/dist/core/extensions/version-diagnostics.js +2 -0
- package/dist/core/lock/lock.d.ts +40 -6
- package/dist/core/lock/lock.js +3 -3
- package/dist/core/shared/errors.d.ts +28 -0
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/mcp/http-server.js +2 -2
- package/dist/mcp/server.js +2 -2
- package/dist/sdk/agent/command-recovery.d.ts +1 -0
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/agent/linked-resource-recovery.d.ts +13 -0
- package/dist/sdk/agent/linked-resource-recovery.js +2 -0
- package/dist/sdk/cli-contracts/agent-output-contracts.js +1 -1
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
- package/dist/sdk/cli-contracts/typed-action-inputs.d.ts +3 -2
- package/dist/sdk/contracts.d.ts +1 -0
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core.d.ts +1 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/extension/doctor.js +1 -1
- package/dist/sdk/extension/install-receipts.js +1 -1
- package/dist/sdk/extension/install-snapshot.d.ts +11 -0
- package/dist/sdk/extension/install-snapshot.js +1 -1
- package/dist/sdk/extension.d.ts +12 -0
- package/dist/sdk/extension.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/health.d.ts +1 -0
- package/dist/sdk/governance/health.js +2 -2
- package/dist/sdk/index.d.ts +4 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/lifecycle/checkpoint-rollback.d.ts +7 -0
- package/dist/sdk/lifecycle/checkpoint-rollback.js +2 -0
- package/dist/sdk/lifecycle/close-many.d.ts +1 -1
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/update-many.d.ts +1 -1
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/mcp/executable.d.ts +13 -0
- package/dist/sdk/mcp/executable.js +5 -0
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/context.d.ts +2 -1
- package/dist/sdk/query/context.js +1 -1
- package/dist/sdk/query/get.d.ts +2 -1
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/list.d.ts +2 -1
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/search/types.d.ts +2 -1
- package/dist/sdk/query.d.ts +1 -0
- package/dist/sdk/query.js +1 -1
- package/dist/sdk/read-output-contracts.d.ts +10 -2
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.d.ts +2 -1
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime.d.ts +11 -11
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/entry.d.ts +5 -1
- package/dist/sdk/test/entry.js +2 -1
- package/dist/sdk/test/execution.js +2 -2
- package/dist/sdk/workspace-snapshot.d.ts +5 -1
- package/dist/sdk/workspace-snapshot.js +3 -3
- package/dist/sdk/workspace.js +2 -2
- package/docs/COMMANDS.md +21 -2
- package/docs/CONFIGURATION.md +19 -3
- package/docs/EXTENSION_AUTHOR_CONTRACTS.md +2 -1
- package/docs/EXTENSION_LIFECYCLE.md +47 -0
- package/docs/MCP_REMOTE_TRANSPORT_SECURITY.md +16 -1
- package/docs/READ_OUTPUT_CONTRACTS.md +15 -0
- package/docs/RELEASING.md +9 -0
- package/docs/SDK.md +84 -5
- package/docs/SDK_STORAGE_LIFECYCLE.md +2 -1
- package/docs/TESTING.md +39 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +8 -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-35ISFIPC.js +0 -113
- package/dist/cli-bundle/chunks/chunk-5LSN7K4N.js +0 -2
- package/dist/cli-bundle/chunks/chunk-BAIVTLJM.js +0 -6
- package/dist/cli-bundle/chunks/chunk-C37RDYZI.js +0 -3
- package/dist/cli-bundle/chunks/chunk-J444ZX23.js +0 -126
- package/dist/cli-bundle/chunks/chunk-O67N62DT.js +0 -2
- package/dist/cli-bundle/chunks/chunk-VO3KDIU7.js +0 -9
- package/dist/cli-bundle/chunks/register-setup-XUIKAIZA.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-25L3L2PF.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-DVNUHTVK.js +0 -9
- package/dist/cli-bundle/focused-chunks/chunk-GC4VMLXL.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-QWKCQ5PW.js +0 -91
- package/dist/cli-bundle/focused-chunks/chunk-SOVXHW6Z.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-UUPJ6OZL.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-XX5JQCLF.js +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
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]="c8a91fc2-57b4-5738-9428-9847ef7afadc")}catch{}})();import{stripVTControlCharacters}from"node:util";import{unicodeSafePrefix}from"../../core/shared/text-normalization.js";import{resolvePmHistoryOperation}from"./command-aliases.js";import{PM_CORE_COMMAND_NAMES}from"./enum-contracts.js";const PM_OUTPUT_DEGRADATION_STEPS=["full","compact","brief","summary","counts"],PM_OUTPUT_BUDGET_CLASSES=["mutation","read","discovery","governance"],PM_DIAGNOSTIC_OUTPUT_CLASSES=["error","warning","validation_summary","recovery_bundle"],PM_DIAGNOSTIC_DEGRADATION_STEPS=["full","omit_explanation","limit_collections","compact_recovery","action_only"],MUTATION_COMMANDS=new Set(["append","claim","close","close-many","close-task","comments","config","copy","create","delete","docs","event","files","focus","history-author-acknowledge","history-compact","history-redact","history-repair","init","item","learnings","meet","notes","pause-task","release","remind","restore","schema","start-task","update","update-many"]),DISCOVERY_COMMANDS=new Set(["contracts","extension","help","install","package","packages","profile","upgrade"]),GOVERNANCE_COMMANDS=new Set(["gc","health","merge","stats","telemetry","test","test-all","validate"]),DEFAULT_MAX_ESTIMATED_TOKENS={mutation:2e3,read:4e3,discovery:3e3,governance:6e3},JSON_BUDGET_NUMERATOR=3,JSON_BUDGET_DENOMINATOR=2,MINIMUM_DIAGNOSTIC_BUDGET=192,DIAGNOSTIC_DEFAULT_BUDGETS={error:{text:768,json:2e3},warning:{text:768,json:2e3},validation_summary:{text:1500,json:3e3},recovery_bundle:{text:768,json:2e3}},PM_DIAGNOSTIC_OUTPUT_BUDGET_CONTRACTS=PM_DIAGNOSTIC_OUTPUT_CLASSES.map(diagnosticClass=>({diagnostic_class:diagnosticClass,default_max_estimated_tokens_by_format:DIAGNOSTIC_DEFAULT_BUDGETS[diagnosticClass],minimum_max_estimated_tokens:MINIMUM_DIAGNOSTIC_BUDGET,degradation_ladder:PM_DIAGNOSTIC_DEGRADATION_STEPS,corrective_action_paths:["required","recovery.suggested_retry","recovery.suggested_retry_args","recovery.next_best_command","next_steps[0]"],token_estimate:"ceil(utf8_bytes / 4)"})),DIAGNOSTIC_BUDGET_BY_CLASS=new Map(PM_DIAGNOSTIC_OUTPUT_BUDGET_CONTRACTS.map(contract=>[contract.diagnostic_class,contract]));function inferPmOutputBudgetClass(command){const[rootCommand=""]=resolvePmHistoryOperation(command).split(/\s+/u);return MUTATION_COMMANDS.has(rootCommand)?"mutation":DISCOVERY_COMMANDS.has(rootCommand)?"discovery":GOVERNANCE_COMMANDS.has(rootCommand)?"governance":"read"}function createPmCommandOutputBudget(command,budgetClass=inferPmOutputBudgetClass(command)){const normalizedCommand=command.trim().replace(/\s+/gu," ");if(normalizedCommand.length===0)throw new TypeError("command must be a non-empty command path");const toonBudget=DEFAULT_MAX_ESTIMATED_TOKENS[budgetClass];return definePmCommandOutputBudget({command:normalizedCommand,budget_class:budgetClass,default_max_estimated_tokens:toonBudget,default_max_estimated_tokens_by_format:{toon:toonBudget,json:Math.ceil(toonBudget*JSON_BUDGET_NUMERATOR/JSON_BUDGET_DENOMINATOR)},degradation_ladder:PM_OUTPUT_DEGRADATION_STEPS,allows_unbounded_opt_out:!0,token_estimate:"ceil(utf8_bytes / 4)"})}function definePmCommandOutputBudget(contract){if(!Number.isSafeInteger(contract.default_max_estimated_tokens)||contract.default_max_estimated_tokens<=0)throw new RangeError("default_max_estimated_tokens must be a positive safe integer");for(const[format,ceiling]of Object.entries(contract.default_max_estimated_tokens_by_format))if(!Number.isSafeInteger(ceiling)||ceiling<=0)throw new RangeError(`default_max_estimated_tokens_by_format.${format} must be a positive safe integer`);return contract}const PM_COMMAND_OUTPUT_BUDGET_CONTRACTS=PM_CORE_COMMAND_NAMES.map(command=>createPmCommandOutputBudget(command)),OUTPUT_BUDGET_BY_COMMAND=new Map(PM_COMMAND_OUTPUT_BUDGET_CONTRACTS.map(contract=>[contract.command,contract]));function resolvePmCommandOutputBudget(command,options={}){const normalizedCommand=command.trim().replace(/\s+/gu," "),[rootCommand]=resolvePmHistoryOperation(normalizedCommand).split(" "),declared=OUTPUT_BUDGET_BY_COMMAND.get(rootCommand);return declared?{...declared,command:normalizedCommand}:options.generateFallback?createPmCommandOutputBudget(normalizedCommand):null}function estimatePmOutputTokens(utf8Bytes){return Math.ceil(Math.max(0,utf8Bytes)/4)}function resolvePmDiagnosticOutputBudget(diagnosticClass){const contract=DIAGNOSTIC_BUDGET_BY_CLASS.get(diagnosticClass);if(contract===void 0)throw new TypeError(`diagnosticClass must be one of: ${PM_DIAGNOSTIC_OUTPUT_CLASSES.join(", ")}`);return contract}function estimateJsonDiagnosticTokens(value){return estimatePmOutputTokens(Buffer.byteLength(JSON.stringify(value,null,2),"utf8"))}function isDiagnosticRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function compactDiagnosticRecovery(value){if(!isDiagnosticRecord(value))return;const compact={};for(const key of["suggested_retry","suggested_retry_args","next_best_command","allowed_values","candidate_commands","missing","missing_required_fields","option_scope","retry_after_ms"]){const candidate=value[key];Array.isArray(candidate)?compact[key]=key==="suggested_retry_args"?candidate:candidate.slice(0,3):candidate!==void 0&&(compact[key]=candidate)}return Object.keys(compact).length>0?compact:void 0}function truncateDiagnosticString(value,maximum){return typeof value!="string"||value.length<=maximum?value:`${unicodeSafePrefix(value,Math.max(1,maximum-3))}...`}function truncateDiagnosticUtf8Text(value,maximumBytes){if(Buffer.byteLength(value,"utf8")<=maximumBytes)return value;const suffix="...",codePoints=Array.from(value);let lower=0,upper=codePoints.length;for(;lower<upper;){const middle=Math.ceil((lower+upper)/2),candidate=`${codePoints.slice(0,middle).join("")}${suffix}`;Buffer.byteLength(candidate,"utf8")<=maximumBytes?lower=middle:upper=middle-1}return`${codePoints.slice(0,lower).join("")}${suffix}`}function prioritizeDiagnosticFields(diagnostic){const prioritized={};for(const key of["code","required","recovery","next_steps","exit_code","type","title","detail","why","examples"])Object.hasOwn(diagnostic,key)&&diagnostic[key]!==void 0&&(prioritized[key]=diagnostic[key]);for(const[key,value]of Object.entries(diagnostic))key!=="__proto__"&&!Object.hasOwn(prioritized,key)&&(prioritized[key]=value);return prioritized}const DIAGNOSTIC_COLLECTION_LIMIT_STAGES=new Set(["limit_collections","compact_recovery","action_only"]),DIAGNOSTIC_RECOVERY_COMPACTION_STAGES=new Set(["compact_recovery","action_only"]);function actionOnlyDiagnostic(candidate){const actionOnly={code:typeof candidate.code=="string"?candidate.code:"diagnostic",required:truncateDiagnosticString(candidate.required,160)??"Inspect the diagnostic code and retry with corrected input."},recovery=compactDiagnosticRecovery(candidate.recovery);return recovery!==void 0?actionOnly.recovery=recovery:Array.isArray(candidate.next_steps)&&(actionOnly.next_steps=candidate.next_steps.slice(0,1)),candidate.exit_code!==void 0&&(actionOnly.exit_code=candidate.exit_code),candidate.type!==void 0&&(actionOnly.type=candidate.type),actionOnly}function diagnosticCandidate(diagnostic,stage){const candidate=structuredClone(diagnostic);if(stage!=="full"&&(delete candidate.why,delete candidate.examples),DIAGNOSTIC_COLLECTION_LIMIT_STAGES.has(stage))for(const[key,value]of Object.entries(candidate))Array.isArray(value)&&(candidate[key]=value.slice(0,3));if(DIAGNOSTIC_RECOVERY_COMPACTION_STAGES.has(stage)){const recovery=compactDiagnosticRecovery(candidate.recovery);recovery?candidate.recovery=recovery:delete candidate.recovery}return stage!=="action_only"?prioritizeDiagnosticFields(candidate):actionOnlyDiagnostic(candidate)}function attachDiagnosticReceipt(candidate,receipt){const projected={...candidate,diagnostic_output:{...receipt,estimated_tokens:0}};for(let attempt=0;attempt<4;attempt+=1){const estimatedTokens=estimateJsonDiagnosticTokens(projected),outputReceipt=projected.diagnostic_output;if(outputReceipt.estimated_tokens===estimatedTokens)break;outputReceipt.estimated_tokens=estimatedTokens}return projected}function shrinkMinimalDiagnosticCandidate(candidate,receipt,budget){let fallback=attachDiagnosticReceipt(candidate,receipt);for(const optionalField of["recovery","exit_code"])estimateJsonDiagnosticTokens(fallback)<=budget||candidate[optionalField]===void 0||(delete candidate[optionalField],fallback=attachDiagnosticReceipt(candidate,receipt));let maximumActionBytes=40;for(;estimateJsonDiagnosticTokens(fallback)>budget&&maximumActionBytes>4;)maximumActionBytes-=4,candidate.code=truncateDiagnosticUtf8Text(String(candidate.code),maximumActionBytes),candidate.required=truncateDiagnosticUtf8Text(String(candidate.required),maximumActionBytes),fallback=attachDiagnosticReceipt(candidate,receipt);return fallback}function createMinimalDiagnosticFallback(projected,budget){const receipt=projected.diagnostic_output,{estimated_tokens:_estimatedTokens,...receiptWithoutEstimate}=receipt,boundedOmittedFields=receiptWithoutEstimate.omitted_fields.slice(0,8).map(field=>truncateDiagnosticUtf8Text(field,32)),boundedReceipt={...receiptWithoutEstimate,omitted_fields:boundedOmittedFields,...receiptWithoutEstimate.omitted_fields.length>boundedOmittedFields.length?{omitted_fields_overflow_count:receiptWithoutEstimate.omitted_fields.length-boundedOmittedFields.length}:{}},recoveryCandidate=compactDiagnosticRecovery(projected.recovery),recovery=recoveryCandidate&&estimateJsonDiagnosticTokens(recoveryCandidate)<=48?recoveryCandidate:void 0,candidate={code:truncateDiagnosticUtf8Text(String(projected.code),320),required:truncateDiagnosticUtf8Text(String(projected.required),320),...recovery?{recovery}:{},...projected.exit_code!==void 0?{exit_code:projected.exit_code}:{}};let fallback=attachDiagnosticReceipt(candidate,boundedReceipt);for(;estimateJsonDiagnosticTokens(fallback)>budget&&boundedReceipt.omitted_fields.length>0;)boundedReceipt.omitted_fields.pop(),boundedReceipt.omitted_fields_overflow_count=receiptWithoutEstimate.omitted_fields.length-boundedReceipt.omitted_fields.length,fallback=attachDiagnosticReceipt(candidate,boundedReceipt);return fallback=shrinkMinimalDiagnosticCandidate(candidate,boundedReceipt,budget),fallback}function projectPmDiagnosticOutput(diagnostic,options={}){const diagnosticRecord=diagnostic,diagnosticClass=options.diagnosticClass??"error",contract=resolvePmDiagnosticOutputBudget(diagnosticClass),explicitBudget=options.maxEstimatedTokens;if(explicitBudget!==void 0&&(!Number.isSafeInteger(explicitBudget)||explicitBudget<contract.minimum_max_estimated_tokens))throw new RangeError(`maxEstimatedTokens must be a safe integer >= ${contract.minimum_max_estimated_tokens}`);const budget=explicitBudget??contract.default_max_estimated_tokens_by_format.json,originalEstimatedTokens=estimateJsonDiagnosticTokens(diagnosticRecord),originalFields=Object.keys(diagnosticRecord);if(originalEstimatedTokens<=budget)return prioritizeDiagnosticFields(structuredClone(diagnosticRecord));let projected;for(const[index,stage]of contract.degradation_ladder.entries()){const candidate=diagnosticCandidate(diagnosticRecord,stage),omittedFields=originalFields.filter(field=>!Object.hasOwn(candidate,field)),withReceipt=attachDiagnosticReceipt(candidate,{diagnostic_class:diagnosticClass,format:"json",budget,budget_source:explicitBudget===void 0?"default":"explicit",original_estimated_tokens:originalEstimatedTokens,truncated:index>0,degradation_steps:contract.degradation_ladder.slice(0,index+1),omitted_fields:omittedFields});if(projected=withReceipt,estimateJsonDiagnosticTokens(withReceipt)<=budget)break}return estimateJsonDiagnosticTokens(projected)>budget&&(projected=createMinimalDiagnosticFallback(projected,budget)),projected}function sanitizeDiagnosticText(text){return stripVTControlCharacters(text).replace(/\r\n/gu,`
|
|
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]="1a14ce9e-1074-5434-9646-dd5e25e34814")}catch{}})();import{stripVTControlCharacters}from"node:util";import{unicodeSafePrefix}from"../../core/shared/text-normalization.js";import{resolvePmHistoryOperation}from"./command-aliases.js";import{PM_CORE_COMMAND_NAMES}from"./enum-contracts.js";const PM_OUTPUT_DEGRADATION_STEPS=["full","compact","brief","summary","counts"],PM_OUTPUT_BUDGET_CLASSES=["mutation","read","discovery","governance"],PM_DIAGNOSTIC_OUTPUT_CLASSES=["error","warning","validation_summary","recovery_bundle"],PM_DIAGNOSTIC_DEGRADATION_STEPS=["full","omit_explanation","limit_collections","compact_recovery","action_only"],MUTATION_COMMANDS=new Set(["append","claim","close","close-many","close-task","comments","config","copy","create","delete","docs","event","files","focus","history-author-acknowledge","history-compact","history-redact","history-repair","init","item","learnings","meet","notes","pause-task","release","remind","restore","schema","start-task","update","update-many"]),DISCOVERY_COMMANDS=new Set(["contracts","extension","help","install","package","packages","profile","upgrade"]),GOVERNANCE_COMMANDS=new Set(["gc","health","merge","stats","telemetry","test","test-all","validate"]),DEFAULT_MAX_ESTIMATED_TOKENS={mutation:2e3,read:4e3,discovery:3e3,governance:6e3},JSON_BUDGET_NUMERATOR=3,JSON_BUDGET_DENOMINATOR=2,MINIMUM_DIAGNOSTIC_BUDGET=192,DIAGNOSTIC_DEFAULT_BUDGETS={error:{text:768,json:2e3},warning:{text:768,json:2e3},validation_summary:{text:1500,json:3e3},recovery_bundle:{text:768,json:2e3}},PM_DIAGNOSTIC_OUTPUT_BUDGET_CONTRACTS=PM_DIAGNOSTIC_OUTPUT_CLASSES.map(diagnosticClass=>({diagnostic_class:diagnosticClass,default_max_estimated_tokens_by_format:DIAGNOSTIC_DEFAULT_BUDGETS[diagnosticClass],minimum_max_estimated_tokens:MINIMUM_DIAGNOSTIC_BUDGET,degradation_ladder:PM_DIAGNOSTIC_DEGRADATION_STEPS,corrective_action_paths:["required","recovery.suggested_retry","recovery.suggested_retry_args","recovery.next_best_command","next_steps[0]"],token_estimate:"ceil(utf8_bytes / 4)"})),DIAGNOSTIC_BUDGET_BY_CLASS=new Map(PM_DIAGNOSTIC_OUTPUT_BUDGET_CONTRACTS.map(contract=>[contract.diagnostic_class,contract]));function inferPmOutputBudgetClass(command){const[rootCommand=""]=resolvePmHistoryOperation(command).split(/\s+/u);return MUTATION_COMMANDS.has(rootCommand)?"mutation":DISCOVERY_COMMANDS.has(rootCommand)?"discovery":GOVERNANCE_COMMANDS.has(rootCommand)?"governance":"read"}function createPmCommandOutputBudget(command,budgetClass=inferPmOutputBudgetClass(command)){const normalizedCommand=command.trim().replace(/\s+/gu," ");if(normalizedCommand.length===0)throw new TypeError("command must be a non-empty command path");const toonBudget=DEFAULT_MAX_ESTIMATED_TOKENS[budgetClass];return definePmCommandOutputBudget({command:normalizedCommand,budget_class:budgetClass,default_max_estimated_tokens:toonBudget,default_max_estimated_tokens_by_format:{toon:toonBudget,json:Math.ceil(toonBudget*JSON_BUDGET_NUMERATOR/JSON_BUDGET_DENOMINATOR)},degradation_ladder:PM_OUTPUT_DEGRADATION_STEPS,allows_unbounded_opt_out:!0,token_estimate:"ceil(utf8_bytes / 4)"})}function definePmCommandOutputBudget(contract){if(!Number.isSafeInteger(contract.default_max_estimated_tokens)||contract.default_max_estimated_tokens<=0)throw new RangeError("default_max_estimated_tokens must be a positive safe integer");for(const[format,ceiling]of Object.entries(contract.default_max_estimated_tokens_by_format))if(!Number.isSafeInteger(ceiling)||ceiling<=0)throw new RangeError(`default_max_estimated_tokens_by_format.${format} must be a positive safe integer`);return contract}const PM_COMMAND_OUTPUT_BUDGET_CONTRACTS=PM_CORE_COMMAND_NAMES.map(command=>createPmCommandOutputBudget(command)),OUTPUT_BUDGET_BY_COMMAND=new Map(PM_COMMAND_OUTPUT_BUDGET_CONTRACTS.map(contract=>[contract.command,contract]));function resolvePmCommandOutputBudget(command,options={}){const normalizedCommand=command.trim().replace(/\s+/gu," "),[rootCommand]=resolvePmHistoryOperation(normalizedCommand).split(" "),declared=OUTPUT_BUDGET_BY_COMMAND.get(rootCommand);return declared?{...declared,command:normalizedCommand}:options.generateFallback?createPmCommandOutputBudget(normalizedCommand):null}function estimatePmOutputTokens(utf8Bytes){return Math.ceil(Math.max(0,utf8Bytes)/4)}function resolvePmDiagnosticOutputBudget(diagnosticClass){const contract=DIAGNOSTIC_BUDGET_BY_CLASS.get(diagnosticClass);if(contract===void 0)throw new TypeError(`diagnosticClass must be one of: ${PM_DIAGNOSTIC_OUTPUT_CLASSES.join(", ")}`);return contract}function estimateJsonDiagnosticTokens(value){return estimatePmOutputTokens(Buffer.byteLength(JSON.stringify(value,null,2),"utf8"))}function isDiagnosticRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function compactDiagnosticRecovery(value){if(!isDiagnosticRecord(value))return;const compact={};for(const key of["suggested_retry","suggested_retry_args","next_best_command","allowed_values","candidate_commands","missing","missing_required_fields","option_scope","retry_after_ms","waited_ms","owner_handoffs"]){const candidate=value[key];Array.isArray(candidate)?compact[key]=key==="suggested_retry_args"?candidate:candidate.slice(0,3):candidate!==void 0&&(compact[key]=candidate)}return Object.keys(compact).length>0?compact:void 0}function truncateDiagnosticString(value,maximum){return typeof value!="string"||value.length<=maximum?value:`${unicodeSafePrefix(value,Math.max(1,maximum-3))}...`}function truncateDiagnosticUtf8Text(value,maximumBytes){if(Buffer.byteLength(value,"utf8")<=maximumBytes)return value;const suffix="...",codePoints=Array.from(value);let lower=0,upper=codePoints.length;for(;lower<upper;){const middle=Math.ceil((lower+upper)/2),candidate=`${codePoints.slice(0,middle).join("")}${suffix}`;Buffer.byteLength(candidate,"utf8")<=maximumBytes?lower=middle:upper=middle-1}return`${codePoints.slice(0,lower).join("")}${suffix}`}function prioritizeDiagnosticFields(diagnostic){const prioritized={};for(const key of["code","required","recovery","next_steps","exit_code","type","title","detail","why","examples"])Object.hasOwn(diagnostic,key)&&diagnostic[key]!==void 0&&(prioritized[key]=diagnostic[key]);for(const[key,value]of Object.entries(diagnostic))key!=="__proto__"&&!Object.hasOwn(prioritized,key)&&(prioritized[key]=value);return prioritized}const DIAGNOSTIC_COLLECTION_LIMIT_STAGES=new Set(["limit_collections","compact_recovery","action_only"]),DIAGNOSTIC_RECOVERY_COMPACTION_STAGES=new Set(["compact_recovery","action_only"]);function actionOnlyDiagnostic(candidate){const actionOnly={code:typeof candidate.code=="string"?candidate.code:"diagnostic",required:truncateDiagnosticString(candidate.required,160)??"Inspect the diagnostic code and retry with corrected input."},recovery=compactDiagnosticRecovery(candidate.recovery);return recovery!==void 0?actionOnly.recovery=recovery:Array.isArray(candidate.next_steps)&&(actionOnly.next_steps=candidate.next_steps.slice(0,1)),candidate.exit_code!==void 0&&(actionOnly.exit_code=candidate.exit_code),candidate.type!==void 0&&(actionOnly.type=candidate.type),actionOnly}function diagnosticCandidate(diagnostic,stage){const candidate=structuredClone(diagnostic);if(stage!=="full"&&(delete candidate.why,delete candidate.examples),DIAGNOSTIC_COLLECTION_LIMIT_STAGES.has(stage))for(const[key,value]of Object.entries(candidate))Array.isArray(value)&&(candidate[key]=value.slice(0,3));if(DIAGNOSTIC_RECOVERY_COMPACTION_STAGES.has(stage)){const recovery=compactDiagnosticRecovery(candidate.recovery);recovery?candidate.recovery=recovery:delete candidate.recovery}return stage!=="action_only"?prioritizeDiagnosticFields(candidate):actionOnlyDiagnostic(candidate)}function attachDiagnosticReceipt(candidate,receipt){const projected={...candidate,diagnostic_output:{...receipt,estimated_tokens:0}};for(let attempt=0;attempt<4;attempt+=1){const estimatedTokens=estimateJsonDiagnosticTokens(projected),outputReceipt=projected.diagnostic_output;if(outputReceipt.estimated_tokens===estimatedTokens)break;outputReceipt.estimated_tokens=estimatedTokens}return projected}function shrinkMinimalDiagnosticCandidate(candidate,receipt,budget){let fallback=attachDiagnosticReceipt(candidate,receipt);for(const optionalField of["recovery","exit_code"])estimateJsonDiagnosticTokens(fallback)<=budget||candidate[optionalField]===void 0||(delete candidate[optionalField],fallback=attachDiagnosticReceipt(candidate,receipt));let maximumActionBytes=40;for(;estimateJsonDiagnosticTokens(fallback)>budget&&maximumActionBytes>4;)maximumActionBytes-=4,candidate.code=truncateDiagnosticUtf8Text(String(candidate.code),maximumActionBytes),candidate.required=truncateDiagnosticUtf8Text(String(candidate.required),maximumActionBytes),fallback=attachDiagnosticReceipt(candidate,receipt);return fallback}function createMinimalDiagnosticFallback(projected,budget){const receipt=projected.diagnostic_output,{estimated_tokens:_estimatedTokens,...receiptWithoutEstimate}=receipt,boundedOmittedFields=receiptWithoutEstimate.omitted_fields.slice(0,8).map(field=>truncateDiagnosticUtf8Text(field,32)),boundedReceipt={...receiptWithoutEstimate,omitted_fields:boundedOmittedFields,...receiptWithoutEstimate.omitted_fields.length>boundedOmittedFields.length?{omitted_fields_overflow_count:receiptWithoutEstimate.omitted_fields.length-boundedOmittedFields.length}:{}},recoveryCandidate=compactDiagnosticRecovery(projected.recovery),recovery=recoveryCandidate&&estimateJsonDiagnosticTokens(recoveryCandidate)<=48?recoveryCandidate:void 0,candidate={code:truncateDiagnosticUtf8Text(String(projected.code),320),required:truncateDiagnosticUtf8Text(String(projected.required),320),...recovery?{recovery}:{},...projected.exit_code!==void 0?{exit_code:projected.exit_code}:{}};let fallback=attachDiagnosticReceipt(candidate,boundedReceipt);for(;estimateJsonDiagnosticTokens(fallback)>budget&&boundedReceipt.omitted_fields.length>0;)boundedReceipt.omitted_fields.pop(),boundedReceipt.omitted_fields_overflow_count=receiptWithoutEstimate.omitted_fields.length-boundedReceipt.omitted_fields.length,fallback=attachDiagnosticReceipt(candidate,boundedReceipt);return fallback=shrinkMinimalDiagnosticCandidate(candidate,boundedReceipt,budget),fallback}function projectPmDiagnosticOutput(diagnostic,options={}){const diagnosticRecord=diagnostic,diagnosticClass=options.diagnosticClass??"error",contract=resolvePmDiagnosticOutputBudget(diagnosticClass),explicitBudget=options.maxEstimatedTokens;if(explicitBudget!==void 0&&(!Number.isSafeInteger(explicitBudget)||explicitBudget<contract.minimum_max_estimated_tokens))throw new RangeError(`maxEstimatedTokens must be a safe integer >= ${contract.minimum_max_estimated_tokens}`);const budget=explicitBudget??contract.default_max_estimated_tokens_by_format.json,originalEstimatedTokens=estimateJsonDiagnosticTokens(diagnosticRecord),originalFields=Object.keys(diagnosticRecord);if(originalEstimatedTokens<=budget)return prioritizeDiagnosticFields(structuredClone(diagnosticRecord));let projected;for(const[index,stage]of contract.degradation_ladder.entries()){const candidate=diagnosticCandidate(diagnosticRecord,stage),omittedFields=originalFields.filter(field=>!Object.hasOwn(candidate,field)),withReceipt=attachDiagnosticReceipt(candidate,{diagnostic_class:diagnosticClass,format:"json",budget,budget_source:explicitBudget===void 0?"default":"explicit",original_estimated_tokens:originalEstimatedTokens,truncated:index>0,degradation_steps:contract.degradation_ladder.slice(0,index+1),omitted_fields:omittedFields});if(projected=withReceipt,estimateJsonDiagnosticTokens(withReceipt)<=budget)break}return estimateJsonDiagnosticTokens(projected)>budget&&(projected=createMinimalDiagnosticFallback(projected,budget)),projected}function sanitizeDiagnosticText(text){return stripVTControlCharacters(text).replace(/\r\n/gu,`
|
|
2
2
|
`).replace(/[^\P{Cc}\n]/gu," ")}function projectPmDiagnosticText(output,correctiveAction,options={}){const diagnosticClass=options.diagnosticClass??"error",contract=resolvePmDiagnosticOutputBudget(diagnosticClass),explicitBudget=options.maxEstimatedTokens;if(explicitBudget!==void 0&&(!Number.isSafeInteger(explicitBudget)||explicitBudget<contract.minimum_max_estimated_tokens))throw new RangeError(`maxEstimatedTokens must be a safe integer >= ${contract.minimum_max_estimated_tokens}`);const budget=explicitBudget??contract.default_max_estimated_tokens_by_format.text,sanitizedOutput=sanitizeDiagnosticText(output),originalEstimatedTokens=estimatePmOutputTokens(Buffer.byteLength(sanitizedOutput,"utf8")),truncated=originalEstimatedTokens>budget,actionPrefix=`What is required:
|
|
3
3
|
`,actionSuffix=`
|
|
4
4
|
|
|
@@ -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]="e69bd52d-7844-5de6-ade5-c4c3a6713df2")}catch{}})();import{resolvePmCommandAlias,PM_HISTORY_COMMAND_ALIASES,PM_RELOCATED_COMMAND_ALIASES,resolvePmHistoryOperation}from"./command-aliases.js";const PM_CLI_GRAMMAR_NOUNS=["item","list","context","search","graph","history","workspace","package","ops","plan","contracts","help"],PM_CLI_SHARED_VERBS=["acknowledge","activate","add","adopt","adopt-all","catalog","compact","complete","create","deactivate","delete","describe","doctor","edit","explore","import","init","inspect","install","list","manage","migrate","mutate","read","redact","reload","remove","reopen","repair","restore","run","show","uninstall","upgrade","verify"];function positionalSlot(name,valueKind,required,options={}){return{name,required,variadic:options.variadic===!0,value_kind:valueKind,polymorphic:options.polymorphic===!0}}function positionalActionVerb(action){const phrase=action.replaceAll("-"," ");return`${phrase.charAt(0).toUpperCase()}${phrase.slice(1)}`}const ITEM_ID=positionalSlot("id","item_id",!0),OPTIONAL_ITEM_ID=positionalSlot("id","item_id",!1),OPTIONAL_TEXT=positionalSlot("text","string",!1),PLAN_ITEM_ID=positionalSlot("plan-id","item_id",!0),PLAN_STEP=positionalSlot("step","string",!0),PLAN_CREATE_FLAGS=["--acceptance-criteria","--actual-result","--affected-version","--assignee","--blocked-by","--blocked-reason","--blocks","--body","--claim","--comment","--component","--confidence","--create-mode","--customer-impact","--deadline","--definition-of-ready","--description","--doc","--environment","--estimate","--event","--expected-result","--fixed-version","--file","--from-search","--goal","--harness","--impact","--learning","--message","--mode","--note","--objective","--order","--outcome","--parent","--priority","--rank","--related","--release","--reminder","--reporter","--repro-steps","--resolution","--resume-context","--reviewer","--risk","--scope","--severity","--sprint","--status","--step","--step-blocked-reason","--step-body","--step-evidence","--step-owner","--step-replacement","--step-status","--step-title","--tags","--template","--test","--title","--type-option","--unblock-note","--value","--why-now"],PLAN_STEP_FLAGS=["--allow-multiple-active","--depends-on","--file","--force","--message","--step-blocked-reason","--step-body","--step-evidence","--step-owner","--step-status","--step-title","--test"],PLAN_STEP_ACTION_DESCRIPTIONS={"update-step":"Update one declared Plan step.","complete-step":"Complete one declared Plan step.","block-step":"Block one declared Plan step.","remove-step":"Remove one declared Plan step.",link:"Link one dependency to a declared Plan step.",unlink:"Unlink one dependency from a declared Plan step."},PM_POSITIONAL_ACTION_CONTRACTS=[{command:"plan create",parent:"plan",action:"create",slots:[positionalSlot("title","string",!1,{polymorphic:!0})],accepted_flags:PLAN_CREATE_FLAGS,description:"Create a Plan item and optionally seed its ordered steps.",example:'pm plan create --title "Refactor lock retry"'},{command:"plan show",parent:"plan",action:"show",slots:[PLAN_ITEM_ID],accepted_flags:["--depth","--fields"],description:"Read one Plan item with a bounded plan projection.",example:"pm plan show pm-a1b2 --depth standard"},{command:"plan add-step",parent:"plan",action:"add-step",slots:[PLAN_ITEM_ID],accepted_flags:PLAN_STEP_FLAGS,description:"Append one ordered step to a Plan item.",example:'pm plan add-step pm-a1b2 --step-title "Run tests"'},...Object.entries(PLAN_STEP_ACTION_DESCRIPTIONS).map(([action,description])=>({command:`plan ${action}`,parent:"plan",action,slots:[PLAN_ITEM_ID,PLAN_STEP],accepted_flags:PLAN_STEP_FLAGS,description,example:`pm plan ${action} pm-a1b2 plan-step-001`})),{command:"plan reorder-step",parent:"plan",action:"reorder-step",slots:[PLAN_ITEM_ID,PLAN_STEP,positionalSlot("new-order","integer",!0)],accepted_flags:["--force","--message"],description:"Move one Plan step to a declared integer order.",example:"pm plan reorder-step pm-a1b2 plan-step-001 2"},...["decision","discovery","validation","resume","approve","materialize"].map(action=>({command:`plan ${action}`,parent:"plan",action,slots:[PLAN_ITEM_ID],accepted_flags:PLAN_STEP_FLAGS,description:`${positionalActionVerb(action)} for one Plan item.`,example:`pm plan ${action} pm-a1b2`})),...["list","show","put","remove"].map(action=>({command:`assurance ${action}`,parent:"assurance",action,slots:[positionalSlot("kind","string",!0),...action==="list"?[]:[positionalSlot("id","string",!0)]],accepted_flags:action==="put"?["--author","--definition","--message"]:action==="remove"?["--author","--message"]:[],description:`${positionalActionVerb(action)} assurance declarations by kind.`,example:action==="list"?"pm assurance list measurement":`pm assurance ${action} measurement example-id`})),{command:"assurance run",parent:"assurance",action:"run",slots:[positionalSlot("gate-id","string",!0)],accepted_flags:["--dry-run","--trigger","--tree"],description:"Evaluate one assurance gate for a lifecycle trigger.",example:"pm assurance run tracker-context-quality --trigger ci --dry-run"},{command:"assurance verdicts",parent:"assurance",action:"verdicts",slots:[positionalSlot("gate-id","string",!1)],accepted_flags:["--gate","--limit"],description:"List bounded assurance verdict history.",example:"pm assurance verdicts --limit 20"},...["presets","apply"].map(action=>({command:`assurance ${action}`,parent:"assurance",action,slots:[positionalSlot("preset","string",action==="apply")],accepted_flags:["--author","--message","--owner"],description:action==="apply"?"Apply one assurance adoption preset.":"List available assurance adoption presets.",example:action==="apply"?"pm assurance apply software-delivery --owner <pm-item-id>":"pm assurance presets"})),{command:"assurance derive",parent:"assurance",action:"derive",slots:[],accepted_flags:["--apply","--author","--message","--owner"],description:"Derive assurance proposals from current project context.",example:"pm assurance derive --owner pm-a1b2"},{command:"assurance promote",parent:"assurance",action:"promote",slots:[positionalSlot("assertion-id","string",!0)],accepted_flags:["--author","--enforcement","--message"],description:"Promote one assertion into a warning or blocking gate.",example:"pm assurance promote assertion-id --enforcement warn"},{command:"assurance risk",parent:"assurance",action:"risk",slots:[],accepted_flags:["--definition"],description:"Analyze bounded defect-recurrence risk for a proposed change.",example:`pm assurance risk --definition '{"policy":{"version":1,"evidence_epoch":"2026-01-01T00:00:00.000Z","families":[]},"change":{"files":[]}}'`},{command:"assurance lineages",parent:"assurance",action:"lineages",slots:[],accepted_flags:["--definition"],description:"Measure all recorded recurrence lineages with bounded evidence rows.",example:`pm assurance lineages --definition '{"policy":{"version":1,"evidence_epoch":"2026-01-01T00:00:00.000Z","families":[]}}'`},{command:"workspace position",parent:"workspace",action:"position",slots:[],accepted_flags:[],description:"Read bounded merge-fence, receipt, history-drift, and next-action readiness.",example:"pm workspace position"},{command:"workspace snapshot create",parent:"workspace snapshot",action:"create",slots:[positionalSlot("name","string",!1)],accepted_flags:[],description:"Capture authoritative tracker state as an immutable snapshot.",example:"pm workspace snapshot create before-migration"},{command:"workspace snapshot list",parent:"workspace snapshot",action:"list",slots:[],accepted_flags:[],description:"List immutable workspace snapshots and named references.",example:"pm workspace snapshot list"},{command:"workspace snapshot inspect",parent:"workspace snapshot",action:"inspect",slots:[positionalSlot("target","string",!0)],accepted_flags:[],description:"Inspect one workspace snapshot target.",example:"pm workspace snapshot inspect before-migration"},{command:"workspace snapshot restore",parent:"workspace snapshot",action:"restore",slots:[positionalSlot("target","string",!0)],accepted_flags:["--author","--dry-run","--force","--message"],description:"Restore an immutable workspace snapshot with explicit recovery controls.",example:"pm workspace snapshot restore before-migration --dry-run"},{command:"workspace snapshot delete",parent:"workspace snapshot",action:"delete",slots:[positionalSlot("target","string",!0)],accepted_flags:[],description:"Delete one workspace snapshot target.",example:"pm workspace snapshot delete before-migration"}],POSITIONAL_ACTION_CONTRACTS_BY_SPECIFICITY=[...PM_POSITIONAL_ACTION_CONTRACTS].sort((left,right)=>right.command.length-left.command.length),EXPLICIT_POSITIONAL_SLOTS=new Map([["append",[ITEM_ID,OPTIONAL_TEXT]],["assurance",[positionalSlot("action","action",!0),positionalSlot("kind","string",!1),positionalSlot("id","string",!1)]],["beads import",[positionalSlot("file","string",!1)]],["cal",[positionalSlot("view","string",!1,{polymorphic:!0})]],["calendar",[positionalSlot("view","string",!1,{polymorphic:!0})]],["changelog export",[positionalSlot("file","string",!1)]],["claim",[OPTIONAL_ITEM_ID]],["close",[ITEM_ID,OPTIONAL_TEXT]],["close-task",[ITEM_ID,positionalSlot("reason","string",!1)]],["comments",[ITEM_ID,OPTIONAL_TEXT]],["completion",[positionalSlot("shell","string",!1)]],["config",[positionalSlot("scope","string",!1,{polymorphic:!0}),positionalSlot("action","action",!1),positionalSlot("key","string",!1),positionalSlot("value","string",!1,{polymorphic:!0})]],["copy",[ITEM_ID]],["create",[positionalSlot("type-or-title","string",!1,{polymorphic:!0}),positionalSlot("title","string",!1)]],["delete",[ITEM_ID]],["deps",[ITEM_ID]],["docs",[ITEM_ID]],["event",[positionalSlot("title","string",!0)]],["files",[ITEM_ID]],["files discover",[ITEM_ID]],["files lookup",[positionalSlot("paths","string",!0,{variadic:!0})]],["focus",[OPTIONAL_ITEM_ID]],["get",[ITEM_ID]],["graph",[positionalSlot("subcommand","action",!0),OPTIONAL_ITEM_ID,positionalSlot("target","item_id",!1)]],["guide",[positionalSlot("topic","string",!1)]],["history",[ITEM_ID]],["history-compact",[OPTIONAL_ITEM_ID]],["history-redact",[ITEM_ID]],["history-repair",[OPTIONAL_ITEM_ID]],["init",[positionalSlot("prefix-or-path","string",!1,{polymorphic:!0})]],["item complete",[ITEM_ID,positionalSlot("reason","string",!1)]],["item reopen",[ITEM_ID,positionalSlot("reason","string",!0)]],["learnings",[ITEM_ID,OPTIONAL_TEXT]],["meet",[positionalSlot("title","string",!0)]],["merge",[positionalSlot("subcommand","action",!0),positionalSlot("artifact","string",!1),positionalSlot("base","string",!1),positionalSlot("ours","string",!1),positionalSlot("theirs","string",!1)]],["notes",[ITEM_ID,OPTIONAL_TEXT]],["package",[positionalSlot("target","string",!1,{polymorphic:!0})]],["package list",[]],["package inventory",[positionalSlot("name","string",!1)]],["package scaffold",[positionalSlot("target","string",!0)]],["package upgrade",[positionalSlot("target","string",!1)]],["packages",[positionalSlot("target","string",!1,{polymorphic:!0})]],["packages list",[]],["packages inventory",[positionalSlot("name","string",!1)]],["packages scaffold",[positionalSlot("target","string",!0)]],["packages upgrade",[positionalSlot("target","string",!1)]],["pause-task",[ITEM_ID]],["plan",[positionalSlot("subcommand","action",!0),positionalSlot("id","item_id",!1,{polymorphic:!0}),positionalSlot("step","string",!1),positionalSlot("new-order","integer",!1)]],["profile",[positionalSlot("subcommand","action",!0),positionalSlot("name","string",!1)]],["release",[ITEM_ID]],["remind",[positionalSlot("title","string",!0)]],["restore",[ITEM_ID,positionalSlot("target","string",!0)]],["schema",[positionalSlot("subcommand","action",!0),positionalSlot("name","string",!1)]],["search-advanced",[positionalSlot("keywords","string",!0,{variadic:!0})]],["search",[positionalSlot("keywords","string",!0,{variadic:!0})]],["start-task",[ITEM_ID]],["templates save",[positionalSlot("name","string",!0)]],["templates show",[positionalSlot("name","string",!0)]],["telemetry",[positionalSlot("namespace-or-subcommand","action",!1,{polymorphic:!0}),positionalSlot("subcommand","action",!1)]],["test",[ITEM_ID]],["test-runs-worker",[positionalSlot("runId","string",!0)]],["update",[ITEM_ID]],["workspace snapshot",[positionalSlot("action","action",!0),positionalSlot("target","string",!1)]],...["activate","adopt","deactivate","init","uninstall"].flatMap(action=>["extension","package","packages"].map(root=>[`${root} ${action}`,[positionalSlot("target","string",!0)]])),...["describe"].flatMap(action=>["extension","package","packages"].map(root=>[`${root} ${action}`,[positionalSlot("target","string",!1)]])),...["install"].flatMap(action=>["extension","package","packages"].map(root=>[`${root} ${action}`,[positionalSlot("targets","string",!1,{variadic:!0})]])),["vcs abandon",[ITEM_ID]],["vcs create",[positionalSlot("title","string",!0)]],["vcs merge",[ITEM_ID]],["vcs propose",[ITEM_ID]],["vcs ref-create",[positionalSlot("name","string",!0)]],["vcs show",[ITEM_ID]]]);function normalizePositionalCommandPath(command){return command.trim().toLowerCase().replace(/\s+/gu," ")}function resolvePmCommandPositionalContract(command){const normalized=normalizePositionalCommandPath(command),direct=PM_COMMAND_POSITIONAL_CONTRACTS.find(contract=>contract.command===normalized);if(direct)return direct;const canonical=resolvePmCommandAlias(normalized)?.canonical;if(canonical)return PM_COMMAND_POSITIONAL_CONTRACTS.find(contract=>contract.command===canonical)}function resolvePmPositionalActionContract(command){const normalized=normalizePositionalCommandPath(command);return POSITIONAL_ACTION_CONTRACTS_BY_SPECIFICITY.find(contract=>contract.command===normalized||normalized.startsWith(`${contract.command} `))}function formatPmPositionalActionFlagTip(acceptedFlags){return`Applicable flags: ${acceptedFlags.length>0?acceptedFlags.join(", "):"none"}.`}function destinationRows(noun,target,disposition,owner,commands){return commands.map(command=>({command,noun,target,disposition,owner}))}const PM_COMMAND_DESTINATION_CONTRACTS=[...destinationRows("item","item","target_noun","pm-pbyu",["item","item complete","item mutate","item reopen"]),...destinationRows("item","item","consolidation","pm-yql1",["append","close-many","close-task","comments","copy","delete","deps","docs","files","learnings","notes","pause-task","start-task","test","update-many"]),...["claim","close","create","get","release","update"].map(command=>({command,noun:"item",target:command,disposition:"keep_as_is",owner:"pm-pbyu",reason:"Permanent high-frequency item operations retain concise root spellings under the accepted hot-path grammar policy."})),...destinationRows("item","item files","target_noun","pm-yql1",["files discover","files lookup","item files discover","item files lookup"]),...destinationRows("item","item test worker","consolidation","pm-lp4j",["test-runs-worker"]),...destinationRows("list","list","target_noun","pm-pfqi",["list"]),...destinationRows("list","list --group-by","consolidation","pm-xkgq",["aggregate"]),...destinationRows("context","context","target_noun","pm-pbyu",["context"]),...destinationRows("context","context","consolidation","pm-kcs4",["ctx","focus","next"]),...destinationRows("context","context next","consolidation","pm-kcs4",["ctx next"]),...destinationRows("context","context focus","consolidation","pm-kcs4",["ctx focus"]),...destinationRows("search","search","target_noun","pm-pbyu",["search"]),...destinationRows("search","search","package_owned","package:search-advanced",["reindex","search-advanced"]),...destinationRows("item","item duplicates","consolidation","pm-fmy9ih",["duplicates"]),...destinationRows("item","item duplicates","package_owned","pm-fmy9ih",["dedupe-audit","dedupe-merge","comments-audit"]),...destinationRows("graph","graph","target_noun","pm-pbyu",["graph"]),...destinationRows("history","history","target_noun","pm-pbyu",["history"]),...destinationRows("history","history attest","target_noun","pm-3z0k",["history attest"]),...destinationRows("history","history attest","consolidation","pm-3z0k",["history-attest"]),...PM_HISTORY_COMMAND_ALIASES.flatMap(({alias,canonical})=>[...destinationRows("history",canonical,"target_noun","pm-tqel",[canonical]),...destinationRows("history",canonical,"consolidation","pm-tqel",[alias])]),...destinationRows("history","history","consolidation","pm-tqel",["events","merge"]),...destinationRows("history","history acknowledge","consolidation","pm-djyvbk",["history-author-acknowledge"]),...destinationRows("history","history","package_owned","package:builtin-vcs-exemplar",["vcs abandon","vcs create","vcs log","vcs merge","vcs propose","vcs ref-create","vcs show"]),...destinationRows("workspace","workspace","target_noun","pm-pbyu",["workspace","workspace position","workspace snapshot","workspace snapshot create","workspace snapshot delete","workspace snapshot inspect","workspace snapshot list","workspace snapshot restore"]),...destinationRows("workspace","workspace init","consolidation","pm-npr3",["init"]),...destinationRows("package","package","target_noun","pm-pbyu",["package","package activate","package adopt","package adopt-all","package catalog","package deactivate","package describe","package doctor","package explore","package init","package install","package inventory","package list","package manage","package migrate","package reload","package scaffold","package uninstall","package upgrade"]),...destinationRows("package","package","consolidation","pm-tnud",["extension activate","extension adopt","extension adopt-all","extension catalog","extension deactivate","extension describe","extension doctor","extension explore","extension init","extension install","extension manage","extension migrate","extension reload","extension uninstall","packages","packages activate","packages adopt","packages adopt-all","packages catalog","packages deactivate","packages describe","packages doctor","packages explore","packages init","packages install","packages inventory","packages list","packages manage","packages migrate","packages reload","packages scaffold","packages uninstall","packages upgrade"]),...destinationRows("package","package","package_owned","package:beads",["beads import"]),...destinationRows("package","package","package_owned","package:pm-changelog",["changelog export","changelog generate"]),...destinationRows("package","package calendar","package_owned","pm-o3fh",["cal","calendar","event","meet","remind"]),...destinationRows("ops","ops","target_noun","pm-6apl",["ops"]),...destinationRows("ops","ops normalize","package_owned","package:pm-governance-audit",["normalize"]),...destinationRows("ops","ops","consolidation","pm-6apl",["eval","gc","health","stats","telemetry","test-all","validate"]),...destinationRows("workspace","workspace","consolidation","pm-npr3",["config","profile","schema"]),...["assurance",...PM_POSITIONAL_ACTION_CONTRACTS.filter(({parent})=>parent==="assurance").map(({command})=>command)].map(command=>({command,noun:"ops",target:command,disposition:"keep_as_is",owner:"pm-djyvbk",reason:"Assurance manages durable measurement, assertion, gate, and verdict data; retain its established domain surface independently of operational diagnostics."})),...destinationRows("plan","plan","target_noun","pm-pbyu",["plan"]),...destinationRows("plan","plan","target_noun","pm-2tan",PM_POSITIONAL_ACTION_CONTRACTS.filter(({parent})=>parent==="plan").map(({command})=>command)),...destinationRows("contracts","contracts","target_noun","pm-pbyu",["contracts"]),...destinationRows("help","help","target_noun","pm-pbyu",["help"]),...destinationRows("workspace","templates","package_owned","package:builtin-templates",["templates","templates list","templates save","templates show"]),...destinationRows("help","help","package_owned","package:builtin-guide-shell",["completion","completion-statuses","completion-tags","completion-types","guide"])].flatMap(entry=>{const alias=PM_RELOCATED_COMMAND_ALIASES.find(candidate=>candidate.alias===entry.command);if(!alias)return[entry];const noun=PM_CLI_GRAMMAR_NOUNS.find(candidate=>candidate===alias.canonical_argv[0])??entry.noun;return[{...entry,noun,target:alias.canonical,owner:alias.owner},{...entry,command:alias.canonical,noun,target:alias.canonical,owner:alias.owner,disposition:entry.disposition==="package_owned"?"package_owned":"target_noun"}]}),PM_COMMAND_POSITIONAL_CONTRACTS=[...new Set(PM_COMMAND_DESTINATION_CONTRACTS.map(({command})=>command))].map(command=>({command,slots:resolvePmPositionalActionContract(command)?.slots??EXPLICIT_POSITIONAL_SLOTS.get(resolvePmHistoryOperation(command))??[]})),PM_CLI_GRAMMAR_CONTRACT={nouns:PM_CLI_GRAMMAR_NOUNS,shared_verbs:PM_CLI_SHARED_VERBS,scope_before_verb:!0,visible_top_level_ceiling:69,ceiling_raise_requires_pm_item:!0,positional_shape_budget:21};function verifyExplicitPositionalSlotCensus(explicitCommands,destinationCommands){const destinations=new Set(destinationCommands);return[...new Set(explicitCommands)].filter(command=>!destinations.has(command)).map(command=>({code:"positional_signature_mismatch",command,detail:`Positional signature ${command} has no destination declaration.`}))}function positionalShapeKey(slots){return slots.map(({required,variadic,value_kind:valueKind,polymorphic})=>`${required?"r":"o"}:${variadic?"v":"s"}:${valueKind}:${polymorphic?"p":"m"}`).join("|")}function positionalSignatureKey(slots){return slots.map(({name,required,variadic,value_kind:valueKind,polymorphic})=>`${name}:${required?"r":"o"}:${variadic?"v":"s"}:${valueKind}:${polymorphic?"p":"m"}`).join("|")}function duplicatePositionalSignatureFindings(contracts,surface){const counts=new Map;for(const{command}of contracts){const normalized=normalizePositionalCommandPath(command);counts.set(normalized,(counts.get(normalized)??0)+1)}return[...counts.entries()].filter(([,count])=>count>1).map(([command,count])=>({code:"positional_signature_mismatch",command,detail:`${count} ${surface} positional signatures exist for ${command}; exactly one is required.`}))}function verifyPmCommandPositionalContracts(observed,options={}){const declared=options.declared??PM_COMMAND_POSITIONAL_CONTRACTS,positionalShapeBudget=options.positionalShapeBudget??PM_CLI_GRAMMAR_CONTRACT.positional_shape_budget,declaredByCommand=new Map(declared.map(contract=>[normalizePositionalCommandPath(contract.command),contract])),observedByCommand=new Map(observed.map(contract=>[normalizePositionalCommandPath(contract.command),contract])),findings=[...duplicatePositionalSignatureFindings(declared,"declared"),...duplicatePositionalSignatureFindings(observed,"observed"),...options.declared===void 0?[...verifyExplicitPositionalSlotCensus(EXPLICIT_POSITIONAL_SLOTS.keys(),PM_COMMAND_DESTINATION_CONTRACTS.map(({command})=>command)),...verifyExplicitPositionalSlotCensus(PM_POSITIONAL_ACTION_CONTRACTS.map(({command})=>command),PM_COMMAND_DESTINATION_CONTRACTS.map(({command})=>command))]:[]];for(const contract of declaredByCommand.values()){const normalizedCommand=normalizePositionalCommandPath(contract.command),actual=observedByCommand.get(normalizedCommand);actual?positionalSignatureKey(actual.slots)!==positionalSignatureKey(contract.slots)&&findings.push({code:"positional_signature_mismatch",command:contract.command,detail:`Observed positional signature for ${contract.command} differs from its declared SDK contract: observed=${positionalSignatureKey(actual.slots)||"<none>"}; declared=${positionalSignatureKey(contract.slots)||"<none>"}.`}):findings.push({code:"missing_observed_signature",command:contract.command,detail:`No observed positional signature exists for ${contract.command}.`})}for(const contract of observedByCommand.values())declaredByCommand.has(normalizePositionalCommandPath(contract.command))||findings.push({code:"stale_observed_signature",command:contract.command,detail:`Observed positional signature ${contract.command} has no declaration.`});const positionalShapeCount=new Set(declared.map(({slots})=>positionalShapeKey(slots))).size;return positionalShapeCount>positionalShapeBudget&&findings.push({code:"positional_shape_budget_exceeded",command:"*",detail:`Distinct positional shape count ${positionalShapeCount} exceeds budget ${positionalShapeBudget}.`}),findings.sort((left,right)=>left.command!==right.command?left.command.localeCompare(right.command):left.code.localeCompare(right.code)),{ok:findings.length===0,declared_command_count:declared.length,observed_command_count:observed.length,positional_shape_count:positionalShapeCount,positional_shape_budget:positionalShapeBudget,findings}}function validateCommandDestinations(commands,destinationsByCommand,nounSet){return commands.flatMap(command=>{const destinations=destinationsByCommand.get(command)??[];if(destinations.length===0){const separatorIndex=command.indexOf(" "),root=separatorIndex===-1?command:command.slice(0,separatorIndex);return[{code:"missing_destination",spelling:command,message:`Command \`${command}\` has no destination census row.`,nearest_target:nounSet.has(root)?root:`ops ${command}`}]}const duplicateFinding=destinations.length>1?[{code:"duplicate_destination",spelling:command,message:`Command \`${command}\` has ${destinations.length} destination rows.`,nearest_target:destinations[0].target}]:[];return destinations.reduce((findings,destination)=>(destination.disposition==="keep_as_is"&&(destination.reason?.trim().length??0)===0&&findings.push({code:"missing_destination",spelling:command,message:`Command \`${command}\` is kept as-is without a documented reason.`,nearest_target:destination.target}),nounSet.has(destination.noun)||findings.push({code:"unknown_noun",spelling:command,message:`Command \`${command}\` names undeclared noun \`${destination.noun}\`.`,nearest_target:destination.target}),findings),duplicateFinding)})}function validateDestinationCensus(commandSet,destinations){return destinations.filter(destination=>destination.disposition!=="package_owned"&&!commandSet.has(destination.command)).map(destination=>({code:"stale_destination",spelling:destination.command,message:`Destination row \`${destination.command}\` is absent from live contracts.`,nearest_target:destination.target}))}function validateAliasTargets(aliases,commandSet){return aliases.filter(alias=>!commandSet.has(alias.canonical)).map(alias=>({code:"alias_target_missing",spelling:alias.alias,message:`Alias \`${alias.alias}\` targets missing canonical command \`${alias.canonical}\`.`,nearest_target:alias.canonical_argv.join(" ")}))}function verifyPmCliGrammar(commands,aliases=[],destinations=PM_COMMAND_DESTINATION_CONTRACTS){const normalizedCommands=[...new Set(commands.map(command=>command.trim()))].filter(command=>command.length>0).sort((left,right)=>left.localeCompare(right)),commandSet=new Set(normalizedCommands),nounSet=new Set(PM_CLI_GRAMMAR_NOUNS),destinationsByCommand=new Map;for(const destination of destinations){const entries=destinationsByCommand.get(destination.command)??[];entries.push(destination),destinationsByCommand.set(destination.command,entries)}const findings=[...validateCommandDestinations(normalizedCommands,destinationsByCommand,nounSet),...validateDestinationCensus(commandSet,destinations),...validateAliasTargets(aliases.filter(alias=>commandSet.has(alias.alias)||!(destinationsByCommand.get(alias.canonical)??[]).some(destination=>destination.disposition==="package_owned")),commandSet)],hiddenAliasNames=new Set(aliases.filter(alias=>alias.hidden).map(alias=>alias.alias)),visibleTopLevelCount=new Set(normalizedCommands.filter(command=>!command.includes(" ")&&!hiddenAliasNames.has(command)&&!(destinationsByCommand.get(command)??[]).some(destination=>destination.disposition==="package_owned"))).size;return visibleTopLevelCount>PM_CLI_GRAMMAR_CONTRACT.visible_top_level_ceiling&&findings.push({code:"visible_surface_ceiling_exceeded",spelling:String(visibleTopLevelCount),message:`Visible non-package top-level command count ${visibleTopLevelCount} exceeds ceiling ${PM_CLI_GRAMMAR_CONTRACT.visible_top_level_ceiling}.`,nearest_target:"Declare the noun placement and tracked waiver before raising the ceiling."}),{ok:findings.length===0,command_count:normalizedCommands.length,destination_count:destinations.length,hidden_alias_count:aliases.filter(alias=>alias.hidden).length,visible_top_level_count:visibleTopLevelCount,visible_top_level_ceiling:PM_CLI_GRAMMAR_CONTRACT.visible_top_level_ceiling,findings}}export{PM_CLI_GRAMMAR_CONTRACT,PM_CLI_GRAMMAR_NOUNS,PM_CLI_SHARED_VERBS,PM_COMMAND_DESTINATION_CONTRACTS,PM_COMMAND_POSITIONAL_CONTRACTS,PM_POSITIONAL_ACTION_CONTRACTS,formatPmPositionalActionFlagTip,positionalShapeKey,positionalSignatureKey,resolvePmCommandPositionalContract,resolvePmPositionalActionContract,verifyExplicitPositionalSlotCensus,verifyPmCliGrammar,verifyPmCommandPositionalContracts};
|
|
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]="32173550-b687-53ee-b51e-f66ab42958fd")}catch{}})();import{resolvePmCommandAlias,PM_HISTORY_COMMAND_ALIASES,PM_RELOCATED_COMMAND_ALIASES,resolvePmHistoryOperation}from"./command-aliases.js";const PM_CLI_GRAMMAR_NOUNS=["item","list","context","search","graph","history","workspace","package","ops","plan","contracts","help"],PM_CLI_SHARED_VERBS=["acknowledge","activate","add","adopt","adopt-all","catalog","compact","complete","create","deactivate","delete","describe","doctor","edit","explore","import","init","inspect","install","list","manage","migrate","mutate","read","redact","reload","remove","reopen","repair","restore","run","show","uninstall","upgrade","verify"];function positionalSlot(name,valueKind,required,options={}){return{name,required,variadic:options.variadic===!0,value_kind:valueKind,polymorphic:options.polymorphic===!0}}function positionalActionVerb(action){const phrase=action.replaceAll("-"," ");return`${phrase.charAt(0).toUpperCase()}${phrase.slice(1)}`}const ITEM_ID=positionalSlot("id","item_id",!0),OPTIONAL_ITEM_ID=positionalSlot("id","item_id",!1),OPTIONAL_TEXT=positionalSlot("text","string",!1),PLAN_ITEM_ID=positionalSlot("plan-id","item_id",!0),PLAN_STEP=positionalSlot("step","string",!0),PLAN_CREATE_FLAGS=["--acceptance-criteria","--actual-result","--affected-version","--assignee","--blocked-by","--blocked-reason","--blocks","--body","--claim","--comment","--component","--confidence","--create-mode","--customer-impact","--deadline","--definition-of-ready","--description","--doc","--environment","--estimate","--event","--expected-result","--fixed-version","--file","--from-search","--goal","--harness","--impact","--learning","--message","--mode","--note","--objective","--order","--outcome","--parent","--priority","--rank","--related","--release","--reminder","--reporter","--repro-steps","--resolution","--resume-context","--reviewer","--risk","--scope","--severity","--sprint","--status","--step","--step-blocked-reason","--step-body","--step-evidence","--step-owner","--step-replacement","--step-status","--step-title","--tags","--template","--test","--title","--type-option","--unblock-note","--value","--why-now"],PLAN_STEP_FLAGS=["--allow-multiple-active","--depends-on","--file","--force","--message","--step-blocked-reason","--step-body","--step-evidence","--step-owner","--step-status","--step-title","--test"],PLAN_STEP_ACTION_DESCRIPTIONS={"update-step":"Update one declared Plan step.","complete-step":"Complete one declared Plan step.","block-step":"Block one declared Plan step.","remove-step":"Remove one declared Plan step.",link:"Link one dependency to a declared Plan step.",unlink:"Unlink one dependency from a declared Plan step."},PM_POSITIONAL_ACTION_CONTRACTS=[{command:"plan create",parent:"plan",action:"create",slots:[positionalSlot("title","string",!1,{polymorphic:!0})],accepted_flags:PLAN_CREATE_FLAGS,description:"Create a Plan item and optionally seed its ordered steps.",example:'pm plan create --title "Refactor lock retry"'},{command:"plan show",parent:"plan",action:"show",slots:[PLAN_ITEM_ID],accepted_flags:["--depth","--fields"],description:"Read one Plan item with a bounded plan projection.",example:"pm plan show pm-a1b2 --depth standard"},{command:"plan add-step",parent:"plan",action:"add-step",slots:[PLAN_ITEM_ID],accepted_flags:PLAN_STEP_FLAGS,description:"Append one ordered step to a Plan item.",example:'pm plan add-step pm-a1b2 --step-title "Run tests"'},...Object.entries(PLAN_STEP_ACTION_DESCRIPTIONS).map(([action,description])=>({command:`plan ${action}`,parent:"plan",action,slots:[PLAN_ITEM_ID,PLAN_STEP],accepted_flags:PLAN_STEP_FLAGS,description,example:`pm plan ${action} pm-a1b2 plan-step-001`})),{command:"plan reorder-step",parent:"plan",action:"reorder-step",slots:[PLAN_ITEM_ID,PLAN_STEP,positionalSlot("new-order","integer",!0)],accepted_flags:["--force","--message"],description:"Move one Plan step to a declared integer order.",example:"pm plan reorder-step pm-a1b2 plan-step-001 2"},...["decision","discovery","validation","resume","approve","materialize"].map(action=>({command:`plan ${action}`,parent:"plan",action,slots:[PLAN_ITEM_ID],accepted_flags:PLAN_STEP_FLAGS,description:`${positionalActionVerb(action)} for one Plan item.`,example:`pm plan ${action} pm-a1b2`})),...["list","show","put","remove"].map(action=>({command:`assurance ${action}`,parent:"assurance",action,slots:[positionalSlot("kind","string",!0),...action==="list"?[]:[positionalSlot("id","string",!0)]],accepted_flags:action==="put"?["--author","--definition","--message"]:action==="remove"?["--author","--message"]:[],description:`${positionalActionVerb(action)} assurance declarations by kind.`,example:action==="list"?"pm assurance list measurement":`pm assurance ${action} measurement example-id`})),{command:"assurance run",parent:"assurance",action:"run",slots:[positionalSlot("gate-id","string",!0)],accepted_flags:["--dry-run","--trigger","--tree"],description:"Evaluate one assurance gate for a lifecycle trigger.",example:"pm assurance run tracker-context-quality --trigger ci --dry-run"},{command:"assurance verdicts",parent:"assurance",action:"verdicts",slots:[positionalSlot("gate-id","string",!1)],accepted_flags:["--gate","--limit"],description:"List bounded assurance verdict history.",example:"pm assurance verdicts --limit 20"},...["presets","apply"].map(action=>({command:`assurance ${action}`,parent:"assurance",action,slots:[positionalSlot("preset","string",action==="apply")],accepted_flags:["--author","--message","--owner"],description:action==="apply"?"Apply one assurance adoption preset.":"List available assurance adoption presets.",example:action==="apply"?"pm assurance apply software-delivery --owner <pm-item-id>":"pm assurance presets"})),{command:"assurance derive",parent:"assurance",action:"derive",slots:[],accepted_flags:["--apply","--author","--message","--owner"],description:"Derive assurance proposals from current project context.",example:"pm assurance derive --owner pm-a1b2"},{command:"assurance promote",parent:"assurance",action:"promote",slots:[positionalSlot("assertion-id","string",!0)],accepted_flags:["--author","--enforcement","--message"],description:"Promote one assertion into a warning or blocking gate.",example:"pm assurance promote assertion-id --enforcement warn"},{command:"assurance risk",parent:"assurance",action:"risk",slots:[],accepted_flags:["--definition"],description:"Analyze bounded defect-recurrence risk for a proposed change.",example:`pm assurance risk --definition '{"policy":{"version":1,"evidence_epoch":"2026-01-01T00:00:00.000Z","families":[]},"change":{"files":[]}}'`},{command:"assurance lineages",parent:"assurance",action:"lineages",slots:[],accepted_flags:["--definition"],description:"Measure all recorded recurrence lineages with bounded evidence rows.",example:`pm assurance lineages --definition '{"policy":{"version":1,"evidence_epoch":"2026-01-01T00:00:00.000Z","families":[]}}'`},{command:"workspace position",parent:"workspace",action:"position",slots:[],accepted_flags:[],description:"Read bounded merge-fence, receipt, history-drift, and next-action readiness.",example:"pm workspace position"},{command:"workspace snapshot create",parent:"workspace snapshot",action:"create",slots:[positionalSlot("name","string",!1)],accepted_flags:[],description:"Capture authoritative tracker state as an immutable snapshot.",example:"pm workspace snapshot create before-migration"},{command:"workspace snapshot list",parent:"workspace snapshot",action:"list",slots:[],accepted_flags:[],description:"List immutable workspace snapshots and named references.",example:"pm workspace snapshot list"},{command:"workspace snapshot inspect",parent:"workspace snapshot",action:"inspect",slots:[positionalSlot("target","string",!0)],accepted_flags:[],description:"Inspect one workspace snapshot target.",example:"pm workspace snapshot inspect before-migration"},{command:"workspace snapshot restore",parent:"workspace snapshot",action:"restore",slots:[positionalSlot("target","string",!0)],accepted_flags:["--author","--dry-run","--force","--message"],description:"Restore an immutable workspace snapshot with explicit recovery controls.",example:"pm workspace snapshot restore before-migration --dry-run"},{command:"workspace snapshot delete",parent:"workspace snapshot",action:"delete",slots:[positionalSlot("target","string",!0)],accepted_flags:[],description:"Delete one workspace snapshot target.",example:"pm workspace snapshot delete before-migration"}],POSITIONAL_ACTION_CONTRACTS_BY_SPECIFICITY=[...PM_POSITIONAL_ACTION_CONTRACTS].sort((left,right)=>right.command.length-left.command.length),EXPLICIT_POSITIONAL_SLOTS=new Map([["append",[ITEM_ID,OPTIONAL_TEXT]],["assurance",[positionalSlot("action","action",!0),positionalSlot("kind","string",!1),positionalSlot("id","string",!1)]],["beads import",[positionalSlot("file","string",!1)]],["cal",[positionalSlot("view","string",!1,{polymorphic:!0})]],["calendar",[positionalSlot("view","string",!1,{polymorphic:!0})]],["changelog export",[positionalSlot("file","string",!1)]],["changelog milestone create",[positionalSlot("name","string",!0)]],["claim",[OPTIONAL_ITEM_ID]],["close",[ITEM_ID,OPTIONAL_TEXT]],["close-task",[ITEM_ID,positionalSlot("reason","string",!1)]],["comments",[ITEM_ID,OPTIONAL_TEXT]],["completion",[positionalSlot("shell","string",!1)]],["config",[positionalSlot("scope","string",!1,{polymorphic:!0}),positionalSlot("action","action",!1),positionalSlot("key","string",!1),positionalSlot("value","string",!1,{polymorphic:!0})]],["copy",[ITEM_ID]],["create",[positionalSlot("type-or-title","string",!1,{polymorphic:!0}),positionalSlot("title","string",!1)]],["delete",[ITEM_ID]],["deps",[ITEM_ID]],["docs",[ITEM_ID]],["event",[positionalSlot("title","string",!0)]],["files",[ITEM_ID]],["files discover",[ITEM_ID]],["files lookup",[positionalSlot("paths","string",!0,{variadic:!0})]],["focus",[OPTIONAL_ITEM_ID]],["get",[ITEM_ID]],["graph",[positionalSlot("subcommand","action",!0),OPTIONAL_ITEM_ID,positionalSlot("target","item_id",!1)]],["guide",[positionalSlot("topic","string",!1)]],["history",[ITEM_ID]],["history-compact",[OPTIONAL_ITEM_ID]],["history-redact",[ITEM_ID]],["history-repair",[OPTIONAL_ITEM_ID]],["init",[positionalSlot("prefix-or-path","string",!1,{polymorphic:!0})]],["item complete",[ITEM_ID,positionalSlot("reason","string",!1)]],["item reopen",[ITEM_ID,positionalSlot("reason","string",!0)]],["learnings",[ITEM_ID,OPTIONAL_TEXT]],["meet",[positionalSlot("title","string",!0)]],["merge",[positionalSlot("subcommand","action",!0),positionalSlot("artifact","string",!1),positionalSlot("base","string",!1),positionalSlot("ours","string",!1),positionalSlot("theirs","string",!1)]],["notes",[ITEM_ID,OPTIONAL_TEXT]],["package",[positionalSlot("target","string",!1,{polymorphic:!0})]],["package list",[]],["package inventory",[positionalSlot("name","string",!1)]],["package scaffold",[positionalSlot("target","string",!0)]],["package upgrade",[positionalSlot("target","string",!1)]],["packages",[positionalSlot("target","string",!1,{polymorphic:!0})]],["packages list",[]],["packages inventory",[positionalSlot("name","string",!1)]],["packages scaffold",[positionalSlot("target","string",!0)]],["packages upgrade",[positionalSlot("target","string",!1)]],["pause-task",[ITEM_ID]],["plan",[positionalSlot("subcommand","action",!0),positionalSlot("id","item_id",!1,{polymorphic:!0}),positionalSlot("step","string",!1),positionalSlot("new-order","integer",!1)]],["profile",[positionalSlot("subcommand","action",!0),positionalSlot("name","string",!1)]],["release",[ITEM_ID]],["remind",[positionalSlot("title","string",!0)]],["restore",[ITEM_ID,positionalSlot("target","string",!0)]],["schema",[positionalSlot("subcommand","action",!0),positionalSlot("name","string",!1)]],["search-advanced",[positionalSlot("keywords","string",!0,{variadic:!0})]],["search",[positionalSlot("keywords","string",!0,{variadic:!0})]],["start-task",[ITEM_ID]],["templates save",[positionalSlot("name","string",!0)]],["templates show",[positionalSlot("name","string",!0)]],["telemetry",[positionalSlot("namespace-or-subcommand","action",!1,{polymorphic:!0}),positionalSlot("subcommand","action",!1)]],["test",[ITEM_ID]],["test-runs-worker",[positionalSlot("runId","string",!0)]],["update",[ITEM_ID]],["workspace snapshot",[positionalSlot("action","action",!0),positionalSlot("target","string",!1)]],...["activate","adopt","deactivate","init","uninstall"].flatMap(action=>["extension","package","packages"].map(root=>[`${root} ${action}`,[positionalSlot("target","string",!0)]])),...["describe"].flatMap(action=>["extension","package","packages"].map(root=>[`${root} ${action}`,[positionalSlot("target","string",!1)]])),...["install"].flatMap(action=>["extension","package","packages"].map(root=>[`${root} ${action}`,[positionalSlot("targets","string",!1,{variadic:!0})]])),["vcs abandon",[ITEM_ID]],["vcs create",[positionalSlot("title","string",!0)]],["vcs merge",[ITEM_ID]],["vcs propose",[ITEM_ID]],["vcs ref-create",[positionalSlot("name","string",!0)]],["vcs show",[ITEM_ID]]]);function normalizePositionalCommandPath(command){return command.trim().toLowerCase().replace(/\s+/gu," ")}function resolvePmCommandPositionalContract(command){const normalized=normalizePositionalCommandPath(command),direct=PM_COMMAND_POSITIONAL_CONTRACTS.find(contract=>contract.command===normalized);if(direct)return direct;const canonical=resolvePmCommandAlias(normalized)?.canonical;if(canonical)return PM_COMMAND_POSITIONAL_CONTRACTS.find(contract=>contract.command===canonical)}function resolvePmPositionalActionContract(command){const normalized=normalizePositionalCommandPath(command);return POSITIONAL_ACTION_CONTRACTS_BY_SPECIFICITY.find(contract=>contract.command===normalized||normalized.startsWith(`${contract.command} `))}function formatPmPositionalActionFlagTip(acceptedFlags){return`Applicable flags: ${acceptedFlags.length>0?acceptedFlags.join(", "):"none"}.`}function destinationRows(noun,target,disposition,owner,commands){return commands.map(command=>({command,noun,target,disposition,owner}))}const PM_COMMAND_DESTINATION_CONTRACTS=[...destinationRows("item","item","target_noun","pm-pbyu",["item","item complete","item mutate","item reopen"]),...destinationRows("item","item","consolidation","pm-yql1",["append","close-many","close-task","comments","copy","delete","deps","docs","files","learnings","notes","pause-task","start-task","test","update-many"]),...["claim","close","create","get","release","update"].map(command=>({command,noun:"item",target:command,disposition:"keep_as_is",owner:"pm-pbyu",reason:"Permanent high-frequency item operations retain concise root spellings under the accepted hot-path grammar policy."})),...destinationRows("item","item files","target_noun","pm-yql1",["files discover","files lookup","item files discover","item files lookup"]),...destinationRows("item","item test worker","consolidation","pm-lp4j",["test-runs-worker"]),...destinationRows("list","list","target_noun","pm-pfqi",["list"]),...destinationRows("list","list --group-by","consolidation","pm-xkgq",["aggregate"]),...destinationRows("context","context","target_noun","pm-pbyu",["context"]),...destinationRows("context","context","consolidation","pm-kcs4",["ctx","focus","next"]),...destinationRows("context","context next","consolidation","pm-kcs4",["ctx next"]),...destinationRows("context","context focus","consolidation","pm-kcs4",["ctx focus"]),...destinationRows("search","search","target_noun","pm-pbyu",["search"]),...destinationRows("search","search","package_owned","package:search-advanced",["reindex","search-advanced"]),...destinationRows("item","item duplicates","consolidation","pm-fmy9ih",["duplicates"]),...destinationRows("item","item duplicates","package_owned","pm-fmy9ih",["dedupe-audit","dedupe-merge","comments-audit"]),...destinationRows("graph","graph","target_noun","pm-pbyu",["graph"]),...destinationRows("history","history","target_noun","pm-pbyu",["history"]),...destinationRows("history","history attest","target_noun","pm-3z0k",["history attest"]),...destinationRows("history","history attest","consolidation","pm-3z0k",["history-attest"]),...PM_HISTORY_COMMAND_ALIASES.flatMap(({alias,canonical})=>[...destinationRows("history",canonical,"target_noun","pm-tqel",[canonical]),...destinationRows("history",canonical,"consolidation","pm-tqel",[alias])]),...destinationRows("history","history","consolidation","pm-tqel",["events","merge"]),...destinationRows("history","history acknowledge","consolidation","pm-djyvbk",["history-author-acknowledge"]),...destinationRows("history","history","package_owned","package:builtin-vcs-exemplar",["vcs abandon","vcs create","vcs log","vcs merge","vcs propose","vcs ref-create","vcs show"]),...destinationRows("workspace","workspace","target_noun","pm-pbyu",["workspace","workspace position","workspace snapshot","workspace snapshot create","workspace snapshot delete","workspace snapshot inspect","workspace snapshot list","workspace snapshot restore"]),...destinationRows("workspace","workspace init","consolidation","pm-npr3",["init"]),...destinationRows("package","package","target_noun","pm-pbyu",["package","package activate","package adopt","package adopt-all","package catalog","package deactivate","package describe","package doctor","package explore","package init","package install","package inventory","package list","package manage","package migrate","package reload","package scaffold","package uninstall","package upgrade"]),...destinationRows("package","package","consolidation","pm-tnud",["extension activate","extension adopt","extension adopt-all","extension catalog","extension deactivate","extension describe","extension doctor","extension explore","extension init","extension install","extension manage","extension migrate","extension reload","extension uninstall","packages","packages activate","packages adopt","packages adopt-all","packages catalog","packages deactivate","packages describe","packages doctor","packages explore","packages init","packages install","packages inventory","packages list","packages manage","packages migrate","packages reload","packages scaffold","packages uninstall","packages upgrade"]),...destinationRows("package","package","package_owned","package:beads",["beads import"]),...destinationRows("package","package","package_owned","package:pm-changelog",["changelog audit","changelog export","changelog generate","changelog milestone create"]),...destinationRows("package","package calendar","package_owned","pm-o3fh",["cal","calendar","event","meet","remind"]),...destinationRows("ops","ops","target_noun","pm-6apl",["ops"]),...destinationRows("ops","ops normalize","package_owned","package:pm-governance-audit",["normalize"]),...destinationRows("ops","ops","consolidation","pm-6apl",["eval","gc","health","stats","telemetry","test-all","validate"]),...destinationRows("workspace","workspace","consolidation","pm-npr3",["config","profile","schema"]),...["assurance",...PM_POSITIONAL_ACTION_CONTRACTS.filter(({parent})=>parent==="assurance").map(({command})=>command)].map(command=>({command,noun:"ops",target:command,disposition:"keep_as_is",owner:"pm-djyvbk",reason:"Assurance manages durable measurement, assertion, gate, and verdict data; retain its established domain surface independently of operational diagnostics."})),...destinationRows("plan","plan","target_noun","pm-pbyu",["plan"]),...destinationRows("plan","plan","target_noun","pm-2tan",PM_POSITIONAL_ACTION_CONTRACTS.filter(({parent})=>parent==="plan").map(({command})=>command)),...destinationRows("contracts","contracts","target_noun","pm-pbyu",["contracts"]),...destinationRows("help","help","target_noun","pm-pbyu",["help"]),...destinationRows("workspace","templates","package_owned","package:builtin-templates",["templates","templates list","templates save","templates show"]),...destinationRows("help","help","package_owned","package:builtin-guide-shell",["completion","completion-statuses","completion-tags","completion-types","guide"])].flatMap(entry=>{const alias=PM_RELOCATED_COMMAND_ALIASES.find(candidate=>candidate.alias===entry.command);if(!alias)return[entry];const noun=PM_CLI_GRAMMAR_NOUNS.find(candidate=>candidate===alias.canonical_argv[0])??entry.noun;return[{...entry,noun,target:alias.canonical,owner:alias.owner},{...entry,command:alias.canonical,noun,target:alias.canonical,owner:alias.owner,disposition:entry.disposition==="package_owned"?"package_owned":"target_noun"}]}),PM_COMMAND_POSITIONAL_CONTRACTS=[...new Set(PM_COMMAND_DESTINATION_CONTRACTS.map(({command})=>command))].map(command=>({command,slots:resolvePmPositionalActionContract(command)?.slots??EXPLICIT_POSITIONAL_SLOTS.get(resolvePmHistoryOperation(command))??[]})),PM_CLI_GRAMMAR_CONTRACT={nouns:PM_CLI_GRAMMAR_NOUNS,shared_verbs:PM_CLI_SHARED_VERBS,scope_before_verb:!0,visible_top_level_ceiling:69,ceiling_raise_requires_pm_item:!0,positional_shape_budget:21};function verifyExplicitPositionalSlotCensus(explicitCommands,destinationCommands){const destinations=new Set(destinationCommands);return[...new Set(explicitCommands)].filter(command=>!destinations.has(command)).map(command=>({code:"positional_signature_mismatch",command,detail:`Positional signature ${command} has no destination declaration.`}))}function positionalShapeKey(slots){return slots.map(({required,variadic,value_kind:valueKind,polymorphic})=>`${required?"r":"o"}:${variadic?"v":"s"}:${valueKind}:${polymorphic?"p":"m"}`).join("|")}function positionalSignatureKey(slots){return slots.map(({name,required,variadic,value_kind:valueKind,polymorphic})=>`${name}:${required?"r":"o"}:${variadic?"v":"s"}:${valueKind}:${polymorphic?"p":"m"}`).join("|")}function duplicatePositionalSignatureFindings(contracts,surface){const counts=new Map;for(const{command}of contracts){const normalized=normalizePositionalCommandPath(command);counts.set(normalized,(counts.get(normalized)??0)+1)}return[...counts.entries()].filter(([,count])=>count>1).map(([command,count])=>({code:"positional_signature_mismatch",command,detail:`${count} ${surface} positional signatures exist for ${command}; exactly one is required.`}))}function verifyPmCommandPositionalContracts(observed,options={}){const declared=options.declared??PM_COMMAND_POSITIONAL_CONTRACTS,positionalShapeBudget=options.positionalShapeBudget??PM_CLI_GRAMMAR_CONTRACT.positional_shape_budget,declaredByCommand=new Map(declared.map(contract=>[normalizePositionalCommandPath(contract.command),contract])),observedByCommand=new Map(observed.map(contract=>[normalizePositionalCommandPath(contract.command),contract])),findings=[...duplicatePositionalSignatureFindings(declared,"declared"),...duplicatePositionalSignatureFindings(observed,"observed"),...options.declared===void 0?[...verifyExplicitPositionalSlotCensus(EXPLICIT_POSITIONAL_SLOTS.keys(),PM_COMMAND_DESTINATION_CONTRACTS.map(({command})=>command)),...verifyExplicitPositionalSlotCensus(PM_POSITIONAL_ACTION_CONTRACTS.map(({command})=>command),PM_COMMAND_DESTINATION_CONTRACTS.map(({command})=>command))]:[]];for(const contract of declaredByCommand.values()){const normalizedCommand=normalizePositionalCommandPath(contract.command),actual=observedByCommand.get(normalizedCommand);actual?positionalSignatureKey(actual.slots)!==positionalSignatureKey(contract.slots)&&findings.push({code:"positional_signature_mismatch",command:contract.command,detail:`Observed positional signature for ${contract.command} differs from its declared SDK contract: observed=${positionalSignatureKey(actual.slots)||"<none>"}; declared=${positionalSignatureKey(contract.slots)||"<none>"}.`}):findings.push({code:"missing_observed_signature",command:contract.command,detail:`No observed positional signature exists for ${contract.command}.`})}for(const contract of observedByCommand.values())declaredByCommand.has(normalizePositionalCommandPath(contract.command))||findings.push({code:"stale_observed_signature",command:contract.command,detail:`Observed positional signature ${contract.command} has no declaration.`});const positionalShapeCount=new Set(declared.map(({slots})=>positionalShapeKey(slots))).size;return positionalShapeCount>positionalShapeBudget&&findings.push({code:"positional_shape_budget_exceeded",command:"*",detail:`Distinct positional shape count ${positionalShapeCount} exceeds budget ${positionalShapeBudget}.`}),findings.sort((left,right)=>left.command!==right.command?left.command.localeCompare(right.command):left.code.localeCompare(right.code)),{ok:findings.length===0,declared_command_count:declared.length,observed_command_count:observed.length,positional_shape_count:positionalShapeCount,positional_shape_budget:positionalShapeBudget,findings}}function validateCommandDestinations(commands,destinationsByCommand,nounSet){return commands.flatMap(command=>{const destinations=destinationsByCommand.get(command)??[];if(destinations.length===0){const separatorIndex=command.indexOf(" "),root=separatorIndex===-1?command:command.slice(0,separatorIndex);return[{code:"missing_destination",spelling:command,message:`Command \`${command}\` has no destination census row.`,nearest_target:nounSet.has(root)?root:`ops ${command}`}]}const duplicateFinding=destinations.length>1?[{code:"duplicate_destination",spelling:command,message:`Command \`${command}\` has ${destinations.length} destination rows.`,nearest_target:destinations[0].target}]:[];return destinations.reduce((findings,destination)=>(destination.disposition==="keep_as_is"&&(destination.reason?.trim().length??0)===0&&findings.push({code:"missing_destination",spelling:command,message:`Command \`${command}\` is kept as-is without a documented reason.`,nearest_target:destination.target}),nounSet.has(destination.noun)||findings.push({code:"unknown_noun",spelling:command,message:`Command \`${command}\` names undeclared noun \`${destination.noun}\`.`,nearest_target:destination.target}),findings),duplicateFinding)})}function validateDestinationCensus(commandSet,destinations){return destinations.filter(destination=>destination.disposition!=="package_owned"&&!commandSet.has(destination.command)).map(destination=>({code:"stale_destination",spelling:destination.command,message:`Destination row \`${destination.command}\` is absent from live contracts.`,nearest_target:destination.target}))}function validateAliasTargets(aliases,commandSet){return aliases.filter(alias=>!commandSet.has(alias.canonical)).map(alias=>({code:"alias_target_missing",spelling:alias.alias,message:`Alias \`${alias.alias}\` targets missing canonical command \`${alias.canonical}\`.`,nearest_target:alias.canonical_argv.join(" ")}))}function verifyPmCliGrammar(commands,aliases=[],destinations=PM_COMMAND_DESTINATION_CONTRACTS){const normalizedCommands=[...new Set(commands.map(command=>command.trim()))].filter(command=>command.length>0).sort((left,right)=>left.localeCompare(right)),commandSet=new Set(normalizedCommands),nounSet=new Set(PM_CLI_GRAMMAR_NOUNS),destinationsByCommand=new Map;for(const destination of destinations){const entries=destinationsByCommand.get(destination.command)??[];entries.push(destination),destinationsByCommand.set(destination.command,entries)}const findings=[...validateCommandDestinations(normalizedCommands,destinationsByCommand,nounSet),...validateDestinationCensus(commandSet,destinations),...validateAliasTargets(aliases.filter(alias=>commandSet.has(alias.alias)||!(destinationsByCommand.get(alias.canonical)??[]).some(destination=>destination.disposition==="package_owned")),commandSet)],hiddenAliasNames=new Set(aliases.filter(alias=>alias.hidden).map(alias=>alias.alias)),visibleTopLevelCount=new Set(normalizedCommands.filter(command=>!command.includes(" ")&&!hiddenAliasNames.has(command)&&!(destinationsByCommand.get(command)??[]).some(destination=>destination.disposition==="package_owned"))).size;return visibleTopLevelCount>PM_CLI_GRAMMAR_CONTRACT.visible_top_level_ceiling&&findings.push({code:"visible_surface_ceiling_exceeded",spelling:String(visibleTopLevelCount),message:`Visible non-package top-level command count ${visibleTopLevelCount} exceeds ceiling ${PM_CLI_GRAMMAR_CONTRACT.visible_top_level_ceiling}.`,nearest_target:"Declare the noun placement and tracked waiver before raising the ceiling."}),{ok:findings.length===0,command_count:normalizedCommands.length,destination_count:destinations.length,hidden_alias_count:aliases.filter(alias=>alias.hidden).length,visible_top_level_count:visibleTopLevelCount,visible_top_level_ceiling:PM_CLI_GRAMMAR_CONTRACT.visible_top_level_ceiling,findings}}export{PM_CLI_GRAMMAR_CONTRACT,PM_CLI_GRAMMAR_NOUNS,PM_CLI_SHARED_VERBS,PM_COMMAND_DESTINATION_CONTRACTS,PM_COMMAND_POSITIONAL_CONTRACTS,PM_POSITIONAL_ACTION_CONTRACTS,formatPmPositionalActionFlagTip,positionalShapeKey,positionalSignatureKey,resolvePmCommandPositionalContract,resolvePmPositionalActionContract,verifyExplicitPositionalSlotCensus,verifyPmCliGrammar,verifyPmCommandPositionalContracts};
|
|
2
2
|
//# sourceMappingURL=grammar-contracts.js.map
|
|
@@ -14,6 +14,7 @@ import type { ToolOptionFlagContract } from "./flag-contracts.js";
|
|
|
14
14
|
import type { CloseCommandOptions } from "../lifecycle/close.js";
|
|
15
15
|
import type { CreateCommandOptions } from "../lifecycle/create.js";
|
|
16
16
|
import type { UpdateCommandOptions } from "../lifecycle/update.js";
|
|
17
|
+
import type { UpdateManyCommandOptions } from "../lifecycle/update-many.js";
|
|
17
18
|
import type { TOOL_BULK_MUTATION_FILTER_OPTION_CONTRACT_SOURCE } from "./tool-option-contracts.js";
|
|
18
19
|
/** JSON-compatible scalar the SDK option-normalization layer accepts for one flag value (CLI flags arrive as strings; MCP and SDK callers may pass native numbers and booleans). */
|
|
19
20
|
export type PmOptionScalar = string | number | boolean;
|
|
@@ -62,8 +63,8 @@ ids?:string | number | readonly (string | number)[];
|
|
|
62
63
|
export type PmBulkMutationControlOptions = {
|
|
63
64
|
/** Preview the bulk mutation without writing changes. */
|
|
64
65
|
dryRun?:boolean;
|
|
65
|
-
/**
|
|
66
|
-
rollback?:
|
|
66
|
+
/** ID of the checkpoint whose committed bulk effects should be reversed. */
|
|
67
|
+
rollback?:UpdateManyCommandOptions["rollback"];
|
|
67
68
|
/** Skip writing the crash-recovery checkpoint for this bulk mutation. */
|
|
68
69
|
noCheckpoint?:boolean;
|
|
69
70
|
};
|
package/dist/sdk/contracts.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Exposes command and action contract data without loading SDK runtime code.
|
|
5
5
|
*/
|
|
6
6
|
export * from "./cli-contracts.js";
|
|
7
|
+
export * from "./mcp/executable.js";
|
|
7
8
|
export * from "./graph/query-contracts.js";
|
|
8
9
|
export * from "./cli-contracts/grammar-contracts.js";
|
|
9
10
|
export * from "./cli-contracts/command-exit-contracts.js";
|
package/dist/sdk/contracts.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]="06f7e972-61ab-5964-843c-5524cfd407d9")}catch{}})();export*from"./cli-contracts.js";export*from"./mcp/executable.js";export*from"./graph/query-contracts.js";export*from"./cli-contracts/grammar-contracts.js";export*from"./cli-contracts/command-exit-contracts.js";export*from"./context-intent-contracts.js";export*from"./error-code-catalog.js";export*from"./generated-error-code-catalog.js";export*from"./flag-invocation-contracts.js";import{resolveExtensionFlagValueContract}from"../core/extensions/flag-value-types.js";export*from"./cli-contracts/flag-lexicon-contracts.js";export*from"./output-token-accounting.js";export*from"./output-contracts.js";export*from"./agent/task-transcript-contracts.js";export*from"./read-output-contracts.js";export*from"./history/attestation-contract.js";export*from"../core/history/operation-contract.js";export*from"./agent/refusal-closure.js";export*from"./agent/closed-domain-contracts.js";export*from"./agent/tracker-preflight-contracts.js";export{resolveExtensionFlagValueContract};
|
|
2
2
|
//# sourceMappingURL=contracts.js.map
|
package/dist/sdk/core.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export * from "./agent-session-context.js";
|
|
|
11
11
|
export { isAlreadyClaimedError } from "./lifecycle/claim.js";
|
|
12
12
|
export { PM_READ_OUTPUT_DIMENSIONS,PM_READ_OUTPUT_OPTION_FLAGS,PM_READ_OUTPUT_COMPOSITION_OPTION_FLAGS,PM_READ_OUTPUT_SURFACE_CONTRACTS,applyReadOutputDimensions,decodeReadOutputContinuationCursor,encodeReadOutputContinuationCursor,isReadOutputBudgetExceeded,resolveReadOutputDimensions,resolveReadOutputEncoding,resolveReadOutputSurface,validateReadOutputOptions,} from "./read-output-contracts.js";
|
|
13
13
|
export { applyReadOutputSessionReferences,attachReadOutputSessionReceipt,parseReadOutputSession,readOutputSessionRemainingTokens,isReadOutputSessionReference,} from "./read-output-session.js";
|
|
14
|
-
export type { PmReadOutputBudgetExceeded,PmReadOutputContinuation,PmReadOutputCursorEnvelope,PmReadOutputDimension,PmReadOutputLegacyAlias,PmReadOutputOptions,PmReadOutputProducerContinuation,PmReadOutputReceipt,PmReadOutputResult,PmReadOutputResultFor,PmReadOutputSessionResult,PmReadOutputSurface,PmReadOutputSurfaceContract,} from "./read-output-contracts.js";
|
|
14
|
+
export type { PmReadOutputBudgetExceeded,PmReadOutputContinuation,PmReadOutputCursorEnvelope,PmReadOutputDimension,PmReadOutputLegacyAlias,PmReadOutputOptions,PmReadOutputProducerContinuation,PmReadOutputReceipt,PmReadOutputMetadata,PmReadOutputResult,PmReadOutputResultFor,PmReadOutputSessionResult,PmReadOutputSurface,PmReadOutputSurfaceContract,} from "./read-output-contracts.js";
|
|
15
15
|
export type { PmReadOutputSessionReceipt,PmReadOutputSessionReference,PmReadOutputSessionState,} from "./read-output-session.js";
|
|
16
16
|
export type { ItemDocument,ItemMetadata,ItemStatus,ItemType,PmSettings,} from "../types/index.js";
|
|
17
17
|
export type { CloseEvidenceFollowUp } from "./lifecycle-policy.js";
|
package/dist/sdk/core.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]="8aaf0090-c67a-540b-b631-800aa480fb0b")}catch{}})();import{BASELINE_ITEM_FORMAT_VERSION,BUILTIN_ITEM_TYPE_VALUES,CONFIDENCE_TEXT_VALUES,CURRENT_ITEM_FORMAT_VERSION,DEPENDENCY_KIND_VALUES,EXIT_CODE,ISSUE_SEVERITY_VALUES,ITEM_TYPE_VALUES,PM_CLI_EXPECTED_ERROR_NAME,PmCliError,PmClient,RISK_VALUES,STATUS_VALUES,canonicalDocument,classifyItemFormatVersion,createPmCliExpectedError,effectiveItemFormatVersion,emptyImportedDocument,isPmCliExpectedError,normalizeItemFormatVersion,normalizeItemId,normalizeStatusInput,nowIso,runAction,serializeItemDocument,aggregate,append,claim,claimNext,close,comments,context,copy,create,deleteItem,deps,docs,files,filesDiscover,focus,get,graph,learnings,list,next,notes,release,reopen,restore,search,update,listAllComplete}from"./runtime.js";export*from"./core-governance.js";import{updateLinkedTest}from"./test/update.js";import{isItemAlreadyExistsError,isPmTokenBudgetRecovery}from"./errors.js";export*from"./agent-session-context.js";import{isAlreadyClaimedError}from"./lifecycle/claim.js";import{PM_READ_OUTPUT_DIMENSIONS,PM_READ_OUTPUT_OPTION_FLAGS,PM_READ_OUTPUT_COMPOSITION_OPTION_FLAGS,PM_READ_OUTPUT_SURFACE_CONTRACTS,applyReadOutputDimensions,decodeReadOutputContinuationCursor,encodeReadOutputContinuationCursor,isReadOutputBudgetExceeded,resolveReadOutputDimensions,resolveReadOutputEncoding,resolveReadOutputSurface,validateReadOutputOptions}from"./read-output-contracts.js";import{applyReadOutputSessionReferences,attachReadOutputSessionReceipt,parseReadOutputSession,readOutputSessionRemainingTokens,isReadOutputSessionReference}from"./read-output-session.js";export{BASELINE_ITEM_FORMAT_VERSION,BUILTIN_ITEM_TYPE_VALUES,CONFIDENCE_TEXT_VALUES,CURRENT_ITEM_FORMAT_VERSION,DEPENDENCY_KIND_VALUES,EXIT_CODE,ISSUE_SEVERITY_VALUES,ITEM_TYPE_VALUES,PM_CLI_EXPECTED_ERROR_NAME,PM_READ_OUTPUT_COMPOSITION_OPTION_FLAGS,PM_READ_OUTPUT_DIMENSIONS,PM_READ_OUTPUT_OPTION_FLAGS,PM_READ_OUTPUT_SURFACE_CONTRACTS,PmCliError,PmClient,RISK_VALUES,STATUS_VALUES,aggregate,append,applyReadOutputDimensions,applyReadOutputSessionReferences,attachReadOutputSessionReceipt,canonicalDocument,claim,claimNext,classifyItemFormatVersion,close,comments,context,copy,create,createPmCliExpectedError,decodeReadOutputContinuationCursor,deleteItem,deps,docs,effectiveItemFormatVersion,emptyImportedDocument,encodeReadOutputContinuationCursor,files,filesDiscover,focus,get,graph,isAlreadyClaimedError,isItemAlreadyExistsError,isPmCliExpectedError,isPmTokenBudgetRecovery,isReadOutputBudgetExceeded,isReadOutputSessionReference,learnings,list,listAllComplete,next,normalizeItemFormatVersion,normalizeItemId,normalizeStatusInput,notes,nowIso,parseReadOutputSession,readOutputSessionRemainingTokens,release,reopen,resolveReadOutputDimensions,resolveReadOutputEncoding,resolveReadOutputSurface,restore,runAction,search,serializeItemDocument,update,updateLinkedTest,validateReadOutputOptions};
|
|
2
2
|
//# sourceMappingURL=core.js.map
|
|
@@ -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]="1e6087f2-01b5-59c3-a471-433c722316b0")}catch{}})();import{reconcileExtensionCapabilityUsage}from"../../core/extensions/index.js";import{EXTENSION_CAPABILITY_CONTRACT,KNOWN_EXTENSION_CAPABILITIES,parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning}from"../../core/extensions/loader.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{normalizeExtensionNameForMatch}from"./shared.js";function summarizeExtensionFailures(failures){return failures.map(({layer,name,error})=>({layer,name,error}))}function addRuntimePath(pathsByExtension,extensionName,pathValue){const normalizedName=normalizeExtensionNameForMatch(extensionName),normalizedPath=pathValue.trim();if(normalizedName.length===0||normalizedPath.length===0)return;const existing=pathsByExtension.get(normalizedName)??new Set;existing.add(normalizedPath),pathsByExtension.set(normalizedName,existing)}function collectRuntimeActivationPaths(activationResult){const commandPathsByExtension=new Map,actionPathsByExtension=new Map;for(const registration of activationResult.registrations.commands)addRuntimePath(commandPathsByExtension,registration.name,registration.command),addRuntimePath(actionPathsByExtension,registration.name,registration.action);for(const handler of activationResult.commands.handlers)addRuntimePath(commandPathsByExtension,handler.name,handler.command);for(const override of activationResult.commands.overrides)addRuntimePath(commandPathsByExtension,override.name,override.command);return{commandPathsByExtension,actionPathsByExtension}}function sortedRuntimePaths(values){if(!(!values||values.size===0))return[...values].sort((left,right)=>left.localeCompare(right))}function resolveDoctorActivationStatus(params){const{enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames}=params;return enabled?loadFailedNames.has(normalizedName)||activationFailedNames.has(normalizedName)?{runtime_active:!1,activation_status:"failed"}:loadedNames.has(normalizedName)?{runtime_active:!0,activation_status:"ok"}:{runtime_active:!1,activation_status:"not_loaded"}:{runtime_active:!1,activation_status:"not_loaded"}}function applyDoctorRuntimeActivationState(extensions,loadResult,activationResult){const loadedNames=new Set(loadResult.loaded.map(entry=>normalizeExtensionNameForMatch(entry.name))),loadFailedNames=new Set(loadResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),activationFailedNames=new Set(activationResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),{commandPathsByExtension,actionPathsByExtension}=collectRuntimeActivationPaths(activationResult);return extensions.map(entry=>{const normalizedName=normalizeExtensionNameForMatch(entry.name),commandPaths=sortedRuntimePaths(commandPathsByExtension.get(normalizedName)),actionPaths=sortedRuntimePaths(actionPathsByExtension.get(normalizedName)),runtimeMetadata={...commandPaths?{command_paths:commandPaths}:{},...actionPaths?{action_paths:actionPaths}:{}},activationStatus=resolveDoctorActivationStatus({enabled:entry.enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames});return{...entry,...activationStatus,...runtimeMetadata}})}function summarizePolicyWarnings(warnings){let warningCount=0,violationCount=0,blockedCount=0;for(const warning of warnings)if(warning.startsWith("extension_policy_")){if(warningCount+=1,warning.startsWith("extension_policy_violation_")){violationCount+=1;continue}warning.startsWith("extension_policy_blocked_")&&(blockedCount+=1)}return{warning_count:warningCount,violation_count:violationCount,blocked_count:blockedCount}}function lifecycleFlagCommand(options,action){return options.vocabulary==="package"?`pm package --${action}`:`pm extension --${action}`}const REGISTRATION_COLLISION_WARNING_CODES=new Set(["extension_command_handler_collision","extension_command_override_collision","extension_command_override_handler_overlap","extension_parser_override_collision","extension_preflight_override_collision","extension_renderer_collision","extension_service_override_collision"]);function isRegistrationCollisionWarning(warning){return REGISTRATION_COLLISION_WARNING_CODES.has(warningCode(warning))}function isExtensionLayer(value){return value==="project"||value==="global"}function parseRegistrationCollisionWarning(warning){const parts=warning.split(":"),code=parts[0];if(!code||!REGISTRATION_COLLISION_WARNING_CODES.has(code))return null;const winnerLayer=parts.at(-4),winnerName=parts.at(-3)?.trim(),displacedLayer=parts.at(-2),displacedName=parts.at(-1)?.trim();return!isExtensionLayer(winnerLayer)||!isExtensionLayer(displacedLayer)||!winnerName||!displacedName?null:{code,surface:parts.slice(1,-4).join(":")||"global",winner:{layer:winnerLayer,name:winnerName},displaced:{layer:displacedLayer,name:displacedName}}}function collectRegistrationCollisionExtensionNames(warnings){const names=new Set;for(const warning of warnings){const parsed=parseRegistrationCollisionWarning(warning);parsed&&(names.add(parsed.winner.name),names.add(parsed.displaced.name))}return[...names].sort((left,right)=>left.localeCompare(right))}function buildRegistrationCollisionRemediation(warnings,commands){const registrationCollisionWarnings=warnings.filter(isRegistrationCollisionWarning);if(registrationCollisionWarnings.length===0)return null;const collisionNames=collectRegistrationCollisionExtensionNames(registrationCollisionWarnings);return`Extension registration collisions or handler/override overlaps detected.${collisionNames.length>0?` Conflicting extensions: ${collisionNames.join(", ")}.`:""} Single-winner surfaces can hide earlier package behavior. Deactivate one conflicting package with ${commands.deactivate}, or scope registration surfaces in extensions.policy.extension_overrides, then rerun ${commands.doctor}.`}function buildRegistrationCollisionPlan(scope,warnings,extensions,options){const collisions=warnings.map(warning=>parseRegistrationCollisionWarning(warning)).filter(entry=>entry!==null).sort((left,right)=>`${left.code}:${left.surface}:${left.winner.name}:${left.displaced.name}`.localeCompare(`${right.code}:${right.surface}:${right.winner.name}:${right.displaced.name}`));if(collisions.length===0)return;const scopeFlag=scope==="global"?"--global":"--project",deactivatePrefix=lifecycleFlagCommand(options,"deactivate"),doctorCommand=`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`,extensionByName=new Map(extensions.map(entry=>[normalizeExtensionNameForMatch(entry.name),entry])),affectedByName=new Map;for(const collision of collisions)for(const name of[collision.winner.name,collision.displaced.name]){const normalizedName=normalizeExtensionNameForMatch(name);affectedByName.set(normalizedName,(affectedByName.get(normalizedName)??0)+1)}const remediationCandidates=[...affectedByName.entries()].map(([normalizedName,affectedCollisions])=>{const extension=extensionByName.get(normalizedName),extensionName=extension?.name??normalizedName,commandPaths=extension?.command_paths??[],actionPaths=extension?.action_paths??[];return{action:"deactivate",extension:extensionName,command:`${deactivatePrefix} ${extensionName} ${scopeFlag}`,affected_collisions:affectedCollisions,feature_loss:{command_paths:[...commandPaths].sort((left,right)=>left.localeCompare(right)),action_paths:[...actionPaths].sort((left,right)=>left.localeCompare(right))}}}).sort((left,right)=>{const affectedDelta=right.affected_collisions-left.affected_collisions;if(affectedDelta!==0)return affectedDelta;const leftSurfaceCount=left.feature_loss.command_paths.length+left.feature_loss.action_paths.length,rightSurfaceCount=right.feature_loss.command_paths.length+right.feature_loss.action_paths.length;return leftSurfaceCount!==rightSurfaceCount?leftSurfaceCount-rightSurfaceCount:left.extension.localeCompare(right.extension)});return{status:"conflicts_detected",collision_count:collisions.length,extension_count:affectedByName.size,next_best_command:doctorCommand,collisions,remediation_candidates:remediationCandidates}}function classifyDoctorLoadFailureWarnings(loadFailures){const warnings=[];for(const failure of loadFailures){const normalizedError=failure.error.toLowerCase();(normalizedError.includes("cannot find package '@unbrained/pm-cli'")||normalizedError.includes('cannot find module "@unbrained/pm-cli"')||normalizedError.includes("cannot find module '@unbrained/pm-cli'"))&&warnings.push(`extension_load_failed_sdk_dependency_missing:${failure.name}`),(normalizedError.includes("cannot use import statement outside a module")||normalizedError.includes("to load an es module")||normalizedError.includes("must use import to load es module"))&&warnings.push(`extension_load_failed_module_mode_mismatch:${failure.name}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyDoctorActivationFailureWarnings(activationFailures=[]){const failures=Array.isArray(activationFailures)?activationFailures:[],warnings=[];for(const failure of failures){if(!failure||typeof failure.name!="string")continue;const missingCapability=failure.trace?.missing_capability??failure.trace?.capability;typeof missingCapability=="string"&&missingCapability.trim().length>0&&warnings.push(`extension_capability_missing:${failure.name}:${missingCapability.trim().toLowerCase()}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyUnusedCapabilityWarnings(loadResult,activationResult){const warnings=[];for(const entry of reconcileExtensionCapabilityUsage(loadResult.loaded,activationResult))for(const capability of entry.unused)warnings.push(`extension_capability_unused:${entry.layer}:${entry.name}:${capability}`);return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}const TRIAGE_REMEDIATION_RULES=[{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manifest_")),build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"explore")} ${ctx.scopeFlag} to inspect discovered manifests and directories.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unknown:")),build:()=>`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. Review extension_capability_unknown warning details for suggested replacements.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_legacy_alias:")),build:()=>"Legacy extension capability aliases were auto-remapped to canonical capabilities. Update manifests to canonical names (migration/validation -> schema)."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_missing:")),build:ctx=>`Extension activation failed because code registered a surface missing from manifest capabilities. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace and add the reported missing_capability to manifest.json before publishing.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unused:")),build:ctx=>`Extension manifests declare capabilities that are never registered against. Remove each reported unused capability from manifest.json to keep least privilege, or add the matching registration. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace for per-extension registration counts.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_command_definition_legacy_handler_alias:")),build:()=>"Extension command definitions using legacy handler were auto-remapped. Update command definitions to use run: (context) => ... for forward compatibility."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_output_service_override_global:")||warning.startsWith("extension_output_renderer_override_global:")),build:()=>"Global output service/renderer overrides are active. For output_format, return context.payload/null/undefined unless the extension owns the command. For renderers, return null for unrelated payloads so pm falls back to native rendering."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_schema_narrow_activation:")),build:()=>"A package registers custom item types/fields (a GLOBAL schema contribution) but also declares narrow activation.commands, so it never activates for built-in commands like pm create <type> and the custom type silently fails to register. Remove activation.commands from manifest.json so pm activates the package for every command, or \u2014 if the schema is intentionally command-scoped \u2014 knowingly ignore this advisory."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_sdk_dependency_missing:")),build:ctx=>`Detected extension load failures caused by missing SDK dependency resolution. Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_module_mode_mismatch:")),build:ctx=>`Detected extension module-mode mismatches. For ESM-based extension entries/imports, set package.json "type": "module" or use an explicit .mjs entry and rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_pm_min_version_")||warning.startsWith("extension_pm_max_version_")),build:ctx=>`Extension pm version-bound warnings detected. Align each package manifest's pm_min_version/pm_max_version with the installed pm CLI version (see the warning's required/allowed=...:current=... details), or upgrade/downgrade the pm CLI to satisfy the declared bounds, then rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:(_warnings,ctx)=>ctx.updateCheckFailedTotal>0,build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"manage")} ${ctx.scopeFlag} after validating network and repository access.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manager_state_")),build:ctx=>`Review and repair ${ctx.scope} managed extension state file if schema/read warnings persist.`},{matches:(_warnings,ctx)=>ctx.policyWarningCount>0,build:()=>"Extension governance policy warnings detected. Review settings.extensions.policy mode and allow/block lists to confirm intended capabilities and registration surfaces."}];function buildExtensionTriageRemediation(params){const{normalizedWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount,unmanagedActionRequiredTotal,notCheckedTotal,skippedNonGithubTotal,updateAvailableTotal}=params,remediation=[],ctx={options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount};if(normalizedWarnings.length>0){const registrationCollisionRemediation=buildRegistrationCollisionRemediation(normalizedWarnings,{deactivate:`${lifecycleFlagCommand(options,"deactivate")} <name> ${scopeFlag}`,doctor:`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`});registrationCollisionRemediation&&remediation.push(registrationCollisionRemediation);for(const rule of TRIAGE_REMEDIATION_RULES)rule.matches(normalizedWarnings,ctx)&&remediation.push(rule.build(ctx))}return unmanagedActionRequiredTotal>0&&remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} --fix-managed-state (or ${lifecycleFlagCommand(options,"adopt-all")} ${scopeFlag}, ${lifecycleFlagCommand(options,"adopt")} <name> ${scopeFlag}, or reinstall via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>).`),skippedNonGithubTotal>0&&remediation.push("Update-check coverage is partial: non-GitHub managed sources were not checked. Inspect their registry or source directly; zero detected updates does not mean these packages are current. Runtime activation health is independent."),notCheckedTotal>0&&remediation.push(`Update-check coverage is partial: some sources have no completed check. Run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} to request update checks.`),updateAvailableTotal>0&&remediation.push(`Update available managed extensions via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>.`),remediation.length===0&&remediation.push(`No immediate action required. Re-run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} after extension changes.`),remediation}function buildExtensionTriageSummary(scope,warnings,extensions,options={}){const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right)),managedTotal=extensions.filter(entry=>entry.managed).length,enabledTotal=extensions.filter(entry=>entry.enabled).length,activeTotal=extensions.filter(entry=>entry.active).length,updateAvailableTotal=extensions.filter(entry=>entry.update_check_status==="checked"&&entry.update_available===!0).length,unmanagedExtensions=extensions.filter(entry=>entry.managed===!1),unmanagedExpectedExtensions=unmanagedExtensions.filter(entry=>isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanagedActionRequiredExtensions=unmanagedExtensions.filter(entry=>!isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),updateCheckStatusTotals={checked:0,skipped_unmanaged:0,skipped_non_github:0,failed:0,not_checked:0};for(const entry of extensions)updateCheckStatusTotals[entry.update_check_status]+=1;const updateCheckFailedTotal=updateCheckStatusTotals.failed,skippedNonGithubTotal=extensions.filter(entry=>entry.update_check_status==="skipped_non_github"&&entry.source?.kind!=="builtin").length,partialCoverageWarnings=Object.entries({skipped_unmanaged:unmanagedActionRequiredExtensions.length,skipped_non_github:skippedNonGithubTotal,failed:updateCheckFailedTotal,not_checked:updateCheckStatusTotals.not_checked}).filter(([,count])=>count>0).map(([status,count])=>`extension_update_health_partial_coverage:${status}:${count}`),updateHealthPartial=partialCoverageWarnings.length>0,updateHealthCoverage=updateHealthPartial?"partial":"full",effectiveWarnings=[...new Set([...normalizedWarnings,...partialCoverageWarnings])].sort((left,right)=>left.localeCompare(right)),warningCodes=[...new Set(effectiveWarnings.map(value=>warningCode(value)))].sort((left,right)=>left.localeCompare(right)),policyWarnings=summarizePolicyWarnings(effectiveWarnings),scopeFlag=scope==="global"?"--global":"--project",collisionPlan=buildRegistrationCollisionPlan(scope,normalizedWarnings,extensions,options),remediation=buildExtensionTriageRemediation({normalizedWarnings:effectiveWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount:policyWarnings.warning_count,unmanagedActionRequiredTotal:unmanagedActionRequiredExtensions.length,notCheckedTotal:updateCheckStatusTotals.not_checked,skippedNonGithubTotal,updateAvailableTotal});return{status:effectiveWarnings.length===0?"ok":"warn",warning_count:effectiveWarnings.length,warning_codes:warningCodes,warnings:effectiveWarnings,policy_warning_count:policyWarnings.warning_count,policy_violation_count:policyWarnings.violation_count,policy_blocked_count:policyWarnings.blocked_count,total_extensions:extensions.length,managed_total:managedTotal,enabled_total:enabledTotal,active_total:activeTotal,update_available_total:updateAvailableTotal,update_health_coverage:updateHealthCoverage,update_health_partial:updateHealthPartial,unmanaged_loaded_extension_count:unmanagedExtensions.length,unmanaged_loaded_extensions:unmanagedExtensions.map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanaged_expected_extension_count:unmanagedExpectedExtensions.length,unmanaged_expected_extensions:unmanagedExpectedExtensions,unmanaged_action_required_extension_count:unmanagedActionRequiredExtensions.length,unmanaged_action_required_extensions:unmanagedActionRequiredExtensions,update_check_status_totals:updateCheckStatusTotals,update_check_failed_total:updateCheckFailedTotal,top_warnings:effectiveWarnings.slice(0,8),remediation,...collisionPlan?{collision_plan:collisionPlan}:{}}}function parseDoctorDetailMode(raw){if(!raw||raw.trim().length===0)return"summary";const normalized=raw.trim().toLowerCase();if(normalized==="summary"||normalized==="deep")return normalized;throw new PmCliError(`Invalid --detail value "${raw}". Expected summary or deep.`,EXIT_CODE.USAGE)}function warningCode(value){const normalized=value.trim(),separator=normalized.indexOf(":");return separator===-1?normalized:normalized.slice(0,separator)}function collectUnknownCapabilityGuidance(warnings){const seen=new Set,guidance=[];for(const warning of warnings){const parsedDetails=(()=>{const unknownWarning=parseUnknownExtensionCapabilityWarning(warning);return unknownWarning?[unknownWarning]:parseLegacyExtensionCapabilityAliasWarning(warning)})();for(const parsed of parsedDetails){const key=`${parsed.layer}:${parsed.name}:${parsed.capability}`;seen.has(key)||(seen.add(key),guidance.push(parsed))}}return guidance}function buildCapabilityContractMetadata(){return{version:EXTENSION_CAPABILITY_CONTRACT.version,capabilities:[...EXTENSION_CAPABILITY_CONTRACT.capabilities],legacy_aliases:{...EXTENSION_CAPABILITY_CONTRACT.legacy_aliases}}}function isExpectedUnmanagedExtension(entry){const normalizedName=normalizeExtensionNameForMatch(entry.name),normalizedDirectory=normalizeExtensionNameForMatch(entry.directory);return normalizedName.startsWith("builtin-")?!0:normalizedDirectory==="beads"||normalizedDirectory==="todos"}function buildDoctorConsistencySummary(scope,installedExtensions,loadedExtensions,failedLoads,disabledByFlag){if(scope!=="project"||disabledByFlag)return{warnings:[],summary:{active_project_count:0,loaded_project_count:0,active_project_names:[],loaded_project_names:[],missing_active_project_names:[]}};const activeProjectNames=[...new Set(installedExtensions.filter(entry=>entry.active).map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),loadedProjectNames=[...new Set(loadedExtensions.filter(entry=>entry.layer==="project").map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),failedLoadNames=new Set(failedLoads.map(entry=>normalizeExtensionNameForMatch(entry.name))),missingActiveProjectNames=activeProjectNames.filter(name=>!loadedProjectNames.includes(name)&&!failedLoadNames.has(name)).sort((left,right)=>left.localeCompare(right));return{warnings:missingActiveProjectNames.length>0?[`extension_doctor_consistency_active_not_loaded:${missingActiveProjectNames.join(",")}`]:[],summary:{active_project_count:activeProjectNames.length,loaded_project_count:loadedProjectNames.length,active_project_names:activeProjectNames,loaded_project_names:loadedProjectNames,missing_active_project_names:missingActiveProjectNames}}}export{applyDoctorRuntimeActivationState,buildCapabilityContractMetadata,buildDoctorConsistencySummary,buildExtensionTriageSummary,buildRegistrationCollisionRemediation,classifyDoctorActivationFailureWarnings,classifyDoctorLoadFailureWarnings,classifyUnusedCapabilityWarnings,collectUnknownCapabilityGuidance,parseDoctorDetailMode,summarizeExtensionFailures};
|
|
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]="573b0fd6-f003-55d8-8f49-c2a5e81cbc31")}catch{}})();import{reconcileExtensionCapabilityUsage}from"../../core/extensions/index.js";import{EXTENSION_CAPABILITY_CONTRACT,KNOWN_EXTENSION_CAPABILITIES,parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning}from"../../core/extensions/loader.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{normalizeExtensionNameForMatch}from"./shared.js";import{extensionVersionRemediation}from"../../core/extensions/version-diagnostics.js";function summarizeExtensionFailures(failures){return failures.map(({layer,name,error})=>({layer,name,error}))}function addRuntimePath(pathsByExtension,extensionName,pathValue){const normalizedName=normalizeExtensionNameForMatch(extensionName),normalizedPath=pathValue.trim();if(normalizedName.length===0||normalizedPath.length===0)return;const existing=pathsByExtension.get(normalizedName)??new Set;existing.add(normalizedPath),pathsByExtension.set(normalizedName,existing)}function collectRuntimeActivationPaths(activationResult){const commandPathsByExtension=new Map,actionPathsByExtension=new Map;for(const registration of activationResult.registrations.commands)addRuntimePath(commandPathsByExtension,registration.name,registration.command),addRuntimePath(actionPathsByExtension,registration.name,registration.action);for(const handler of activationResult.commands.handlers)addRuntimePath(commandPathsByExtension,handler.name,handler.command);for(const override of activationResult.commands.overrides)addRuntimePath(commandPathsByExtension,override.name,override.command);return{commandPathsByExtension,actionPathsByExtension}}function sortedRuntimePaths(values){if(!(!values||values.size===0))return[...values].sort((left,right)=>left.localeCompare(right))}function resolveDoctorActivationStatus(params){const{enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames}=params;return enabled?loadFailedNames.has(normalizedName)||activationFailedNames.has(normalizedName)?{runtime_active:!1,activation_status:"failed"}:loadedNames.has(normalizedName)?{runtime_active:!0,activation_status:"ok"}:{runtime_active:!1,activation_status:"not_loaded"}:{runtime_active:!1,activation_status:"not_loaded"}}function applyDoctorRuntimeActivationState(extensions,loadResult,activationResult){const loadedNames=new Set(loadResult.loaded.map(entry=>normalizeExtensionNameForMatch(entry.name))),loadFailedNames=new Set(loadResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),activationFailedNames=new Set(activationResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),{commandPathsByExtension,actionPathsByExtension}=collectRuntimeActivationPaths(activationResult);return extensions.map(entry=>{const normalizedName=normalizeExtensionNameForMatch(entry.name),commandPaths=sortedRuntimePaths(commandPathsByExtension.get(normalizedName)),actionPaths=sortedRuntimePaths(actionPathsByExtension.get(normalizedName)),runtimeMetadata={...commandPaths?{command_paths:commandPaths}:{},...actionPaths?{action_paths:actionPaths}:{}},activationStatus=resolveDoctorActivationStatus({enabled:entry.enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames});return{...entry,...activationStatus,...runtimeMetadata}})}function summarizePolicyWarnings(warnings){let warningCount=0,violationCount=0,blockedCount=0;for(const warning of warnings)if(warning.startsWith("extension_policy_")){if(warningCount+=1,warning.startsWith("extension_policy_violation_")){violationCount+=1;continue}warning.startsWith("extension_policy_blocked_")&&(blockedCount+=1)}return{warning_count:warningCount,violation_count:violationCount,blocked_count:blockedCount}}function lifecycleFlagCommand(options,action){return options.vocabulary==="package"?`pm package --${action}`:`pm extension --${action}`}const REGISTRATION_COLLISION_WARNING_CODES=new Set(["extension_command_handler_collision","extension_command_override_collision","extension_command_override_handler_overlap","extension_parser_override_collision","extension_preflight_override_collision","extension_renderer_collision","extension_service_override_collision"]);function isRegistrationCollisionWarning(warning){return REGISTRATION_COLLISION_WARNING_CODES.has(warningCode(warning))}function isExtensionLayer(value){return value==="project"||value==="global"}function parseRegistrationCollisionWarning(warning){const parts=warning.split(":"),code=parts[0];if(!code||!REGISTRATION_COLLISION_WARNING_CODES.has(code))return null;const winnerLayer=parts.at(-4),winnerName=parts.at(-3)?.trim(),displacedLayer=parts.at(-2),displacedName=parts.at(-1)?.trim();return!isExtensionLayer(winnerLayer)||!isExtensionLayer(displacedLayer)||!winnerName||!displacedName?null:{code,surface:parts.slice(1,-4).join(":")||"global",winner:{layer:winnerLayer,name:winnerName},displaced:{layer:displacedLayer,name:displacedName}}}function collectRegistrationCollisionExtensionNames(warnings){const names=new Set;for(const warning of warnings){const parsed=parseRegistrationCollisionWarning(warning);parsed&&(names.add(parsed.winner.name),names.add(parsed.displaced.name))}return[...names].sort((left,right)=>left.localeCompare(right))}function buildRegistrationCollisionRemediation(warnings,commands){const registrationCollisionWarnings=warnings.filter(isRegistrationCollisionWarning);if(registrationCollisionWarnings.length===0)return null;const collisionNames=collectRegistrationCollisionExtensionNames(registrationCollisionWarnings);return`Extension registration collisions or handler/override overlaps detected.${collisionNames.length>0?` Conflicting extensions: ${collisionNames.join(", ")}.`:""} Single-winner surfaces can hide earlier package behavior. Deactivate one conflicting package with ${commands.deactivate}, or scope registration surfaces in extensions.policy.extension_overrides, then rerun ${commands.doctor}.`}function buildRegistrationCollisionPlan(scope,warnings,extensions,options){const collisions=warnings.map(warning=>parseRegistrationCollisionWarning(warning)).filter(entry=>entry!==null).sort((left,right)=>`${left.code}:${left.surface}:${left.winner.name}:${left.displaced.name}`.localeCompare(`${right.code}:${right.surface}:${right.winner.name}:${right.displaced.name}`));if(collisions.length===0)return;const scopeFlag=scope==="global"?"--global":"--project",deactivatePrefix=lifecycleFlagCommand(options,"deactivate"),doctorCommand=`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`,extensionByName=new Map(extensions.map(entry=>[normalizeExtensionNameForMatch(entry.name),entry])),affectedByName=new Map;for(const collision of collisions)for(const name of[collision.winner.name,collision.displaced.name]){const normalizedName=normalizeExtensionNameForMatch(name);affectedByName.set(normalizedName,(affectedByName.get(normalizedName)??0)+1)}const remediationCandidates=[...affectedByName.entries()].map(([normalizedName,affectedCollisions])=>{const extension=extensionByName.get(normalizedName),extensionName=extension?.name??normalizedName,commandPaths=extension?.command_paths??[],actionPaths=extension?.action_paths??[];return{action:"deactivate",extension:extensionName,command:`${deactivatePrefix} ${extensionName} ${scopeFlag}`,affected_collisions:affectedCollisions,feature_loss:{command_paths:[...commandPaths].sort((left,right)=>left.localeCompare(right)),action_paths:[...actionPaths].sort((left,right)=>left.localeCompare(right))}}}).sort((left,right)=>{const affectedDelta=right.affected_collisions-left.affected_collisions;if(affectedDelta!==0)return affectedDelta;const leftSurfaceCount=left.feature_loss.command_paths.length+left.feature_loss.action_paths.length,rightSurfaceCount=right.feature_loss.command_paths.length+right.feature_loss.action_paths.length;return leftSurfaceCount!==rightSurfaceCount?leftSurfaceCount-rightSurfaceCount:left.extension.localeCompare(right.extension)});return{status:"conflicts_detected",collision_count:collisions.length,extension_count:affectedByName.size,next_best_command:doctorCommand,collisions,remediation_candidates:remediationCandidates}}function classifyDoctorLoadFailureWarnings(loadFailures){const warnings=[];for(const failure of loadFailures){const normalizedError=failure.error.toLowerCase();(normalizedError.includes("cannot find package '@unbrained/pm-cli'")||normalizedError.includes('cannot find module "@unbrained/pm-cli"')||normalizedError.includes("cannot find module '@unbrained/pm-cli'"))&&warnings.push(`extension_load_failed_sdk_dependency_missing:${failure.name}`),(normalizedError.includes("cannot use import statement outside a module")||normalizedError.includes("to load an es module")||normalizedError.includes("must use import to load es module"))&&warnings.push(`extension_load_failed_module_mode_mismatch:${failure.name}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyDoctorActivationFailureWarnings(activationFailures=[]){const failures=Array.isArray(activationFailures)?activationFailures:[],warnings=[];for(const failure of failures){if(!failure||typeof failure.name!="string")continue;const missingCapability=failure.trace?.missing_capability??failure.trace?.capability;typeof missingCapability=="string"&&missingCapability.trim().length>0&&warnings.push(`extension_capability_missing:${failure.name}:${missingCapability.trim().toLowerCase()}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyUnusedCapabilityWarnings(loadResult,activationResult){const warnings=[];for(const entry of reconcileExtensionCapabilityUsage(loadResult.loaded,activationResult))for(const capability of entry.unused)warnings.push(`extension_capability_unused:${entry.layer}:${entry.name}:${capability}`);return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}const TRIAGE_REMEDIATION_RULES=[{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manifest_")),build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"explore")} ${ctx.scopeFlag} to inspect discovered manifests and directories.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unknown:")),build:()=>`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. Review extension_capability_unknown warning details for suggested replacements.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_legacy_alias:")),build:()=>"Legacy extension capability aliases were auto-remapped to canonical capabilities. Update manifests to canonical names (migration/validation -> schema)."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_missing:")),build:ctx=>`Extension activation failed because code registered a surface missing from manifest capabilities. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace and add the reported missing_capability to manifest.json before publishing.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unused:")),build:ctx=>`Extension manifests declare capabilities that are never registered against. Remove each reported unused capability from manifest.json to keep least privilege, or add the matching registration. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace for per-extension registration counts.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_command_definition_legacy_handler_alias:")),build:()=>"Extension command definitions using legacy handler were auto-remapped. Update command definitions to use run: (context) => ... for forward compatibility."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_output_service_override_global:")||warning.startsWith("extension_output_renderer_override_global:")),build:()=>"Global output service/renderer overrides are active. For output_format, return context.payload/null/undefined unless the extension owns the command. For renderers, return null for unrelated payloads so pm falls back to native rendering."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_schema_narrow_activation:")),build:()=>"A package registers custom item types/fields (a GLOBAL schema contribution) but also declares narrow activation.commands, so it never activates for built-in commands like pm create <type> and the custom type silently fails to register. Remove activation.commands from manifest.json so pm activates the package for every command, or \u2014 if the schema is intentionally command-scoped \u2014 knowingly ignore this advisory."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_sdk_dependency_missing:")),build:ctx=>`Detected extension load failures caused by missing SDK dependency resolution. Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_module_mode_mismatch:")),build:ctx=>`Detected extension module-mode mismatches. For ESM-based extension entries/imports, set package.json "type": "module" or use an explicit .mjs entry and rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_pm_min_version_")||warning.startsWith("extension_pm_max_version_")),build:ctx=>`Extension pm version-bound warnings detected. Align each package manifest's pm_min_version/pm_max_version with the installed pm CLI version (see the warning's required/allowed=...:current=... details), or upgrade/downgrade the pm CLI to satisfy the declared bounds, then rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:(_warnings,ctx)=>ctx.updateCheckFailedTotal>0,build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"manage")} ${ctx.scopeFlag} after validating network and repository access.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manager_state_")),build:ctx=>`Review and repair ${ctx.scope} managed extension state file if schema/read warnings persist.`},{matches:(_warnings,ctx)=>ctx.policyWarningCount>0,build:()=>"Extension governance policy warnings detected. Review settings.extensions.policy mode and allow/block lists to confirm intended capabilities and registration surfaces."}];function buildExtensionTriageRemediation(params){const{normalizedWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount,unmanagedActionRequiredTotal,notCheckedTotal,skippedNonGithubTotal,updateAvailableTotal}=params,remediation=normalizedWarnings.map(extensionVersionRemediation).filter(guidance=>guidance!==void 0),ctx={options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount};if(normalizedWarnings.length>0){const registrationCollisionRemediation=buildRegistrationCollisionRemediation(normalizedWarnings,{deactivate:`${lifecycleFlagCommand(options,"deactivate")} <name> ${scopeFlag}`,doctor:`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`});registrationCollisionRemediation&&remediation.push(registrationCollisionRemediation);for(const rule of TRIAGE_REMEDIATION_RULES)rule.matches(normalizedWarnings,ctx)&&remediation.push(rule.build(ctx))}return unmanagedActionRequiredTotal>0&&remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} --fix-managed-state (or ${lifecycleFlagCommand(options,"adopt-all")} ${scopeFlag}, ${lifecycleFlagCommand(options,"adopt")} <name> ${scopeFlag}, or reinstall via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>).`),skippedNonGithubTotal>0&&remediation.push("Update-check coverage is partial: non-GitHub managed sources were not checked. Inspect their registry or source directly; zero detected updates does not mean these packages are current. Runtime activation health is independent."),notCheckedTotal>0&&remediation.push(`Update-check coverage is partial: some sources have no completed check. Run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} to request update checks.`),updateAvailableTotal>0&&remediation.push(`Update available managed extensions via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>.`),remediation.length===0&&remediation.push(`No immediate action required. Re-run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} after extension changes.`),remediation}function buildExtensionTriageSummary(scope,warnings,extensions,options={}){const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right)),managedTotal=extensions.filter(entry=>entry.managed).length,enabledTotal=extensions.filter(entry=>entry.enabled).length,activeTotal=extensions.filter(entry=>entry.active).length,updateAvailableTotal=extensions.filter(entry=>entry.update_check_status==="checked"&&entry.update_available===!0).length,unmanagedExtensions=extensions.filter(entry=>entry.managed===!1),unmanagedExpectedExtensions=unmanagedExtensions.filter(entry=>isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanagedActionRequiredExtensions=unmanagedExtensions.filter(entry=>!isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),updateCheckStatusTotals={checked:0,skipped_unmanaged:0,skipped_non_github:0,failed:0,not_checked:0};for(const entry of extensions)updateCheckStatusTotals[entry.update_check_status]+=1;const updateCheckFailedTotal=updateCheckStatusTotals.failed,skippedNonGithubTotal=extensions.filter(entry=>entry.update_check_status==="skipped_non_github"&&entry.source?.kind!=="builtin").length,partialCoverageWarnings=Object.entries({skipped_unmanaged:unmanagedActionRequiredExtensions.length,skipped_non_github:skippedNonGithubTotal,failed:updateCheckFailedTotal,not_checked:updateCheckStatusTotals.not_checked}).filter(([,count])=>count>0).map(([status,count])=>`extension_update_health_partial_coverage:${status}:${count}`),updateHealthPartial=partialCoverageWarnings.length>0,updateHealthCoverage=updateHealthPartial?"partial":"full",effectiveWarnings=[...new Set([...normalizedWarnings,...partialCoverageWarnings])].sort((left,right)=>left.localeCompare(right)),warningCodes=[...new Set(effectiveWarnings.map(value=>warningCode(value)))].sort((left,right)=>left.localeCompare(right)),policyWarnings=summarizePolicyWarnings(effectiveWarnings),scopeFlag=scope==="global"?"--global":"--project",collisionPlan=buildRegistrationCollisionPlan(scope,normalizedWarnings,extensions,options),remediation=buildExtensionTriageRemediation({normalizedWarnings:effectiveWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount:policyWarnings.warning_count,unmanagedActionRequiredTotal:unmanagedActionRequiredExtensions.length,notCheckedTotal:updateCheckStatusTotals.not_checked,skippedNonGithubTotal,updateAvailableTotal});return{status:effectiveWarnings.length===0?"ok":"warn",warning_count:effectiveWarnings.length,warning_codes:warningCodes,warnings:effectiveWarnings,policy_warning_count:policyWarnings.warning_count,policy_violation_count:policyWarnings.violation_count,policy_blocked_count:policyWarnings.blocked_count,total_extensions:extensions.length,managed_total:managedTotal,enabled_total:enabledTotal,active_total:activeTotal,update_available_total:updateAvailableTotal,update_health_coverage:updateHealthCoverage,update_health_partial:updateHealthPartial,unmanaged_loaded_extension_count:unmanagedExtensions.length,unmanaged_loaded_extensions:unmanagedExtensions.map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanaged_expected_extension_count:unmanagedExpectedExtensions.length,unmanaged_expected_extensions:unmanagedExpectedExtensions,unmanaged_action_required_extension_count:unmanagedActionRequiredExtensions.length,unmanaged_action_required_extensions:unmanagedActionRequiredExtensions,update_check_status_totals:updateCheckStatusTotals,update_check_failed_total:updateCheckFailedTotal,top_warnings:effectiveWarnings.slice(0,8),remediation,...collisionPlan?{collision_plan:collisionPlan}:{}}}function parseDoctorDetailMode(raw){if(!raw||raw.trim().length===0)return"summary";const normalized=raw.trim().toLowerCase();if(normalized==="summary"||normalized==="deep")return normalized;throw new PmCliError(`Invalid --detail value "${raw}". Expected summary or deep.`,EXIT_CODE.USAGE)}function warningCode(value){const normalized=value.trim(),separator=normalized.indexOf(":");return separator===-1?normalized:normalized.slice(0,separator)}function collectUnknownCapabilityGuidance(warnings){const seen=new Set,guidance=[];for(const warning of warnings){const parsedDetails=(()=>{const unknownWarning=parseUnknownExtensionCapabilityWarning(warning);return unknownWarning?[unknownWarning]:parseLegacyExtensionCapabilityAliasWarning(warning)})();for(const parsed of parsedDetails){const key=`${parsed.layer}:${parsed.name}:${parsed.capability}`;seen.has(key)||(seen.add(key),guidance.push(parsed))}}return guidance}function buildCapabilityContractMetadata(){return{version:EXTENSION_CAPABILITY_CONTRACT.version,capabilities:[...EXTENSION_CAPABILITY_CONTRACT.capabilities],legacy_aliases:{...EXTENSION_CAPABILITY_CONTRACT.legacy_aliases}}}function isExpectedUnmanagedExtension(entry){const normalizedName=normalizeExtensionNameForMatch(entry.name),normalizedDirectory=normalizeExtensionNameForMatch(entry.directory);return normalizedName.startsWith("builtin-")?!0:normalizedDirectory==="beads"||normalizedDirectory==="todos"}function buildDoctorConsistencySummary(scope,installedExtensions,loadedExtensions,failedLoads,disabledByFlag){if(scope!=="project"||disabledByFlag)return{warnings:[],summary:{active_project_count:0,loaded_project_count:0,active_project_names:[],loaded_project_names:[],missing_active_project_names:[]}};const activeProjectNames=[...new Set(installedExtensions.filter(entry=>entry.active).map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),loadedProjectNames=[...new Set(loadedExtensions.filter(entry=>entry.layer==="project").map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),failedLoadNames=new Set(failedLoads.map(entry=>normalizeExtensionNameForMatch(entry.name))),missingActiveProjectNames=activeProjectNames.filter(name=>!loadedProjectNames.includes(name)&&!failedLoadNames.has(name)).sort((left,right)=>left.localeCompare(right));return{warnings:missingActiveProjectNames.length>0?[`extension_doctor_consistency_active_not_loaded:${missingActiveProjectNames.join(",")}`]:[],summary:{active_project_count:activeProjectNames.length,loaded_project_count:loadedProjectNames.length,active_project_names:activeProjectNames,loaded_project_names:loadedProjectNames,missing_active_project_names:missingActiveProjectNames}}}export{applyDoctorRuntimeActivationState,buildCapabilityContractMetadata,buildDoctorConsistencySummary,buildExtensionTriageSummary,buildRegistrationCollisionRemediation,classifyDoctorActivationFailureWarnings,classifyDoctorLoadFailureWarnings,classifyUnusedCapabilityWarnings,collectUnknownCapabilityGuidance,parseDoctorDetailMode,summarizeExtensionFailures};
|
|
2
2
|
//# sourceMappingURL=doctor.js.map
|
|
@@ -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]="17cca82e-e9f9-5633-8d91-bc6c2b560d5f")}catch{}})();function buildBundledInstallReceipt(packages,dryRun){const succeeded=packages.filter(entry=>entry.result.ok).length;return{installed_all:!dryRun&&succeeded===packages.length,installed_count:dryRun?0:succeeded,...dryRun?{dry_run:!0,planned_count:succeeded}:{},failed_count:packages.length-succeeded,packages:packages.map(({alias,result})=>{const details=result.details;return{alias,ok:result.ok,extension:details.extension,source:details.source,source_resolution:details.source_resolution,install_plan:details.install_plan,dry_run:details.dry_run,destination_path:details.destination_path,activated:details.activated,settings_changed:details.settings_changed,previous_state_preserved:details.previous_state_preserved,rollback:details.rollback,command_paths:details.command_paths,action_paths:details.action_paths,command_discovery:details.command_discovery,verification:details.verification,runtime_activation_status:details.runtime_activation_status,activation_diagnostics:details.activation_diagnostics,warnings:result.warnings}})}}export{buildBundledInstallReceipt};
|
|
2
2
|
//# sourceMappingURL=install-receipts.js.map
|
|
@@ -21,3 +21,14 @@ export declare const readOptionalMetadataFile:(filePath:string) => Promise<Buffe
|
|
|
21
21
|
export declare const captureExtensionInstallSnapshot:(selectedRoot:string,settingsRoot:string,destinationDirectory:string,destinationExists:boolean,backupDirectory:string) => Promise<ExtensionInstallSnapshot>;
|
|
22
22
|
/** Restore directory and metadata snapshots after a partially persisted install. */
|
|
23
23
|
export declare const restoreExtensionInstallSnapshot:(snapshot:ExtensionInstallSnapshot) => Promise<void>;
|
|
24
|
+
/** Retain the previous installation until both persistence and runtime verification settle. */
|
|
25
|
+
export declare function withVerifiedExtensionInstall<T extends {
|
|
26
|
+
ok:boolean;
|
|
27
|
+
details:Record<string,unknown>;
|
|
28
|
+
}>(options:{
|
|
29
|
+
selectedRoot:string;
|
|
30
|
+
settingsRoot:string;
|
|
31
|
+
destinationDirectory:string;
|
|
32
|
+
sourceDirectory:string;
|
|
33
|
+
scope:"project" | "global";
|
|
34
|
+
},install:() => Promise<T>):Promise<T>;
|
|
@@ -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]="7c06c702-29ea-5552-aadc-52dfc9c238ef")}catch{}})();import{withHostEnvironmentBoundary}from"../../core/fs/host-environment-errors.js";import fs from"node:fs/promises";import path from"node:path";import{getSettingsPath}from"../../core/store/paths.js";import{isErrnoCode}from"./install-runtime.js";import{pathExists}from"../../core/fs/fs-utils.js";import{PmCliError}from"../../core/shared/errors.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{renderPmCommand}from"../command-line.js";import{areDirectoriesEquivalent}from"./install-sources.js";import{writeWorkspaceJsonWithHistory}from"../../core/history/workspace-history.js";import{readSettings}from"../../core/store/settings.js";import{clearSettingsReadCache}from"../../core/store/settings-read-cache.js";import{resolveAuthor}from"../../core/shared/author.js";import{resolveManagedExtensionStatePath}from"./managed-state.js";const readOptionalMetadataFile=async filePath=>fs.readFile(filePath).catch(error=>{if(isErrnoCode(error,"ENOENT"))return null;throw error}),captureExtensionInstallSnapshot=async(selectedRoot,settingsRoot,destinationDirectory,destinationExists,backupDirectory)=>withHostEnvironmentBoundary("extension_install_backup",async()=>{const managedStatePath=resolveManagedExtensionStatePath(selectedRoot),settingsPath=getSettingsPath(settingsRoot),[managedStateContents,settingsContents]=await Promise.all([readOptionalMetadataFile(managedStatePath),readOptionalMetadataFile(settingsPath)]);return destinationExists&&await fs.cp(destinationDirectory,backupDirectory,{recursive:!0,force:!0}),{backupDirectory,destinationDirectory,destinationExists,managedStatePath,managedStateContents,settingsPath,settingsContents}}),restoreExtensionInstallSnapshot=async snapshot=>withHostEnvironmentBoundary("extension_install_rollback",async()=>{await fs.rm(snapshot.destinationDirectory,{recursive:!0,force:!0}),snapshot.destinationExists&&await fs.cp(snapshot.backupDirectory,snapshot.destinationDirectory,{recursive:!0,force:!0});for(const[filePath,contents]of[[snapshot.managedStatePath,snapshot.managedStateContents],[snapshot.settingsPath,snapshot.settingsContents]])if(contents===null)await fs.rm(filePath,{force:!0});else if(filePath===snapshot.settingsPath){const settingsRoot=path.dirname(snapshot.settingsPath),settings=await readSettings(settingsRoot);try{await writeWorkspaceJsonWithHistory({pmRoot:settingsRoot,filePath,raw:contents.toString("utf8"),op:"extension:install:rollback",author:resolveAuthor(void 0,settings.author_default),lockTtlSeconds:settings.locks.ttl_seconds,lockWaitMs:settings.locks.wait_ms})}finally{clearSettingsReadCache(settingsRoot)}}else await fs.mkdir(path.dirname(filePath),{recursive:!0}),await fs.writeFile(filePath,contents)});async function withVerifiedExtensionInstall(options,install){const destinationExists=await pathExists(options.destinationDirectory),inPlace=await areDirectoriesEquivalent(options.sourceDirectory,options.destinationDirectory);await fs.mkdir(options.selectedRoot,{recursive:!0});const backupParent=path.join(path.dirname(options.selectedRoot),"runtime","extension-installs");await fs.mkdir(backupParent,{recursive:!0});const backupRoot=await fs.mkdtemp(path.join(backupParent,".pm-extension-install-backup-")),backupDirectory=path.join(backupRoot,"destination"),recoveryArgs=["package","install",backupDirectory,`--${options.scope}`],recoveryCommand=renderPmCommand(recoveryArgs);let retainBackup=!1;try{const snapshot=await captureExtensionInstallSnapshot(options.selectedRoot,options.settingsRoot,options.destinationDirectory,destinationExists,backupDirectory);let result;try{result=await install()}catch(error){try{await restoreExtensionInstallSnapshot(snapshot)}catch(rollbackError){retainBackup=!0;const wrapped=new PmCliError(`Extension install failed: ${String(error)}; rollback failed: ${String(rollbackError)}`,EXIT_CODE.GENERIC_FAILURE,{code:"extension_install_rollback_failed",original_code:error instanceof PmCliError?error.code:void 0,required:"Restore the previous package before retrying the replacement. Previous state was not preserved.",nextSteps:[destinationExists?recoveryCommand:"Repair the reported metadata write failure, then retry the original install."],...destinationExists?{recovery:{suggested_retry:recoveryCommand,suggested_retry_args:recoveryArgs}}:{}});throw Object.defineProperty(wrapped,"cause",{value:error,configurable:!0,writable:!0}),wrapped}throw error}if(result.ok)return result;if(!destinationExists||inPlace)return{...result,details:{...result.details,previous_state_preserved:!1}};try{await restoreExtensionInstallSnapshot(snapshot)}catch(error){return retainBackup=!0,{...result,details:{...result.details,previous_state_preserved:!1,rollback:{status:"failed",error:String(error),backup_directory:backupDirectory,recovery_command:recoveryCommand,recovery_args:recoveryArgs}}}}return{...result,details:{...result.details,overwritten:!1,settings_changed:!1,previous_state_preserved:!0,rollback:{status:"restored"}}}}finally{retainBackup||await fs.rm(backupRoot,{recursive:!0,force:!0}).catch(()=>{})}}export{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot,withVerifiedExtensionInstall};
|
|
2
2
|
//# sourceMappingURL=install-snapshot.js.map
|
package/dist/sdk/extension.d.ts
CHANGED
|
@@ -168,6 +168,18 @@ warnings:string[];
|
|
|
168
168
|
/** Value that configures or reports details for this contract. */
|
|
169
169
|
details:Record<string,unknown> & {
|
|
170
170
|
install_plan?:ExtensionInstallPlan;
|
|
171
|
+
/** Whether a rejected install restored the installation it replaced. */
|
|
172
|
+
previous_state_preserved?:boolean;
|
|
173
|
+
/** Compensation outcome; failed restoration retains an executable recovery source. */
|
|
174
|
+
rollback?:{
|
|
175
|
+
status:"restored";
|
|
176
|
+
} | {
|
|
177
|
+
status:"failed";
|
|
178
|
+
error:string;
|
|
179
|
+
backup_directory:string;
|
|
180
|
+
recovery_command:string;
|
|
181
|
+
recovery_args:string[];
|
|
182
|
+
};
|
|
171
183
|
};
|
|
172
184
|
}
|
|
173
185
|
/** Documents the extension triage summary payload exchanged by command, SDK, and package integrations. */
|