@unbrained/pm-cli 2026.9.7 → 2026.9.9
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/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +7 -2
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +231 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.d.ts +0 -5
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
- package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
- package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
- package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
- package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
- package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
- package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
- package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +37 -37
- 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 +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/policy/workflow-policy-schema.d.ts +312 -0
- package/dist/core/policy/workflow-policy-schema.js +2 -0
- package/dist/core/policy/workflow-policy-store.d.ts +24 -0
- package/dist/core/policy/workflow-policy-store.js +2 -0
- package/dist/core/policy/workflow-policy.d.ts +139 -0
- package/dist/core/policy/workflow-policy.js +2 -0
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.d.ts +1 -0
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +174 -839
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.d.ts +3 -1
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
- package/dist/sdk/governance/workflow-completeness.js +2 -0
- package/dist/sdk/governance/workflow-policy.d.ts +47 -0
- package/dist/sdk/governance/workflow-policy.js +4 -0
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +2 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -1
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.d.ts +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.d.ts +27 -0
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.d.ts +6 -4
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.d.ts +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.d.ts +2 -1
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.d.ts +4 -0
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.d.ts +2 -1
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.d.ts +4 -0
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/COMMANDS.md +10 -0
- package/docs/CONFIGURATION.md +12 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +4 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +33 -0
- package/docs/WORKFLOW_POLICIES.md +129 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
- package/marketplace.json +2 -2
- package/package.json +5 -5
- 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-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-I5W3KMGB.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-PEFABF7E.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,700 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module core/extensions/extension-hook-runtime
|
|
3
|
-
*
|
|
4
|
-
* Implements extension runtime contracts and governance for Extension Hook Runtime.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d1dd5d4f-5f08-5e52-b109-d066f92ae3b3")}catch(e){}}();
|
|
8
|
-
import { cloneCommandOptionsSnapshot, cloneContextSnapshot, cloneGlobalOptionsSnapshot, normalizeCommandName, } from "./extension-runtime-helpers.js";
|
|
9
|
-
import { stableValueEquals } from "../shared/serialization.js";
|
|
10
|
-
import { EXIT_CODE } from "../shared/constants.js";
|
|
11
|
-
import { PmCliError } from "../shared/errors.js";
|
|
12
|
-
const DEFAULT_MUTATION_GUARD_TIMEOUT_MS = 5_000;
|
|
13
|
-
async function executeRegisteredHooks(entries, hookName, context) {
|
|
14
|
-
const warnings = [];
|
|
15
|
-
for (const entry of entries) {
|
|
16
|
-
try {
|
|
17
|
-
await entry.run(cloneContextSnapshot(context));
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
warnings.push(`extension_hook_failed:${entry.layer}:${entry.name}:${hookName}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return warnings;
|
|
24
|
-
}
|
|
25
|
-
/** Implements run before command hooks for the public runtime surface of this module. */
|
|
26
|
-
export async function runBeforeCommandHooks(hooks, context) {
|
|
27
|
-
return executeRegisteredHooks(hooks.beforeCommand, "beforeCommand", context);
|
|
28
|
-
}
|
|
29
|
-
/** Reject malformed or denied mutation-guard decisions with stable extension diagnostics. */
|
|
30
|
-
function enforceMutationGuardDecision(decision, entry, operation) {
|
|
31
|
-
if (decision === undefined)
|
|
32
|
-
return;
|
|
33
|
-
if (typeof decision !== "object" ||
|
|
34
|
-
decision === null ||
|
|
35
|
-
!("allow" in decision) ||
|
|
36
|
-
decision.allow !== true &&
|
|
37
|
-
decision.allow !== false) {
|
|
38
|
-
throw new PmCliError(`Extension mutation guard ${entry.name} returned an invalid decision.`, EXIT_CODE.CONFLICT, {
|
|
39
|
-
code: "extension_mutation_guard_invalid_decision",
|
|
40
|
-
reason: `${entry.layer}:${entry.name}`,
|
|
41
|
-
nextSteps: ["Return { allow: true } or a structured denial from the guard."],
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
if (decision.allow)
|
|
45
|
-
return;
|
|
46
|
-
const denial = decision;
|
|
47
|
-
const code = typeof denial.code === "string" ? denial.code.trim() : "";
|
|
48
|
-
const remediation = typeof denial.remediation === "string" ? denial.remediation.trim() : "";
|
|
49
|
-
if (code.length === 0 || remediation.length === 0) {
|
|
50
|
-
throw new PmCliError(`Extension mutation guard ${entry.name} returned an invalid denial.`, EXIT_CODE.CONFLICT, {
|
|
51
|
-
code: "extension_mutation_guard_invalid_denial",
|
|
52
|
-
reason: `${entry.layer}:${entry.name}`,
|
|
53
|
-
nextSteps: ["Return non-empty code and remediation fields from the guard."],
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
const message = typeof denial.message === "string" ? denial.message.trim() : "";
|
|
57
|
-
throw new PmCliError(message || `Extension mutation guard ${entry.name} denied ${operation}.`, EXIT_CODE.CONFLICT, {
|
|
58
|
-
code,
|
|
59
|
-
reason: `${entry.layer}:${entry.name}`,
|
|
60
|
-
nextSteps: [remediation],
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/** Run every transactional mutation guard in registration order and fail closed on denial or failure. */
|
|
64
|
-
export async function runBeforeMutationHooks(hooks, context) {
|
|
65
|
-
for (const entry of hooks.beforeMutation ?? []) {
|
|
66
|
-
let decision;
|
|
67
|
-
let timeoutHandle;
|
|
68
|
-
try {
|
|
69
|
-
const guardPromise = Promise.resolve().then(() => entry.run({
|
|
70
|
-
pm_root: context.pm_root,
|
|
71
|
-
operation: context.operation,
|
|
72
|
-
before: context.before === null
|
|
73
|
-
? null
|
|
74
|
-
: cloneContextSnapshot(context.before),
|
|
75
|
-
after: context.after === null
|
|
76
|
-
? null
|
|
77
|
-
: cloneContextSnapshot(context.after),
|
|
78
|
-
changed_fields: [...context.changed_fields],
|
|
79
|
-
sdk: context.sdk,
|
|
80
|
-
}));
|
|
81
|
-
guardPromise.catch(() => { });
|
|
82
|
-
decision = await Promise.race([
|
|
83
|
-
guardPromise,
|
|
84
|
-
new Promise((_, reject) => {
|
|
85
|
-
timeoutHandle = setTimeout(() => {
|
|
86
|
-
reject(new PmCliError(`Extension mutation guard ${entry.name} timed out before ${context.operation}.`, EXIT_CODE.CONFLICT, {
|
|
87
|
-
code: "extension_mutation_guard_timed_out",
|
|
88
|
-
reason: `${entry.layer}:${entry.name}`,
|
|
89
|
-
nextSteps: [
|
|
90
|
-
"Fix or disable the stalled extension guard, then retry the mutation.",
|
|
91
|
-
],
|
|
92
|
-
}));
|
|
93
|
-
}, DEFAULT_MUTATION_GUARD_TIMEOUT_MS);
|
|
94
|
-
timeoutHandle.unref?.();
|
|
95
|
-
}),
|
|
96
|
-
]);
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
if (error instanceof PmCliError)
|
|
100
|
-
throw error;
|
|
101
|
-
throw new PmCliError(`Extension mutation guard ${entry.name} failed before ${context.operation}.`, EXIT_CODE.CONFLICT, {
|
|
102
|
-
code: "extension_mutation_guard_failed",
|
|
103
|
-
reason: `${entry.layer}:${entry.name}`,
|
|
104
|
-
nextSteps: ["Fix or disable the failing extension guard, then retry the mutation."],
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
clearTimeout(timeoutHandle);
|
|
109
|
-
}
|
|
110
|
-
enforceMutationGuardDecision(decision, entry, context.operation);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/** Implements run after command hooks for the public runtime surface of this module. */
|
|
114
|
-
export async function runAfterCommandHooks(hooks, context) {
|
|
115
|
-
return executeRegisteredHooks(hooks.afterCommand, "afterCommand", context);
|
|
116
|
-
}
|
|
117
|
-
/** Implements run on write hooks for the public runtime surface of this module. */
|
|
118
|
-
export async function runOnWriteHooks(hooks, context) {
|
|
119
|
-
return executeRegisteredHooks(hooks.onWrite, "onWrite", context);
|
|
120
|
-
}
|
|
121
|
-
/** Implements run on read hooks for the public runtime surface of this module. */
|
|
122
|
-
export async function runOnReadHooks(hooks, context) {
|
|
123
|
-
return executeRegisteredHooks(hooks.onRead, "onRead", context);
|
|
124
|
-
}
|
|
125
|
-
/** Implements run on index hooks for the public runtime surface of this module. */
|
|
126
|
-
export async function runOnIndexHooks(hooks, context) {
|
|
127
|
-
return executeRegisteredHooks(hooks.onIndex, "onIndex", context);
|
|
128
|
-
}
|
|
129
|
-
/** Normalize an extension handler failure into a single-line, length-bounded message so the real cause can be surfaced to the user/CI without leaking multi-line stack noise or unbounded payloads. */
|
|
130
|
-
function describeHandlerError(error) {
|
|
131
|
-
let raw = "";
|
|
132
|
-
if (error instanceof Error && typeof error.message === "string") {
|
|
133
|
-
raw = error.message;
|
|
134
|
-
}
|
|
135
|
-
else if (typeof error === "string") {
|
|
136
|
-
raw = error;
|
|
137
|
-
}
|
|
138
|
-
else if (typeof error === "object" &&
|
|
139
|
-
error !== null &&
|
|
140
|
-
typeof error.message === "string") {
|
|
141
|
-
// Extensions may throw plain/serialized objects that carry a message but do
|
|
142
|
-
// not inherit from the base Error class.
|
|
143
|
-
raw = error.message;
|
|
144
|
-
}
|
|
145
|
-
const normalized = raw.replace(/\s+/gu, " ").trim();
|
|
146
|
-
if (normalized.length === 0) {
|
|
147
|
-
return "";
|
|
148
|
-
}
|
|
149
|
-
const maxLength = 300;
|
|
150
|
-
return normalized.length > maxLength
|
|
151
|
-
? `${normalized.slice(0, maxLength - 1)}…`
|
|
152
|
-
: normalized;
|
|
153
|
-
}
|
|
154
|
-
/** Read one bounded string field from an extension result or thrown value. */
|
|
155
|
-
function readHandlerStringField(value, field) {
|
|
156
|
-
if (typeof value !== "object" ||
|
|
157
|
-
value === null ||
|
|
158
|
-
typeof value[field] !== "string") {
|
|
159
|
-
return undefined;
|
|
160
|
-
}
|
|
161
|
-
const normalized = String(value[field])
|
|
162
|
-
.replace(/\s+/gu, " ")
|
|
163
|
-
.trim();
|
|
164
|
-
return normalized.length > 0 ? normalized.slice(0, 300) : undefined;
|
|
165
|
-
}
|
|
166
|
-
/** Validate an optional structured extension result exit code. */
|
|
167
|
-
function readHandlerResultExitCode(result) {
|
|
168
|
-
if (typeof result !== "object" ||
|
|
169
|
-
result === null ||
|
|
170
|
-
!Object.hasOwn(result, "exit_code")) {
|
|
171
|
-
return undefined;
|
|
172
|
-
}
|
|
173
|
-
const exitCode = result.exit_code;
|
|
174
|
-
if (typeof exitCode !== "number" ||
|
|
175
|
-
!Number.isInteger(exitCode) ||
|
|
176
|
-
exitCode < 1 ||
|
|
177
|
-
exitCode > 255) {
|
|
178
|
-
throw new TypeError("Extension command result exit_code must be an integer from 1 to 255.");
|
|
179
|
-
}
|
|
180
|
-
return exitCode;
|
|
181
|
-
}
|
|
182
|
-
/** Implements run command handler for the public runtime surface of this module. */
|
|
183
|
-
export async function runCommandHandler(commands, context) {
|
|
184
|
-
const command = normalizeCommandName(context.command);
|
|
185
|
-
if (command.length === 0) {
|
|
186
|
-
return {
|
|
187
|
-
handled: false,
|
|
188
|
-
result: null,
|
|
189
|
-
warnings: [],
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
const matched = [...commands.handlers]
|
|
193
|
-
.reverse()
|
|
194
|
-
.find((entry) => entry.command === command);
|
|
195
|
-
if (!matched) {
|
|
196
|
-
return {
|
|
197
|
-
handled: false,
|
|
198
|
-
result: null,
|
|
199
|
-
warnings: [],
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
try {
|
|
203
|
-
const result = await matched.run({
|
|
204
|
-
command,
|
|
205
|
-
args: cloneContextSnapshot(context.args),
|
|
206
|
-
options: cloneContextSnapshot(context.options),
|
|
207
|
-
global: cloneContextSnapshot(context.global),
|
|
208
|
-
pm_root: context.pm_root,
|
|
209
|
-
source_workspace_root: context.source_workspace_root,
|
|
210
|
-
repo_root: context.repo_root,
|
|
211
|
-
pm_root_rel: context.pm_root_rel,
|
|
212
|
-
...(context.sdk === undefined ? {} : { sdk: context.sdk }),
|
|
213
|
-
});
|
|
214
|
-
return {
|
|
215
|
-
handled: true,
|
|
216
|
-
result,
|
|
217
|
-
warnings: [],
|
|
218
|
-
...Object.fromEntries([
|
|
219
|
-
["exitCode", readHandlerResultExitCode(result)],
|
|
220
|
-
["errorCode", readHandlerStringField(result, "code")],
|
|
221
|
-
["remediation", readHandlerStringField(result, "remediation")],
|
|
222
|
-
].filter((entry) => entry[1] !== undefined)),
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
const exitCode = typeof error === "object" && error !== null && "exitCode" in error
|
|
227
|
-
? error.exitCode
|
|
228
|
-
: undefined;
|
|
229
|
-
if (typeof exitCode === "number" && Number.isFinite(exitCode)) {
|
|
230
|
-
throw error;
|
|
231
|
-
}
|
|
232
|
-
return {
|
|
233
|
-
handled: false,
|
|
234
|
-
result: null,
|
|
235
|
-
warnings: [
|
|
236
|
-
`extension_command_handler_failed:${matched.layer}:${matched.name}:${matched.command}`,
|
|
237
|
-
],
|
|
238
|
-
errorMessage: describeHandlerError(error),
|
|
239
|
-
...Object.fromEntries([
|
|
240
|
-
["errorCode", readHandlerStringField(error, "code")],
|
|
241
|
-
["remediation", readHandlerStringField(error, "remediation")],
|
|
242
|
-
].filter((entry) => entry[1] !== undefined)),
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/** Implements run parser override for the public runtime surface of this module. */
|
|
247
|
-
export async function runParserOverride(parsers, context) {
|
|
248
|
-
const command = normalizeCommandName(context.command);
|
|
249
|
-
if (command.length === 0) {
|
|
250
|
-
return {
|
|
251
|
-
overridden: false,
|
|
252
|
-
context: {
|
|
253
|
-
command,
|
|
254
|
-
args: cloneContextSnapshot(context.args),
|
|
255
|
-
options: cloneCommandOptionsSnapshot(context.options),
|
|
256
|
-
global: cloneGlobalOptionsSnapshot(context.global),
|
|
257
|
-
pm_root: context.pm_root,
|
|
258
|
-
source_workspace_root: context.source_workspace_root,
|
|
259
|
-
repo_root: context.repo_root,
|
|
260
|
-
pm_root_rel: context.pm_root_rel,
|
|
261
|
-
},
|
|
262
|
-
warnings: [],
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
const matched = [...parsers.overrides]
|
|
266
|
-
.reverse()
|
|
267
|
-
.find((entry) => entry.command === command);
|
|
268
|
-
if (!matched) {
|
|
269
|
-
return {
|
|
270
|
-
overridden: false,
|
|
271
|
-
context: {
|
|
272
|
-
command,
|
|
273
|
-
args: cloneContextSnapshot(context.args),
|
|
274
|
-
options: cloneCommandOptionsSnapshot(context.options),
|
|
275
|
-
global: cloneGlobalOptionsSnapshot(context.global),
|
|
276
|
-
pm_root: context.pm_root,
|
|
277
|
-
source_workspace_root: context.source_workspace_root,
|
|
278
|
-
repo_root: context.repo_root,
|
|
279
|
-
pm_root_rel: context.pm_root_rel,
|
|
280
|
-
},
|
|
281
|
-
warnings: [],
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
try {
|
|
285
|
-
const delta = (await Promise.resolve(matched.run({
|
|
286
|
-
command,
|
|
287
|
-
args: cloneContextSnapshot(context.args),
|
|
288
|
-
options: cloneCommandOptionsSnapshot(context.options),
|
|
289
|
-
global: cloneGlobalOptionsSnapshot(context.global),
|
|
290
|
-
pm_root: context.pm_root,
|
|
291
|
-
source_workspace_root: context.source_workspace_root,
|
|
292
|
-
repo_root: context.repo_root,
|
|
293
|
-
pm_root_rel: context.pm_root_rel,
|
|
294
|
-
}))) ?? {};
|
|
295
|
-
const nextArgs = Array.isArray(delta.args)
|
|
296
|
-
? cloneContextSnapshot(delta.args)
|
|
297
|
-
: cloneContextSnapshot(context.args);
|
|
298
|
-
const nextOptions = delta.options
|
|
299
|
-
? cloneCommandOptionsSnapshot(delta.options)
|
|
300
|
-
: cloneCommandOptionsSnapshot(context.options);
|
|
301
|
-
const nextGlobal = delta.global
|
|
302
|
-
? cloneGlobalOptionsSnapshot(delta.global)
|
|
303
|
-
: cloneGlobalOptionsSnapshot(context.global);
|
|
304
|
-
return {
|
|
305
|
-
overridden: true,
|
|
306
|
-
context: {
|
|
307
|
-
command,
|
|
308
|
-
args: nextArgs,
|
|
309
|
-
options: nextOptions,
|
|
310
|
-
global: nextGlobal,
|
|
311
|
-
pm_root: context.pm_root,
|
|
312
|
-
source_workspace_root: context.source_workspace_root,
|
|
313
|
-
repo_root: context.repo_root,
|
|
314
|
-
pm_root_rel: context.pm_root_rel,
|
|
315
|
-
},
|
|
316
|
-
warnings: [],
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
catch {
|
|
320
|
-
return {
|
|
321
|
-
overridden: false,
|
|
322
|
-
context: {
|
|
323
|
-
command,
|
|
324
|
-
args: cloneContextSnapshot(context.args),
|
|
325
|
-
options: cloneCommandOptionsSnapshot(context.options),
|
|
326
|
-
global: cloneGlobalOptionsSnapshot(context.global),
|
|
327
|
-
pm_root: context.pm_root,
|
|
328
|
-
source_workspace_root: context.source_workspace_root,
|
|
329
|
-
repo_root: context.repo_root,
|
|
330
|
-
pm_root_rel: context.pm_root_rel,
|
|
331
|
-
},
|
|
332
|
-
warnings: [
|
|
333
|
-
`extension_parser_override_failed:${matched.layer}:${matched.name}:${matched.command}`,
|
|
334
|
-
],
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/** Implements run preflight override for the public runtime surface of this module. */
|
|
339
|
-
export async function runPreflightOverride(preflight, context) {
|
|
340
|
-
const baseContext = {
|
|
341
|
-
command: normalizeCommandName(context.command),
|
|
342
|
-
args: cloneContextSnapshot(context.args),
|
|
343
|
-
options: cloneCommandOptionsSnapshot(context.options),
|
|
344
|
-
global: cloneGlobalOptionsSnapshot(context.global),
|
|
345
|
-
pm_root: context.pm_root,
|
|
346
|
-
source_workspace_root: context.source_workspace_root,
|
|
347
|
-
repo_root: context.repo_root,
|
|
348
|
-
pm_root_rel: context.pm_root_rel,
|
|
349
|
-
};
|
|
350
|
-
const baseDecision = cloneContextSnapshot(context.decision);
|
|
351
|
-
const matched = [...preflight.overrides]
|
|
352
|
-
.reverse()
|
|
353
|
-
.find((entry) => !entry.commands?.length || entry.commands.includes(baseContext.command));
|
|
354
|
-
if (!matched) {
|
|
355
|
-
return {
|
|
356
|
-
overridden: false,
|
|
357
|
-
context: baseContext,
|
|
358
|
-
decision: baseDecision,
|
|
359
|
-
warnings: [],
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
try {
|
|
363
|
-
const delta = (await Promise.resolve(matched.run({
|
|
364
|
-
command: baseContext.command,
|
|
365
|
-
args: cloneContextSnapshot(baseContext.args),
|
|
366
|
-
options: cloneCommandOptionsSnapshot(baseContext.options),
|
|
367
|
-
global: cloneGlobalOptionsSnapshot(baseContext.global),
|
|
368
|
-
pm_root: baseContext.pm_root,
|
|
369
|
-
source_workspace_root: baseContext.source_workspace_root,
|
|
370
|
-
repo_root: baseContext.repo_root,
|
|
371
|
-
pm_root_rel: baseContext.pm_root_rel,
|
|
372
|
-
decision: cloneContextSnapshot(baseDecision),
|
|
373
|
-
}))) ?? {};
|
|
374
|
-
const nextContext = {
|
|
375
|
-
command: baseContext.command,
|
|
376
|
-
args: Array.isArray(delta.args)
|
|
377
|
-
? cloneContextSnapshot(delta.args)
|
|
378
|
-
: baseContext.args,
|
|
379
|
-
options: delta.options
|
|
380
|
-
? cloneCommandOptionsSnapshot(delta.options)
|
|
381
|
-
: baseContext.options,
|
|
382
|
-
global: delta.global
|
|
383
|
-
? cloneGlobalOptionsSnapshot(delta.global)
|
|
384
|
-
: baseContext.global,
|
|
385
|
-
pm_root: baseContext.pm_root,
|
|
386
|
-
source_workspace_root: baseContext.source_workspace_root,
|
|
387
|
-
repo_root: baseContext.repo_root,
|
|
388
|
-
pm_root_rel: baseContext.pm_root_rel,
|
|
389
|
-
};
|
|
390
|
-
const nextDecision = {
|
|
391
|
-
enforce_item_format_gate: typeof delta.enforce_item_format_gate === "boolean"
|
|
392
|
-
? delta.enforce_item_format_gate
|
|
393
|
-
: baseDecision.enforce_item_format_gate,
|
|
394
|
-
run_preflight_item_format_sync: typeof delta.run_preflight_item_format_sync === "boolean"
|
|
395
|
-
? delta.run_preflight_item_format_sync
|
|
396
|
-
: baseDecision.run_preflight_item_format_sync,
|
|
397
|
-
run_extension_migrations: typeof delta.run_extension_migrations === "boolean"
|
|
398
|
-
? delta.run_extension_migrations
|
|
399
|
-
: baseDecision.run_extension_migrations,
|
|
400
|
-
enforce_mandatory_migration_gate: typeof delta.enforce_mandatory_migration_gate === "boolean"
|
|
401
|
-
? delta.enforce_mandatory_migration_gate
|
|
402
|
-
: baseDecision.enforce_mandatory_migration_gate,
|
|
403
|
-
};
|
|
404
|
-
return {
|
|
405
|
-
overridden: true,
|
|
406
|
-
context: nextContext,
|
|
407
|
-
decision: nextDecision,
|
|
408
|
-
warnings: [],
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
catch {
|
|
412
|
-
return {
|
|
413
|
-
overridden: false,
|
|
414
|
-
context: baseContext,
|
|
415
|
-
decision: baseDecision,
|
|
416
|
-
warnings: [
|
|
417
|
-
`extension_preflight_override_failed:${matched.layer}:${matched.name}`,
|
|
418
|
-
],
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
function resolveDefaultServiceResult(context) {
|
|
423
|
-
return {
|
|
424
|
-
handled: false,
|
|
425
|
-
result: context.payload,
|
|
426
|
-
warnings: [],
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
function matchingServiceOverrides(services, service) {
|
|
430
|
-
return [...services.overrides]
|
|
431
|
-
.reverse()
|
|
432
|
-
.filter((entry) => entry.service === service);
|
|
433
|
-
}
|
|
434
|
-
function buildServiceOverrideContext(context) {
|
|
435
|
-
return {
|
|
436
|
-
service: context.service,
|
|
437
|
-
command: context.command
|
|
438
|
-
? normalizeCommandName(context.command)
|
|
439
|
-
: undefined,
|
|
440
|
-
args: context.args ? cloneContextSnapshot(context.args) : undefined,
|
|
441
|
-
options: context.options
|
|
442
|
-
? cloneCommandOptionsSnapshot(context.options)
|
|
443
|
-
: undefined,
|
|
444
|
-
global: context.global
|
|
445
|
-
? cloneGlobalOptionsSnapshot(context.global)
|
|
446
|
-
: undefined,
|
|
447
|
-
pm_root: context.pm_root,
|
|
448
|
-
source_workspace_root: context.source_workspace_root,
|
|
449
|
-
repo_root: context.repo_root,
|
|
450
|
-
pm_root_rel: context.pm_root_rel,
|
|
451
|
-
payload: cloneContextSnapshot(context.payload),
|
|
452
|
-
};
|
|
453
|
-
}
|
|
454
|
-
function isServiceOverrideDecision(value) {
|
|
455
|
-
if (typeof value !== "object" ||
|
|
456
|
-
value === null ||
|
|
457
|
-
!Object.hasOwn(value, "handled")) {
|
|
458
|
-
return false;
|
|
459
|
-
}
|
|
460
|
-
const handled = value.handled;
|
|
461
|
-
return handled === true
|
|
462
|
-
? Object.hasOwn(value, "result")
|
|
463
|
-
: handled === false && Reflect.ownKeys(value).length === 1;
|
|
464
|
-
}
|
|
465
|
-
function resolveServiceOverrideValue(result, context) {
|
|
466
|
-
if (isServiceOverrideDecision(result)) {
|
|
467
|
-
return result.handled
|
|
468
|
-
? { handled: true, result: result.result }
|
|
469
|
-
: { handled: false, result: context.payload };
|
|
470
|
-
}
|
|
471
|
-
if (context.service === "output_format" &&
|
|
472
|
-
(result === null || result === undefined)) {
|
|
473
|
-
return { handled: false, result: context.payload };
|
|
474
|
-
}
|
|
475
|
-
return { handled: true, result };
|
|
476
|
-
}
|
|
477
|
-
function isLegacyOutputPayloadEcho(result, context, serviceContext) {
|
|
478
|
-
return (context.service === "output_format" &&
|
|
479
|
-
typeof result === "object" &&
|
|
480
|
-
result !== null &&
|
|
481
|
-
stableValueEquals(result, serviceContext.payload));
|
|
482
|
-
}
|
|
483
|
-
function resolveMatchedServiceDecision(matched, decision, warnings) {
|
|
484
|
-
if (!decision.handled) {
|
|
485
|
-
return undefined;
|
|
486
|
-
}
|
|
487
|
-
if (matched.passThrough === true) {
|
|
488
|
-
warnings.push(`extension_service_pass_through_contract_violated:${matched.layer}:${matched.name}:${matched.service}`);
|
|
489
|
-
return undefined;
|
|
490
|
-
}
|
|
491
|
-
return {
|
|
492
|
-
handled: true,
|
|
493
|
-
result: decision.result,
|
|
494
|
-
warnings,
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
/** Implements run service override sync for the public runtime surface of this module. */
|
|
498
|
-
export function runServiceOverrideSync(services, context) {
|
|
499
|
-
const matches = matchingServiceOverrides(services, context.service);
|
|
500
|
-
if (matches.length === 0) {
|
|
501
|
-
return resolveDefaultServiceResult(context);
|
|
502
|
-
}
|
|
503
|
-
const warnings = [];
|
|
504
|
-
for (const matched of matches) {
|
|
505
|
-
try {
|
|
506
|
-
const serviceContext = buildServiceOverrideContext(context);
|
|
507
|
-
const result = matched.run(serviceContext);
|
|
508
|
-
if (result instanceof Promise) {
|
|
509
|
-
warnings.push(`extension_service_override_async_unsupported:${matched.layer}:${matched.name}:${matched.service}`);
|
|
510
|
-
continue;
|
|
511
|
-
}
|
|
512
|
-
if (isLegacyOutputPayloadEcho(result, context, serviceContext)) {
|
|
513
|
-
warnings.push(`extension_output_format_payload_echo_deprecated:${matched.layer}:${matched.name}`);
|
|
514
|
-
continue;
|
|
515
|
-
}
|
|
516
|
-
const resolved = resolveMatchedServiceDecision(matched, resolveServiceOverrideValue(result, context), warnings);
|
|
517
|
-
if (resolved)
|
|
518
|
-
return resolved;
|
|
519
|
-
}
|
|
520
|
-
catch {
|
|
521
|
-
warnings.push(`extension_service_override_failed:${matched.layer}:${matched.name}:${matched.service}`);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
return {
|
|
525
|
-
handled: false,
|
|
526
|
-
result: context.payload,
|
|
527
|
-
warnings,
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
/** Implements run service override for the public runtime surface of this module. */
|
|
531
|
-
export async function runServiceOverride(services, context) {
|
|
532
|
-
const matches = matchingServiceOverrides(services, context.service);
|
|
533
|
-
if (matches.length === 0) {
|
|
534
|
-
return resolveDefaultServiceResult(context);
|
|
535
|
-
}
|
|
536
|
-
const warnings = [];
|
|
537
|
-
for (const matched of matches) {
|
|
538
|
-
try {
|
|
539
|
-
const serviceContext = buildServiceOverrideContext(context);
|
|
540
|
-
const result = await Promise.resolve(matched.run(serviceContext));
|
|
541
|
-
if (isLegacyOutputPayloadEcho(result, context, serviceContext)) {
|
|
542
|
-
warnings.push(`extension_output_format_payload_echo_deprecated:${matched.layer}:${matched.name}`);
|
|
543
|
-
continue;
|
|
544
|
-
}
|
|
545
|
-
const resolved = resolveMatchedServiceDecision(matched, resolveServiceOverrideValue(result, context), warnings);
|
|
546
|
-
if (resolved)
|
|
547
|
-
return resolved;
|
|
548
|
-
}
|
|
549
|
-
catch {
|
|
550
|
-
warnings.push(`extension_service_override_failed:${matched.layer}:${matched.name}:${matched.service}`);
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
return {
|
|
554
|
-
handled: false,
|
|
555
|
-
result: context.payload,
|
|
556
|
-
warnings,
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
/** Implements run command override for the public runtime surface of this module. */
|
|
560
|
-
export function runCommandOverride(commands, context) {
|
|
561
|
-
const command = normalizeCommandName(context.command);
|
|
562
|
-
if (command.length === 0) {
|
|
563
|
-
return {
|
|
564
|
-
overridden: false,
|
|
565
|
-
result: context.result,
|
|
566
|
-
warnings: [],
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
const matched = [...commands.overrides]
|
|
570
|
-
.reverse()
|
|
571
|
-
.find((entry) => entry.command === command);
|
|
572
|
-
if (!matched) {
|
|
573
|
-
return {
|
|
574
|
-
overridden: false,
|
|
575
|
-
result: context.result,
|
|
576
|
-
warnings: [],
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
try {
|
|
580
|
-
const overrideOptions = cloneCommandOptionsSnapshot(context.options);
|
|
581
|
-
const overrideGlobal = cloneGlobalOptionsSnapshot(context.global);
|
|
582
|
-
const overrideResult = matched.run({
|
|
583
|
-
command,
|
|
584
|
-
args: cloneContextSnapshot(context.args),
|
|
585
|
-
options: overrideOptions,
|
|
586
|
-
global: overrideGlobal,
|
|
587
|
-
pm_root: context.pm_root,
|
|
588
|
-
source_workspace_root: context.source_workspace_root,
|
|
589
|
-
repo_root: context.repo_root,
|
|
590
|
-
pm_root_rel: context.pm_root_rel,
|
|
591
|
-
result: cloneContextSnapshot(context.result),
|
|
592
|
-
});
|
|
593
|
-
if (overrideResult instanceof Promise) {
|
|
594
|
-
return {
|
|
595
|
-
overridden: false,
|
|
596
|
-
result: context.result,
|
|
597
|
-
warnings: [
|
|
598
|
-
`extension_command_override_async_unsupported:${matched.layer}:${matched.name}:${matched.command}`,
|
|
599
|
-
],
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
return {
|
|
603
|
-
overridden: true,
|
|
604
|
-
result: overrideResult,
|
|
605
|
-
warnings: [],
|
|
606
|
-
};
|
|
607
|
-
}
|
|
608
|
-
catch {
|
|
609
|
-
return {
|
|
610
|
-
overridden: false,
|
|
611
|
-
result: context.result,
|
|
612
|
-
warnings: [
|
|
613
|
-
`extension_command_override_failed:${matched.layer}:${matched.name}:${matched.command}`,
|
|
614
|
-
],
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
function rendererOwnsContext(entry, command, result) {
|
|
619
|
-
if ((entry.commands?.length ?? 0) > 0 && !entry.commands?.includes(command)) {
|
|
620
|
-
return false;
|
|
621
|
-
}
|
|
622
|
-
if (entry.resultDiscriminator === undefined) {
|
|
623
|
-
return true;
|
|
624
|
-
}
|
|
625
|
-
try {
|
|
626
|
-
return entry.resultDiscriminator(cloneContextSnapshot(result));
|
|
627
|
-
}
|
|
628
|
-
catch {
|
|
629
|
-
return false;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
/** Implements run renderer override for the public runtime surface of this module. */
|
|
633
|
-
export function runRendererOverride(renderers, context) {
|
|
634
|
-
const rendererCommand = typeof context.command === "string"
|
|
635
|
-
? normalizeCommandName(context.command)
|
|
636
|
-
: "";
|
|
637
|
-
const matched = [...renderers.overrides]
|
|
638
|
-
.reverse()
|
|
639
|
-
.find((entry) => entry.format === context.format &&
|
|
640
|
-
rendererOwnsContext(entry, rendererCommand, context.result));
|
|
641
|
-
if (!matched) {
|
|
642
|
-
return {
|
|
643
|
-
overridden: false,
|
|
644
|
-
rendered: null,
|
|
645
|
-
warnings: [],
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
|
-
try {
|
|
649
|
-
const rendererArgs = Array.isArray(context.args)
|
|
650
|
-
? cloneContextSnapshot(context.args)
|
|
651
|
-
: [];
|
|
652
|
-
const rendererOptions = cloneCommandOptionsSnapshot(context.options);
|
|
653
|
-
const rendererGlobal = cloneGlobalOptionsSnapshot(context.global);
|
|
654
|
-
const rendererPmRoot = typeof context.pm_root === "string" ? context.pm_root : "";
|
|
655
|
-
const rendered = matched.run({
|
|
656
|
-
format: context.format,
|
|
657
|
-
command: rendererCommand,
|
|
658
|
-
args: rendererArgs,
|
|
659
|
-
options: rendererOptions,
|
|
660
|
-
global: rendererGlobal,
|
|
661
|
-
pm_root: rendererPmRoot,
|
|
662
|
-
source_workspace_root: context.source_workspace_root,
|
|
663
|
-
repo_root: context.repo_root,
|
|
664
|
-
pm_root_rel: context.pm_root_rel,
|
|
665
|
-
result: cloneContextSnapshot(context.result),
|
|
666
|
-
});
|
|
667
|
-
if (rendered === null || rendered === undefined) {
|
|
668
|
-
return {
|
|
669
|
-
overridden: false,
|
|
670
|
-
rendered: null,
|
|
671
|
-
warnings: [],
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
if (typeof rendered !== "string") {
|
|
675
|
-
return {
|
|
676
|
-
overridden: false,
|
|
677
|
-
rendered: null,
|
|
678
|
-
warnings: [
|
|
679
|
-
`extension_renderer_invalid_result:${matched.layer}:${matched.name}:${matched.format}`,
|
|
680
|
-
],
|
|
681
|
-
};
|
|
682
|
-
}
|
|
683
|
-
return {
|
|
684
|
-
overridden: true,
|
|
685
|
-
rendered,
|
|
686
|
-
warnings: [],
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
catch {
|
|
690
|
-
return {
|
|
691
|
-
overridden: false,
|
|
692
|
-
rendered: null,
|
|
693
|
-
warnings: [
|
|
694
|
-
`extension_renderer_failed:${matched.layer}:${matched.name}:${matched.format}`,
|
|
695
|
-
],
|
|
696
|
-
};
|
|
697
|
-
}
|
|
698
|
-
}
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="736cf7fc-d4da-57ce-90d8-2432085dd2c8")}catch(e2){}})();import{cloneCommandOptionsSnapshot,cloneContextSnapshot,cloneGlobalOptionsSnapshot,normalizeCommandName}from"./extension-runtime-helpers.js";import{stableValueEquals}from"../shared/serialization.js";import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";const DEFAULT_MUTATION_GUARD_TIMEOUT_MS=5e3;async function executeRegisteredHooks(entries,hookName,context){const warnings=[];for(const entry of entries){try{await entry.run(cloneContextSnapshot(context))}catch{warnings.push(`extension_hook_failed:${entry.layer}:${entry.name}:${hookName}`)}}return warnings}async function runBeforeCommandHooks(hooks,context){return executeRegisteredHooks(hooks.beforeCommand,"beforeCommand",context)}function enforceMutationGuardDecision(decision,entry,operation){if(decision===void 0)return;if(typeof decision!=="object"||decision===null||!("allow"in decision)||decision.allow!==true&&decision.allow!==false){throw new PmCliError(`Extension mutation guard ${entry.name} returned an invalid decision.`,EXIT_CODE.CONFLICT,{code:"extension_mutation_guard_invalid_decision",reason:`${entry.layer}:${entry.name}`,nextSteps:["Return { allow: true } or a structured denial from the guard."]})}if(decision.allow)return;const denial=decision;const code=typeof denial.code==="string"?denial.code.trim():"";const remediation=typeof denial.remediation==="string"?denial.remediation.trim():"";if(code.length===0||remediation.length===0){throw new PmCliError(`Extension mutation guard ${entry.name} returned an invalid denial.`,EXIT_CODE.CONFLICT,{code:"extension_mutation_guard_invalid_denial",reason:`${entry.layer}:${entry.name}`,nextSteps:["Return non-empty code and remediation fields from the guard."]})}const message=typeof denial.message==="string"?denial.message.trim():"";throw new PmCliError(message||`Extension mutation guard ${entry.name} denied ${operation}.`,EXIT_CODE.CONFLICT,{code,reason:`${entry.layer}:${entry.name}`,nextSteps:[remediation]})}async function runBeforeMutationHooks(hooks,context){for(const entry of hooks.beforeMutation??[]){let decision;let timeoutHandle;try{const guardPromise=Promise.resolve().then(()=>entry.run({pm_root:context.pm_root,operation:context.operation,before:context.before===null?null:cloneContextSnapshot(context.before),after:context.after===null?null:cloneContextSnapshot(context.after),changed_fields:[...context.changed_fields],sdk:context.sdk}));guardPromise.catch(()=>{});decision=await Promise.race([guardPromise,new Promise((_,reject)=>{timeoutHandle=setTimeout(()=>{reject(new PmCliError(`Extension mutation guard ${entry.name} timed out before ${context.operation}.`,EXIT_CODE.CONFLICT,{code:"extension_mutation_guard_timed_out",reason:`${entry.layer}:${entry.name}`,nextSteps:["Fix or disable the stalled extension guard, then retry the mutation."]}))},DEFAULT_MUTATION_GUARD_TIMEOUT_MS);timeoutHandle.unref?.()})])}catch(error){if(error instanceof PmCliError)throw error;throw new PmCliError(`Extension mutation guard ${entry.name} failed before ${context.operation}.`,EXIT_CODE.CONFLICT,{code:"extension_mutation_guard_failed",reason:`${entry.layer}:${entry.name}`,nextSteps:["Fix or disable the failing extension guard, then retry the mutation."]})}finally{clearTimeout(timeoutHandle)}enforceMutationGuardDecision(decision,entry,context.operation)}}async function runAfterCommandHooks(hooks,context){return executeRegisteredHooks(hooks.afterCommand,"afterCommand",context)}async function runOnWriteHooks(hooks,context){return executeRegisteredHooks(hooks.onWrite,"onWrite",context)}async function runOnReadHooks(hooks,context){return executeRegisteredHooks(hooks.onRead,"onRead",context)}async function runOnIndexHooks(hooks,context){return executeRegisteredHooks(hooks.onIndex,"onIndex",context)}function describeHandlerError(error){let raw="";if(error instanceof Error&&typeof error.message==="string"){raw=error.message}else if(typeof error==="string"){raw=error}else if(typeof error==="object"&&error!==null&&typeof error.message==="string"){raw=error.message}const normalized=raw.replace(/\s+/gu," ").trim();if(normalized.length===0){return""}const maxLength=300;return normalized.length>maxLength?`${normalized.slice(0,maxLength-1)}\u2026`:normalized}function readHandlerStringField(value,field){if(typeof value!=="object"||value===null||typeof value[field]!=="string"){return void 0}const normalized=String(value[field]).replace(/\s+/gu," ").trim();return normalized.length>0?normalized.slice(0,300):void 0}function readHandlerResultExitCode(result){if(typeof result!=="object"||result===null||!Object.hasOwn(result,"exit_code")){return void 0}const exitCode=result.exit_code;if(typeof exitCode!=="number"||!Number.isInteger(exitCode)||exitCode<1||exitCode>255){throw new TypeError("Extension command result exit_code must be an integer from 1 to 255.")}return exitCode}async function runCommandHandler(commands,context){const command=normalizeCommandName(context.command);if(command.length===0){return{handled:false,result:null,warnings:[]}}const matched=[...commands.handlers].reverse().find(entry=>entry.command===command);if(!matched){return{handled:false,result:null,warnings:[]}}try{const result=await matched.run({command,args:cloneContextSnapshot(context.args),options:cloneContextSnapshot(context.options),global:cloneContextSnapshot(context.global),pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel,...context.sdk===void 0?{}:{sdk:context.sdk}});return{handled:true,result,warnings:[],...Object.fromEntries([["exitCode",readHandlerResultExitCode(result)],["errorCode",readHandlerStringField(result,"code")],["remediation",readHandlerStringField(result,"remediation")]].filter(entry=>entry[1]!==void 0))}}catch(error){const exitCode=typeof error==="object"&&error!==null&&"exitCode"in error?error.exitCode:void 0;if(typeof exitCode==="number"&&Number.isFinite(exitCode)){throw error}return{handled:false,result:null,warnings:[`extension_command_handler_failed:${matched.layer}:${matched.name}:${matched.command}`],errorMessage:describeHandlerError(error),...Object.fromEntries([["errorCode",readHandlerStringField(error,"code")],["remediation",readHandlerStringField(error,"remediation")]].filter(entry=>entry[1]!==void 0))}}}async function runParserOverride(parsers,context){const command=normalizeCommandName(context.command);if(command.length===0){return{overridden:false,context:{command,args:cloneContextSnapshot(context.args),options:cloneCommandOptionsSnapshot(context.options),global:cloneGlobalOptionsSnapshot(context.global),pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel},warnings:[]}}const matched=[...parsers.overrides].reverse().find(entry=>entry.command===command);if(!matched){return{overridden:false,context:{command,args:cloneContextSnapshot(context.args),options:cloneCommandOptionsSnapshot(context.options),global:cloneGlobalOptionsSnapshot(context.global),pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel},warnings:[]}}try{const delta=await Promise.resolve(matched.run({command,args:cloneContextSnapshot(context.args),options:cloneCommandOptionsSnapshot(context.options),global:cloneGlobalOptionsSnapshot(context.global),pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel}))??{};const nextArgs=Array.isArray(delta.args)?cloneContextSnapshot(delta.args):cloneContextSnapshot(context.args);const nextOptions=delta.options?cloneCommandOptionsSnapshot(delta.options):cloneCommandOptionsSnapshot(context.options);const nextGlobal=delta.global?cloneGlobalOptionsSnapshot(delta.global):cloneGlobalOptionsSnapshot(context.global);return{overridden:true,context:{command,args:nextArgs,options:nextOptions,global:nextGlobal,pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel},warnings:[]}}catch{return{overridden:false,context:{command,args:cloneContextSnapshot(context.args),options:cloneCommandOptionsSnapshot(context.options),global:cloneGlobalOptionsSnapshot(context.global),pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel},warnings:[`extension_parser_override_failed:${matched.layer}:${matched.name}:${matched.command}`]}}}async function runPreflightOverride(preflight,context){const baseContext={command:normalizeCommandName(context.command),args:cloneContextSnapshot(context.args),options:cloneCommandOptionsSnapshot(context.options),global:cloneGlobalOptionsSnapshot(context.global),pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel};const baseDecision=cloneContextSnapshot(context.decision);const matched=[...preflight.overrides].reverse().find(entry=>!entry.commands?.length||entry.commands.includes(baseContext.command));if(!matched){return{overridden:false,context:baseContext,decision:baseDecision,warnings:[]}}try{const delta=await Promise.resolve(matched.run({command:baseContext.command,args:cloneContextSnapshot(baseContext.args),options:cloneCommandOptionsSnapshot(baseContext.options),global:cloneGlobalOptionsSnapshot(baseContext.global),pm_root:baseContext.pm_root,source_workspace_root:baseContext.source_workspace_root,repo_root:baseContext.repo_root,pm_root_rel:baseContext.pm_root_rel,decision:cloneContextSnapshot(baseDecision)}))??{};const nextContext={command:baseContext.command,args:Array.isArray(delta.args)?cloneContextSnapshot(delta.args):baseContext.args,options:delta.options?cloneCommandOptionsSnapshot(delta.options):baseContext.options,global:delta.global?cloneGlobalOptionsSnapshot(delta.global):baseContext.global,pm_root:baseContext.pm_root,source_workspace_root:baseContext.source_workspace_root,repo_root:baseContext.repo_root,pm_root_rel:baseContext.pm_root_rel};const nextDecision={enforce_item_format_gate:typeof delta.enforce_item_format_gate==="boolean"?delta.enforce_item_format_gate:baseDecision.enforce_item_format_gate,run_preflight_item_format_sync:typeof delta.run_preflight_item_format_sync==="boolean"?delta.run_preflight_item_format_sync:baseDecision.run_preflight_item_format_sync,run_extension_migrations:typeof delta.run_extension_migrations==="boolean"?delta.run_extension_migrations:baseDecision.run_extension_migrations,enforce_mandatory_migration_gate:typeof delta.enforce_mandatory_migration_gate==="boolean"?delta.enforce_mandatory_migration_gate:baseDecision.enforce_mandatory_migration_gate};return{overridden:true,context:nextContext,decision:nextDecision,warnings:[]}}catch{return{overridden:false,context:baseContext,decision:baseDecision,warnings:[`extension_preflight_override_failed:${matched.layer}:${matched.name}`]}}}function resolveDefaultServiceResult(context){return{handled:false,result:context.payload,warnings:[]}}function matchingServiceOverrides(services,service){return[...services.overrides].reverse().filter(entry=>entry.service===service)}function buildServiceOverrideContext(context){return{service:context.service,command:context.command?normalizeCommandName(context.command):void 0,args:context.args?cloneContextSnapshot(context.args):void 0,options:context.options?cloneCommandOptionsSnapshot(context.options):void 0,global:context.global?cloneGlobalOptionsSnapshot(context.global):void 0,pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel,payload:cloneContextSnapshot(context.payload)}}function isServiceOverrideDecision(value){if(typeof value!=="object"||value===null||!Object.hasOwn(value,"handled")){return false}const handled=value.handled;return handled===true?Object.hasOwn(value,"result"):handled===false&&Reflect.ownKeys(value).length===1}function resolveServiceOverrideValue(result,context){if(isServiceOverrideDecision(result)){return result.handled?{handled:true,result:result.result}:{handled:false,result:context.payload}}if(context.service==="output_format"&&(result===null||result===void 0)){return{handled:false,result:context.payload}}return{handled:true,result}}function isLegacyOutputPayloadEcho(result,context,serviceContext){return context.service==="output_format"&&typeof result==="object"&&result!==null&&stableValueEquals(result,serviceContext.payload)}function resolveMatchedServiceDecision(matched,decision,warnings){if(!decision.handled){return void 0}if(matched.passThrough===true){warnings.push(`extension_service_pass_through_contract_violated:${matched.layer}:${matched.name}:${matched.service}`);return void 0}return{handled:true,result:decision.result,warnings}}function runServiceOverrideSync(services,context){const matches=matchingServiceOverrides(services,context.service);if(matches.length===0){return resolveDefaultServiceResult(context)}const warnings=[];for(const matched of matches){try{const serviceContext=buildServiceOverrideContext(context);const result=matched.run(serviceContext);if(result instanceof Promise){warnings.push(`extension_service_override_async_unsupported:${matched.layer}:${matched.name}:${matched.service}`);continue}if(isLegacyOutputPayloadEcho(result,context,serviceContext)){warnings.push(`extension_output_format_payload_echo_deprecated:${matched.layer}:${matched.name}`);continue}const resolved=resolveMatchedServiceDecision(matched,resolveServiceOverrideValue(result,context),warnings);if(resolved)return resolved}catch{warnings.push(`extension_service_override_failed:${matched.layer}:${matched.name}:${matched.service}`)}}return{handled:false,result:context.payload,warnings}}async function runServiceOverride(services,context){const matches=matchingServiceOverrides(services,context.service);if(matches.length===0){return resolveDefaultServiceResult(context)}const warnings=[];for(const matched of matches){try{const serviceContext=buildServiceOverrideContext(context);const result=await Promise.resolve(matched.run(serviceContext));if(isLegacyOutputPayloadEcho(result,context,serviceContext)){warnings.push(`extension_output_format_payload_echo_deprecated:${matched.layer}:${matched.name}`);continue}const resolved=resolveMatchedServiceDecision(matched,resolveServiceOverrideValue(result,context),warnings);if(resolved)return resolved}catch{warnings.push(`extension_service_override_failed:${matched.layer}:${matched.name}:${matched.service}`)}}return{handled:false,result:context.payload,warnings}}function runCommandOverride(commands,context){const command=normalizeCommandName(context.command);if(command.length===0){return{overridden:false,result:context.result,warnings:[]}}const matched=[...commands.overrides].reverse().find(entry=>entry.command===command);if(!matched){return{overridden:false,result:context.result,warnings:[]}}try{const overrideOptions=cloneCommandOptionsSnapshot(context.options);const overrideGlobal=cloneGlobalOptionsSnapshot(context.global);const overrideResult=matched.run({command,args:cloneContextSnapshot(context.args),options:overrideOptions,global:overrideGlobal,pm_root:context.pm_root,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel,result:cloneContextSnapshot(context.result)});if(overrideResult instanceof Promise){return{overridden:false,result:context.result,warnings:[`extension_command_override_async_unsupported:${matched.layer}:${matched.name}:${matched.command}`]}}return{overridden:true,result:overrideResult,warnings:[]}}catch{return{overridden:false,result:context.result,warnings:[`extension_command_override_failed:${matched.layer}:${matched.name}:${matched.command}`]}}}function rendererOwnsContext(entry,command,result){if((entry.commands?.length??0)>0&&!entry.commands?.includes(command)){return false}if(entry.resultDiscriminator===void 0){return true}try{return entry.resultDiscriminator(cloneContextSnapshot(result))}catch{return false}}function runRendererOverride(renderers,context){const rendererCommand=typeof context.command==="string"?normalizeCommandName(context.command):"";const matched=[...renderers.overrides].reverse().find(entry=>entry.format===context.format&&rendererOwnsContext(entry,rendererCommand,context.result));if(!matched){return{overridden:false,rendered:null,warnings:[]}}try{const rendererArgs=Array.isArray(context.args)?cloneContextSnapshot(context.args):[];const rendererOptions=cloneCommandOptionsSnapshot(context.options);const rendererGlobal=cloneGlobalOptionsSnapshot(context.global);const rendererPmRoot=typeof context.pm_root==="string"?context.pm_root:"";const rendered=matched.run({format:context.format,command:rendererCommand,args:rendererArgs,options:rendererOptions,global:rendererGlobal,pm_root:rendererPmRoot,source_workspace_root:context.source_workspace_root,repo_root:context.repo_root,pm_root_rel:context.pm_root_rel,result:cloneContextSnapshot(context.result)});if(rendered===null||rendered===void 0){return{overridden:false,rendered:null,warnings:[]}}if(typeof rendered!=="string"){return{overridden:false,rendered:null,warnings:[`extension_renderer_invalid_result:${matched.layer}:${matched.name}:${matched.format}`]}}return{overridden:true,rendered,warnings:[]}}catch{return{overridden:false,rendered:null,warnings:[`extension_renderer_failed:${matched.layer}:${matched.name}:${matched.format}`]}}}export{runAfterCommandHooks,runBeforeCommandHooks,runBeforeMutationHooks,runCommandHandler,runCommandOverride,runOnIndexHooks,runOnReadHooks,runOnWriteHooks,runParserOverride,runPreflightOverride,runRendererOverride,runServiceOverride,runServiceOverrideSync};
|
|
699
2
|
//# sourceMappingURL=extension-hook-runtime.js.map
|
|
700
|
-
//# debugId=d1dd5d4f-5f08-5e52-b109-d066f92ae3b3
|