@unbrained/pm-cli 2026.10.3 → 2026.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +28 -2
- package/dist/cli/after-command-context-usage.js +1 -1
- package/dist/cli/argv-utils.js +1 -1
- package/dist/cli/bootstrap-args.js +1 -1
- package/dist/cli/bundle-integrity.js +2 -2
- package/dist/cli/command-namespaces.js +1 -1
- package/dist/cli/commander-usage.d.ts +1 -1
- package/dist/cli/commander-usage.js +7 -4
- package/dist/cli/commands/annotations/comments.js +1 -1
- package/dist/cli/commands/annotations/docs.js +1 -1
- package/dist/cli/commands/annotations/files.js +1 -1
- package/dist/cli/commands/annotations/learnings.js +1 -1
- package/dist/cli/commands/annotations/notes.js +1 -1
- package/dist/cli/commands/extension/describe.js +1 -1
- package/dist/cli/commands/extension/extension.js +1 -1
- package/dist/cli/commands/extension/scaffold.js +1 -1
- package/dist/cli/commands/extension/shared.js +1 -1
- package/dist/cli/commands/governance/gc.js +1 -1
- package/dist/cli/commands/governance/health.js +1 -1
- package/dist/cli/commands/governance/telemetry.js +1 -1
- package/dist/cli/commands/governance/validate.js +1 -1
- package/dist/cli/commands/history/activity.js +1 -1
- package/dist/cli/commands/history/history-compact.js +1 -1
- package/dist/cli/commands/history/history-redact.js +1 -1
- package/dist/cli/commands/history/history-repair.js +1 -1
- package/dist/cli/commands/history/history.js +1 -1
- package/dist/cli/commands/history/restore.js +1 -1
- package/dist/cli/commands/lifecycle/append.js +1 -1
- package/dist/cli/commands/lifecycle/claim.js +1 -1
- package/dist/cli/commands/lifecycle/close-many.js +1 -1
- package/dist/cli/commands/lifecycle/close.js +1 -1
- package/dist/cli/commands/lifecycle/copy.js +1 -1
- package/dist/cli/commands/lifecycle/create.js +1 -1
- package/dist/cli/commands/lifecycle/delete.js +1 -1
- package/dist/cli/commands/lifecycle/focus.js +1 -1
- package/dist/cli/commands/lifecycle/plan.js +1 -1
- package/dist/cli/commands/lifecycle/update-many.js +1 -1
- package/dist/cli/commands/lifecycle/update.js +1 -1
- package/dist/cli/commands/query/aggregate.js +1 -1
- package/dist/cli/commands/query/context.js +1 -1
- package/dist/cli/commands/query/deps.js +1 -1
- package/dist/cli/commands/query/duplicates.js +1 -1
- package/dist/cli/commands/query/eval.js +1 -1
- package/dist/cli/commands/query/get.js +1 -1
- package/dist/cli/commands/query/graph.js +1 -1
- package/dist/cli/commands/query/list.js +1 -1
- package/dist/cli/commands/query/next.js +1 -1
- package/dist/cli/commands/query/search.js +1 -1
- package/dist/cli/commands/query/stats.js +1 -1
- package/dist/cli/commands/test/test-all.js +1 -1
- package/dist/cli/commands/test/test-runs.js +1 -1
- package/dist/cli/commands/test/test.js +1 -1
- package/dist/cli/commands/workspace/config.js +1 -1
- package/dist/cli/commands/workspace/contracts.js +1 -1
- package/dist/cli/commands/workspace/init.js +1 -1
- package/dist/cli/commands/workspace/merge.js +1 -1
- package/dist/cli/commands/workspace/profile.js +1 -1
- package/dist/cli/commands/workspace/schema.js +1 -1
- package/dist/cli/commands/workspace/upgrade.js +1 -1
- package/dist/cli/context-intent-invocation.js +1 -1
- package/dist/cli/description-stdin.js +1 -1
- package/dist/cli/error-guidance.js +3 -1
- package/dist/cli/extension-command-help.js +5 -3
- package/dist/cli/extension-command-options.js +1 -1
- package/dist/cli/extension-recovery.js +1 -1
- package/dist/cli/help-content.js +5 -2
- package/dist/cli/help-json-payload.js +6 -3
- package/dist/cli/invocation-profile.js +2 -2
- package/dist/cli/main.js +5 -5
- package/dist/cli/migration-gates.js +1 -1
- package/dist/cli/option-values.js +1 -1
- package/dist/cli/public.js +1 -1
- package/dist/cli/register-annotations.js +1 -1
- package/dist/cli/register-assurance.js +1 -1
- package/dist/cli/register-files-lookup.js +1 -1
- package/dist/cli/register-history-activity.js +1 -1
- package/dist/cli/register-history-author.js +1 -1
- package/dist/cli/register-history-maintenance.js +2 -2
- package/dist/cli/register-list-query.js +10 -10
- package/dist/cli/register-mutation-options.js +1 -1
- package/dist/cli/register-mutation.js +2 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli/register-setup.js +1 -1
- package/dist/cli/register-structured-mutation.js +1 -1
- package/dist/cli/registration-helpers.js +1 -1
- package/dist/cli/runtime/activation.js +1 -1
- package/dist/cli/runtime/invocation-options.js +1 -1
- package/dist/cli/runtime/projection-retry.js +1 -1
- package/dist/cli/runtime/selection.js +1 -1
- package/dist/cli/runtime/telemetry-outcome.js +1 -1
- package/dist/cli/runtime-compatibility-boundary.d.ts +1 -1
- package/dist/cli/runtime-compatibility-boundary.js +4 -4
- package/dist/cli/schema/registration.js +2 -2
- package/dist/cli/schema-registration-helpers.js +1 -1
- package/dist/cli/search-refresh.js +1 -1
- package/dist/cli/stats-analytics-json.js +1 -1
- package/dist/cli/telemetry-flush.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +162 -162
- package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
- package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
- package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
- package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
- package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
- package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
- package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
- package/dist/cli-bundle/chunks/chunk-OOLYASYJ.js +2 -0
- package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
- package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-44UGMMQ6.js → chunk-VZ63DEVJ.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
- package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-5XKF5SQV.js → chunk-Z66DWDAU.js} +91 -91
- package/dist/cli-bundle/chunks/{register-list-query-DYCGUQEW.js → register-list-query-75QXHIFH.js} +11 -11
- package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BIYG72P.js → chunk-2CVX3KR3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-DBD4W4QP.js → chunk-ABV67XCC.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-EJN7DY3B.js → chunk-DOVTUKJQ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
- package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
- package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
- package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-XRSCIYHR.js → chunk-YMU42COG.js} +2 -2
- package/dist/cli-bundle/main.js +28 -28
- 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 +32 -32
- 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 +55 -55
- 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 +10 -10
- package/dist/cli.js +1 -1
- package/dist/core/checkpoint/checkpoint-gc.js +1 -1
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
- package/dist/core/config/nested-settings.js +1 -1
- package/dist/core/config/positional-value.js +1 -1
- package/dist/core/diagnostics/remediation.js +1 -1
- package/dist/core/extensions/activation-summary-markdown.js +2 -1
- package/dist/core/extensions/activation-summary.js +1 -1
- package/dist/core/extensions/activation-transaction.js +1 -1
- package/dist/core/extensions/capability-usage.js +1 -1
- package/dist/core/extensions/command-hook-context.js +1 -1
- package/dist/core/extensions/command-metadata-contract.js +1 -1
- package/dist/core/extensions/command-visibility-tier.js +1 -1
- package/dist/core/extensions/contribution-inventory.js +1 -1
- package/dist/core/extensions/exporter-output-contract.js +1 -1
- package/dist/core/extensions/extension-candidate.js +1 -1
- package/dist/core/extensions/extension-capability-aliases.js +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +1 -1
- package/dist/core/extensions/extension-policy.js +1 -1
- package/dist/core/extensions/extension-registries.js +1 -1
- package/dist/core/extensions/extension-runtime-helpers.js +1 -1
- package/dist/core/extensions/extension-types.d.ts +8 -1
- package/dist/core/extensions/extension-types.js +1 -1
- package/dist/core/extensions/flag-definition-validation.js +1 -1
- package/dist/core/extensions/flag-value-types.js +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/item-field-types.js +1 -1
- package/dist/core/extensions/item-fields.js +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/manifest-parser.js +1 -1
- package/dist/core/extensions/manifest-schema.js +1 -1
- package/dist/core/extensions/module-graph-snapshot.js +1 -1
- package/dist/core/extensions/preflight-ownership.js +1 -1
- package/dist/core/extensions/registration-contracts.js +1 -1
- package/dist/core/extensions/registration-validation.js +1 -1
- package/dist/core/extensions/registration-values.js +1 -1
- package/dist/core/extensions/reserved-host-flags.js +1 -1
- package/dist/core/extensions/runtime-registrations.js +1 -1
- package/dist/core/extensions/service-ownership.js +1 -1
- package/dist/core/extensions/version-compat.js +1 -1
- package/dist/core/fs/atomic-create.js +1 -1
- package/dist/core/fs/fs-utils.js +2 -2
- package/dist/core/fs/host-environment-errors.js +1 -1
- package/dist/core/fs/index.js +1 -1
- package/dist/core/fs/path-utils.js +1 -1
- package/dist/core/governance/content-fields.js +1 -1
- package/dist/core/governance/issue-codes.js +1 -1
- package/dist/core/governance/metadata-coverage.js +1 -1
- package/dist/core/history/digest.js +1 -1
- package/dist/core/history/drift-cache.js +3 -3
- package/dist/core/history/drift-scan.d.ts +4 -0
- package/dist/core/history/drift-scan.js +1 -1
- package/dist/core/history/event-classification.js +1 -1
- package/dist/core/history/event-index.js +8 -7
- package/dist/core/history/history-compact-bulk.js +1 -1
- package/dist/core/history/history-diff.js +1 -1
- package/dist/core/history/history-rewrite.js +1 -1
- package/dist/core/history/history-storage-stats.js +1 -1
- package/dist/core/history/history-stream-policy.js +1 -1
- package/dist/core/history/history.js +2 -2
- package/dist/core/history/identity.js +1 -1
- package/dist/core/history/index.js +1 -1
- package/dist/core/history/operation-contract.js +1 -1
- package/dist/core/history/projection.js +1 -1
- package/dist/core/history/read.js +1 -1
- package/dist/core/history/replay.js +2 -1
- package/dist/core/history/tombstone.js +1 -1
- package/dist/core/history/version-address.js +1 -1
- package/dist/core/history/workspace-history.js +2 -2
- package/dist/core/io/body-file.js +1 -1
- package/dist/core/io/bulk-ids-input.js +2 -1
- package/dist/core/item/actionability.js +1 -1
- package/dist/core/item/dependency-reference.js +1 -1
- package/dist/core/item/id.js +1 -1
- package/dist/core/item/index.js +1 -1
- package/dist/core/item/item-format-version.js +1 -1
- package/dist/core/item/item-format.js +6 -4
- package/dist/core/item/item-record.js +1 -1
- package/dist/core/item/item-type-definition.js +1 -1
- package/dist/core/item/parent-reference-policy.js +1 -1
- package/dist/core/item/parse.js +8 -2
- package/dist/core/item/plan-lifecycle.js +1 -1
- package/dist/core/item/priority.js +1 -1
- package/dist/core/item/sprint-release-format.js +1 -1
- package/dist/core/item/status-filter.js +1 -1
- package/dist/core/item/status.js +1 -1
- package/dist/core/item/toon-decode.js +1 -1
- package/dist/core/item/type-registry.js +1 -1
- package/dist/core/item/type-synonyms.js +1 -1
- package/dist/core/lock/index.js +1 -1
- package/dist/core/lock/lock-gc.js +1 -1
- package/dist/core/lock/lock.js +3 -3
- package/dist/core/output/mutation-projection.js +1 -1
- package/dist/core/output/output-control.js +1 -1
- package/dist/core/output/output.js +22 -10
- package/dist/core/output/query-summary.js +1 -1
- package/dist/core/output/tabular.js +3 -1
- package/dist/core/packages/manifest.js +1 -1
- package/dist/core/packages/root.js +1 -1
- package/dist/core/policy/workflow-policy-schema.js +1 -1
- package/dist/core/policy/workflow-policy-store.js +1 -1
- package/dist/core/policy/workflow-policy.js +1 -1
- package/dist/core/profile/profile-describe.js +1 -1
- package/dist/core/profile/profile-lint.js +1 -1
- package/dist/core/profile/profile-plan.js +1 -1
- package/dist/core/profile/profile-presets.js +25 -1
- package/dist/core/reproducibility/context.js +1 -1
- package/dist/core/schema/fields-file.js +2 -2
- package/dist/core/schema/item-types-file.js +2 -2
- package/dist/core/schema/runtime-field-filters.js +1 -1
- package/dist/core/schema/runtime-field-values.js +1 -1
- package/dist/core/schema/runtime-schema.js +2 -2
- package/dist/core/schema/status-defs-file.js +2 -2
- package/dist/core/schema/status-token.js +1 -1
- package/dist/core/schema/type-inference.js +1 -1
- package/dist/core/schema/type-presets.js +1 -1
- package/dist/core/schema/type-workflows.js +1 -1
- package/dist/core/search/background-refresh.js +2 -2
- package/dist/core/search/bm25.js +1 -1
- package/dist/core/search/cache.js +2 -2
- package/dist/core/search/corpus.js +1 -1
- package/dist/core/search/embedding-batches.js +1 -1
- package/dist/core/search/eval-thresholds.js +1 -1
- package/dist/core/search/eval.js +1 -1
- package/dist/core/search/http-client.js +1 -1
- package/dist/core/search/providers.js +1 -1
- package/dist/core/search/relevance.js +1 -1
- package/dist/core/search/semantic-defaults.js +1 -1
- package/dist/core/search/staleness.js +1 -1
- package/dist/core/search/vector-stores.js +2 -2
- package/dist/core/search/vectorization-metadata.js +1 -1
- package/dist/core/sentry/helpers.js +1 -1
- package/dist/core/sentry/instrument.js +1 -1
- package/dist/core/session/session-state.js +1 -1
- package/dist/core/shared/agent-session-context.js +1 -1
- package/dist/core/shared/author.js +5 -1
- package/dist/core/shared/command-line.js +1 -1
- package/dist/core/shared/command-types.js +1 -1
- package/dist/core/shared/conflict-markers.js +1 -1
- package/dist/core/shared/constants.js +1 -1
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/shared/html-entity-decode.js +1 -1
- package/dist/core/shared/index.js +1 -1
- package/dist/core/shared/item-metadata-contract.js +1 -1
- package/dist/core/shared/lazy-module.js +1 -1
- package/dist/core/shared/levenshtein.js +1 -1
- package/dist/core/shared/memo.js +1 -1
- package/dist/core/shared/numeric-parsers.js +1 -1
- package/dist/core/shared/option-alias-visibility.js +1 -1
- package/dist/core/shared/primitives.js +1 -1
- package/dist/core/shared/secret-rules.js +1 -1
- package/dist/core/shared/serial-queue.js +1 -1
- package/dist/core/shared/serialization.js +1 -1
- package/dist/core/shared/split-comma-list.js +1 -1
- package/dist/core/shared/text-normalization.js +1 -1
- package/dist/core/shared/time.js +2 -1
- package/dist/core/store/index.js +1 -1
- package/dist/core/store/item-format-migration.js +1 -1
- package/dist/core/store/item-metadata-cache.js +1 -1
- package/dist/core/store/item-metadata-query-index.js +7 -7
- package/dist/core/store/item-metadata-read-work.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/core/store/paths.js +1 -1
- package/dist/core/store/settings-concurrency.js +1 -1
- package/dist/core/store/settings-read-cache.js +1 -1
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.d.ts +11 -2
- package/dist/core/store/settings.js +3 -3
- package/dist/core/store/tracker-preflight.js +1 -1
- package/dist/core/telemetry/consent.js +2 -2
- package/dist/core/telemetry/observability.js +1 -1
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/read-sampling.js +2 -2
- package/dist/core/telemetry/runtime.js +9 -5
- package/dist/core/test/background-runs.js +3 -3
- package/dist/core/test/item-test-run-tracking.js +1 -1
- package/dist/core/test/run-selectors.js +1 -1
- package/dist/core/validate/estimate-defaults.js +1 -1
- package/dist/core/validate/fix-planning.js +1 -1
- package/dist/core/validate/linked-artifact-reference.js +1 -1
- package/dist/core/validate/missing-by-type.js +1 -1
- package/dist/core/validate/missing-link-owners.js +1 -1
- package/dist/core/validate/stale-file-classification.js +1 -1
- package/dist/mcp/http-server.js +6 -4
- package/dist/mcp/legacy-adapter.js +1 -1
- package/dist/mcp/runtime-capabilities.js +1 -1
- package/dist/mcp/server.js +4 -4
- package/dist/mcp/tool-definitions.js +1 -1
- package/dist/sdk/actionability.js +1 -1
- package/dist/sdk/agent/closed-domain-contracts.js +1 -1
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/agent/command-suggestions.js +1 -1
- package/dist/sdk/agent/create-option-policy.js +1 -1
- package/dist/sdk/agent/identity-config.js +1 -1
- package/dist/sdk/agent/item-addressing.js +1 -1
- package/dist/sdk/agent/refusal-closure-census.js +2 -1
- package/dist/sdk/agent/refusal-closure.js +1 -1
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
- package/dist/sdk/agent/refusal-reachability.js +3 -1
- package/dist/sdk/agent/subcommand-recovery.js +1 -1
- package/dist/sdk/agent/task-transcript-contracts.js +1 -1
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
- package/dist/sdk/agent-capability-contracts.js +3 -1
- package/dist/sdk/agent-session-context.js +1 -1
- package/dist/sdk/annotations.js +1 -1
- package/dist/sdk/author-attribution.js +1 -1
- package/dist/sdk/authoring.js +1 -1
- package/dist/sdk/cli-bootstrap.js +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/command-aliases.js +1 -1
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
- package/dist/sdk/cli-contracts/commander-types.js +1 -1
- package/dist/sdk/cli-contracts/completeness.js +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
- package/dist/sdk/cli-contracts/string-lists.js +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
- package/dist/sdk/cli-contracts.js +1 -1
- package/dist/sdk/cli-program.js +1 -1
- package/dist/sdk/command-line.js +1 -1
- package/dist/sdk/comments.js +1 -1
- package/dist/sdk/compile-cache.js +1 -1
- package/dist/sdk/completion/bash.js +2 -1
- package/dist/sdk/completion/fish.js +13 -7
- package/dist/sdk/completion/shared.js +1 -1
- package/dist/sdk/completion/zsh.js +14 -8
- package/dist/sdk/completion.js +1 -1
- package/dist/sdk/compose.js +1 -1
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/context/recency.js +1 -1
- package/dist/sdk/context/semantic-session-attribution.js +1 -1
- package/dist/sdk/context/usage-egress.js +1 -1
- package/dist/sdk/context/usage-ledger.js +6 -3
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/context-intent-runtime.js +1 -1
- package/dist/sdk/context-packing.js +1 -1
- package/dist/sdk/context-relevance.js +1 -1
- package/dist/sdk/context-signal-store.js +2 -2
- package/dist/sdk/context-usage.js +1 -1
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core-governance.js +1 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/corpus-shape.js +1 -1
- package/dist/sdk/define.js +1 -1
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/dependency-flag-validation.js +1 -1
- package/dist/sdk/dependency-provenance.js +1 -1
- package/dist/sdk/docs.js +1 -1
- package/dist/sdk/duplicates.js +1 -1
- package/dist/sdk/environment/agent-environment.js +1 -1
- package/dist/sdk/environment/host-environment-errors.js +1 -1
- package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
- package/dist/sdk/environment/source-context.js +1 -1
- package/dist/sdk/environment/tracker-preflight.js +1 -1
- package/dist/sdk/error-code-catalog.js +1 -1
- package/dist/sdk/error-runtime.js +1 -1
- package/dist/sdk/errors.js +1 -1
- package/dist/sdk/eval.js +1 -1
- package/dist/sdk/extension/author-manifest.js +1 -1
- package/dist/sdk/extension/bundled-catalog.js +1 -1
- package/dist/sdk/extension/concurrency.js +1 -1
- package/dist/sdk/extension/copy-scope.js +1 -1
- package/dist/sdk/extension/custom-field-collisions.js +1 -1
- package/dist/sdk/extension/describe.js +4 -2
- package/dist/sdk/extension/doctor.js +1 -1
- package/dist/sdk/extension/install-plan.js +1 -1
- package/dist/sdk/extension/install-receipts.js +1 -1
- package/dist/sdk/extension/install-runtime.js +3 -3
- package/dist/sdk/extension/install-snapshot.js +1 -1
- package/dist/sdk/extension/install-sources.js +5 -5
- package/dist/sdk/extension/managed-state.js +2 -2
- package/dist/sdk/extension/migrations.js +2 -2
- package/dist/sdk/extension/output-ownership.js +1 -1
- package/dist/sdk/extension/runtime-summary.js +1 -1
- package/dist/sdk/extension/scaffold.js +11 -4
- package/dist/sdk/extension/shared.js +1 -1
- package/dist/sdk/extension/source-resolution.js +1 -1
- package/dist/sdk/extension/static-inventory.js +1 -1
- package/dist/sdk/extension/update-check.js +1 -1
- package/dist/sdk/extension-command-context.js +1 -1
- package/dist/sdk/extension-contracts.js +1 -1
- package/dist/sdk/extension.js +1 -1
- package/dist/sdk/files.js +1 -1
- package/dist/sdk/flag-invocation-contracts.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/generated-error-code-catalog.js +1 -1
- package/dist/sdk/governance/assurance-action-contracts.js +1 -1
- package/dist/sdk/governance/assurance-action.js +1 -1
- package/dist/sdk/governance/assurance-limits.js +1 -1
- package/dist/sdk/governance/assurance-mutation-error.js +1 -1
- package/dist/sdk/governance/assurance-presets.js +1 -1
- package/dist/sdk/governance/assurance-runtime.js +1 -1
- package/dist/sdk/governance/assurance.js +4 -4
- package/dist/sdk/governance/boundary-fixtures.js +1 -1
- package/dist/sdk/governance/closure-timestamps.js +1 -1
- package/dist/sdk/governance/coverage-assurance.js +1 -1
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
- package/dist/sdk/governance/defect-recurrence.js +1 -1
- package/dist/sdk/governance/extension-host-version.js +1 -1
- package/dist/sdk/governance/gc.js +1 -1
- package/dist/sdk/governance/health-merge-evidence.js +1 -1
- package/dist/sdk/governance/health.js +2 -1
- package/dist/sdk/governance/hierarchy-validation.js +1 -1
- package/dist/sdk/governance/linked-file-report.js +1 -1
- package/dist/sdk/governance/merge-receipt-history.js +1 -1
- package/dist/sdk/governance/provenance-health.js +4 -1
- package/dist/sdk/governance/reindex.js +5 -4
- package/dist/sdk/governance/stale-work.js +1 -1
- package/dist/sdk/governance/status-role-diagnostics.js +1 -1
- package/dist/sdk/governance/storage-integrity.js +1 -1
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
- package/dist/sdk/governance/upgrade.js +2 -2
- package/dist/sdk/governance/validate-history-drift.js +1 -1
- package/dist/sdk/governance/validate-item-reader.js +1 -1
- package/dist/sdk/governance/validate-normalization.js +1 -1
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/governance/workflow-completeness.js +1 -1
- package/dist/sdk/governance/workflow-policy.js +3 -3
- package/dist/sdk/governance/workspace-position.js +2 -1
- package/dist/sdk/governance.js +1 -1
- package/dist/sdk/graph/adapter.js +1 -1
- package/dist/sdk/graph/analytics.js +1 -1
- package/dist/sdk/graph/assembly.js +1 -1
- package/dist/sdk/graph/cache.js +1 -1
- package/dist/sdk/graph/centrality.js +1 -1
- package/dist/sdk/graph/conformance.js +1 -1
- package/dist/sdk/graph/deadline-scheduling.js +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -1
- package/dist/sdk/graph/governance-contracts.js +1 -1
- package/dist/sdk/graph/governance.js +1 -1
- package/dist/sdk/graph/hierarchy-integrity.js +1 -1
- package/dist/sdk/graph/index.js +1 -1
- package/dist/sdk/graph/lifecycle-coverage.js +1 -1
- package/dist/sdk/graph/mutation-advisory.js +1 -1
- package/dist/sdk/graph/query-contracts.js +1 -1
- package/dist/sdk/graph/remediation.js +1 -1
- package/dist/sdk/graph/run.js +1 -1
- package/dist/sdk/graph/scheduling.js +1 -1
- package/dist/sdk/graph/traversal.js +1 -1
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
- package/dist/sdk/graph.js +1 -1
- package/dist/sdk/guide-topics.js +1 -1
- package/dist/sdk/guide.js +8 -1
- package/dist/sdk/history/attestation-command.js +1 -1
- package/dist/sdk/history/attestation-contract.js +1 -1
- package/dist/sdk/history/attestation-scan.js +1 -1
- package/dist/sdk/history/attestation.js +1 -1
- package/dist/sdk/history/maintenance.js +1 -1
- package/dist/sdk/history/salvage.js +3 -2
- package/dist/sdk/history/subject.js +1 -1
- package/dist/sdk/history-analytics.js +1 -1
- package/dist/sdk/history-compact.js +1 -1
- package/dist/sdk/history-mcp.js +1 -1
- package/dist/sdk/history-provenance.js +1 -1
- package/dist/sdk/history-read.js +1 -1
- package/dist/sdk/history-redact.js +1 -1
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/improvement-ledger-validation.js +1 -1
- package/dist/sdk/improvement-ledger.js +2 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/init-agent-guidance.js +16 -2
- package/dist/sdk/init.js +16 -2
- package/dist/sdk/invocation-author.js +1 -1
- package/dist/sdk/item-children.js +1 -1
- package/dist/sdk/item-metadata-index.js +1 -1
- package/dist/sdk/item-schedule.js +1 -1
- package/dist/sdk/item-transaction.js +1 -1
- package/dist/sdk/learnings.js +1 -1
- package/dist/sdk/lifecycle/append.js +4 -2
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/copy.js +1 -1
- package/dist/sdk/lifecycle/create.js +1 -1
- package/dist/sdk/lifecycle/delete.js +1 -1
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
- package/dist/sdk/lifecycle/focus.js +1 -1
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
- package/dist/sdk/lifecycle/mcp-actions.js +1 -1
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
- package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
- package/dist/sdk/lifecycle/plan.js +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
- package/dist/sdk/lifecycle/reopen.js +1 -1
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.js +2 -1
- package/dist/sdk/lifecycle-completion.js +1 -1
- package/dist/sdk/lifecycle-policy.js +1 -1
- package/dist/sdk/linked-artifacts.js +2 -1
- package/dist/sdk/mcp/apps.js +1 -1
- package/dist/sdk/mcp/authorization.js +1 -1
- package/dist/sdk/mcp/discovery.js +1 -1
- package/dist/sdk/mcp/interactions.js +1 -1
- package/dist/sdk/mcp/protocol.js +1 -1
- package/dist/sdk/mcp/skills.js +3 -1
- package/dist/sdk/mcp/subscriptions.js +1 -1
- package/dist/sdk/mcp/tasks.js +2 -2
- package/dist/sdk/mcp/transport.js +1 -1
- package/dist/sdk/merge/abandoned-receipts.js +1 -1
- package/dist/sdk/merge/driver.js +1 -1
- package/dist/sdk/merge/index.js +1 -1
- package/dist/sdk/merge/install.js +4 -2
- package/dist/sdk/merge/receipt-file-boundary.js +1 -1
- package/dist/sdk/merge/receipt-operation.js +1 -1
- package/dist/sdk/merge/receipt-schema.js +1 -1
- package/dist/sdk/merge/receipts.js +4 -4
- package/dist/sdk/merge/reconcile.js +1 -1
- package/dist/sdk/merge/three-way.js +3 -2
- package/dist/sdk/merge/worktree-config.js +1 -1
- package/dist/sdk/merge.js +1 -1
- package/dist/sdk/mutation-events.js +1 -1
- package/dist/sdk/mutation-guard.js +1 -1
- package/dist/sdk/notes.js +1 -1
- package/dist/sdk/output-contracts.js +1 -1
- package/dist/sdk/output-projection.js +1 -1
- package/dist/sdk/output-token-accounting.js +1 -1
- package/dist/sdk/output.js +2 -1
- package/dist/sdk/ownership-source.js +1 -1
- package/dist/sdk/package-import-adapters.js +1 -1
- package/dist/sdk/package-migrations.js +1 -1
- package/dist/sdk/package-runtime-options.js +1 -1
- package/dist/sdk/pagination.js +1 -1
- package/dist/sdk/profile.js +5 -1
- package/dist/sdk/provenance.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -1
- package/dist/sdk/query/aggregate.js +1 -1
- package/dist/sdk/query/calendar.js +4 -1
- package/dist/sdk/query/complete-list.js +1 -1
- package/dist/sdk/query/context.js +2 -1
- package/dist/sdk/query/duplicate-candidates.js +1 -1
- package/dist/sdk/query/get.d.ts +14 -2
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/history.js +1 -1
- package/dist/sdk/query/item-filter-options.js +1 -1
- package/dist/sdk/query/light-metadata.js +1 -1
- package/dist/sdk/query/list-filter-shared.js +1 -1
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/multi-value-filters.js +1 -1
- package/dist/sdk/query/next-ready-budget.js +1 -1
- package/dist/sdk/query/next.js +2 -1
- package/dist/sdk/query/parsers.js +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/query/search/corpus.js +2 -1
- package/dist/sdk/query/search/filters.js +1 -1
- package/dist/sdk/query/search/input.js +1 -1
- package/dist/sdk/query/search/lexical.js +1 -1
- package/dist/sdk/query/search/response.js +1 -1
- package/dist/sdk/query/search/semantic.js +3 -2
- package/dist/sdk/query/search/types.js +1 -1
- package/dist/sdk/query/search-contracts.js +1 -1
- package/dist/sdk/query/search-pagination.d.ts +1 -1
- package/dist/sdk/query/search-pagination.js +1 -1
- package/dist/sdk/query/search-rendering.js +1 -1
- package/dist/sdk/query/search.js +1 -1
- package/dist/sdk/query/workspace-contracts.js +1 -1
- package/dist/sdk/query.js +1 -1
- package/dist/sdk/read-output/continuation.js +1 -1
- package/dist/sdk/read-output/options.js +1 -1
- package/dist/sdk/read-output/provenance.js +1 -1
- package/dist/sdk/read-output-budget.js +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/read-output-rows.js +1 -1
- package/dist/sdk/read-output-session.js +1 -1
- package/dist/sdk/relationship-analytics.js +1 -1
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/relationship-history.js +7 -4
- package/dist/sdk/relationship-kinds/contract.js +1 -1
- package/dist/sdk/relationship-migration.js +1 -1
- package/dist/sdk/relationships.js +1 -1
- package/dist/sdk/reproducibility/process.js +1 -1
- package/dist/sdk/runtime/actions.js +1 -1
- package/dist/sdk/runtime/context.js +1 -1
- package/dist/sdk/runtime/schema-preview.js +1 -1
- package/dist/sdk/runtime/schema.js +1 -1
- package/dist/sdk/runtime-action-aliases.js +1 -1
- package/dist/sdk/runtime-extended-actions.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime-public-contracts.js +1 -1
- package/dist/sdk/runtime-stats-options.js +1 -1
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/scheduling-shortcuts.js +1 -1
- package/dist/sdk/schema-migration.js +4 -3
- package/dist/sdk/schema.js +7 -1
- package/dist/sdk/search-refresh-worker.js +1 -1
- package/dist/sdk/similarity-scoring.js +1 -1
- package/dist/sdk/similarity.js +1 -1
- package/dist/sdk/start-task-status.js +1 -1
- package/dist/sdk/stats.js +1 -1
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/telemetry-flush.js +1 -1
- package/dist/sdk/telemetry.js +4 -3
- package/dist/sdk/templates.js +26 -2
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/entry.js +1 -1
- package/dist/sdk/test/execution.js +6 -5
- package/dist/sdk/test/json-path.js +1 -1
- package/dist/sdk/test/linked-command-detection.js +1 -1
- package/dist/sdk/test/measurements.js +1 -1
- package/dist/sdk/test/parsers.js +1 -1
- package/dist/sdk/test/runs.js +1 -1
- package/dist/sdk/test/trust.js +2 -2
- package/dist/sdk/test/workspace-snapshot.js +1 -1
- package/dist/sdk/testing.js +7 -4
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
- package/dist/sdk/traceability/source-traceability.js +2 -1
- package/dist/sdk/tracker-root-discovery.js +1 -1
- package/dist/sdk/workspace-contracts-cache.js +1 -1
- package/dist/sdk/workspace-contracts.js +1 -1
- package/dist/sdk/workspace-memory.js +2 -2
- package/dist/sdk/workspace-recipe.js +1 -1
- package/dist/sdk/workspace-snapshot.js +5 -4
- package/dist/sdk/workspace-transaction-gc.js +1 -1
- package/dist/sdk/workspace-transaction.js +2 -2
- package/dist/sdk/workspace.js +3 -2
- package/dist/types/index.js +1 -1
- package/dist/types.js +1 -1
- package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +25 -0
- package/docs/GET_READ_EVIDENCE.md +68 -0
- package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
- package/docs/README.md +2 -0
- package/docs/SDK_AUDITED_MUTATIONS.md +35 -0
- package/docs/TESTING.md +8 -0
- package/docs/ecosystem-review-2026-09-28.json +2864 -3157
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +2 -2
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +2 -2
- package/plugins/pm-codex/plugin.json +1 -1
- package/scripts/finalize-build.mjs +3 -2
- package/dist/cli-bundle/chunks/chunk-3AF2R3Y6.js +0 -6
- package/dist/cli-bundle/chunks/chunk-6ST3SCQ6.js +0 -2
- package/dist/cli-bundle/chunks/chunk-6Z4IV2MC.js +0 -8
- package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
- package/dist/cli-bundle/chunks/chunk-FW5LJXQY.js +0 -31
- package/dist/cli-bundle/chunks/chunk-H2DZW6I6.js +0 -3
- package/dist/cli-bundle/chunks/chunk-H7CXQBGQ.js +0 -2
- package/dist/cli-bundle/chunks/chunk-KP7NBQK3.js +0 -80
- package/dist/cli-bundle/chunks/chunk-MKXBCBAN.js +0 -20
- package/dist/cli-bundle/chunks/chunk-QPKQKSQU.js +0 -238
- package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
- package/dist/cli-bundle/chunks/chunk-YCBGZF3T.js +0 -2
- package/dist/cli-bundle/chunks/chunk-YDWKGUQU.js +0 -3
- package/dist/cli-bundle/chunks/register-mutation-5PT3NW3A.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-QDDQOAAV.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-BBX67YMA.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-4FFPGNCJ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-73DA7ISY.js +0 -75
- package/dist/cli-bundle/focused-chunks/chunk-E754JDLY.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-FKK2HI3S.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-GMYUNHST.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-HIA2ZF64.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UTRSM3ZK.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-VVWYI2X7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-WAJNX4RN.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-WCY6HRZO.js +0 -30
- package/dist/cli-bundle/focused-chunks/chunk-YC32ZSLS.js +0 -165
- package/dist/cli-bundle/focused-chunks/chunk-ZIXFMIUL.js +0 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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]="7bda052f-809f-5c09-bb28-ccb56a7f22b7")}catch{}})();import{findInstalledNpmPackageCandidate,parseExtensionInstallSource}from"./install-sources.js";import{resolveBundledExtensionAliasSource,resolveBundledPackageNpmName}from"./bundled-catalog.js";async function resolveExtensionInstallSourceIdentity(explicitSourceInput,githubOption,ref){const bundledAliasSource=typeof githubOption=="string"?null:await resolveBundledExtensionAliasSource(explicitSourceInput),bundledAliasName=bundledAliasSource===null?null:explicitSourceInput.trim().toLowerCase(),bundledPackageName=bundledAliasName===null?null:await resolveBundledPackageNpmName(bundledAliasName),installSource=parseExtensionInstallSource(bundledAliasSource??explicitSourceInput,{forceGithub:typeof githubOption=="string",ref}),installedNpmCandidate=bundledAliasName===null?null:await findInstalledNpmPackageCandidate(explicitSourceInput);return{bundledAliasName,bundledPackageName,installSource,sourceResolution:{requested:explicitSourceInput,selected:{kind:bundledAliasName===null?installSource.kind:"builtin",input:bundledAliasName??installSource.input,...bundledPackageName===null?{}:{package:bundledPackageName}},ambiguous:installedNpmCandidate!==null,precedence:"bundled_alias_before_installed_npm",candidates:[...bundledAliasName===null?[]:[{kind:"builtin",input:bundledAliasName,...bundledPackageName===null?{}:{package:bundledPackageName},command:`pm install ${bundledAliasName}`}],...installedNpmCandidate===null?[]:[{kind:"npm",input:`npm:${installedNpmCandidate.package}`,package:installedNpmCandidate.package,...installedNpmCandidate.version===void 0?{}:{version:installedNpmCandidate.version},directory:installedNpmCandidate.directory,command:`pm install npm:${installedNpmCandidate.package}`}]]}}}export{resolveExtensionInstallSourceIdentity};
|
|
2
2
|
//# sourceMappingURL=source-resolution.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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]="846100a9-4314-5f7c-b892-fa16e09bee5b")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{resolveGlobalPmRoot}from"../../core/store/paths.js";import{normalizeManagedState}from"./managed-state.js";import{normalizeExtensionNameForMatch,normalizeStringList,parseExtensionManifest}from"./shared.js";function isMissing(error){return typeof error=="object"&&error!==null&&"code"in error&&error.code==="ENOENT"}function isTrustedSourceStatus(status){return status!=="invalid"&&status!=="unreadable"}function parseEnablement(raw){const parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new SyntaxError("Invalid settings object");const configured=parsed.extensions;if(configured===void 0)return{enabled:[],disabled:[]};if(typeof configured!="object"||configured===null||Array.isArray(configured))throw new SyntaxError("Invalid extensions settings");const value=configured;if(value.enabled!==void 0&&(!Array.isArray(value.enabled)||!value.enabled.every(entry=>typeof entry=="string"))||value.disabled!==void 0&&(!Array.isArray(value.disabled)||!value.disabled.every(entry=>typeof entry=="string")))throw new SyntaxError("Invalid extension enablement lists");return{enabled:value.enabled??[],disabled:value.disabled??[]}}async function readEnablement(settingsPath){let raw;try{raw=await fs.readFile(settingsPath,"utf8")}catch(error){return isMissing(error)?{status:"absent",enabled:[],disabled:[]}:{status:"unreadable",enabled:[],disabled:[],error:{code:"settings_unreadable",path:settingsPath}}}try{return{status:"ok",...parseEnablement(raw)}}catch{return{status:"invalid",enabled:[],disabled:[],error:{code:"settings_invalid",path:settingsPath}}}}async function readManagedRecords(managedPath){let raw;try{raw=await fs.readFile(managedPath,"utf8")}catch(error){if(isMissing(error))try{if((await fs.stat(path.dirname(managedPath))).isDirectory())return{status:"absent",entries:[]}}catch(parentError){if(isMissing(parentError))return{status:"absent",entries:[]}}return{status:"unreadable",entries:[],error:{code:"managed_state_unreadable",path:managedPath}}}try{const parsed=JSON.parse(raw),normalized=normalizeManagedState(parsed);if(!normalized||typeof parsed!="object"||parsed===null||!Array.isArray(parsed.entries)||normalized.entries.length!==parsed.entries.length)throw new SyntaxError("Invalid managed extension state");return{status:"ok",entries:normalized.entries}}catch{return{status:"invalid",entries:[],error:{code:"managed_state_invalid",path:managedPath}}}}async function readExtensionDirectories(extensionsRoot){try{return{directories:(await fs.readdir(extensionsRoot,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right))}}catch(error){return isMissing(error)?{directories:[]}:{directories:[],error:{code:"extensions_unreadable",path:extensionsRoot}}}}async function readManifest(manifestPath){let raw;try{raw=await fs.readFile(manifestPath,"utf8")}catch(error){return isMissing(error)?{manifest:null,error:{code:"manifest_invalid",path:manifestPath}}:{manifest:null,error:{code:"manifest_unreadable",path:manifestPath}}}try{const manifest=parseExtensionManifest(JSON.parse(raw));return manifest?{manifest}:{manifest:null,error:{code:"manifest_invalid",path:manifestPath}}}catch{return{manifest:null,error:{code:"manifest_invalid",path:manifestPath}}}}function projectConfiguredEntry(input){const name=input.manifest?.name??input.directory,enabled=new Set(normalizeStringList(input.settings.enabled)),disabled=new Set(normalizeStringList(input.settings.disabled)),configuredEnabled=!isTrustedSourceStatus(input.settings.status)||!input.manifest?null:!disabled.has(name)&&(enabled.size===0||enabled.has(name)),managed=isTrustedSourceStatus(input.managed.status)?input.managed.entries.some(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(name)||normalizeExtensionNameForMatch(entry.directory)===normalizeExtensionNameForMatch(input.directory)):null;return{name,directory:input.directory,scope:input.scope,installed:!0,status:input.manifest?configuredEnabled===!1?"inactive":"installed":"malformed_manifest",configured_enabled:configuredEnabled,managed,runtime_active:null,...input.manifest?{version:input.manifest.version}:{}}}async function inspectStaticExtensionInventory(options){const scope=options.scope??"project",selectedRoot=scope==="global"?resolveGlobalPmRoot(options.cwd??process.cwd()):options.pmRoot,extensionsRoot=path.join(selectedRoot,"extensions"),settings=await readEnablement(path.join(selectedRoot,"settings.json")),managed=await readManagedRecords(path.join(extensionsRoot,".managed-extensions.json")),listed=await readExtensionDirectories(extensionsRoot),errors=[];for(const source of[settings,managed,listed])source.error&&errors.push(source.error);const requested=options.name?.trim(),extensions=[];for(const directory of listed.directories){const manifestPath=path.join(extensionsRoot,directory,"manifest.json"),inspected=await readManifest(manifestPath);inspected.error&&errors.push(inspected.error);const entry=projectConfiguredEntry({directory,scope,manifest:inspected.manifest,settings,managed});requested&&![entry.name,directory].some(value=>normalizeExtensionNameForMatch(value)===normalizeExtensionNameForMatch(requested))||extensions.push(entry)}return requested&&extensions.length===0&&errors.every(error=>error.code!=="extensions_unreadable")&&extensions.push({name:requested,directory:null,scope,installed:!1,status:"absent",configured_enabled:isTrustedSourceStatus(settings.status)?!1:null,managed:isTrustedSourceStatus(managed.status)?!1:null,runtime_active:null}),{scope,complete:errors.length===0,settings_status:settings.status,managed_state_status:managed.status,extensions,errors}}export{inspectStaticExtensionInventory};
|
|
2
2
|
//# sourceMappingURL=static-inventory.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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]="eb2ad9e2-8e60-5cac-8874-ab9300621402")}catch{}})();import{nowIso}from"../../core/shared/time.js";import{runGitCommand}from"./install-sources.js";const GITHUB_UPDATE_CHECK_TIMEOUT_MS=1e4,resolveGithubUpdateOutput=(output,installedCommitInput,checkedAt)=>{const references=output.split(/\r?\n/).map(line=>line.trim()).filter(Boolean).map(line=>{const[commit,ref=""]=line.split(/\s+/);return{commit,ref}}),remoteReference=references.find(reference=>reference.ref.endsWith("^{}"))??references[0];if(!remoteReference)return{checked_at:checkedAt,available:null,error:"no_remote_reference_found"};const installedCommit=installedCommitInput?.trim();return installedCommit?{checked_at:checkedAt,remote_commit:remoteReference.commit,available:remoteReference.commit!==installedCommit}:{checked_at:checkedAt,remote_commit:remoteReference.commit,available:null,error:"missing_installed_commit"}},checkGithubUpdate=async(source,gitCommandRunner=runGitCommand)=>{const checkedAt=nowIso();if(source.kind!=="github"||!source.repository)return{checked_at:checkedAt,available:null,error:"not_a_github_managed_source"};try{const ref=[source.ref?.trim(),"HEAD"].find(Boolean),output=await gitCommandRunner(["ls-remote",source.repository,ref,`${ref}^{}`],void 0,GITHUB_UPDATE_CHECK_TIMEOUT_MS);return resolveGithubUpdateOutput(output,source.commit,checkedAt)}catch(error){return{checked_at:checkedAt,available:null,error:error instanceof Error?error.message:String(error)}}};export{checkGithubUpdate};
|
|
2
2
|
//# sourceMappingURL=update-check.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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]="d8f2f0b4-4679-55d2-9336-9f9b9d38067f")}catch{}})();import{createHash}from"node:crypto";import{runActiveOnWriteHooks}from"../core/extensions/index.js";import{mutateWorkspaceJsonWithHistory}from"../core/history/workspace-history.js";import{resolveAuthor}from"../core/shared/author.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{stableValueEquals}from"../core/shared/serialization.js";import{getSettingsPath}from"../core/store/paths.js";import{mergeSettings,readSettings,runWithConfigurationOnlySettings,serializeSettings}from"../core/store/settings.js";import{clearSettingsReadCache}from"../core/store/settings-read-cache.js";import{validateSettings}from"../core/store/settings-validator.js";import{isPmCliExpectedError}from"./errors.js";import{getItemAt}from"./history-read.js";import{RelationshipEventLog,RelationshipEventStore}from"./relationship-history.js";import{analyzeGraphImpact}from"./relationship-analytics.js";import{RelationshipGraph,createRelationshipKindRegistry}from"./relationships.js";import{commitWorkspaceTransaction}from"./workspace-transaction.js";function buildRelationshipKindRegistry(definitions){const registry=createRelationshipKindRegistry();for(const definition of definitions)registry.register(definition);return registry}function createExtensionCommandSdk(pmRoot,client,invocationAuthor,invocationCommand){return{client,isItemNotFoundError:error=>isPmCliExpectedError(error)&&error.exitCode===EXIT_CODE.NOT_FOUND,getItemAt:(id,target)=>getItemAt(id,target,{pmRoot}),openRelationshipEventStore:options=>RelationshipEventStore.open({pmRoot,nodes:options.nodes,registry:buildRelationshipKindRegistry(options.definitions),...options.relativePath===void 0?{}:{relativePath:options.relativePath}}),createRelationshipGraph:options=>new RelationshipGraph(options.nodes,options.edges,buildRelationshipKindRegistry(options.definitions)),analyzeRelationshipImpact:(graph,root,options)=>analyzeGraphImpact(graph,root,options),validateRelationshipEvents:options=>{const log=new RelationshipEventLog(options.nodes,{registry:buildRelationshipKindRegistry(options.definitions)});return options.events.map(event=>log.append({...event,expectedVersion:log.version}))},commitWorkspaceTransaction:options=>commitWorkspaceTransaction({...options,pmRoot}),mutateWorkspaceSettings:async options=>{if(!/^[a-zA-Z0-9._-]{1,128}$/u.test(options.operationId))throw new PmCliError("Workspace settings operationId must be 1-128 letters, digits, dots, underscores, or hyphens.",EXIT_CODE.USAGE);const settings=options.dryRun===!0?await runWithConfigurationOnlySettings(pmRoot,()=>readSettings(pmRoot)):await readSettings(pmRoot);try{const mutation=await mutateWorkspaceJsonWithHistory({pmRoot,filePath:getSettingsPath(pmRoot),op:"extension:pm:settings",idempotencyKey:invocationCommand===void 0?options.operationId:`${createHash("sha256").update(invocationCommand).digest("hex").slice(0,16)}:${options.operationId}`,author:invocationAuthor??resolveAuthor(void 0,settings.author_default),lockTtlSeconds:settings.locks.ttl_seconds,lockWaitMs:settings.locks.wait_ms,recordCreation:!1,dryRun:options.dryRun===!0,mutate:async beforeRaw=>{const current=beforeRaw===null?null:JSON.parse(beforeRaw),validatedCurrent=validateSettings(current);if(!validatedCurrent.success)throw new PmCliError("Workspace settings mutation requires a valid initialized settings.json.",EXIT_CODE.USAGE);const currentSettings=mergeSettings(validatedCurrent.data),next=await options.mutate(structuredClone(currentSettings));if(!validateSettings(next).success)throw new PmCliError("Workspace settings mutation returned invalid settings.json.",EXIT_CODE.USAGE);const raw=stableValueEquals(currentSettings,next)?beforeRaw:serializeSettings(next,{source:{raw:current,validated:validatedCurrent.data}}),validatedResult=validateSettings(JSON.parse(raw));if(!validatedResult.success)throw new PmCliError("Workspace settings mutation serialized invalid settings.json.",EXIT_CODE.USAGE);return{raw,result:options.includePreview===!0?mergeSettings(validatedResult.data):void 0}}});return mutation.changed&&options.dryRun!==!0&&await runActiveOnWriteHooks({path:getSettingsPath(pmRoot),scope:"project",op:"extension:pm:settings"}),{changed:mutation.changed,dry_run:options.dryRun===!0,replayed:mutation.replayed===!0,...mutation.result===void 0?{}:{preview:mutation.result}}}finally{clearSettingsReadCache(pmRoot)}}}}export{createExtensionCommandSdk};
|
|
2
2
|
//# sourceMappingURL=extension-command-context.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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]="3ec1f825-59d1-5ce2-ac76-c628264bd8be")}catch{}})();import{EXTENSION_CAPABILITY_CONTRACT,EXTENSION_CAPABILITY_CONTRACT_VERSION,EXTENSION_CAPABILITY_LEGACY_ALIASES,KNOWN_EXTENSION_CAPABILITIES,KNOWN_EXTENSION_POLICY_MODES,KNOWN_EXTENSION_POLICY_SURFACES,KNOWN_EXTENSION_SANDBOX_PROFILES,KNOWN_EXTENSION_TRUST_MODES}from"../core/extensions/loader.js";import{LIST_COMMANDER_STRING_OPTION_CONTRACTS,SEARCH_COMMANDER_STRING_OPTION_CONTRACTS}from"./cli-contracts/commander-types.js";import{compactFlagAliasContracts,LIST_FILTER_FLAG_CONTRACTS,SEARCH_FLAG_CONTRACTS}from"./cli-contracts/flag-contracts.js";const EXTENSION_CAPABILITIES=KNOWN_EXTENSION_CAPABILITIES,EXTENSION_POLICY_MODES=KNOWN_EXTENSION_POLICY_MODES,EXTENSION_POLICY_SURFACES=KNOWN_EXTENSION_POLICY_SURFACES,EXTENSION_TRUST_MODES=KNOWN_EXTENSION_TRUST_MODES,EXTENSION_SANDBOX_PROFILES=KNOWN_EXTENSION_SANDBOX_PROFILES;function toExtensionFlagDefinition(contract,long,stringOptionKeys,short){const normalizedKey=contract.flag.slice(2).replace(/[-_]([a-z])/gu,(_match,letter)=>letter.toUpperCase()),stringValued=stringOptionKeys.has(normalizedKey);return{long,...short?{short}:{},description:contract.description??`Standard pm ${contract.flag} option.`,...contract.required===!0?{required:!0}:{},...contract.list===!0?{list:!0}:{},...contract.repeatable===!0?{repeatable:!0}:{},value_type:stringValued?"string":"boolean",...stringValued?{value_name:contract.value_name??"value"}:{}}}function toExtensionFlagDefinitions(contracts,stringOptions=[]){const stringOptionKeys=new Set(stringOptions.flatMap(contract=>contract.keys)),definitions=[];for(const contract of compactFlagAliasContracts(contracts.map(entry=>({...entry})))){definitions.push(toExtensionFlagDefinition(contract,contract.flag,stringOptionKeys,contract.short));for(const alias of contract.aliases??[])definitions.push(toExtensionFlagDefinition(contract,alias,stringOptionKeys))}return definitions}const LIST_FILTER_EXTENSION_FLAG_DEFINITIONS=toExtensionFlagDefinitions(LIST_FILTER_FLAG_CONTRACTS,LIST_COMMANDER_STRING_OPTION_CONTRACTS),SEARCH_EXTENSION_FLAG_DEFINITIONS=toExtensionFlagDefinitions(SEARCH_FLAG_CONTRACTS,SEARCH_COMMANDER_STRING_OPTION_CONTRACTS);export{EXTENSION_CAPABILITIES,EXTENSION_CAPABILITY_CONTRACT,EXTENSION_CAPABILITY_CONTRACT_VERSION,EXTENSION_CAPABILITY_LEGACY_ALIASES,EXTENSION_POLICY_MODES,EXTENSION_POLICY_SURFACES,EXTENSION_SANDBOX_PROFILES,EXTENSION_TRUST_MODES,LIST_FILTER_EXTENSION_FLAG_DEFINITIONS,SEARCH_EXTENSION_FLAG_DEFINITIONS,toExtensionFlagDefinitions};
|
|
2
2
|
//# sourceMappingURL=extension-contracts.js.map
|
package/dist/sdk/extension.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4f8fc1a7-748d-559d-9de8-835d0428c6a7")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{activateExtensions,createSerialQueue,loadExtensions,nextExtensionReloadToken}from"../core/extensions/index.js";import{describeExtensionActivation}from"../core/extensions/activation-summary.js";import{createExtensionContributionInventory}from"../core/extensions/contribution-inventory.js";import{resolveExtensionRoots}from"../core/extensions/loader.js";import{pathExists}from"../core/fs/fs-utils.js";import{resolvePmPackageRootFromModule}from"../core/packages/root.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{nowIso}from"../core/shared/time.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../core/store/paths.js";import{readSettings,writeSettings}from"../core/store/settings.js";import{quoteCommandArg,renderPmCommand}from"./command-line.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{ensureTypeFolderScaffold}from"./schema.js";import{normalizeStringList,normalizeExtensionNameForMatch,normalizeManagedDirectoryName,parseExtensionManifest,validateExtensionDirectory}from"./extension/shared.js";import{sortManagedEntries,managedExtensionSourcesEquivalent,readManagedExtensionState,writeManagedExtensionState,upsertManagedEntry,persistManagedContributionInventory,resolveManagedExtensionStatePath}from"./extension/managed-state.js";import{parseExtensionInstallSource,resolveInstallSource,areDirectoriesEquivalent}from"./extension/install-sources.js";import{resolveBundledExtensionAliasSource,isBundledPackageInstallAllTarget,listBundledPackageAliases,resolveBundledAliasManifestName,buildBundledPackageCatalog}from"./extension/bundled-catalog.js";import{scaffoldExtensionProject}from"./extension/scaffold.js";import{buildExtensionDescribeResult}from"./extension/describe.js";import{applyDoctorRuntimeActivationState,classifyDoctorLoadFailureWarnings,classifyDoctorActivationFailureWarnings,classifyUnusedCapabilityWarnings,buildExtensionTriageSummary,parseDoctorDetailMode,collectUnknownCapabilityGuidance,buildCapabilityContractMetadata,buildDoctorConsistencySummary,summarizeExtensionFailures}from"./extension/doctor.js";import{copyExtensionDirectoryForInstall,copyExtensionDirectoryWithoutSelfNesting,ensureExtensionModuleTypeMarker,ensureInstalledExtensionSdkLink,isErrnoCode,isRetriableExtensionInstallCopyError,resolveCanonicalExtensionInstallDestination,withExtensionInstallLock}from"./extension/install-runtime.js";import{mapWithFixedConcurrency}from"./extension/concurrency.js";import{summarizeRuntimeCommandPathsForExtension}from"./extension/runtime-summary.js";import{collectGlobalOutputOverrideDoctorWarnings}from"./extension/output-ownership.js";import{collectMcpCustomFieldCollisionDoctorWarnings}from"./extension/custom-field-collisions.js";import{checkGithubUpdate}from"./extension/update-check.js";import{runExtensionMigrateAction}from"./extension/migrations.js";import{buildBundledInstallReceipt}from"./extension/install-receipts.js";import{buildExtensionInstallPlan}from"./extension/install-plan.js";import{inspectExtensionAuthorManifestAtPmRoot}from"./extension/author-manifest.js";import{resolveExtensionInstallSourceIdentity}from"./extension/source-resolution.js";import{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot}from"./extension/install-snapshot.js";const GITHUB_UPDATE_CHECK_CONCURRENCY=4;const LIFECYCLE_ACTION_TARGETS=[["install","install","--install"],["uninstall","uninstall","--uninstall"],["explore","explore","--explore"],["list","explore","--explore"],["manage","manage","--manage"],["describe","describe","--describe"],["reload","reload","--reload"],["doctor","doctor","--doctor"],["catalog","catalog","--catalog"],["init","init","--init"],["scaffold","init","--scaffold"],["adopt","adopt","--adopt"],["adopt-all","adopt-all","--adopt-all"],["activate","activate","--activate"],["deactivate","deactivate","--deactivate"],["migrate","migrate","--migrate"]];const LIFECYCLE_ACTION_FLAG_HINT=LIFECYCLE_ACTION_TARGETS.map(([,,flag])=>flag).filter((flag,index,flags)=>flags.indexOf(flag)===index).join(", ");const LIFECYCLE_ACTION_FLAGS={install:"--install",uninstall:"--uninstall",explore:"--explore",manage:"--manage",describe:"--describe",reload:"--reload",doctor:"--doctor",catalog:"--catalog",adopt:"--adopt","adopt-all":"--adopt-all",activate:"--activate",deactivate:"--deactivate",migrate:"--migrate",init:"--init"};const NATIVE_OUTPUT_MARKER="__pm_native_output";const EXTENSION_POLICY_ROOT_LIST_FIELDS=["trusted_extensions","allowed_extensions","blocked_extensions","allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"];const EXTENSION_POLICY_OVERRIDE_LIST_FIELDS=["allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"];const EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS=["disabled","require_trusted","require_provenance"];const DEFAULT_EXTENSION_POLICY_DETAILS={mode:"off",trust_mode:"off",require_provenance:false,trusted_extensions:[],default_sandbox_profile:"none",allowed_extensions:[],blocked_extensions:[],allowed_capabilities:[],blocked_capabilities:[],allowed_surfaces:[],blocked_surfaces:[],allowed_commands:[],blocked_commands:[],allowed_actions:[],blocked_actions:[],allowed_services:[],blocked_services:[],extension_overrides:[]};const normalizePolicyRootLists=policy=>{const safePolicy=policy??DEFAULT_EXTENSION_POLICY_DETAILS;const lists={};for(const field of EXTENSION_POLICY_ROOT_LIST_FIELDS){lists[field]=normalizeStringList(safePolicy[field]??[])}return lists};const appendNonEmptyPolicyLists=(target,lists)=>{for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS){if(lists[field].length>0){target[field]=lists[field]}}return target};const appendEnabledPolicyScalars=(target,override)=>{for(const field of EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS){if(override[field]===true){target[field]=true}}if(override.sandbox_profile){target.sandbox_profile=override.sandbox_profile}return target};const normalizePolicyOverrideLists=override=>{const lists={};for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS){lists[field]=normalizeStringList(override[field]??[])}return lists};const buildExtensionPolicyOverrideDetails=override=>{const name=typeof override.name==="string"?override.name.trim():"";if(name.length===0){return null}return appendNonEmptyPolicyLists(appendEnabledPolicyScalars({name},override),normalizePolicyOverrideLists(override))};const normalizeExtensionPolicyOverrides=overrides=>(overrides??[]).map(override=>buildExtensionPolicyOverrideDetails(override)).filter(override=>override!==null).sort((left,right)=>left.name.localeCompare(right.name));const buildExtensionPolicyDetails=policy=>{const safePolicy=Object.assign({},DEFAULT_EXTENSION_POLICY_DETAILS,policy??{});const rootLists=normalizePolicyRootLists(policy);const overrides=normalizeExtensionPolicyOverrides(safePolicy.extension_overrides);return{mode:safePolicy.mode,trust_mode:safePolicy.trust_mode,require_provenance:safePolicy.require_provenance===true,trusted_extensions:rootLists.trusted_extensions,default_sandbox_profile:safePolicy.default_sandbox_profile,allowed_extensions:rootLists.allowed_extensions,blocked_extensions:rootLists.blocked_extensions,allowed_capabilities:rootLists.allowed_capabilities,blocked_capabilities:rootLists.blocked_capabilities,allowed_surfaces:rootLists.allowed_surfaces,blocked_surfaces:rootLists.blocked_surfaces,allowed_commands:rootLists.allowed_commands,blocked_commands:rootLists.blocked_commands,allowed_actions:rootLists.allowed_actions,blocked_actions:rootLists.blocked_actions,allowed_services:rootLists.allowed_services,blocked_services:rootLists.blocked_services,extension_overrides:overrides}};const resolveInstalledExtensionCandidate=async(installed,extensionTarget)=>{const lookupValues=[extensionTarget];const bundledAliasManifestName=await resolveBundledAliasManifestName(extensionTarget);if(bundledAliasManifestName){lookupValues.push(bundledAliasManifestName)}const normalizedLookups=[...new Set(lookupValues.map(value=>normalizeExtensionNameForMatch(value)).filter(value=>value.length>0))];for(const lookup of normalizedLookups){const byName=installed.find(entry=>normalizeExtensionNameForMatch(entry.name)===lookup);if(byName){return byName}const byDirectory=installed.find(entry=>normalizeExtensionNameForMatch(entry.directory)===lookup);if(byDirectory){return byDirectory}}return void 0};const isExtensionEnabled=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));if(disabled.has(normalizedName)){return false}if(enabled.size===0){return true}return enabled.has(normalizedName)};const ensureActivated=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));const previousEnabled=[...enabled];const previousDisabled=[...disabled];disabled.delete(normalizedName);if(enabled.size>0){enabled.add(normalizedName)}settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right));settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right));return settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")};const ensureDeactivated=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));const previousEnabled=[...enabled];const previousDisabled=[...disabled];enabled.delete(normalizedName);disabled.add(normalizedName);settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right));settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right));return settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")};const clearExtensionState=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));const previousEnabled=[...enabled];const previousDisabled=[...disabled];enabled.delete(normalizedName);disabled.delete(normalizedName);settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right));settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right));return settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")};const suggestLifecycleActionTarget=target=>{const normalizedTarget=target.trim().toLowerCase();const maxDistance=Math.min(2,Math.max(1,Math.ceil(normalizedTarget.length/4)));const nearest=LIFECYCLE_ACTION_TARGETS.map(([candidate,action,flag])=>({action,flag,distance:levenshteinDistanceWithinLimit(normalizedTarget,candidate,maxDistance)})).filter(entry=>entry.distance!==null).sort((left,right)=>left.distance-right.distance)[0];return nearest?{action:nearest.action,flag:nearest.flag}:null};const buildUnknownLifecycleActionError=(target,options)=>{const noun=options.vocabulary==="package"?"package":"extension";const suggestion=suggestLifecycleActionTarget(target);if(!suggestion){return new PmCliError(`One action flag is required. Use one of: ${LIFECYCLE_ACTION_FLAG_HINT}. Bare \`pm package\` and \`pm extension\` default to --explore.`,EXIT_CODE.USAGE)}const command=`pm ${noun} ${suggestion.flag}`;return createUnknownSubcommandError({command_path:noun,display_name:`${noun} lifecycle`,token_kind:"action",token:target,allowed:Object.keys(IMPLICIT_EXTENSION_ACTIONS),retry_command:command,message_suffix:`. Did you mean "${suggestion.flag}"?`,fallback_candidates:[{source:"lifecycle_action",command,reason:`nearest lifecycle action for "${target}"`}]})};const EXTENSION_ACTION_FLAG_SELECTORS=[["install","install"],["uninstall","uninstall"],["explore","explore"],["manage","manage"],["describe","describe"],["reload","reload"],["doctor","doctor"],["catalog","catalog"],["init","init"],["scaffold","init"],["adopt","adopt"],["adoptAll","adopt-all"],["activate","activate"],["deactivate","deactivate"],["migrate","migrate"]];const IMPLICIT_EXTENSION_ACTIONS={doctor:"doctor",reload:"reload",catalog:"catalog",init:"init",scaffold:"init",explore:"explore",manage:"manage",migrate:"migrate",list:"explore","":"explore"};const resolveImplicitActionFromTarget=normalizedTarget=>IMPLICIT_EXTENSION_ACTIONS[normalizedTarget]??null;const resolveAction=(target,options)=>{const selected=[...new Set(EXTENSION_ACTION_FLAG_SELECTORS.filter(([flag])=>options[flag]===true).map(([,mappedAction])=>mappedAction))];if(selected.length===0){if(target===void 0){return"explore"}const implicitAction=resolveImplicitActionFromTarget(target.trim().toLowerCase());if(implicitAction){return implicitAction}throw buildUnknownLifecycleActionError(target,options)}if(selected.length>1){throw new PmCliError("Extension action flags are mutually exclusive.",EXIT_CODE.USAGE)}return selected[0]};const resolveScope=options=>{const projectLike=options.project===true||options.local===true;const global2=options.global===true;if(projectLike&&global2){throw new PmCliError('Options "--project/--local" and "--global" are mutually exclusive.',EXIT_CODE.USAGE)}return global2?"global":"project"};const EXTENSION_UPDATE_CHECK_RESOLVERS=[managedEntry=>managedEntry?null:{status:"skipped_unmanaged",reason:"extension_not_managed"},managedEntry=>managedEntry&&managedEntry.source.kind!=="github"?{status:"skipped_non_github",reason:`managed_source_kind_${managedEntry.source.kind}`}:null,managedEntry=>{const updateError=typeof managedEntry?.update_error==="string"?managedEntry.update_error.trim():"";return updateError.length>0?{status:"failed",reason:updateError}:null},managedEntry=>{const entry=managedEntry;const checkedAt=typeof entry.last_update_check_at==="string"?entry.last_update_check_at.trim():"";if(checkedAt.length===0){return null}const reason={true:"update_available",false:"up_to_date"}[String(entry.update_available)]??"checked_without_commit_baseline";return{status:"checked",reason}}];const resolveUpdateCheckResolution=managedEntry=>{for(const resolve of EXTENSION_UPDATE_CHECK_RESOLVERS){const resolution=resolve(managedEntry);if(resolution){return resolution}}return{status:"not_checked",reason:"no_update_check_recorded"}};const buildInstalledExtensionSummary=(identity,scope,managedEntry,updateCheck)=>{const managed=managedEntry??{};return{name:identity.name,directory:identity.directory,version:identity.version,entry:identity.entry,scope,active:identity.enabled,enabled:identity.enabled,runtime_active:null,activation_status:"unknown",contributions:managed.contributions,managed:Boolean(managedEntry),source:managed.source,update_available:managed.update_available,last_update_check_at:managed.last_update_check_at,last_update_remote_commit:managed.last_update_remote_commit,update_error:managed.update_error,update_check_status:updateCheck.status,update_check_reason:updateCheck.reason}};const buildMissingManifestInspection=(directoryName,scope,settings,managedEntry)=>{const managed=Object.assign({name:directoryName,manifest_version:"unknown",manifest_entry:"unknown"},managedEntry);const enabled=managedEntry?isExtensionEnabled(settings,managedEntry.name):false;return{warning:`extension_manifest_missing:${scope}:${directoryName}`,summary:buildInstalledExtensionSummary({name:managed.name,directory:directoryName,version:managed.manifest_version,entry:managed.manifest_entry,enabled},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}};const inspectInstalledExtensionDirectory=async(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory)=>{const extensionDirectory=path.join(extensionsRoot,directoryName);const manifestPath=path.join(extensionDirectory,"manifest.json");const managedDirectoryEntry=managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));if(!await pathExists(manifestPath)){return buildMissingManifestInspection(directoryName,scope,settings,managedDirectoryEntry)}const invalidJson=Symbol("invalid-extension-manifest-json");const rawManifest=await fs.readFile(manifestPath,"utf8").then(contents=>JSON.parse(contents)).catch(()=>invalidJson);if(rawManifest===invalidJson){return{warning:`extension_manifest_invalid_json:${scope}:${directoryName}`}}const manifest=parseExtensionManifest(rawManifest);if(!manifest){return{warning:`extension_manifest_invalid:${scope}:${directoryName}`}}const managedEntry=managedByName.get(normalizeExtensionNameForMatch(manifest.name))??managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));return{summary:buildInstalledExtensionSummary({name:manifest.name,directory:directoryName,version:manifest.version,entry:manifest.entry,enabled:isExtensionEnabled(settings,manifest.name)},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}};const listInstalledExtensions=async(extensionsRoot,scope,settings,state)=>{if(!await pathExists(extensionsRoot)){return{extensions:[],warnings:[]}}const entries=await fs.readdir(extensionsRoot,{withFileTypes:true});const directories=entries.filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right));const managedByName=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.name),managedEntry]));const managedByDirectory=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.directory),managedEntry]));const warnings=[];const summaries=[];for(const directoryName of directories){const inspected=await inspectInstalledExtensionDirectory(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory);if(inspected.warning){warnings.push(inspected.warning)}if(inspected.summary){summaries.push(inspected.summary)}}return{extensions:summaries.sort((left,right)=>left.name.localeCompare(right.name)),warnings:warnings.sort((left,right)=>left.localeCompare(right))}};const extensionRuntimeProbeQueue=createSerialQueue();const resolveCommandDiscoveryPackageName=(extensionName,source)=>[source.package,source.kind==="builtin"?source.name:void 0].find(candidate=>candidate?.trim())?.trim()??extensionName;const buildInstallCommandDiscovery=(extensionName,source,commandSummary,activationFailure)=>{const helpCommands=commandSummary.command_paths.map(commandPath=>`pm ${commandPath} --help`);const sdkDependencyMissing=activationFailure?.error.toLowerCase().includes("@unbrained/pm-cli")===true;const nextSteps=commandSummary.command_paths.length>0?[...helpCommands]:["Run pm package doctor --project --detail deep if expected package commands are missing."];if(sdkDependencyMissing){nextSteps.unshift("Install @unbrained/pm-cli in the target workspace so declarative package runtime imports resolve, then reinstall the package.")}return{package_name:resolveCommandDiscoveryPackageName(extensionName,source),extension_name:extensionName,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,help_commands:helpCommands,next_steps:nextSteps,...sdkDependencyMissing?{sdk_dependency_status:"missing"}:{}}};const summarizeActivationFailureForDiagnostics=failure=>{const trace=failure.trace;const summary={layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error};if(!trace)return summary;summary.trace=Object.fromEntries(Object.entries(trace).filter(([,value])=>value!==void 0));if(trace.missing_capability){summary.missing_capability=trace.missing_capability}if(trace.hint)summary.hint=trace.hint;return summary};const collectActivationFailureDiagnostics=failures=>{return failures.map(failure=>summarizeActivationFailureForDiagnostics(failure)).sort((left,right)=>`${left.layer}:${left.name}`.localeCompare(`${right.layer}:${right.name}`))};const findActivationFailureByName=(extensionName,failures,layer)=>{const normalizedName=normalizeExtensionNameForMatch(extensionName);return failures.find(failure=>(layer===void 0||failure.layer===layer)&&normalizeExtensionNameForMatch(failure.name)===normalizedName)};const resolveInstallRuntimeActivationStatus=(extensionName,scope,runtimeInstalled,installActivationFailure)=>{const runtimeInstalledExtension=runtimeInstalled.find(entry=>entry.scope===scope&&normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName));return runtimeInstalledExtension?.activation_status??(installActivationFailure?"failed":"unknown")};const probeRuntimeCommandPathsForInstall=(pmRoot,parent,settings,refreshedInstalled,global2)=>{return extensionRuntimeProbeQueue.enqueue(async()=>{const originalPackageRoot=process.env.PM_CLI_PACKAGE_ROOT;const snapshotRoot=await fs.mkdtemp(path.join(parent,".pm-module-graph-"));process.env.PM_CLI_PACKAGE_ROOT=resolvePmPackageRootFromModule(import.meta.url,["../.."]);try{const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===true,reload_token:nextExtensionReloadToken(),cache_bust:true,module_graph_snapshot_root:snapshotRoot});const activationResult=await activateExtensions({...loadResult});const runtimeFailures=[...loadResult.failed.map(failure=>({layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error})),...collectActivationFailureDiagnostics(activationResult.failed)];const contributionInventories=Object.fromEntries(loadResult.loaded.map(extension=>[normalizeExtensionNameForMatch(extension.name),createExtensionContributionInventory(describeExtensionActivation(activationResult,{extensionName:extension.name}))]));return{installed:applyDoctorRuntimeActivationState(refreshedInstalled,loadResult,activationResult),warnings:[...loadResult.warnings,...activationResult.warnings],activation_failures:runtimeFailures,extensions_disabled:loadResult.disabled_by_flag,item_type_registrations:activationResult.registrations.item_types,contribution_inventories:contributionInventories}}finally{await fs.rm(snapshotRoot,{recursive:true,force:true});if(originalPackageRoot===void 0){delete process.env.PM_CLI_PACKAGE_ROOT}else{process.env.PM_CLI_PACKAGE_ROOT=originalPackageRoot}}})};const adoptUnmanagedExtensions=async(extensionsRoot,scope,installedExtensions,state)=>{const unmanagedCandidates=installedExtensions.filter(entry=>!entry.managed);const sortedCandidates=[...unmanagedCandidates].sort((left,right)=>{const byName=left.name.localeCompare(right.name);if(byName!==0){return byName}return left.directory.localeCompare(right.directory)});let nextState=state;const adoptedEntries=[];for(const candidate of sortedCandidates){const extensionDirectory=path.join(extensionsRoot,candidate.directory);const validated=await validateExtensionDirectory(extensionDirectory);const now=nowIso();const sourceRecord={kind:"local",input:candidate.name,location:extensionDirectory};nextState=upsertManagedEntry(nextState,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord});adoptedEntries.push({name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry,source:sourceRecord})}if(adoptedEntries.length>0){await writeManagedExtensionState(extensionsRoot,nextState)}return{state:nextState,adopted_entries:adoptedEntries,unmanaged_candidates:sortedCandidates,already_managed_count:installedExtensions.length-unmanagedCandidates.length}};const resolveExtensionRootsForScope=(scope,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path);const roots=resolveExtensionRoots(pmRoot,process.cwd());const settingsRoot=scope==="global"?resolveGlobalPmRoot(process.cwd()):pmRoot;const selectedRoot=scope==="global"?roots.global:roots.project;return{pm_root:pmRoot,scope,settings_root:settingsRoot,selected_root:selectedRoot,roots}};const resolveGithubOption=options=>{const values=[options.gh,options.github].filter(value=>typeof value==="string").map(value=>value.trim()).filter(Boolean);const uniqueValues=[...new Set(values)];if(uniqueValues.length>1){throw new PmCliError('Options "--gh" and "--github" must match when both are provided.',EXIT_CODE.USAGE)}return uniqueValues[0]};const getLifecycleActionFlag=action=>{return LIFECYCLE_ACTION_FLAGS[action]};const throwMissingLifecycleTarget=(action,options)=>{const noun=options.vocabulary==="package"?"package":"extension";const targetName=action==="install"?"source":"name";const targetLabel=`${noun} ${targetName}`;const actionFlag=getLifecycleActionFlag(action);const commandTarget=`<${targetName}>`;const command=`pm ${noun} ${actionFlag} ${commandTarget}`;throw new PmCliError(`Action "${action}" requires ${targetLabel} input.`,EXIT_CODE.USAGE,{code:"missing_lifecycle_target",required:`Provide a ${targetName} target for ${action}.`,examples:[`pm ${noun} ${action} ${commandTarget}`,command,`pm ${noun} --help`],recovery:{attempted_command:`pm ${noun} ${action}`,suggested_retry:command,fallback_candidates:[{source:"lifecycle_action",command,reason:`flag-form ${action} command with required ${targetName} target`}]}})};const requireTarget=(target,action,options={})=>{const normalized=target?.trim();if(normalized)return normalized;if(action==="init"){throw new PmCliError('Action "init" requires a scaffold target path (for example: pm package init ./my-package or pm extension init ./my-extension).',EXIT_CODE.USAGE)}return throwMissingLifecycleTarget(action,options)};const collectSchemaNarrowActivationDoctorWarnings=(loadResult,activationResult)=>{const schemaContributors=new Set([...activationResult.registrations.item_types.map(entry=>({entry,count:entry.types.length})),...activationResult.registrations.item_fields.map(entry=>({entry,count:entry.fields.length}))].filter(({count})=>count>0).map(({entry})=>`${entry.layer}:${normalizeExtensionNameForMatch(entry.name)}`));return loadResult.loaded.filter(extension=>(extension.activation?.commands??[]).length>0).filter(extension=>schemaContributors.has(`${extension.layer}:${normalizeExtensionNameForMatch(extension.name)}`)).map(extension=>`extension_schema_narrow_activation:${extension.layer}:${extension.name}`).filter((warning,index,warnings)=>warnings.indexOf(warning)===index).sort((left,right)=>left.localeCompare(right))};const assertExtensionActionOptionScope=(action,options)=>{const guards=[{triggered:options.strictExit===true||options.failOnWarn===true,allowed:action==="doctor",message:"--strict-exit and --fail-on-warn are only valid with --doctor."},{triggered:options.trace===true,allowed:action==="doctor",message:"--trace is only valid with --doctor."},{triggered:options.watch===true,allowed:action==="reload",message:"--watch is only valid with --reload."},{triggered:options.runtimeProbe===true,allowed:action==="manage",message:"--runtime-probe is only valid with --manage."},{triggered:options.fixManagedState===true,allowed:action==="manage"||action==="doctor",message:"--fix-managed-state is only valid with --manage or --doctor."},{triggered:options.isolated===true||options.ignoreGlobal===true,allowed:action==="doctor",message:"--isolated and --ignore-global are only valid with --doctor."},{triggered:options.capability!==void 0,allowed:action==="init",message:"--capability is only valid with --init/--scaffold."},{triggered:options.declarative===true,allowed:action==="init",message:"--declarative is only valid with --init/--scaffold."},{triggered:options.dryRun===true,allowed:action==="migrate"||action==="install",message:"--dry-run is only valid with --migrate or --install."}];const invalidGuard=guards.find(guard=>guard.triggered&&!guard.allowed);if(invalidGuard){throw new PmCliError(invalidGuard.message,EXIT_CODE.USAGE)}};const resolveNormalizedExtensionTarget=(target,action,options)=>{const normalizedInput=String(target??"").trim().toLowerCase();const explicitInitAction=[options.init,options.scaffold].includes(true);const aliases={doctor:["doctor"],reload:["reload"],catalog:["catalog"],init:explicitInitAction?[]:["init","scaffold"]};return(aliases[action]??[]).includes(normalizedInput)?void 0:target};const resolveExtensionResultRoots=ctx=>{const projectedCatalog=[ctx.action==="catalog",typeof ctx.options.fields==="string",String(ctx.options.fields).trim().length>0].every(Boolean);return projectedCatalog?{project:"project",global:"global",selected:ctx.scope,settings_root:"project"}:{project:ctx.resolvedRoots.roots.project,global:ctx.resolvedRoots.roots.global,selected:ctx.resolvedRoots.selected_root,settings_root:ctx.resolvedRoots.settings_root}};const buildExtensionActionResult=(ctx,details,ok)=>{const result={ok,action:ctx.action,scope:ctx.scope,roots:resolveExtensionResultRoots(ctx),warnings:[...new Set(ctx.warnings)].sort((left,right)=>left.localeCompare(right)),details};if(ctx.action==="doctor"){Object.defineProperty(result,NATIVE_OUTPUT_MARKER,{value:true,enumerable:false,configurable:false})}return result};const runExtension=async(target,options,global2)=>{const action=resolveAction(target,options);assertExtensionActionOptionScope(action,options);const normalizedTarget=resolveNormalizedExtensionTarget(target,action,options);const scope=resolveScope(options);const resolvedRoots=resolveExtensionRootsForScope(scope,global2);const warnings=[];const actionContext={action,normalizedTarget,scope,resolvedRoots,warnings,options,global:global2};const withResult=(details,ok=true)=>buildExtensionActionResult(actionContext,details,ok);const ctx={...actionContext,withResult};return await dispatchExtensionAction(ctx)};const buildExtensionScaffoldNextSteps=(scaffold,options)=>{const vocabulary=options.vocabulary??"extension";const shellTargetPath=scaffold.target_path.replace(/\\/g,"/");const quotedShellTargetPath=quoteCommandArg(shellTargetPath);const dependencySteps={package:`Install dependencies: cd ${quotedShellTargetPath}, then run "npm install"`,extension:`Install type-check dependencies: cd ${quotedShellTargetPath}, then run "npm install -D typescript @types/node @unbrained/pm-cli"`};const validationSteps={package:`Validate the package: cd ${quotedShellTargetPath}, then run "npm run typecheck" and "npm test"`,extension:`Type-check the source (optional): cd ${quotedShellTargetPath}, then run "npx tsc --noEmit"`};const declarativeGuidance=[];if([vocabulary==="package",options.declarative===true].every(Boolean)){declarativeGuidance.push("Ensure the target workspace can resolve @unbrained/pm-cli before installing this declarative package.")}return[dependencySteps[vocabulary],...declarativeGuidance,`Install the scaffold: ${renderPmCommand(vocabulary==="package"?["install","--project",shellTargetPath]:["extension","--install","--project",shellTargetPath])}`,`Smoke-test command path: pm ${scaffold.command_name}`,validationSteps[vocabulary],`Run diagnostics: ${vocabulary==="package"?"pm package doctor":"pm extension --doctor"} --project --detail summary`]};const runExtensionInitAction=async ctx=>{const{action,normalizedTarget,options,withResult}=ctx;const githubOption=resolveGithubOption(options);const disallowedSourceOptions=[githubOption,options.ref].filter(value=>typeof value==="string").map(value=>value.trim()).filter(Boolean);if(disallowedSourceOptions.length>0){throw new PmCliError('Action "init" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE)}const scaffoldTarget=requireTarget(normalizedTarget,action,options);const scaffold=await scaffoldExtensionProject(scaffoldTarget,options.vocabulary??"extension",options.capability,options.declarative===true);return withResult({scaffolded:scaffold.created_directory||scaffold.files.some(entry=>entry.status==="created"),extension:{name:scaffold.extension_name,command:scaffold.command_name},capability:scaffold.capability,style:scaffold.style,target_path:scaffold.target_path,created_directory:scaffold.created_directory,files:scaffold.files,next_steps:buildExtensionScaffoldNextSteps(scaffold,options)})};const runExtensionReloadAction=async ctx=>{const{normalizedTarget,resolvedRoots,warnings,options,global:global2,withResult}=ctx;if(normalizedTarget!==void 0){throw new PmCliError('Action "reload" does not accept a target argument.',EXIT_CODE.USAGE)}const settings=await readSettings(resolvedRoots.settings_root);const reloadToken=nextExtensionReloadToken();const reloaded=await loadExtensions({pmRoot:resolvedRoots.settings_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions,reload_token:reloadToken,cache_bust:true});warnings.push(...reloaded.warnings);const activation=await activateExtensions(reloaded);warnings.push(...activation.warnings);const details={reload:{token:reloadToken,cache_bust:true,watch:options.watch===true},loaded_count:reloaded.loaded.length,failed_count:reloaded.failed.length,activated_count:Math.max(0,reloaded.loaded.length-activation.failed.length),activation_failed_count:activation.failed.length,loaded_extensions:reloaded.loaded.map(entry=>({name:entry.name,layer:entry.layer,version:entry.version})),failed_extensions:reloaded.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error})),activation_failures:activation.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error}))};if(options.watch===true){warnings.push("extension_reload_watch_hint:watch_mode_requested_non_interactive_single_pass_only")}return withResult(details)};const runExtensionCatalogAction=async ctx=>{const{normalizedTarget,scope,options,global:global2,withResult}=ctx;if(typeof normalizedTarget==="string"&&normalizedTarget.length>0&&normalizedTarget!=="catalog"){throw new PmCliError('Action "catalog" does not accept a package target.',EXIT_CODE.USAGE)}return withResult(await buildBundledPackageCatalog(scope,global2,options))};const buildBundledInstallManagedSource=(alias,packageName)=>({kind:"builtin",input:alias,location:alias,name:alias,...packageName===null?{}:{package:packageName}});const buildLocalInstallManagedSource=source=>({kind:"local",input:source.input,location:source.absolute_path});const buildNpmInstallManagedSource=(source,resolved)=>({kind:"npm",input:source.input,location:resolved.resolved_subpath??".",package:resolved.npm_package,version:resolved.npm_version});const buildGithubInstallManagedSource=(source,resolved)=>({kind:"github",input:source.input,location:resolved.resolved_subpath??source.subpath??".",repository:source.repository,owner:source.owner,repo:source.repo,ref:source.ref,subpath:resolved.resolved_subpath??source.subpath,commit:resolved.commit});const buildInstallManagedSource=(bundledAliasName,bundledPackageName,installSource,resolvedSource)=>{if(bundledAliasName){return buildBundledInstallManagedSource(bundledAliasName,bundledPackageName)}if(installSource.kind==="local"){return buildLocalInstallManagedSource(installSource)}if(installSource.kind==="npm"){return buildNpmInstallManagedSource(installSource,resolvedSource)}return buildGithubInstallManagedSource(installSource,resolvedSource)};const resolveManagedInstallTimestamps=(existing,manifestVersion,source,now)=>{if(!existing)return{installed_at:now,updated_at:now};if(existing.manifest_version!==manifestVersion){return{installed_at:existing.installed_at,updated_at:now}}if(!managedExtensionSourcesEquivalent(existing.source,source)){return{installed_at:existing.installed_at,updated_at:now}}return{installed_at:existing.installed_at,updated_at:existing.updated_at}};const persistExtensionInstall=async(ctx,input)=>{const{scope,resolvedRoots,warnings}=ctx;const{validated,destinationDirectoryName}=input;const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const destinationDirectory=path.join(resolvedRoots.selected_root,destinationDirectoryName);const destinationExists=await pathExists(destinationDirectory);const installInPlace=await areDirectoriesEquivalent(validated.directory,destinationDirectory);await fs.mkdir(resolvedRoots.selected_root,{recursive:true});const backupRoot=await fs.mkdtemp(path.join(resolvedRoots.selected_root,".pm-extension-install-backup-"));const backupDirectory=path.join(backupRoot,"destination");try{const snapshot=await captureExtensionInstallSnapshot(resolvedRoots.selected_root,resolvedRoots.settings_root,destinationDirectory,destinationExists,backupDirectory);const sourceRecord=buildInstallManagedSource(input.bundledAliasName,input.bundledPackageName,input.installSource,input.resolvedSource);const existingManagedEntry=managedStateRead.state.entries.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name));const timestamps=resolveManagedInstallTimestamps(existingManagedEntry,validated.manifest.version,sourceRecord,nowIso());const managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:destinationDirectoryName,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,...timestamps,source:sourceRecord});const activationChanged=ensureActivated(settings,validated.manifest.name);try{if(!installInPlace){await copyExtensionDirectoryForInstall(validated.directory,destinationDirectory)}await ensureExtensionModuleTypeMarker(destinationDirectory);await ensureInstalledExtensionSdkLink(destinationDirectory);await writeManagedExtensionState(resolvedRoots.selected_root,managedState);if(activationChanged){await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}}catch(error){try{await restoreExtensionInstallSnapshot(snapshot)}catch(rollbackError){throw new AggregateError([error,rollbackError],`Extension install failed: ${String(error)}; rollback failed: ${String(rollbackError)}`,{cause:rollbackError})}throw error}return{settings,managedState,sourceRecord,destinationDirectory,destinationExists,installInPlace,activationChanged}}finally{await fs.rm(backupRoot,{recursive:true,force:true}).catch(()=>void 0)}};const scaffoldInstalledExtensionItemTypes=async(ctx,extensionName,registrations)=>{const definitions=registrations.filter(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName)).flatMap(entry=>entry.types.map(type=>({name:type.name,folder:type.folder})));if(ctx.scope==="project"&&definitions.length>0){await ensureTypeFolderScaffold(ctx.resolvedRoots.pm_root,definitions,ctx.warnings,"install:type-folder")}return definitions};const buildInstalledExtensionActivation=(ctx,extensionName,runtimeProbe,commandSummary,installedItemTypes)=>{const failure=findActivationFailureByName(extensionName,runtimeProbe.activation_failures,ctx.scope);const status=resolveInstallRuntimeActivationStatus(extensionName,ctx.scope,runtimeProbe.installed,failure);const activated=[!runtimeProbe.extensions_disabled,status==="ok"].every(Boolean);if(!activated){ctx.warnings.push(`extension_install_activation_failed:${ctx.scope}:${extensionName}:${status}`)}const healthByActivation={true:{status:"ok",blocking_failure_count:0},false:{status:"degraded",blocking_failure_count:1}};return{activated,status,failure,verification:{status:healthByActivation[String(activated)].status,target_pm_root:ctx.resolvedRoots.pm_root,activation_status:status,activated,registered_commands:commandSummary.command_paths,registered_actions:commandSummary.action_paths,registered_item_types:installedItemTypes,module_graph_verification:"fresh_in_topology_snapshot",health:healthByActivation[String(activated)]}}};const performExtensionInstallUnderLock=async(ctx,input)=>{const{scope,resolvedRoots,warnings,global:global2,withResult}=ctx;const{validated,destinationDirectoryName}=input;const persisted=await persistExtensionInstall(ctx,input);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,persisted.settings,persisted.managedState);warnings.push(...refreshedInstalled.warnings);const runtimeProbe=await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),persisted.settings,refreshedInstalled.extensions,global2);warnings.push(...runtimeProbe.warnings);const installedItemTypeDefinitions=await scaffoldInstalledExtensionItemTypes(ctx,validated.manifest.name,runtimeProbe.item_type_registrations);const commandSummary=summarizeRuntimeCommandPathsForExtension(validated.manifest.name,runtimeProbe.installed);const activation=buildInstalledExtensionActivation(ctx,validated.manifest.name,runtimeProbe,commandSummary,installedItemTypeDefinitions);const contributionInventory=runtimeProbe.contribution_inventories[normalizeExtensionNameForMatch(validated.manifest.name)];if(contributionInventory){persisted.managedState=await persistManagedContributionInventory(resolvedRoots.selected_root,persisted.managedState,validated.manifest.name,contributionInventory)}return withResult({extension:{name:validated.manifest.name,version:validated.manifest.version,entry:validated.manifest.entry,capabilities:validated.manifest.capabilities,directory:destinationDirectoryName},source:persisted.sourceRecord,source_resolution:input.sourceResolution,...input.installPlan?{install_plan:input.installPlan}:{},destination_path:persisted.destinationDirectory,overwritten:[persisted.destinationExists,!persisted.installInPlace].every(Boolean),installed_in_place:persisted.installInPlace,activated:activation.activated,settings_changed:persisted.activationChanged,runtime_activation_status:activation.status,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,contributions:contributionInventory,command_discovery:buildInstallCommandDiscovery(validated.manifest.name,persisted.sourceRecord,commandSummary,activation.failure),verification:activation.verification,activation_diagnostics:{failed_count:runtimeProbe.activation_failures.length,failed:runtimeProbe.activation_failures,installed_extension_failed:activation.failure??null}},activation.activated)};const runBundledExtensionInstallAll=async ctx=>{const{options,global:global2,warnings,withResult}=ctx;if(typeof options.ref==="string"&&options.ref.trim().length>0){throw new PmCliError('Action "install all" does not accept --ref.',EXIT_CODE.USAGE)}const packages=[];const installedSources=new Map;for(const alias of await listBundledPackageAliases()){const source=await resolveBundledExtensionAliasSource(alias);const sourceKey=path.resolve(source);let result=installedSources.get(sourceKey);if(result===void 0){result=await runExtension(alias,{...options,install:true},global2);installedSources.set(sourceKey,result)}packages.push({alias,result})}warnings.push(...packages.flatMap(entry=>entry.result.warnings));return withResult(buildBundledInstallReceipt(packages,options.dryRun===true),packages.every(entry=>entry.result.ok))};const runSingleExtensionInstall=async(ctx,explicitSourceInput,githubOption)=>{const{resolvedRoots}=ctx;const{bundledAliasName,bundledPackageName,installSource,sourceResolution}=await resolveExtensionInstallSourceIdentity(explicitSourceInput,githubOption,ctx.options.ref);if(sourceResolution.ambiguous){const npmCandidate=sourceResolution.candidates.find(candidate=>candidate.kind==="npm");ctx.warnings.push(`extension_install_source_ambiguous:${explicitSourceInput}:builtin:${bundledAliasName}:npm:${npmCandidate.package}`)}const resolvedSource=await resolveInstallSource(installSource);try{const validated=await validateExtensionDirectory(resolvedSource.directory,{source_kind:installSource.kind,source_input:installSource.input,source_root:resolvedSource.source_root});const destinationDirectoryName=normalizeManagedDirectoryName(validated.manifest.name);const installPlan=ctx.options.dryRun===true||installSource.kind==="local"&&bundledAliasName===null?await buildExtensionInstallPlan(resolvedSource,path.join(resolvedRoots.selected_root,destinationDirectoryName),ctx.scope,ctx.options.copyPlan):void 0;if(ctx.options.dryRun===true){return ctx.withResult({dry_run:true,installed:false,activated:false,extension:{name:validated.manifest.name,version:validated.manifest.version},source_resolution:sourceResolution,install_plan:installPlan})}return await withExtensionInstallLock(resolvedRoots.settings_root,destinationDirectoryName,()=>performExtensionInstallUnderLock(ctx,{validated,destinationDirectoryName,bundledAliasName,bundledPackageName,sourceResolution,installSource,resolvedSource,installPlan}))}finally{if(resolvedSource.cleanup){await resolvedSource.cleanup()}}};const runExtensionInstallAction=async ctx=>{const githubOption=resolveGithubOption(ctx.options);const explicitSourceInput=githubOption??requireTarget(ctx.normalizedTarget,ctx.action,ctx.options);if([githubOption===void 0,isBundledPackageInstallAllTarget(explicitSourceInput)].every(Boolean)){return runBundledExtensionInstallAll(ctx)}return runSingleExtensionInstall(ctx,explicitSourceInput,githubOption)};const runExtensionAdoptAllAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx;if(normalizedTarget!==void 0){throw new PmCliError('Action "adopt-all" does not accept a target argument.',EXIT_CODE.USAGE)}const githubOption=resolveGithubOption(options);if(githubOption!==void 0||typeof options.ref==="string"&&options.ref.trim().length>0){throw new PmCliError('Action "adopt-all" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE)}const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const adoption=await adoptUnmanagedExtensions(resolvedRoots.selected_root,scope,installed.extensions,managedStateRead.state);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,adoption.state);warnings.push(...refreshedInstalled.warnings);const triage=buildExtensionTriageSummary(scope,warnings,refreshedInstalled.extensions,options);warnings.push(...triage.warnings);const refreshedByIdentity=new Map(refreshedInstalled.extensions.map(entry=>[`${normalizeExtensionNameForMatch(entry.name)}:${normalizeExtensionNameForMatch(entry.directory)}`,entry]));const refreshedByDirectory=new Map(refreshedInstalled.extensions.map(entry=>[normalizeExtensionNameForMatch(entry.directory),entry]));const adoptedDetails=adoption.adopted_entries.map(entry=>{const normalizedDirectory=normalizeExtensionNameForMatch(entry.directory);const refreshedEntry=refreshedByIdentity.get(`${normalizeExtensionNameForMatch(entry.name)}:${normalizedDirectory}`)??refreshedByDirectory.get(normalizedDirectory);return{...entry,...projectExtensionUpdateCheck(refreshedEntry)}});return withResult({adopted_all:adoptedDetails.length>0,adopted_count:adoptedDetails.length,already_managed_count:adoption.already_managed_count,extensions:adoptedDetails,triage,warning_codes:triage.warning_codes,update_health_partial:triage.update_health_partial,update_health_coverage:triage.update_health_coverage})};const projectExtensionUpdateCheck=entry=>{return{update_check_status:entry?.update_check_status??null,update_check_reason:entry?.update_check_reason??null}};const buildAdoptedExtensionSource=(githubOption,extensionTarget,extensionDirectory,ref)=>{if(githubOption===void 0){return{kind:"local",input:extensionTarget,location:extensionDirectory}}const parsed=parseExtensionInstallSource(githubOption,{forceGithub:true,ref});if(parsed.kind!=="github"){throw new PmCliError(`Invalid GitHub shorthand "${githubOption}".`,EXIT_CODE.USAGE)}return{kind:"github",input:parsed.input,location:parsed.subpath??".",repository:parsed.repository,owner:parsed.owner,repo:parsed.repo,ref:parsed.ref,subpath:parsed.subpath}};const runExtensionAdoptAction=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx;const extensionTarget=requireTarget(normalizedTarget,action,options);const githubOption=resolveGithubOption(options);const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate){throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND)}if(candidate.managed){return withResult({adopted:false,already_managed:true,extension:{name:candidate.name,directory:candidate.directory}})}const extensionDirectory=path.join(resolvedRoots.selected_root,candidate.directory);const validated=await validateExtensionDirectory(extensionDirectory);const now=nowIso();const sourceRecord=buildAdoptedExtensionSource(githubOption,extensionTarget,extensionDirectory,options.ref);const managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord});await writeManagedExtensionState(resolvedRoots.selected_root,managedState);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const refreshedEntry=refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name))??refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.directory)===normalizeExtensionNameForMatch(candidate.directory));return withResult({adopted:true,extension:{name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry},source:sourceRecord,...projectExtensionUpdateCheck(refreshedEntry)})};const resolveRequiredInstalledExtension=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options}=ctx;const extensionTarget=requireTarget(normalizedTarget,action,options);const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate){throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND)}return{settings,managedStateRead,candidate}};const runExtensionUninstallAction=async ctx=>{const{resolvedRoots,withResult}=ctx;const{settings,managedStateRead,candidate}=await resolveRequiredInstalledExtension(ctx);const destinationDirectory=path.join(resolvedRoots.selected_root,candidate.directory);await fs.rm(destinationDirectory,{recursive:true,force:true});const updatedState={...managedStateRead.state,updated_at:nowIso(),entries:managedStateRead.state.entries.filter(entry=>normalizeExtensionNameForMatch(entry.name)!==normalizeExtensionNameForMatch(candidate.name)&&normalizeExtensionNameForMatch(entry.directory)!==normalizeExtensionNameForMatch(candidate.directory))};await writeManagedExtensionState(resolvedRoots.selected_root,updatedState);const stateChanged=clearExtensionState(settings,candidate.name);if(stateChanged){await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}return withResult({removed:true,extension:{name:candidate.name,directory:candidate.directory},destination_path:destinationDirectory,settings_changed:stateChanged})};const runExtensionActivateDeactivateAction=async ctx=>{const{action,resolvedRoots,warnings,global:global2,withResult}=ctx;const{settings,candidate}=await resolveRequiredInstalledExtension(ctx);const settingsChanged=action==="activate"?ensureActivated(settings,candidate.name):ensureDeactivated(settings,candidate.name);if(settingsChanged){await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}const activationFailure=action==="activate"?await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),settings,[candidate],global2).then(probe=>{warnings.push(...probe.warnings);return findActivationFailureByName(candidate.name,probe.activation_failures,ctx.scope)}):void 0;if(activationFailure)warnings.push(`extension_activate_failed:${ctx.scope}:${candidate.name}`);return withResult({extension:{name:candidate.name,directory:candidate.directory},active:action==="activate"&&activationFailure===void 0,runtime_active:action==="activate"&&activationFailure===void 0,activation_failure:activationFailure??null,settings_changed:settingsChanged,settings:{enabled:[...settings.extensions.enabled],disabled:[...settings.extensions.disabled]}},activationFailure===void 0)};const buildDoctorRemediation=(baseRemediation,loadFailureCount,activationFailureCount,vocabulary,managedStateFix,isolationHint)=>{const noun=vocabulary==="package"?"package":"extension";const doctorAction={package:"doctor",extension:"--doctor"}[noun];const adoptedCount=managedStateFix?.adopted_entries.length??0;const conditionalEntries=[[isolationHint!==null,isolationHint??""],[loadFailureCount>0,`Run pm ${noun} explore --project and pm ${noun} explore --global to inspect load failures.`],[activationFailureCount>0,`Review activation failures in pm ${noun} ${doctorAction} --detail deep output.`],[adoptedCount>0,`Managed-state fix adopted ${adoptedCount} extension(s).`]];return[...new Set([...baseRemediation,...conditionalEntries.filter(([include])=>include).map(([,entry])=>entry)].map(entry=>entry.trim()).filter(entry=>entry.length>0))]};const hasGlobalLayerDiagnostics=loadResult=>{return loadResult.loaded.some(entry=>entry.layer==="global")||loadResult.failed.some(entry=>entry.layer==="global")||loadResult.warnings.some(warning=>warning.includes(":global:"))};const buildDoctorIsolationHint=(scope,isolated,vocabulary,loadResult)=>{if(scope!=="project"||isolated||!hasGlobalLayerDiagnostics(loadResult)){return null}const noun=vocabulary==="package"?"package":"extension";return`Global ${noun} registrations are included in project diagnostics. For hermetic ${noun} smoke tests, rerun pm ${noun} doctor --project --isolated --detail deep --trace, or set PM_GLOBAL_PATH to a temporary directory for the whole test process.`};const resolveDoctorInvocationOptions=(target,scope,options)=>{if(String(target??"").trim().length>0){throw new PmCliError('Action "doctor" does not accept a target argument.',EXIT_CODE.USAGE)}const isolated=[options.isolated,options.ignoreGlobal].includes(true);if([isolated,scope==="global"].every(Boolean)){throw new PmCliError("--isolated and --ignore-global are only valid with project-scope doctor diagnostics.",EXIT_CODE.USAGE)}const detailMode=parseDoctorDetailMode(options.detail);const includeTrace=options.trace===true;if([includeTrace,detailMode!=="deep"].every(Boolean)){throw new PmCliError("--trace requires --detail deep with --doctor.",EXIT_CODE.USAGE)}return{isolated,detailMode,includeTrace}};const applyDoctorManagedStateFix=async(ctx,installed,state)=>{if(ctx.options.fixManagedState!==true)return{state,fix:null};const fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,state);return{state:fix.state,fix}};const buildDoctorIsolationMetadata=(scope,isolated,vocabulary,loadResult)=>{const noun=vocabulary==="package"?"package":"extension";if(scope!=="project"){return{isolated,global_extensions_included:false,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:null,pm_global_path_recipe:null}}const isolatedCommand=`pm ${noun} doctor --project --isolated --detail deep --trace`;return{isolated,global_extensions_included:!isolated,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:isolated?null:isolatedCommand,pm_global_path_recipe:`PM_GLOBAL_PATH=$(mktemp -d) pm ${noun} doctor --project --detail deep --trace`}};const runExtensionDoctorAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx;const{isolated,detailMode,includeTrace}=resolveDoctorInvocationOptions(normalizedTarget,scope,options);const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await applyDoctorManagedStateFix(ctx,installed.extensions,managedStateRead.state);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===true,ignoreGlobalExtensions:isolated});const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});const authorManifest=await inspectExtensionAuthorManifestAtPmRoot(resolvedRoots.pm_root);warnings.push(...authorManifest.warnings,...loadResult.warnings);warnings.push(...classifyDoctorLoadFailureWarnings(loadResult.failed));warnings.push(...activationResult.warnings);warnings.push(...classifyDoctorActivationFailureWarnings(activationResult.failed));warnings.push(...classifyUnusedCapabilityWarnings(loadResult,activationResult));warnings.push(...collectGlobalOutputOverrideDoctorWarnings(activationResult,loadResult));warnings.push(...collectSchemaNarrowActivationDoctorWarnings(loadResult,activationResult));warnings.push(...collectMcpCustomFieldCollisionDoctorWarnings(activationResult));const runtimeInstalledExtensions=applyDoctorRuntimeActivationState(refreshedInstalled.extensions,loadResult,activationResult);const doctorConsistency=buildDoctorConsistencySummary(scope,runtimeInstalledExtensions,loadResult.loaded.map(entry=>({layer:entry.layer,name:entry.name})),loadResult.failed.map(entry=>({name:entry.name})),loadResult.disabled_by_flag);warnings.push(...doctorConsistency.warnings);const updateCheckWarnings=runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateCheckWarnings);const triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const normalizedWarnings=[...triage.warnings];const policySummary={mode:loadResult.policy.mode,trust_mode:loadResult.policy.trust_mode,require_provenance:loadResult.policy.require_provenance,default_sandbox_profile:loadResult.policy.default_sandbox_profile,sandbox_enforcement:"advisory: sandbox_profile/permissions are declaration-based load gates, not runtime isolation (ADR pm-6ef3)",trusted_extensions_count:loadResult.policy.trusted_extensions.length,allowed_extensions_count:loadResult.policy.allowed_extensions.length,blocked_extensions_count:loadResult.policy.blocked_extensions.length,allowed_capabilities_count:loadResult.policy.allowed_capabilities.length,blocked_capabilities_count:loadResult.policy.blocked_capabilities.length,allowed_surfaces_count:loadResult.policy.allowed_surfaces.length,blocked_surfaces_count:loadResult.policy.blocked_surfaces.length,allowed_commands_count:loadResult.policy.allowed_commands.length,blocked_commands_count:loadResult.policy.blocked_commands.length,allowed_actions_count:loadResult.policy.allowed_actions.length,blocked_actions_count:loadResult.policy.blocked_actions.length,allowed_services_count:loadResult.policy.allowed_services.length,blocked_services_count:loadResult.policy.blocked_services.length,extension_override_count:loadResult.policy.extension_overrides.length};const capabilityGuidance=collectUnknownCapabilityGuidance(normalizedWarnings);const capabilityContract=buildCapabilityContractMetadata();const warningCodes=triage.warning_codes;const isolationHint=buildDoctorIsolationHint(scope,isolated,options.vocabulary,loadResult);const remediation=buildDoctorRemediation(triage.remediation,loadResult.failed.length,activationResult.failed.length,options.vocabulary,managedStateFix,isolationHint);const isolation=buildDoctorIsolationMetadata(scope,isolated,options.vocabulary,loadResult);const summary={status:triage.status,scope,warning_count:triage.warning_count,warning_codes:warningCodes,total_extensions:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,unmanaged_loaded_extension_count:triage.unmanaged_loaded_extension_count,unmanaged_action_required_extension_count:triage.unmanaged_action_required_extension_count,unmanaged_expected_extension_count:triage.unmanaged_expected_extension_count,runtime_active_total:runtimeInstalledExtensions.filter(entry=>entry.runtime_active===true).length,activation_status_totals:{ok:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="ok").length,failed:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="failed").length,not_loaded:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="not_loaded").length,unknown:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="unknown").length},unknown_capability_count:capabilityGuidance.length,capability_contract_version:capabilityContract.version,update_available_total:triage.update_available_total,update_check_status_totals:triage.update_check_status_totals,update_health_coverage:triage.update_health_coverage,update_health_partial:triage.update_health_partial,update_check_failed_total:runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").length,load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,load_failures:summarizeExtensionFailures(loadResult.failed),activation_failures:summarizeExtensionFailures(activationResult.failed),blocking_failure_count:loadResult.failed.length+activationResult.failed.length,has_blocking_failures:loadResult.failed.length+activationResult.failed.length>0,consistency_warning_count:doctorConsistency.warnings.length,trace_enabled:includeTrace,isolation,policy:policySummary,remediation};const managedStateFixSummary=managedStateFix?{requested:true,applied:managedStateFix.adopted_entries.length>0,adopted_count:managedStateFix.adopted_entries.length,already_managed_count:managedStateFix.already_managed_count,adopted_extensions:managedStateFix.adopted_entries.map(entry=>entry.name)}:{requested:false,applied:false,adopted_count:0,already_managed_count:refreshedInstalled.extensions.filter(entry=>entry.managed).length,adopted_extensions:[]};const details={mode:detailMode,summary,triage,trace_enabled:includeTrace,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,managed_state_fix:managedStateFixSummary,author_manifest:authorManifest,isolation,policy:loadResult.policy};if(detailMode==="deep"){const activationFailedDetails=includeTrace?activationResult.failed:activationResult.failed.map(entry=>{const{trace:_trace,...rest}=entry;return rest});details.deep={warnings:normalizedWarnings,warning_codes:warningCodes,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,trace_enabled:includeTrace,managed_state:{path:managedStateRead.path,count:managedState.entries.length,entries:managedState.entries},installed_extensions:runtimeInstalledExtensions,load:{roots:loadResult.roots,policy:loadResult.policy,warnings:loadResult.warnings,failed:loadResult.failed,loaded:loadResult.loaded.map(entry=>({layer:entry.layer,directory:entry.directory,name:entry.name,version:entry.version,entry:entry.entry,priority:entry.priority}))},activation:{failed:activationFailedDetails,warnings:activationResult.warnings,hook_counts:activationResult.hook_counts,registration_counts:activationResult.registration_counts,parser_override_count:activationResult.parser_override_count,preflight_override_count:activationResult.preflight_override_count,service_override_count:activationResult.service_override_count,renderer_override_count:activationResult.renderer_override_count},consistency:doctorConsistency.summary};if(includeTrace){details.deep.trace={activation_failures:activationResult.failed.filter(entry=>entry.trace!==void 0).map(entry=>({layer:entry.layer,name:entry.name,entry_path:entry.entry_path,error:entry.error,method:entry.trace.method,command:entry.trace.command,capability:entry.trace.capability,missing_capability:entry.trace.missing_capability,registration_index:entry.trace.registration_index,expected_schema:entry.trace.expected_schema,hint:entry.trace.hint,received:entry.trace.received}))}}}return withResult(details)};const runExtensionDescribeAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx;const settings=await readSettings(resolvedRoots.settings_root);const loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===true});const activationResult=await activateExtensions(loadResult);warnings.push(...loadResult.warnings);warnings.push(...activationResult.warnings);const describeResult=buildExtensionDescribeResult(normalizedTarget,loadResult,activationResult);if(normalizedTarget!==void 0&&describeResult.extensions.length===0){const noun=options.vocabulary==="package"?"package":"extension";const loadedNames=[...new Set(loadResult.loaded.map(entry=>options.vocabulary==="package"&&typeof entry.source_package==="string"&&entry.source_package.trim().length>0?entry.source_package.trim():entry.name))].sort((left,right)=>left.localeCompare(right));const loadedHint=loadedNames.length>0?` Loaded ${noun} names: ${loadedNames.join(", ")}.`:"";throw new PmCliError(`No loaded ${noun} named "${normalizedTarget}" was found in ${scope} scope.${loadedHint} Run pm ${noun} explore to list discovered ${noun}s.`,EXIT_CODE.NOT_FOUND)}return withResult({target:describeResult.target,total:describeResult.total,extensions:describeResult.extensions,union:describeResult.union,command_ownership:describeResult.command_ownership})};const prepareExploreManageState=async(ctx,installed,initialState)=>{let state=initialState;let fix=null;if([ctx.action==="manage",ctx.options.fixManagedState===true].every(Boolean)){fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,initialState);state=fix.state}if(ctx.action==="manage"){const entries=await mapWithFixedConcurrency(state.entries,GITHUB_UPDATE_CHECK_CONCURRENCY,async entry=>{if(entry.source.kind!=="github")return entry;const updateStatus=await checkGithubUpdate(entry.source);return{...entry,last_update_check_at:updateStatus.checked_at,last_update_remote_commit:updateStatus.remote_commit,update_available:updateStatus.available,update_error:updateStatus.error}});state={...state,updated_at:nowIso(),entries:sortManagedEntries(entries)};await writeManagedExtensionState(ctx.resolvedRoots.selected_root,state)}return{state,fix}};const probeExploreManageRuntime=async(ctx,settings,installed)=>{const loadResult=await loadExtensions({pmRoot:ctx.resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:ctx.global.noExtensions===true});const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});ctx.warnings.push(...loadResult.warnings,...activationResult.warnings);return{installed:applyDoctorRuntimeActivationState(installed,loadResult,activationResult),failures:collectActivationFailureDiagnostics(activationResult.failed),summary:{requested:true,executed:true,reason:ctx.action==="explore"?"explore_defaults_to_runtime_probe":ctx.options.runtimeProbe===true?"runtime_probe_requested":"manage_defaults_to_runtime_probe",load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,warning_count:[...new Set([...loadResult.warnings,...activationResult.warnings])].length,policy:loadResult.policy}}};const projectExploreManageFix=(fix,installed)=>fix?{requested:true,applied:fix.adopted_entries.length>0,adopted_count:fix.adopted_entries.length,adopted_extensions:fix.adopted_entries.map(entry=>entry.name),already_managed_count:fix.already_managed_count}:{requested:false,applied:false,adopted_count:0,adopted_extensions:[],already_managed_count:installed.filter(entry=>entry.managed).length};const runExtensionExploreManageAction=async ctx=>{const{action,scope,resolvedRoots,warnings,options,withResult}=ctx;const settings=await readSettings(resolvedRoots.settings_root);const configuredPolicy=buildExtensionPolicyDetails(settings.extensions.policy);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await prepareExploreManageState(ctx,installed.extensions,managedStateRead.state);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);if(action==="manage"){const updateWarnings=refreshedInstalled.extensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateWarnings)}const runtimeProbe=await probeExploreManageRuntime(ctx,settings,refreshedInstalled.extensions);const runtimeInstalledExtensions=runtimeProbe.installed;const triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const details={total:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,extensions:runtimeInstalledExtensions,triage,policy:configuredPolicy};if(runtimeProbe.failures!==void 0){details.activation_diagnostics={failed_count:runtimeProbe.failures.length,failed:runtimeProbe.failures}}if(action==="explore"){details.runtime_probe=runtimeProbe.summary}if(action==="manage"){details.runtime_probe=runtimeProbe.summary;details.managed_state_fix=projectExploreManageFix(managedStateFix,runtimeInstalledExtensions)}return withResult(details)};const EXTENSION_ACTION_HANDLERS={init:runExtensionInitAction,install:runExtensionInstallAction,uninstall:runExtensionUninstallAction,explore:runExtensionExploreManageAction,manage:runExtensionExploreManageAction,describe:runExtensionDescribeAction,reload:runExtensionReloadAction,doctor:runExtensionDoctorAction,catalog:runExtensionCatalogAction,adopt:runExtensionAdoptAction,"adopt-all":runExtensionAdoptAllAction,activate:runExtensionActivateDeactivateAction,deactivate:runExtensionActivateDeactivateAction,migrate:runExtensionMigrateAction};const requiresExtensionStateLock=ctx=>[ctx.action==="uninstall",ctx.action==="manage",ctx.action==="adopt",ctx.action==="adopt-all",ctx.action==="activate",ctx.action==="deactivate",ctx.action==="migrate",[ctx.action==="doctor",ctx.options.fixManagedState===true].every(Boolean)].some(Boolean);const dispatchExtensionAction=ctx=>requiresExtensionStateLock(ctx)?withExtensionInstallLock(ctx.resolvedRoots.settings_root,`${ctx.action}-state`,()=>EXTENSION_ACTION_HANDLERS[ctx.action](ctx)):EXTENSION_ACTION_HANDLERS[ctx.action](ctx);const _testOnly={adoptUnmanagedExtensions,buildAdoptedExtensionSource,buildExtensionPolicyDetails,buildInstallCommandDiscovery,checkGithubUpdate,clearExtensionState,collectActivationFailureDiagnostics,findActivationFailureByName,resolveInstallRuntimeActivationStatus,collectGlobalOutputOverrideDoctorWarnings,collectMcpCustomFieldCollisionDoctorWarnings,collectSchemaNarrowActivationDoctorWarnings,copyExtensionDirectoryWithoutSelfNesting,isErrnoCode,isRetriableExtensionInstallCopyError,listInstalledExtensions,mapWithFixedConcurrency,projectExtensionUpdateCheck,readOptionalMetadataFile,requireTarget,resolveAction,resolveCommandDiscoveryPackageName,resolveGithubOption,resolveInstalledExtensionCandidate,resolveManagedInstallTimestamps,resolveScope,resolveUpdateCheckResolution,withExtensionInstallLock};export{_testOnly,copyExtensionDirectoryForInstall,parseExtensionInstallSource,parseExtensionManifest,readManagedExtensionState,resolveCanonicalExtensionInstallDestination,resolveManagedExtensionStatePath,runExtension,validateExtensionDirectory,writeManagedExtensionState};
|
|
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]="f34e0f7f-952c-5673-82b2-6bf87c10c7be")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{activateExtensions,createSerialQueue,loadExtensions,nextExtensionReloadToken}from"../core/extensions/index.js";import{describeExtensionActivation}from"../core/extensions/activation-summary.js";import{createExtensionContributionInventory}from"../core/extensions/contribution-inventory.js";import{resolveExtensionRoots}from"../core/extensions/loader.js";import{pathExists}from"../core/fs/fs-utils.js";import{resolvePmPackageRootFromModule}from"../core/packages/root.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{nowIso}from"../core/shared/time.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../core/store/paths.js";import{readSettings,writeSettings}from"../core/store/settings.js";import{quoteCommandArg,renderPmCommand}from"./command-line.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{ensureTypeFolderScaffold}from"./schema.js";import{normalizeStringList,normalizeExtensionNameForMatch,normalizeManagedDirectoryName,parseExtensionManifest,validateExtensionDirectory}from"./extension/shared.js";import{sortManagedEntries,managedExtensionSourcesEquivalent,readManagedExtensionState,writeManagedExtensionState,upsertManagedEntry,persistManagedContributionInventory,resolveManagedExtensionStatePath}from"./extension/managed-state.js";import{parseExtensionInstallSource,resolveInstallSource,areDirectoriesEquivalent}from"./extension/install-sources.js";import{resolveBundledExtensionAliasSource,isBundledPackageInstallAllTarget,listBundledPackageAliases,resolveBundledAliasManifestName,buildBundledPackageCatalog}from"./extension/bundled-catalog.js";import{scaffoldExtensionProject}from"./extension/scaffold.js";import{buildExtensionDescribeResult}from"./extension/describe.js";import{applyDoctorRuntimeActivationState,classifyDoctorLoadFailureWarnings,classifyDoctorActivationFailureWarnings,classifyUnusedCapabilityWarnings,buildExtensionTriageSummary,parseDoctorDetailMode,collectUnknownCapabilityGuidance,buildCapabilityContractMetadata,buildDoctorConsistencySummary,summarizeExtensionFailures}from"./extension/doctor.js";import{copyExtensionDirectoryForInstall,copyExtensionDirectoryWithoutSelfNesting,ensureExtensionModuleTypeMarker,ensureInstalledExtensionSdkLink,isErrnoCode,isRetriableExtensionInstallCopyError,resolveCanonicalExtensionInstallDestination,withExtensionInstallLock}from"./extension/install-runtime.js";import{mapWithFixedConcurrency}from"./extension/concurrency.js";import{summarizeRuntimeCommandPathsForExtension}from"./extension/runtime-summary.js";import{collectGlobalOutputOverrideDoctorWarnings}from"./extension/output-ownership.js";import{collectMcpCustomFieldCollisionDoctorWarnings}from"./extension/custom-field-collisions.js";import{checkGithubUpdate}from"./extension/update-check.js";import{runExtensionMigrateAction}from"./extension/migrations.js";import{buildBundledInstallReceipt}from"./extension/install-receipts.js";import{buildExtensionInstallPlan}from"./extension/install-plan.js";import{inspectExtensionAuthorManifestAtPmRoot}from"./extension/author-manifest.js";import{resolveExtensionInstallSourceIdentity}from"./extension/source-resolution.js";import{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot}from"./extension/install-snapshot.js";const GITHUB_UPDATE_CHECK_CONCURRENCY=4,LIFECYCLE_ACTION_TARGETS=[["install","install","--install"],["uninstall","uninstall","--uninstall"],["explore","explore","--explore"],["list","explore","--explore"],["manage","manage","--manage"],["describe","describe","--describe"],["reload","reload","--reload"],["doctor","doctor","--doctor"],["catalog","catalog","--catalog"],["init","init","--init"],["scaffold","init","--scaffold"],["adopt","adopt","--adopt"],["adopt-all","adopt-all","--adopt-all"],["activate","activate","--activate"],["deactivate","deactivate","--deactivate"],["migrate","migrate","--migrate"]],LIFECYCLE_ACTION_FLAG_HINT=LIFECYCLE_ACTION_TARGETS.map(([,,flag])=>flag).filter((flag,index,flags)=>flags.indexOf(flag)===index).join(", "),LIFECYCLE_ACTION_FLAGS={install:"--install",uninstall:"--uninstall",explore:"--explore",manage:"--manage",describe:"--describe",reload:"--reload",doctor:"--doctor",catalog:"--catalog",adopt:"--adopt","adopt-all":"--adopt-all",activate:"--activate",deactivate:"--deactivate",migrate:"--migrate",init:"--init"},NATIVE_OUTPUT_MARKER="__pm_native_output",EXTENSION_POLICY_ROOT_LIST_FIELDS=["trusted_extensions","allowed_extensions","blocked_extensions","allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"],EXTENSION_POLICY_OVERRIDE_LIST_FIELDS=["allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"],EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS=["disabled","require_trusted","require_provenance"],DEFAULT_EXTENSION_POLICY_DETAILS={mode:"off",trust_mode:"off",require_provenance:!1,trusted_extensions:[],default_sandbox_profile:"none",allowed_extensions:[],blocked_extensions:[],allowed_capabilities:[],blocked_capabilities:[],allowed_surfaces:[],blocked_surfaces:[],allowed_commands:[],blocked_commands:[],allowed_actions:[],blocked_actions:[],allowed_services:[],blocked_services:[],extension_overrides:[]},normalizePolicyRootLists=policy=>{const safePolicy=policy??DEFAULT_EXTENSION_POLICY_DETAILS,lists={};for(const field of EXTENSION_POLICY_ROOT_LIST_FIELDS)lists[field]=normalizeStringList(safePolicy[field]??[]);return lists},appendNonEmptyPolicyLists=(target,lists)=>{for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS)lists[field].length>0&&(target[field]=lists[field]);return target},appendEnabledPolicyScalars=(target,override)=>{for(const field of EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS)override[field]===!0&&(target[field]=!0);return override.sandbox_profile&&(target.sandbox_profile=override.sandbox_profile),target},normalizePolicyOverrideLists=override=>{const lists={};for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS)lists[field]=normalizeStringList(override[field]??[]);return lists},buildExtensionPolicyOverrideDetails=override=>{const name=typeof override.name=="string"?override.name.trim():"";return name.length===0?null:appendNonEmptyPolicyLists(appendEnabledPolicyScalars({name},override),normalizePolicyOverrideLists(override))},normalizeExtensionPolicyOverrides=overrides=>(overrides??[]).map(override=>buildExtensionPolicyOverrideDetails(override)).filter(override=>override!==null).sort((left,right)=>left.name.localeCompare(right.name)),buildExtensionPolicyDetails=policy=>{const safePolicy=Object.assign({},DEFAULT_EXTENSION_POLICY_DETAILS,policy??{}),rootLists=normalizePolicyRootLists(policy),overrides=normalizeExtensionPolicyOverrides(safePolicy.extension_overrides);return{mode:safePolicy.mode,trust_mode:safePolicy.trust_mode,require_provenance:safePolicy.require_provenance===!0,trusted_extensions:rootLists.trusted_extensions,default_sandbox_profile:safePolicy.default_sandbox_profile,allowed_extensions:rootLists.allowed_extensions,blocked_extensions:rootLists.blocked_extensions,allowed_capabilities:rootLists.allowed_capabilities,blocked_capabilities:rootLists.blocked_capabilities,allowed_surfaces:rootLists.allowed_surfaces,blocked_surfaces:rootLists.blocked_surfaces,allowed_commands:rootLists.allowed_commands,blocked_commands:rootLists.blocked_commands,allowed_actions:rootLists.allowed_actions,blocked_actions:rootLists.blocked_actions,allowed_services:rootLists.allowed_services,blocked_services:rootLists.blocked_services,extension_overrides:overrides}},resolveInstalledExtensionCandidate=async(installed,extensionTarget)=>{const lookupValues=[extensionTarget],bundledAliasManifestName=await resolveBundledAliasManifestName(extensionTarget);bundledAliasManifestName&&lookupValues.push(bundledAliasManifestName);const normalizedLookups=[...new Set(lookupValues.map(value=>normalizeExtensionNameForMatch(value)).filter(value=>value.length>0))];for(const lookup of normalizedLookups){const byName=installed.find(entry=>normalizeExtensionNameForMatch(entry.name)===lookup);if(byName)return byName;const byDirectory=installed.find(entry=>normalizeExtensionNameForMatch(entry.directory)===lookup);if(byDirectory)return byDirectory}},isExtensionEnabled=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled));return new Set(normalizeStringList(settings.extensions.disabled)).has(normalizedName)?!1:enabled.size===0?!0:enabled.has(normalizedName)},ensureActivated=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled)),disabled=new Set(normalizeStringList(settings.extensions.disabled)),previousEnabled=[...enabled],previousDisabled=[...disabled];return disabled.delete(normalizedName),enabled.size>0&&enabled.add(normalizedName),settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")},ensureDeactivated=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled)),disabled=new Set(normalizeStringList(settings.extensions.disabled)),previousEnabled=[...enabled],previousDisabled=[...disabled];return enabled.delete(normalizedName),disabled.add(normalizedName),settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")},clearExtensionState=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled)),disabled=new Set(normalizeStringList(settings.extensions.disabled)),previousEnabled=[...enabled],previousDisabled=[...disabled];return enabled.delete(normalizedName),disabled.delete(normalizedName),settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")},suggestLifecycleActionTarget=target=>{const normalizedTarget=target.trim().toLowerCase(),maxDistance=Math.min(2,Math.max(1,Math.ceil(normalizedTarget.length/4))),nearest=LIFECYCLE_ACTION_TARGETS.map(([candidate,action,flag])=>({action,flag,distance:levenshteinDistanceWithinLimit(normalizedTarget,candidate,maxDistance)})).filter(entry=>entry.distance!==null).sort((left,right)=>left.distance-right.distance)[0];return nearest?{action:nearest.action,flag:nearest.flag}:null},buildUnknownLifecycleActionError=(target,options)=>{const noun=options.vocabulary==="package"?"package":"extension",suggestion=suggestLifecycleActionTarget(target);if(!suggestion)return new PmCliError(`One action flag is required. Use one of: ${LIFECYCLE_ACTION_FLAG_HINT}. Bare \`pm package\` and \`pm extension\` default to --explore.`,EXIT_CODE.USAGE);const command=`pm ${noun} ${suggestion.flag}`;return createUnknownSubcommandError({command_path:noun,display_name:`${noun} lifecycle`,token_kind:"action",token:target,allowed:Object.keys(IMPLICIT_EXTENSION_ACTIONS),retry_command:command,message_suffix:`. Did you mean "${suggestion.flag}"?`,fallback_candidates:[{source:"lifecycle_action",command,reason:`nearest lifecycle action for "${target}"`}]})},EXTENSION_ACTION_FLAG_SELECTORS=[["install","install"],["uninstall","uninstall"],["explore","explore"],["manage","manage"],["describe","describe"],["reload","reload"],["doctor","doctor"],["catalog","catalog"],["init","init"],["scaffold","init"],["adopt","adopt"],["adoptAll","adopt-all"],["activate","activate"],["deactivate","deactivate"],["migrate","migrate"]],IMPLICIT_EXTENSION_ACTIONS={doctor:"doctor",reload:"reload",catalog:"catalog",init:"init",scaffold:"init",explore:"explore",manage:"manage",migrate:"migrate",list:"explore","":"explore"},resolveImplicitActionFromTarget=normalizedTarget=>IMPLICIT_EXTENSION_ACTIONS[normalizedTarget]??null,resolveAction=(target,options)=>{const selected=[...new Set(EXTENSION_ACTION_FLAG_SELECTORS.filter(([flag])=>options[flag]===!0).map(([,mappedAction])=>mappedAction))];if(selected.length===0){if(target===void 0)return"explore";const implicitAction=resolveImplicitActionFromTarget(target.trim().toLowerCase());if(implicitAction)return implicitAction;throw buildUnknownLifecycleActionError(target,options)}if(selected.length>1)throw new PmCliError("Extension action flags are mutually exclusive.",EXIT_CODE.USAGE);return selected[0]},resolveScope=options=>{const projectLike=options.project===!0||options.local===!0,global2=options.global===!0;if(projectLike&&global2)throw new PmCliError('Options "--project/--local" and "--global" are mutually exclusive.',EXIT_CODE.USAGE);return global2?"global":"project"},EXTENSION_UPDATE_CHECK_RESOLVERS=[managedEntry=>managedEntry?null:{status:"skipped_unmanaged",reason:"extension_not_managed"},managedEntry=>managedEntry&&managedEntry.source.kind!=="github"?{status:"skipped_non_github",reason:`managed_source_kind_${managedEntry.source.kind}`}:null,managedEntry=>{const updateError=typeof managedEntry?.update_error=="string"?managedEntry.update_error.trim():"";return updateError.length>0?{status:"failed",reason:updateError}:null},managedEntry=>{const entry=managedEntry;return(typeof entry.last_update_check_at=="string"?entry.last_update_check_at.trim():"").length===0?null:{status:"checked",reason:{true:"update_available",false:"up_to_date"}[String(entry.update_available)]??"checked_without_commit_baseline"}}],resolveUpdateCheckResolution=managedEntry=>{for(const resolve of EXTENSION_UPDATE_CHECK_RESOLVERS){const resolution=resolve(managedEntry);if(resolution)return resolution}return{status:"not_checked",reason:"no_update_check_recorded"}},buildInstalledExtensionSummary=(identity,scope,managedEntry,updateCheck)=>{const managed=managedEntry??{};return{name:identity.name,directory:identity.directory,version:identity.version,entry:identity.entry,scope,active:identity.enabled,enabled:identity.enabled,runtime_active:null,activation_status:"unknown",contributions:managed.contributions,managed:!!managedEntry,source:managed.source,update_available:managed.update_available,last_update_check_at:managed.last_update_check_at,last_update_remote_commit:managed.last_update_remote_commit,update_error:managed.update_error,update_check_status:updateCheck.status,update_check_reason:updateCheck.reason}},buildMissingManifestInspection=(directoryName,scope,settings,managedEntry)=>{const managed=Object.assign({name:directoryName,manifest_version:"unknown",manifest_entry:"unknown"},managedEntry),enabled=managedEntry?isExtensionEnabled(settings,managedEntry.name):!1;return{warning:`extension_manifest_missing:${scope}:${directoryName}`,summary:buildInstalledExtensionSummary({name:managed.name,directory:directoryName,version:managed.manifest_version,entry:managed.manifest_entry,enabled},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}},inspectInstalledExtensionDirectory=async(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory)=>{const extensionDirectory=path.join(extensionsRoot,directoryName),manifestPath=path.join(extensionDirectory,"manifest.json"),managedDirectoryEntry=managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));if(!await pathExists(manifestPath))return buildMissingManifestInspection(directoryName,scope,settings,managedDirectoryEntry);const invalidJson=Symbol("invalid-extension-manifest-json"),rawManifest=await fs.readFile(manifestPath,"utf8").then(contents=>JSON.parse(contents)).catch(()=>invalidJson);if(rawManifest===invalidJson)return{warning:`extension_manifest_invalid_json:${scope}:${directoryName}`};const manifest=parseExtensionManifest(rawManifest);if(!manifest)return{warning:`extension_manifest_invalid:${scope}:${directoryName}`};const managedEntry=managedByName.get(normalizeExtensionNameForMatch(manifest.name))??managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));return{summary:buildInstalledExtensionSummary({name:manifest.name,directory:directoryName,version:manifest.version,entry:manifest.entry,enabled:isExtensionEnabled(settings,manifest.name)},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}},listInstalledExtensions=async(extensionsRoot,scope,settings,state)=>{if(!await pathExists(extensionsRoot))return{extensions:[],warnings:[]};const directories=(await fs.readdir(extensionsRoot,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),managedByName=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.name),managedEntry])),managedByDirectory=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.directory),managedEntry])),warnings=[],summaries=[];for(const directoryName of directories){const inspected=await inspectInstalledExtensionDirectory(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory);inspected.warning&&warnings.push(inspected.warning),inspected.summary&&summaries.push(inspected.summary)}return{extensions:summaries.sort((left,right)=>left.name.localeCompare(right.name)),warnings:warnings.sort((left,right)=>left.localeCompare(right))}},extensionRuntimeProbeQueue=createSerialQueue(),resolveCommandDiscoveryPackageName=(extensionName,source)=>[source.package,source.kind==="builtin"?source.name:void 0].find(candidate=>candidate?.trim())?.trim()??extensionName,buildInstallCommandDiscovery=(extensionName,source,commandSummary,activationFailure)=>{const helpCommands=commandSummary.command_paths.map(commandPath=>`pm ${commandPath} --help`),sdkDependencyMissing=activationFailure?.error.toLowerCase().includes("@unbrained/pm-cli")===!0,nextSteps=commandSummary.command_paths.length>0?[...helpCommands]:["Run pm package doctor --project --detail deep if expected package commands are missing."];return sdkDependencyMissing&&nextSteps.unshift("Install @unbrained/pm-cli in the target workspace so declarative package runtime imports resolve, then reinstall the package."),{package_name:resolveCommandDiscoveryPackageName(extensionName,source),extension_name:extensionName,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,help_commands:helpCommands,next_steps:nextSteps,...sdkDependencyMissing?{sdk_dependency_status:"missing"}:{}}},summarizeActivationFailureForDiagnostics=failure=>{const trace=failure.trace,summary={layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error};return trace&&(summary.trace=Object.fromEntries(Object.entries(trace).filter(([,value])=>value!==void 0)),trace.missing_capability&&(summary.missing_capability=trace.missing_capability),trace.hint&&(summary.hint=trace.hint)),summary},collectActivationFailureDiagnostics=failures=>failures.map(failure=>summarizeActivationFailureForDiagnostics(failure)).sort((left,right)=>`${left.layer}:${left.name}`.localeCompare(`${right.layer}:${right.name}`)),findActivationFailureByName=(extensionName,failures,layer)=>{const normalizedName=normalizeExtensionNameForMatch(extensionName);return failures.find(failure=>(layer===void 0||failure.layer===layer)&&normalizeExtensionNameForMatch(failure.name)===normalizedName)},resolveInstallRuntimeActivationStatus=(extensionName,scope,runtimeInstalled,installActivationFailure)=>runtimeInstalled.find(entry=>entry.scope===scope&&normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName))?.activation_status??(installActivationFailure?"failed":"unknown"),probeRuntimeCommandPathsForInstall=(pmRoot,parent,settings,refreshedInstalled,global2)=>extensionRuntimeProbeQueue.enqueue(async()=>{const originalPackageRoot=process.env.PM_CLI_PACKAGE_ROOT,snapshotRoot=await fs.mkdtemp(path.join(parent,".pm-module-graph-"));process.env.PM_CLI_PACKAGE_ROOT=resolvePmPackageRootFromModule(import.meta.url,["../.."]);try{const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===!0,reload_token:nextExtensionReloadToken(),cache_bust:!0,module_graph_snapshot_root:snapshotRoot}),activationResult=await activateExtensions({...loadResult}),runtimeFailures=[...loadResult.failed.map(failure=>({layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error})),...collectActivationFailureDiagnostics(activationResult.failed)],contributionInventories=Object.fromEntries(loadResult.loaded.map(extension=>[normalizeExtensionNameForMatch(extension.name),createExtensionContributionInventory(describeExtensionActivation(activationResult,{extensionName:extension.name}))]));return{installed:applyDoctorRuntimeActivationState(refreshedInstalled,loadResult,activationResult),warnings:[...loadResult.warnings,...activationResult.warnings],activation_failures:runtimeFailures,extensions_disabled:loadResult.disabled_by_flag,item_type_registrations:activationResult.registrations.item_types,contribution_inventories:contributionInventories}}finally{await fs.rm(snapshotRoot,{recursive:!0,force:!0}),originalPackageRoot===void 0?delete process.env.PM_CLI_PACKAGE_ROOT:process.env.PM_CLI_PACKAGE_ROOT=originalPackageRoot}}),adoptUnmanagedExtensions=async(extensionsRoot,scope,installedExtensions,state)=>{const unmanagedCandidates=installedExtensions.filter(entry=>!entry.managed),sortedCandidates=[...unmanagedCandidates].sort((left,right)=>{const byName=left.name.localeCompare(right.name);return byName!==0?byName:left.directory.localeCompare(right.directory)});let nextState=state;const adoptedEntries=[];for(const candidate of sortedCandidates){const extensionDirectory=path.join(extensionsRoot,candidate.directory),validated=await validateExtensionDirectory(extensionDirectory),now=nowIso(),sourceRecord={kind:"local",input:candidate.name,location:extensionDirectory};nextState=upsertManagedEntry(nextState,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord}),adoptedEntries.push({name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry,source:sourceRecord})}return adoptedEntries.length>0&&await writeManagedExtensionState(extensionsRoot,nextState),{state:nextState,adopted_entries:adoptedEntries,unmanaged_candidates:sortedCandidates,already_managed_count:installedExtensions.length-unmanagedCandidates.length}},resolveExtensionRootsForScope=(scope,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path),roots=resolveExtensionRoots(pmRoot,process.cwd()),settingsRoot=scope==="global"?resolveGlobalPmRoot(process.cwd()):pmRoot,selectedRoot=scope==="global"?roots.global:roots.project;return{pm_root:pmRoot,scope,settings_root:settingsRoot,selected_root:selectedRoot,roots}},resolveGithubOption=options=>{const values=[options.gh,options.github].filter(value=>typeof value=="string").map(value=>value.trim()).filter(Boolean),uniqueValues=[...new Set(values)];if(uniqueValues.length>1)throw new PmCliError('Options "--gh" and "--github" must match when both are provided.',EXIT_CODE.USAGE);return uniqueValues[0]},getLifecycleActionFlag=action=>LIFECYCLE_ACTION_FLAGS[action],throwMissingLifecycleTarget=(action,options)=>{const noun=options.vocabulary==="package"?"package":"extension",targetName=action==="install"?"source":"name",targetLabel=`${noun} ${targetName}`,actionFlag=getLifecycleActionFlag(action),commandTarget=`<${targetName}>`,command=`pm ${noun} ${actionFlag} ${commandTarget}`;throw new PmCliError(`Action "${action}" requires ${targetLabel} input.`,EXIT_CODE.USAGE,{code:"missing_lifecycle_target",required:`Provide a ${targetName} target for ${action}.`,examples:[`pm ${noun} ${action} ${commandTarget}`,command,`pm ${noun} --help`],recovery:{attempted_command:`pm ${noun} ${action}`,suggested_retry:command,fallback_candidates:[{source:"lifecycle_action",command,reason:`flag-form ${action} command with required ${targetName} target`}]}})},requireTarget=(target,action,options={})=>{const normalized=target?.trim();if(normalized)return normalized;if(action==="init")throw new PmCliError('Action "init" requires a scaffold target path (for example: pm package init ./my-package or pm extension init ./my-extension).',EXIT_CODE.USAGE);return throwMissingLifecycleTarget(action,options)},collectSchemaNarrowActivationDoctorWarnings=(loadResult,activationResult)=>{const schemaContributors=new Set([...activationResult.registrations.item_types.map(entry=>({entry,count:entry.types.length})),...activationResult.registrations.item_fields.map(entry=>({entry,count:entry.fields.length}))].filter(({count})=>count>0).map(({entry})=>`${entry.layer}:${normalizeExtensionNameForMatch(entry.name)}`));return loadResult.loaded.filter(extension=>(extension.activation?.commands??[]).length>0).filter(extension=>schemaContributors.has(`${extension.layer}:${normalizeExtensionNameForMatch(extension.name)}`)).map(extension=>`extension_schema_narrow_activation:${extension.layer}:${extension.name}`).filter((warning,index,warnings)=>warnings.indexOf(warning)===index).sort((left,right)=>left.localeCompare(right))},assertExtensionActionOptionScope=(action,options)=>{const invalidGuard=[{triggered:options.strictExit===!0||options.failOnWarn===!0,allowed:action==="doctor",message:"--strict-exit and --fail-on-warn are only valid with --doctor."},{triggered:options.trace===!0,allowed:action==="doctor",message:"--trace is only valid with --doctor."},{triggered:options.watch===!0,allowed:action==="reload",message:"--watch is only valid with --reload."},{triggered:options.runtimeProbe===!0,allowed:action==="manage",message:"--runtime-probe is only valid with --manage."},{triggered:options.fixManagedState===!0,allowed:action==="manage"||action==="doctor",message:"--fix-managed-state is only valid with --manage or --doctor."},{triggered:options.isolated===!0||options.ignoreGlobal===!0,allowed:action==="doctor",message:"--isolated and --ignore-global are only valid with --doctor."},{triggered:options.capability!==void 0,allowed:action==="init",message:"--capability is only valid with --init/--scaffold."},{triggered:options.declarative===!0,allowed:action==="init",message:"--declarative is only valid with --init/--scaffold."},{triggered:options.dryRun===!0,allowed:action==="migrate"||action==="install",message:"--dry-run is only valid with --migrate or --install."}].find(guard=>guard.triggered&&!guard.allowed);if(invalidGuard)throw new PmCliError(invalidGuard.message,EXIT_CODE.USAGE)},resolveNormalizedExtensionTarget=(target,action,options)=>{const normalizedInput=String(target??"").trim().toLowerCase(),explicitInitAction=[options.init,options.scaffold].includes(!0);return({doctor:["doctor"],reload:["reload"],catalog:["catalog"],init:explicitInitAction?[]:["init","scaffold"]}[action]??[]).includes(normalizedInput)?void 0:target},resolveExtensionResultRoots=ctx=>[ctx.action==="catalog",typeof ctx.options.fields=="string",String(ctx.options.fields).trim().length>0].every(Boolean)?{project:"project",global:"global",selected:ctx.scope,settings_root:"project"}:{project:ctx.resolvedRoots.roots.project,global:ctx.resolvedRoots.roots.global,selected:ctx.resolvedRoots.selected_root,settings_root:ctx.resolvedRoots.settings_root},buildExtensionActionResult=(ctx,details,ok)=>{const result={ok,action:ctx.action,scope:ctx.scope,roots:resolveExtensionResultRoots(ctx),warnings:[...new Set(ctx.warnings)].sort((left,right)=>left.localeCompare(right)),details};return ctx.action==="doctor"&&Object.defineProperty(result,NATIVE_OUTPUT_MARKER,{value:!0,enumerable:!1,configurable:!1}),result},runExtension=async(target,options,global2)=>{const action=resolveAction(target,options);assertExtensionActionOptionScope(action,options);const normalizedTarget=resolveNormalizedExtensionTarget(target,action,options),scope=resolveScope(options),resolvedRoots=resolveExtensionRootsForScope(scope,global2),actionContext={action,normalizedTarget,scope,resolvedRoots,warnings:[],options,global:global2},ctx={...actionContext,withResult:(details,ok=!0)=>buildExtensionActionResult(actionContext,details,ok)};return await dispatchExtensionAction(ctx)},buildExtensionScaffoldNextSteps=(scaffold,options)=>{const vocabulary=options.vocabulary??"extension",shellTargetPath=scaffold.target_path.replace(/\\/g,"/"),quotedShellTargetPath=quoteCommandArg(shellTargetPath),dependencySteps={package:`Install dependencies: cd ${quotedShellTargetPath}, then run "npm install"`,extension:`Install type-check dependencies: cd ${quotedShellTargetPath}, then run "npm install -D typescript @types/node @unbrained/pm-cli"`},validationSteps={package:`Validate the package: cd ${quotedShellTargetPath}, then run "npm run typecheck" and "npm test"`,extension:`Type-check the source (optional): cd ${quotedShellTargetPath}, then run "npx tsc --noEmit"`},declarativeGuidance=[];return[vocabulary==="package",options.declarative===!0].every(Boolean)&&declarativeGuidance.push("Ensure the target workspace can resolve @unbrained/pm-cli before installing this declarative package."),[dependencySteps[vocabulary],...declarativeGuidance,`Install the scaffold: ${renderPmCommand(vocabulary==="package"?["install","--project",shellTargetPath]:["extension","--install","--project",shellTargetPath])}`,`Smoke-test command path: pm ${scaffold.command_name}`,validationSteps[vocabulary],`Run diagnostics: ${vocabulary==="package"?"pm package doctor":"pm extension --doctor"} --project --detail summary`]},runExtensionInitAction=async ctx=>{const{action,normalizedTarget,options,withResult}=ctx;if([resolveGithubOption(options),options.ref].filter(value=>typeof value=="string").map(value=>value.trim()).filter(Boolean).length>0)throw new PmCliError('Action "init" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE);const scaffoldTarget=requireTarget(normalizedTarget,action,options),scaffold=await scaffoldExtensionProject(scaffoldTarget,options.vocabulary??"extension",options.capability,options.declarative===!0);return withResult({scaffolded:scaffold.created_directory||scaffold.files.some(entry=>entry.status==="created"),extension:{name:scaffold.extension_name,command:scaffold.command_name},capability:scaffold.capability,style:scaffold.style,target_path:scaffold.target_path,created_directory:scaffold.created_directory,files:scaffold.files,next_steps:buildExtensionScaffoldNextSteps(scaffold,options)})},runExtensionReloadAction=async ctx=>{const{normalizedTarget,resolvedRoots,warnings,options,global:global2,withResult}=ctx;if(normalizedTarget!==void 0)throw new PmCliError('Action "reload" does not accept a target argument.',EXIT_CODE.USAGE);const settings=await readSettings(resolvedRoots.settings_root),reloadToken=nextExtensionReloadToken(),reloaded=await loadExtensions({pmRoot:resolvedRoots.settings_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions,reload_token:reloadToken,cache_bust:!0});warnings.push(...reloaded.warnings);const activation=await activateExtensions(reloaded);warnings.push(...activation.warnings);const details={reload:{token:reloadToken,cache_bust:!0,watch:options.watch===!0},loaded_count:reloaded.loaded.length,failed_count:reloaded.failed.length,activated_count:Math.max(0,reloaded.loaded.length-activation.failed.length),activation_failed_count:activation.failed.length,loaded_extensions:reloaded.loaded.map(entry=>({name:entry.name,layer:entry.layer,version:entry.version})),failed_extensions:reloaded.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error})),activation_failures:activation.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error}))};return options.watch===!0&&warnings.push("extension_reload_watch_hint:watch_mode_requested_non_interactive_single_pass_only"),withResult(details)},runExtensionCatalogAction=async ctx=>{const{normalizedTarget,scope,options,global:global2,withResult}=ctx;if(typeof normalizedTarget=="string"&&normalizedTarget.length>0&&normalizedTarget!=="catalog")throw new PmCliError('Action "catalog" does not accept a package target.',EXIT_CODE.USAGE);return withResult(await buildBundledPackageCatalog(scope,global2,options))},buildBundledInstallManagedSource=(alias,packageName)=>({kind:"builtin",input:alias,location:alias,name:alias,...packageName===null?{}:{package:packageName}}),buildLocalInstallManagedSource=source=>({kind:"local",input:source.input,location:source.absolute_path}),buildNpmInstallManagedSource=(source,resolved)=>({kind:"npm",input:source.input,location:resolved.resolved_subpath??".",package:resolved.npm_package,version:resolved.npm_version}),buildGithubInstallManagedSource=(source,resolved)=>({kind:"github",input:source.input,location:resolved.resolved_subpath??source.subpath??".",repository:source.repository,owner:source.owner,repo:source.repo,ref:source.ref,subpath:resolved.resolved_subpath??source.subpath,commit:resolved.commit}),buildInstallManagedSource=(bundledAliasName,bundledPackageName,installSource,resolvedSource)=>bundledAliasName?buildBundledInstallManagedSource(bundledAliasName,bundledPackageName):installSource.kind==="local"?buildLocalInstallManagedSource(installSource):installSource.kind==="npm"?buildNpmInstallManagedSource(installSource,resolvedSource):buildGithubInstallManagedSource(installSource,resolvedSource),resolveManagedInstallTimestamps=(existing,manifestVersion,source,now)=>existing?existing.manifest_version!==manifestVersion?{installed_at:existing.installed_at,updated_at:now}:managedExtensionSourcesEquivalent(existing.source,source)?{installed_at:existing.installed_at,updated_at:existing.updated_at}:{installed_at:existing.installed_at,updated_at:now}:{installed_at:now,updated_at:now},persistExtensionInstall=async(ctx,input)=>{const{scope,resolvedRoots,warnings}=ctx,{validated,destinationDirectoryName}=input,settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const destinationDirectory=path.join(resolvedRoots.selected_root,destinationDirectoryName),destinationExists=await pathExists(destinationDirectory),installInPlace=await areDirectoriesEquivalent(validated.directory,destinationDirectory);await fs.mkdir(resolvedRoots.selected_root,{recursive:!0});const backupRoot=await fs.mkdtemp(path.join(resolvedRoots.selected_root,".pm-extension-install-backup-")),backupDirectory=path.join(backupRoot,"destination");try{const snapshot=await captureExtensionInstallSnapshot(resolvedRoots.selected_root,resolvedRoots.settings_root,destinationDirectory,destinationExists,backupDirectory),sourceRecord=buildInstallManagedSource(input.bundledAliasName,input.bundledPackageName,input.installSource,input.resolvedSource),existingManagedEntry=managedStateRead.state.entries.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name)),timestamps=resolveManagedInstallTimestamps(existingManagedEntry,validated.manifest.version,sourceRecord,nowIso()),managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:destinationDirectoryName,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,...timestamps,source:sourceRecord}),activationChanged=ensureActivated(settings,validated.manifest.name);try{installInPlace||await copyExtensionDirectoryForInstall(validated.directory,destinationDirectory),await ensureExtensionModuleTypeMarker(destinationDirectory),await ensureInstalledExtensionSdkLink(destinationDirectory),await writeManagedExtensionState(resolvedRoots.selected_root,managedState),activationChanged&&await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}catch(error){try{await restoreExtensionInstallSnapshot(snapshot)}catch(rollbackError){throw new AggregateError([error,rollbackError],`Extension install failed: ${String(error)}; rollback failed: ${String(rollbackError)}`,{cause:rollbackError})}throw error}return{settings,managedState,sourceRecord,destinationDirectory,destinationExists,installInPlace,activationChanged}}finally{await fs.rm(backupRoot,{recursive:!0,force:!0}).catch(()=>{})}},scaffoldInstalledExtensionItemTypes=async(ctx,extensionName,registrations)=>{const definitions=registrations.filter(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName)).flatMap(entry=>entry.types.map(type=>({name:type.name,folder:type.folder})));return ctx.scope==="project"&&definitions.length>0&&await ensureTypeFolderScaffold(ctx.resolvedRoots.pm_root,definitions,ctx.warnings,"install:type-folder"),definitions},buildInstalledExtensionActivation=(ctx,extensionName,runtimeProbe,commandSummary,installedItemTypes)=>{const failure=findActivationFailureByName(extensionName,runtimeProbe.activation_failures,ctx.scope),status=resolveInstallRuntimeActivationStatus(extensionName,ctx.scope,runtimeProbe.installed,failure),activated=[!runtimeProbe.extensions_disabled,status==="ok"].every(Boolean);activated||ctx.warnings.push(`extension_install_activation_failed:${ctx.scope}:${extensionName}:${status}`);const healthByActivation={true:{status:"ok",blocking_failure_count:0},false:{status:"degraded",blocking_failure_count:1}};return{activated,status,failure,verification:{status:healthByActivation[String(activated)].status,target_pm_root:ctx.resolvedRoots.pm_root,activation_status:status,activated,registered_commands:commandSummary.command_paths,registered_actions:commandSummary.action_paths,registered_item_types:installedItemTypes,module_graph_verification:"fresh_in_topology_snapshot",health:healthByActivation[String(activated)]}}},performExtensionInstallUnderLock=async(ctx,input)=>{const{scope,resolvedRoots,warnings,global:global2,withResult}=ctx,{validated,destinationDirectoryName}=input,persisted=await persistExtensionInstall(ctx,input),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,persisted.settings,persisted.managedState);warnings.push(...refreshedInstalled.warnings);const runtimeProbe=await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),persisted.settings,refreshedInstalled.extensions,global2);warnings.push(...runtimeProbe.warnings);const installedItemTypeDefinitions=await scaffoldInstalledExtensionItemTypes(ctx,validated.manifest.name,runtimeProbe.item_type_registrations),commandSummary=summarizeRuntimeCommandPathsForExtension(validated.manifest.name,runtimeProbe.installed),activation=buildInstalledExtensionActivation(ctx,validated.manifest.name,runtimeProbe,commandSummary,installedItemTypeDefinitions),contributionInventory=runtimeProbe.contribution_inventories[normalizeExtensionNameForMatch(validated.manifest.name)];return contributionInventory&&(persisted.managedState=await persistManagedContributionInventory(resolvedRoots.selected_root,persisted.managedState,validated.manifest.name,contributionInventory)),withResult({extension:{name:validated.manifest.name,version:validated.manifest.version,entry:validated.manifest.entry,capabilities:validated.manifest.capabilities,directory:destinationDirectoryName},source:persisted.sourceRecord,source_resolution:input.sourceResolution,...input.installPlan?{install_plan:input.installPlan}:{},destination_path:persisted.destinationDirectory,overwritten:[persisted.destinationExists,!persisted.installInPlace].every(Boolean),installed_in_place:persisted.installInPlace,activated:activation.activated,settings_changed:persisted.activationChanged,runtime_activation_status:activation.status,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,contributions:contributionInventory,command_discovery:buildInstallCommandDiscovery(validated.manifest.name,persisted.sourceRecord,commandSummary,activation.failure),verification:activation.verification,activation_diagnostics:{failed_count:runtimeProbe.activation_failures.length,failed:runtimeProbe.activation_failures,installed_extension_failed:activation.failure??null}},activation.activated)},runBundledExtensionInstallAll=async ctx=>{const{options,global:global2,warnings,withResult}=ctx;if(typeof options.ref=="string"&&options.ref.trim().length>0)throw new PmCliError('Action "install all" does not accept --ref.',EXIT_CODE.USAGE);const packages=[],installedSources=new Map;for(const alias of await listBundledPackageAliases()){const source=await resolveBundledExtensionAliasSource(alias),sourceKey=path.resolve(source);let result=installedSources.get(sourceKey);result===void 0&&(result=await runExtension(alias,{...options,install:!0},global2),installedSources.set(sourceKey,result)),packages.push({alias,result})}return warnings.push(...packages.flatMap(entry=>entry.result.warnings)),withResult(buildBundledInstallReceipt(packages,options.dryRun===!0),packages.every(entry=>entry.result.ok))},runSingleExtensionInstall=async(ctx,explicitSourceInput,githubOption)=>{const{resolvedRoots}=ctx,{bundledAliasName,bundledPackageName,installSource,sourceResolution}=await resolveExtensionInstallSourceIdentity(explicitSourceInput,githubOption,ctx.options.ref);if(sourceResolution.ambiguous){const npmCandidate=sourceResolution.candidates.find(candidate=>candidate.kind==="npm");ctx.warnings.push(`extension_install_source_ambiguous:${explicitSourceInput}:builtin:${bundledAliasName}:npm:${npmCandidate.package}`)}const resolvedSource=await resolveInstallSource(installSource);try{const validated=await validateExtensionDirectory(resolvedSource.directory,{source_kind:installSource.kind,source_input:installSource.input,source_root:resolvedSource.source_root}),destinationDirectoryName=normalizeManagedDirectoryName(validated.manifest.name),installPlan=ctx.options.dryRun===!0||installSource.kind==="local"&&bundledAliasName===null?await buildExtensionInstallPlan(resolvedSource,path.join(resolvedRoots.selected_root,destinationDirectoryName),ctx.scope,ctx.options.copyPlan):void 0;return ctx.options.dryRun===!0?ctx.withResult({dry_run:!0,installed:!1,activated:!1,extension:{name:validated.manifest.name,version:validated.manifest.version},source_resolution:sourceResolution,install_plan:installPlan}):await withExtensionInstallLock(resolvedRoots.settings_root,destinationDirectoryName,()=>performExtensionInstallUnderLock(ctx,{validated,destinationDirectoryName,bundledAliasName,bundledPackageName,sourceResolution,installSource,resolvedSource,installPlan}))}finally{resolvedSource.cleanup&&await resolvedSource.cleanup()}},runExtensionInstallAction=async ctx=>{const githubOption=resolveGithubOption(ctx.options),explicitSourceInput=githubOption??requireTarget(ctx.normalizedTarget,ctx.action,ctx.options);return[githubOption===void 0,isBundledPackageInstallAllTarget(explicitSourceInput)].every(Boolean)?runBundledExtensionInstallAll(ctx):runSingleExtensionInstall(ctx,explicitSourceInput,githubOption)},runExtensionAdoptAllAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx;if(normalizedTarget!==void 0)throw new PmCliError('Action "adopt-all" does not accept a target argument.',EXIT_CODE.USAGE);if(resolveGithubOption(options)!==void 0||typeof options.ref=="string"&&options.ref.trim().length>0)throw new PmCliError('Action "adopt-all" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE);const settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const adoption=await adoptUnmanagedExtensions(resolvedRoots.selected_root,scope,installed.extensions,managedStateRead.state),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,adoption.state);warnings.push(...refreshedInstalled.warnings);const triage=buildExtensionTriageSummary(scope,warnings,refreshedInstalled.extensions,options);warnings.push(...triage.warnings);const refreshedByIdentity=new Map(refreshedInstalled.extensions.map(entry=>[`${normalizeExtensionNameForMatch(entry.name)}:${normalizeExtensionNameForMatch(entry.directory)}`,entry])),refreshedByDirectory=new Map(refreshedInstalled.extensions.map(entry=>[normalizeExtensionNameForMatch(entry.directory),entry])),adoptedDetails=adoption.adopted_entries.map(entry=>{const normalizedDirectory=normalizeExtensionNameForMatch(entry.directory),refreshedEntry=refreshedByIdentity.get(`${normalizeExtensionNameForMatch(entry.name)}:${normalizedDirectory}`)??refreshedByDirectory.get(normalizedDirectory);return{...entry,...projectExtensionUpdateCheck(refreshedEntry)}});return withResult({adopted_all:adoptedDetails.length>0,adopted_count:adoptedDetails.length,already_managed_count:adoption.already_managed_count,extensions:adoptedDetails,triage,warning_codes:triage.warning_codes,update_health_partial:triage.update_health_partial,update_health_coverage:triage.update_health_coverage})},projectExtensionUpdateCheck=entry=>({update_check_status:entry?.update_check_status??null,update_check_reason:entry?.update_check_reason??null}),buildAdoptedExtensionSource=(githubOption,extensionTarget,extensionDirectory,ref)=>{if(githubOption===void 0)return{kind:"local",input:extensionTarget,location:extensionDirectory};const parsed=parseExtensionInstallSource(githubOption,{forceGithub:!0,ref});if(parsed.kind!=="github")throw new PmCliError(`Invalid GitHub shorthand "${githubOption}".`,EXIT_CODE.USAGE);return{kind:"github",input:parsed.input,location:parsed.subpath??".",repository:parsed.repository,owner:parsed.owner,repo:parsed.repo,ref:parsed.ref,subpath:parsed.subpath}},runExtensionAdoptAction=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx,extensionTarget=requireTarget(normalizedTarget,action,options),githubOption=resolveGithubOption(options),settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate)throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND);if(candidate.managed)return withResult({adopted:!1,already_managed:!0,extension:{name:candidate.name,directory:candidate.directory}});const extensionDirectory=path.join(resolvedRoots.selected_root,candidate.directory),validated=await validateExtensionDirectory(extensionDirectory),now=nowIso(),sourceRecord=buildAdoptedExtensionSource(githubOption,extensionTarget,extensionDirectory,options.ref),managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord});await writeManagedExtensionState(resolvedRoots.selected_root,managedState);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const refreshedEntry=refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name))??refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.directory)===normalizeExtensionNameForMatch(candidate.directory));return withResult({adopted:!0,extension:{name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry},source:sourceRecord,...projectExtensionUpdateCheck(refreshedEntry)})},resolveRequiredInstalledExtension=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options}=ctx,extensionTarget=requireTarget(normalizedTarget,action,options),settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate)throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND);return{settings,managedStateRead,candidate}},runExtensionUninstallAction=async ctx=>{const{resolvedRoots,withResult}=ctx,{settings,managedStateRead,candidate}=await resolveRequiredInstalledExtension(ctx),destinationDirectory=path.join(resolvedRoots.selected_root,candidate.directory);await fs.rm(destinationDirectory,{recursive:!0,force:!0});const updatedState={...managedStateRead.state,updated_at:nowIso(),entries:managedStateRead.state.entries.filter(entry=>normalizeExtensionNameForMatch(entry.name)!==normalizeExtensionNameForMatch(candidate.name)&&normalizeExtensionNameForMatch(entry.directory)!==normalizeExtensionNameForMatch(candidate.directory))};await writeManagedExtensionState(resolvedRoots.selected_root,updatedState);const stateChanged=clearExtensionState(settings,candidate.name);return stateChanged&&await writeSettings(resolvedRoots.settings_root,settings,"settings:write"),withResult({removed:!0,extension:{name:candidate.name,directory:candidate.directory},destination_path:destinationDirectory,settings_changed:stateChanged})},runExtensionActivateDeactivateAction=async ctx=>{const{action,resolvedRoots,warnings,global:global2,withResult}=ctx,{settings,candidate}=await resolveRequiredInstalledExtension(ctx),settingsChanged=action==="activate"?ensureActivated(settings,candidate.name):ensureDeactivated(settings,candidate.name);settingsChanged&&await writeSettings(resolvedRoots.settings_root,settings,"settings:write");const activationFailure=action==="activate"?await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),settings,[candidate],global2).then(probe=>(warnings.push(...probe.warnings),findActivationFailureByName(candidate.name,probe.activation_failures,ctx.scope))):void 0;return activationFailure&&warnings.push(`extension_activate_failed:${ctx.scope}:${candidate.name}`),withResult({extension:{name:candidate.name,directory:candidate.directory},active:action==="activate"&&activationFailure===void 0,runtime_active:action==="activate"&&activationFailure===void 0,activation_failure:activationFailure??null,settings_changed:settingsChanged,settings:{enabled:[...settings.extensions.enabled],disabled:[...settings.extensions.disabled]}},activationFailure===void 0)},buildDoctorRemediation=(baseRemediation,loadFailureCount,activationFailureCount,vocabulary,managedStateFix,isolationHint)=>{const noun=vocabulary==="package"?"package":"extension",doctorAction={package:"doctor",extension:"--doctor"}[noun],adoptedCount=managedStateFix?.adopted_entries.length??0,conditionalEntries=[[isolationHint!==null,isolationHint??""],[loadFailureCount>0,`Run pm ${noun} explore --project and pm ${noun} explore --global to inspect load failures.`],[activationFailureCount>0,`Review activation failures in pm ${noun} ${doctorAction} --detail deep output.`],[adoptedCount>0,`Managed-state fix adopted ${adoptedCount} extension(s).`]];return[...new Set([...baseRemediation,...conditionalEntries.filter(([include])=>include).map(([,entry])=>entry)].map(entry=>entry.trim()).filter(entry=>entry.length>0))]},hasGlobalLayerDiagnostics=loadResult=>loadResult.loaded.some(entry=>entry.layer==="global")||loadResult.failed.some(entry=>entry.layer==="global")||loadResult.warnings.some(warning=>warning.includes(":global:")),buildDoctorIsolationHint=(scope,isolated,vocabulary,loadResult)=>{if(scope!=="project"||isolated||!hasGlobalLayerDiagnostics(loadResult))return null;const noun=vocabulary==="package"?"package":"extension";return`Global ${noun} registrations are included in project diagnostics. For hermetic ${noun} smoke tests, rerun pm ${noun} doctor --project --isolated --detail deep --trace, or set PM_GLOBAL_PATH to a temporary directory for the whole test process.`},resolveDoctorInvocationOptions=(target,scope,options)=>{if(String(target??"").trim().length>0)throw new PmCliError('Action "doctor" does not accept a target argument.',EXIT_CODE.USAGE);const isolated=[options.isolated,options.ignoreGlobal].includes(!0);if([isolated,scope==="global"].every(Boolean))throw new PmCliError("--isolated and --ignore-global are only valid with project-scope doctor diagnostics.",EXIT_CODE.USAGE);const detailMode=parseDoctorDetailMode(options.detail),includeTrace=options.trace===!0;if([includeTrace,detailMode!=="deep"].every(Boolean))throw new PmCliError("--trace requires --detail deep with --doctor.",EXIT_CODE.USAGE);return{isolated,detailMode,includeTrace}},applyDoctorManagedStateFix=async(ctx,installed,state)=>{if(ctx.options.fixManagedState!==!0)return{state,fix:null};const fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,state);return{state:fix.state,fix}},buildDoctorIsolationMetadata=(scope,isolated,vocabulary,loadResult)=>{const noun=vocabulary==="package"?"package":"extension";if(scope!=="project")return{isolated,global_extensions_included:!1,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:null,pm_global_path_recipe:null};const isolatedCommand=`pm ${noun} doctor --project --isolated --detail deep --trace`;return{isolated,global_extensions_included:!isolated,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:isolated?null:isolatedCommand,pm_global_path_recipe:`PM_GLOBAL_PATH=$(mktemp -d) pm ${noun} doctor --project --detail deep --trace`}},runExtensionDoctorAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx,{isolated,detailMode,includeTrace}=resolveDoctorInvocationOptions(normalizedTarget,scope,options),settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await applyDoctorManagedStateFix(ctx,installed.extensions,managedStateRead.state),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===!0,ignoreGlobalExtensions:isolated}),activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded}),authorManifest=await inspectExtensionAuthorManifestAtPmRoot(resolvedRoots.pm_root);warnings.push(...authorManifest.warnings,...loadResult.warnings),warnings.push(...classifyDoctorLoadFailureWarnings(loadResult.failed)),warnings.push(...activationResult.warnings),warnings.push(...classifyDoctorActivationFailureWarnings(activationResult.failed)),warnings.push(...classifyUnusedCapabilityWarnings(loadResult,activationResult)),warnings.push(...collectGlobalOutputOverrideDoctorWarnings(activationResult,loadResult)),warnings.push(...collectSchemaNarrowActivationDoctorWarnings(loadResult,activationResult)),warnings.push(...collectMcpCustomFieldCollisionDoctorWarnings(activationResult));const runtimeInstalledExtensions=applyDoctorRuntimeActivationState(refreshedInstalled.extensions,loadResult,activationResult),doctorConsistency=buildDoctorConsistencySummary(scope,runtimeInstalledExtensions,loadResult.loaded.map(entry=>({layer:entry.layer,name:entry.name})),loadResult.failed.map(entry=>({name:entry.name})),loadResult.disabled_by_flag);warnings.push(...doctorConsistency.warnings);const updateCheckWarnings=runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateCheckWarnings);const triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const normalizedWarnings=[...triage.warnings],policySummary={mode:loadResult.policy.mode,trust_mode:loadResult.policy.trust_mode,require_provenance:loadResult.policy.require_provenance,default_sandbox_profile:loadResult.policy.default_sandbox_profile,sandbox_enforcement:"advisory: sandbox_profile/permissions are declaration-based load gates, not runtime isolation (ADR pm-6ef3)",trusted_extensions_count:loadResult.policy.trusted_extensions.length,allowed_extensions_count:loadResult.policy.allowed_extensions.length,blocked_extensions_count:loadResult.policy.blocked_extensions.length,allowed_capabilities_count:loadResult.policy.allowed_capabilities.length,blocked_capabilities_count:loadResult.policy.blocked_capabilities.length,allowed_surfaces_count:loadResult.policy.allowed_surfaces.length,blocked_surfaces_count:loadResult.policy.blocked_surfaces.length,allowed_commands_count:loadResult.policy.allowed_commands.length,blocked_commands_count:loadResult.policy.blocked_commands.length,allowed_actions_count:loadResult.policy.allowed_actions.length,blocked_actions_count:loadResult.policy.blocked_actions.length,allowed_services_count:loadResult.policy.allowed_services.length,blocked_services_count:loadResult.policy.blocked_services.length,extension_override_count:loadResult.policy.extension_overrides.length},capabilityGuidance=collectUnknownCapabilityGuidance(normalizedWarnings),capabilityContract=buildCapabilityContractMetadata(),warningCodes=triage.warning_codes,isolationHint=buildDoctorIsolationHint(scope,isolated,options.vocabulary,loadResult),remediation=buildDoctorRemediation(triage.remediation,loadResult.failed.length,activationResult.failed.length,options.vocabulary,managedStateFix,isolationHint),isolation=buildDoctorIsolationMetadata(scope,isolated,options.vocabulary,loadResult),summary={status:triage.status,scope,warning_count:triage.warning_count,warning_codes:warningCodes,total_extensions:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,unmanaged_loaded_extension_count:triage.unmanaged_loaded_extension_count,unmanaged_action_required_extension_count:triage.unmanaged_action_required_extension_count,unmanaged_expected_extension_count:triage.unmanaged_expected_extension_count,runtime_active_total:runtimeInstalledExtensions.filter(entry=>entry.runtime_active===!0).length,activation_status_totals:{ok:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="ok").length,failed:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="failed").length,not_loaded:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="not_loaded").length,unknown:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="unknown").length},unknown_capability_count:capabilityGuidance.length,capability_contract_version:capabilityContract.version,update_available_total:triage.update_available_total,update_check_status_totals:triage.update_check_status_totals,update_health_coverage:triage.update_health_coverage,update_health_partial:triage.update_health_partial,update_check_failed_total:runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").length,load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,load_failures:summarizeExtensionFailures(loadResult.failed),activation_failures:summarizeExtensionFailures(activationResult.failed),blocking_failure_count:loadResult.failed.length+activationResult.failed.length,has_blocking_failures:loadResult.failed.length+activationResult.failed.length>0,consistency_warning_count:doctorConsistency.warnings.length,trace_enabled:includeTrace,isolation,policy:policySummary,remediation},managedStateFixSummary=managedStateFix?{requested:!0,applied:managedStateFix.adopted_entries.length>0,adopted_count:managedStateFix.adopted_entries.length,already_managed_count:managedStateFix.already_managed_count,adopted_extensions:managedStateFix.adopted_entries.map(entry=>entry.name)}:{requested:!1,applied:!1,adopted_count:0,already_managed_count:refreshedInstalled.extensions.filter(entry=>entry.managed).length,adopted_extensions:[]},details={mode:detailMode,summary,triage,trace_enabled:includeTrace,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,managed_state_fix:managedStateFixSummary,author_manifest:authorManifest,isolation,policy:loadResult.policy};if(detailMode==="deep"){const activationFailedDetails=includeTrace?activationResult.failed:activationResult.failed.map(entry=>{const{trace:_trace,...rest}=entry;return rest});details.deep={warnings:normalizedWarnings,warning_codes:warningCodes,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,trace_enabled:includeTrace,managed_state:{path:managedStateRead.path,count:managedState.entries.length,entries:managedState.entries},installed_extensions:runtimeInstalledExtensions,load:{roots:loadResult.roots,policy:loadResult.policy,warnings:loadResult.warnings,failed:loadResult.failed,loaded:loadResult.loaded.map(entry=>({layer:entry.layer,directory:entry.directory,name:entry.name,version:entry.version,entry:entry.entry,priority:entry.priority}))},activation:{failed:activationFailedDetails,warnings:activationResult.warnings,hook_counts:activationResult.hook_counts,registration_counts:activationResult.registration_counts,parser_override_count:activationResult.parser_override_count,preflight_override_count:activationResult.preflight_override_count,service_override_count:activationResult.service_override_count,renderer_override_count:activationResult.renderer_override_count},consistency:doctorConsistency.summary},includeTrace&&(details.deep.trace={activation_failures:activationResult.failed.filter(entry=>entry.trace!==void 0).map(entry=>({layer:entry.layer,name:entry.name,entry_path:entry.entry_path,error:entry.error,method:entry.trace.method,command:entry.trace.command,capability:entry.trace.capability,missing_capability:entry.trace.missing_capability,registration_index:entry.trace.registration_index,expected_schema:entry.trace.expected_schema,hint:entry.trace.hint,received:entry.trace.received}))})}return withResult(details)},runExtensionDescribeAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx,settings=await readSettings(resolvedRoots.settings_root),loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===!0}),activationResult=await activateExtensions(loadResult);warnings.push(...loadResult.warnings),warnings.push(...activationResult.warnings);const describeResult=buildExtensionDescribeResult(normalizedTarget,loadResult,activationResult);if(normalizedTarget!==void 0&&describeResult.extensions.length===0){const noun=options.vocabulary==="package"?"package":"extension",loadedNames=[...new Set(loadResult.loaded.map(entry=>options.vocabulary==="package"&&typeof entry.source_package=="string"&&entry.source_package.trim().length>0?entry.source_package.trim():entry.name))].sort((left,right)=>left.localeCompare(right)),loadedHint=loadedNames.length>0?` Loaded ${noun} names: ${loadedNames.join(", ")}.`:"";throw new PmCliError(`No loaded ${noun} named "${normalizedTarget}" was found in ${scope} scope.${loadedHint} Run pm ${noun} explore to list discovered ${noun}s.`,EXIT_CODE.NOT_FOUND)}return withResult({target:describeResult.target,total:describeResult.total,extensions:describeResult.extensions,union:describeResult.union,command_ownership:describeResult.command_ownership})},prepareExploreManageState=async(ctx,installed,initialState)=>{let state=initialState,fix=null;if([ctx.action==="manage",ctx.options.fixManagedState===!0].every(Boolean)&&(fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,initialState),state=fix.state),ctx.action==="manage"){const entries=await mapWithFixedConcurrency(state.entries,GITHUB_UPDATE_CHECK_CONCURRENCY,async entry=>{if(entry.source.kind!=="github")return entry;const updateStatus=await checkGithubUpdate(entry.source);return{...entry,last_update_check_at:updateStatus.checked_at,last_update_remote_commit:updateStatus.remote_commit,update_available:updateStatus.available,update_error:updateStatus.error}});state={...state,updated_at:nowIso(),entries:sortManagedEntries(entries)},await writeManagedExtensionState(ctx.resolvedRoots.selected_root,state)}return{state,fix}},probeExploreManageRuntime=async(ctx,settings,installed)=>{const loadResult=await loadExtensions({pmRoot:ctx.resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:ctx.global.noExtensions===!0}),activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});return ctx.warnings.push(...loadResult.warnings,...activationResult.warnings),{installed:applyDoctorRuntimeActivationState(installed,loadResult,activationResult),failures:collectActivationFailureDiagnostics(activationResult.failed),summary:{requested:!0,executed:!0,reason:ctx.action==="explore"?"explore_defaults_to_runtime_probe":ctx.options.runtimeProbe===!0?"runtime_probe_requested":"manage_defaults_to_runtime_probe",load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,warning_count:[...new Set([...loadResult.warnings,...activationResult.warnings])].length,policy:loadResult.policy}}},projectExploreManageFix=(fix,installed)=>fix?{requested:!0,applied:fix.adopted_entries.length>0,adopted_count:fix.adopted_entries.length,adopted_extensions:fix.adopted_entries.map(entry=>entry.name),already_managed_count:fix.already_managed_count}:{requested:!1,applied:!1,adopted_count:0,adopted_extensions:[],already_managed_count:installed.filter(entry=>entry.managed).length},runExtensionExploreManageAction=async ctx=>{const{action,scope,resolvedRoots,warnings,options,withResult}=ctx,settings=await readSettings(resolvedRoots.settings_root),configuredPolicy=buildExtensionPolicyDetails(settings.extensions.policy),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await prepareExploreManageState(ctx,installed.extensions,managedStateRead.state),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);if(warnings.push(...refreshedInstalled.warnings),action==="manage"){const updateWarnings=refreshedInstalled.extensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateWarnings)}const runtimeProbe=await probeExploreManageRuntime(ctx,settings,refreshedInstalled.extensions),runtimeInstalledExtensions=runtimeProbe.installed,triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const details={total:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,extensions:runtimeInstalledExtensions,triage,policy:configuredPolicy};return runtimeProbe.failures!==void 0&&(details.activation_diagnostics={failed_count:runtimeProbe.failures.length,failed:runtimeProbe.failures}),action==="explore"&&(details.runtime_probe=runtimeProbe.summary),action==="manage"&&(details.runtime_probe=runtimeProbe.summary,details.managed_state_fix=projectExploreManageFix(managedStateFix,runtimeInstalledExtensions)),withResult(details)},EXTENSION_ACTION_HANDLERS={init:runExtensionInitAction,install:runExtensionInstallAction,uninstall:runExtensionUninstallAction,explore:runExtensionExploreManageAction,manage:runExtensionExploreManageAction,describe:runExtensionDescribeAction,reload:runExtensionReloadAction,doctor:runExtensionDoctorAction,catalog:runExtensionCatalogAction,adopt:runExtensionAdoptAction,"adopt-all":runExtensionAdoptAllAction,activate:runExtensionActivateDeactivateAction,deactivate:runExtensionActivateDeactivateAction,migrate:runExtensionMigrateAction},requiresExtensionStateLock=ctx=>[ctx.action==="uninstall",ctx.action==="manage",ctx.action==="adopt",ctx.action==="adopt-all",ctx.action==="activate",ctx.action==="deactivate",ctx.action==="migrate",[ctx.action==="doctor",ctx.options.fixManagedState===!0].every(Boolean)].some(Boolean),dispatchExtensionAction=ctx=>requiresExtensionStateLock(ctx)?withExtensionInstallLock(ctx.resolvedRoots.settings_root,`${ctx.action}-state`,()=>EXTENSION_ACTION_HANDLERS[ctx.action](ctx)):EXTENSION_ACTION_HANDLERS[ctx.action](ctx),_testOnly={adoptUnmanagedExtensions,buildAdoptedExtensionSource,buildExtensionPolicyDetails,buildInstallCommandDiscovery,checkGithubUpdate,clearExtensionState,collectActivationFailureDiagnostics,findActivationFailureByName,resolveInstallRuntimeActivationStatus,collectGlobalOutputOverrideDoctorWarnings,collectMcpCustomFieldCollisionDoctorWarnings,collectSchemaNarrowActivationDoctorWarnings,copyExtensionDirectoryWithoutSelfNesting,isErrnoCode,isRetriableExtensionInstallCopyError,listInstalledExtensions,mapWithFixedConcurrency,projectExtensionUpdateCheck,readOptionalMetadataFile,requireTarget,resolveAction,resolveCommandDiscoveryPackageName,resolveGithubOption,resolveInstalledExtensionCandidate,resolveManagedInstallTimestamps,resolveScope,resolveUpdateCheckResolution,withExtensionInstallLock};export{_testOnly,copyExtensionDirectoryForInstall,parseExtensionInstallSource,parseExtensionManifest,readManagedExtensionState,resolveCanonicalExtensionInstallDestination,resolveManagedExtensionStatePath,runExtension,validateExtensionDirectory,writeManagedExtensionState};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
package/dist/sdk/files.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="573da024-c791-5ff2-b3ee-3529804bab43")}catch(e2){}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,hasActiveOnReadHooks}from"../core/extensions/index.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{locateItem,listAllItemMetadata,mutateItem,readLocatedItem}from"../core/store/item-store.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{queryLinkedFileMetadataIndex}from"../core/store/item-metadata-query-index.js";import{resolvePmRoot,resolveWorkspaceRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{resolveAuthor}from"../core/shared/author.js";import{isPathWithinDirectory}from"../core/fs/path-utils.js";import{dedupeLinkedArtifacts,normalizeLinkedPath,renameArtifactsResultKey,runLinkedArtifacts,sortLinkedArtifacts}from"./linked-artifacts.js";import{explainSourceTraceability}from"./traceability/source-traceability.js";const RELATIVE_REFERENCE_SCAN_MAX_CHARS=32768;function normalizeCandidatePathForOutput(value){return normalizeLinkedPath(path.normalize(value))}async function realpathForContainment(inputPath){try{return await fs.realpath(inputPath)}catch{return path.resolve(inputPath)}}function linkedFileResolvedKey(linkedFile,projectRoot){const resolvedPath=path.isAbsolute(linkedFile.path)?path.resolve(linkedFile.path):path.resolve(projectRoot,linkedFile.path);return`${normalizeCandidatePathForOutput(resolvedPath)}::${linkedFile.scope}`}function collectTextReferences(value,fieldPath,references){if(typeof value==="string"){const trimmed=value.trim();if(trimmed.length>0){references.push({field:fieldPath,value:trimmed})}return}if(Array.isArray(value)){value.forEach((entry,index)=>collectTextReferences(entry,`${fieldPath}[${index}]`,references));return}if(typeof value==="object"&&value!==null){for(const[key,nested]of Object.entries(value)){collectTextReferences(nested,fieldPath?`${fieldPath}.${key}`:key,references)}}}function collectItemTextReferences(document){const references=[];collectTextReferences(document.metadata,"metadata",references);collectTextReferences(document.body,"body",references);return references}function cleanupPathToken(value){let next=value.trim();next=next.replace(/^[`"'<([{]+/u,"");next=next.replace(/[`"'>)\]},;!?]+$/u,"");next=next.replace(/[.]+$/u,"");next=next.replace(/:(?:\d+)(?::\d+)?$/u,"");next=next.replace(/[.]+$/u,"");return next}function extractRawPathReferences(references){const rawReferences=[];const absolutePattern=/(?:[A-Za-z]:[\\/]|\/)[^\s"'`<>()[\]{},;]+/gu;const relativePattern=/(?:\.{1,2}[\\/])?(?:(?:[A-Za-z0-9_.@-]+[\\/])+[A-Za-z0-9_.@-]+|[A-Za-z0-9_.@-]+\.[A-Za-z0-9][A-Za-z0-9._-]*)/gu;for(const reference of references){const seenInField=new Set;const boundedRelativeValue=reference.value.slice(0,RELATIVE_REFERENCE_SCAN_MAX_CHARS);for(const[pattern,input]of[[absolutePattern,reference.value],[relativePattern,boundedRelativeValue]]){pattern.lastIndex=0;for(const match of input.matchAll(pattern)){const token=cleanupPathToken(match[0]);if(!token||seenInField.has(token)){continue}seenInField.add(token);rawReferences.push({field:reference.field,value:token})}}}return rawReferences}async function resolveDiscoveredFile(rawPath,workspaceRoot,invocationRoot=workspaceRoot){const absolutePath=path.isAbsolute(rawPath)?path.resolve(rawPath):path.resolve(invocationRoot,rawPath);let stats;try{stats=await fs.stat(absolutePath)}catch{return void 0}if(!stats.isFile()){return void 0}const[canonicalProjectRoot,canonicalAbsolutePath]=await Promise.all([realpathForContainment(workspaceRoot),realpathForContainment(absolutePath)]);if(isPathWithinDirectory(canonicalProjectRoot,canonicalAbsolutePath)){const relativePath=path.relative(canonicalProjectRoot,canonicalAbsolutePath);if(!relativePath||relativePath.startsWith("..")||path.isAbsolute(relativePath)){return void 0}return{path:normalizeCandidatePathForOutput(relativePath),scope:"project"}}return{path:normalizeCandidatePathForOutput(absolutePath),scope:"global"}}async function discoverReferencedFiles(document,workspaceRoot,invocationRoot=workspaceRoot){const existingResolvedKeys=new Set((document.metadata.files??[]).map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));const grouped=new Map;const rawReferences=extractRawPathReferences(collectItemTextReferences(document));const resolvedByValue=new Map;await Promise.all([...new Set(rawReferences.map(reference=>reference.value))].map(async value=>{resolvedByValue.set(value,await resolveDiscoveredFile(value,workspaceRoot,invocationRoot))}));const resolvedReferences=rawReferences.map(reference=>({reference,resolved:resolvedByValue.get(reference.value)}));for(const{reference,resolved}of resolvedReferences){if(!resolved){continue}const key=linkedFileResolvedKey(resolved,workspaceRoot);const existing=grouped.get(key)??{path:resolved.path,scope:resolved.scope,sourceFields:new Set,originalPaths:new Set,sourceCount:0};existing.sourceFields.add(reference.field);existing.originalPaths.add(reference.value);existing.sourceCount+=1;grouped.set(key,existing)}return[...grouped.entries()].map(([key,entry])=>({path:entry.path,scope:entry.scope,status:existingResolvedKeys.has(key)?"already_linked":"addable",source_count:entry.sourceCount,source_fields:[...entry.sourceFields].sort((left,right)=>left.localeCompare(right)),original_paths:[...entry.originalPaths].sort((left,right)=>left.localeCompare(right))})).sort((left,right)=>{const byStatus=left.status.localeCompare(right.status);if(byStatus!==0)return byStatus;const byPath=left.path.localeCompare(right.path);if(byPath!==0)return byPath;return left.scope.localeCompare(right.scope)})}const _testOnly={relativeReferenceScanMaxChars:RELATIVE_REFERENCE_SCAN_MAX_CHARS,normalizeCandidatePathForOutput,realpathForContainment,linkedFileResolvedKey,collectTextReferences,collectItemTextReferences,cleanupPathToken,extractRawPathReferences,resolveDiscoveredFile,discoverReferencedFiles};async function runFiles(id,options,global2){const result=await runLinkedArtifacts(id,options,global2,{metadataKey:"files",op:"files_add",bareNoun:"file",supportsAppendStable:true});return renameArtifactsResultKey(result,"files")}async function normalizeFilesLookupPaths(values,workspaceRoot){const canonicalWorkspaceRoot=await realpathForContainment(workspaceRoot);const paths=await Promise.all(values.map(async value=>{const trimmed=value.trim();if(!trimmed){throw new PmCliError("Files lookup paths must not be empty.",EXIT_CODE.USAGE)}if(!path.isAbsolute(trimmed))return normalizeLinkedPath(trimmed);const canonicalAbsolutePath=await realpathForContainment(trimmed);return isPathWithinDirectory(canonicalWorkspaceRoot,canonicalAbsolutePath)?normalizeLinkedPath(path.relative(canonicalWorkspaceRoot,canonicalAbsolutePath)):normalizeLinkedPath(canonicalAbsolutePath)}));const uniquePaths=[...new Set(paths)].sort((left,right)=>left.localeCompare(right));if(uniquePaths.length===0){throw new PmCliError("Files lookup requires at least one path.",EXIT_CODE.USAGE)}return uniquePaths}function resolveFilesLookupWindow(options){for(const[label,value]of[["limit",options.limit],["offset",options.offset]]){if(value!==void 0&&(!Number.isInteger(value)||value<0)){throw new PmCliError(`Files lookup ${label} must be a non-negative integer.`,EXIT_CODE.USAGE)}}const{offset=0,limit=50}=options;return{offset:Math.max(0,Math.floor(offset)),limit:options.noTruncate?void 0:Math.max(0,Math.floor(limit))}}function projectFilesLookupItem(item){return{id:item.id,title:item.title,type:item.type,status:item.status,priority:item.priority,updated_at:item.updated_at}}function compareFilesLookupCandidates(left,right){const byPriority=left.item.priority-right.item.priority;if(byPriority!==0)return byPriority;const byUpdated=right.item.updated_at.localeCompare(left.item.updated_at);return byUpdated===0?left.item.id.localeCompare(right.item.id):byUpdated}function matchingFilesLookupCandidates(params){return params.metadata.map(item=>({item,files:(item.files??[]).filter(file=>params.paths.includes(normalizeLinkedPath(file.path))&&(params.scope===void 0||file.scope===params.scope)).sort((left,right)=>{const byPath=left.path.localeCompare(right.path);return byPath===0?left.scope.localeCompare(right.scope):byPath})})).filter(match=>match.files.length>0).sort(compareFilesLookupCandidates)}async function resolveFilesLookupTraceability(params){if(!params.explain)return void 0;return explainSourceTraceability({workspaceRoot:params.workspaceRoot,paths:params.paths,candidates:params.matching,corpus:params.metadata,...params.lineRange?{lineRange:params.lineRange}:{},...params.decisionDepth===void 0?{}:{decisionDepth:params.decisionDepth}})}async function queryFilesLookupIndex(params){if([params.strictRead,params.noTruncate,params.explain,hasActiveOnReadHooks()].includes(true)){return null}const indexState=await readItemMetadataDerivedIndexState(params.pmRoot,[...new Set(Object.values(params.typeToFolder))]);if(!indexState)return null;return queryLinkedFileMetadataIndex({pmRoot:params.pmRoot,expectedSourceCursor:indexState.source_cursor,paths:params.paths,scope:params.scope,limit:params.limit,offset:params.offset})}async function queryFilesLookupSource(params){const warnings=[];const metadata=await listAllItemMetadata(params.pmRoot,params.settings.item_format,params.typeToFolder,warnings,params.settings.schema);const matching=matchingFilesLookupCandidates({metadata,paths:params.paths,scope:params.scope});const readWarnings=warnings.filter(warning=>/^item_list_(?:item|directory)_read_failed:/u.test(warning));if(params.strictRead&&readWarnings.length>0){throw new PmCliError(`Files lookup could not read every item: ${readWarnings.join("; ")}`,EXIT_CODE.GENERIC_FAILURE)}const traceability=await resolveFilesLookupTraceability({explain:params.explain,workspaceRoot:params.workspaceRoot,paths:params.paths,matching,metadata,lineRange:params.lineRange,decisionDepth:params.decisionDepth});const ranked=traceability?[...matching].sort((left,right)=>{const byScore=traceability.explanations.get(right.item.id).score-traceability.explanations.get(left.item.id).score;if(byScore!==0)return byScore;return compareFilesLookupCandidates(left,right)}):matching;const page=ranked.slice(params.offset,params.limit===void 0?void 0:params.offset+params.limit);return{paths:params.paths,total:matching.length,count:page.length,offset:params.offset,limit:params.limit??null,has_more:params.offset+page.length<matching.length,truncated:params.offset+page.length<matching.length,completeness:{status:readWarnings.length===0?"complete":"partial",source:"source_scan"},warnings,matches:page.map(match=>({item:projectFilesLookupItem(match.item),files:match.files,...traceability?{traceability:traceability.explanations.get(match.item.id)}:{}})),...traceability?{traceability_receipt:traceability.receipt}:{}}}async function runFilesLookup(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);const workspaceRoot=resolveWorkspaceRoot(pmRoot);await assertInitializedTracker(pmRoot);const paths=await normalizeFilesLookupPaths(options.paths,workspaceRoot);if(options.lineRange&&paths.length!==1){throw new PmCliError("Files lookup line attribution requires exactly one source path.",EXIT_CODE.USAGE)}const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const{offset,limit}=resolveFilesLookupWindow(options);const indexed=await queryFilesLookupIndex({pmRoot,typeToFolder:typeRegistry.type_to_folder,paths,scope:options.scope,limit,offset,strictRead:options.strictRead===true,noTruncate:options.noTruncate===true,explain:options.explain===true||options.lineRange!==void 0});if(indexed){return{paths,total:indexed.total,count:indexed.matches.length,offset,limit,has_more:offset+indexed.matches.length<indexed.total,truncated:offset+indexed.matches.length<indexed.total,completeness:{status:"unchecked",source:"index"},warnings:[],matches:indexed.matches.map(match=>({item:projectFilesLookupItem(match.item),files:match.files}))}}return queryFilesLookupSource({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,paths,scope:options.scope,limit,offset,strictRead:options.strictRead===true,workspaceRoot,explain:options.explain===true||options.lineRange!==void 0,lineRange:options.lineRange,decisionDepth:options.decisionDepth})}async function runFilesDiscover(id,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);const workspaceRoot=resolveWorkspaceRoot(pmRoot);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located){throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND)}const loaded=await readLocatedItem(located,{schema:settings.schema});const candidates=await discoverReferencedFiles(loaded.document,workspaceRoot,process.cwd());const addableCandidates=candidates.filter(candidate=>candidate.status==="addable");const skippedExisting=candidates.filter(candidate=>candidate.status==="already_linked");const requestedApply=options.apply===true;const note=options.note?.trim()||"discovered from item text";if(!requestedApply||addableCandidates.length===0){const files2=loaded.document.metadata.files??[];return{id:located.id,files:files2,changed:false,apply:requestedApply,count:files2.length,candidate_count:candidates.length,addable_count:addableCandidates.length,added_count:0,skipped_existing_count:skippedExisting.length,candidates,added:[],skipped_existing:skippedExisting}}const author=resolveAuthor(options.author,settings.author_default);const discoveredAdds=addableCandidates.map(candidate=>({path:candidate.path,scope:candidate.scope,note}));let appliedAdds=[];const appliedCandidateIndices=new Set;const result=await mutateItem({pmRoot,settings,id,op:"files_discover",author,message:options.message??"Discover referenced file links",force:options.force,mutate(document){const next=[...document.metadata.files??[]];const existingResolvedKeys=new Set(next.map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));appliedAdds=[];appliedCandidateIndices.clear();for(const[index,add]of discoveredAdds.entries()){const resolvedKey=linkedFileResolvedKey(add,workspaceRoot);if(existingResolvedKeys.has(resolvedKey)){continue}next.push(add);existingResolvedKeys.add(resolvedKey);appliedAdds.push(add);appliedCandidateIndices.add(index)}const deduped=dedupeLinkedArtifacts(next);const normalized=options.appendStable?deduped:sortLinkedArtifacts(deduped);if(normalized.length>0){document.metadata.files=normalized}else{delete document.metadata.files}return{changedFields:appliedAdds.length>0?["files"]:[],warnings:appliedAdds.length!==discoveredAdds.length?[`files_discover_skipped_existing:${discoveredAdds.length-appliedAdds.length}`]:[]}}});const files=result.item.files??[];const addedResolvedKeys=new Set(appliedAdds.map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));const added=files.filter(entry=>addedResolvedKeys.has(linkedFileResolvedKey(entry,workspaceRoot)));const skippedDuringApply=addableCandidates.filter((_candidate,index)=>!appliedCandidateIndices.has(index));const allSkippedExisting=[...skippedExisting,...skippedDuringApply];return{id:result.item.id,files,changed:added.length>0,apply:true,count:files.length,candidate_count:candidates.length,addable_count:addableCandidates.length,added_count:added.length,skipped_existing_count:allSkippedExisting.length,candidates,added,skipped_existing:allSkippedExisting}}export{_testOnly,runFiles,runFilesDiscover,runFilesLookup};
|
|
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]="06b0bd73-d282-5473-a1da-f11c61a0a086")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,hasActiveOnReadHooks}from"../core/extensions/index.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{locateItem,listAllItemMetadata,mutateItem,readLocatedItem}from"../core/store/item-store.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{queryLinkedFileMetadataIndex}from"../core/store/item-metadata-query-index.js";import{resolvePmRoot,resolveWorkspaceRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{resolveAuthor}from"../core/shared/author.js";import{isPathWithinDirectory}from"../core/fs/path-utils.js";import{dedupeLinkedArtifacts,normalizeLinkedPath,renameArtifactsResultKey,runLinkedArtifacts,sortLinkedArtifacts}from"./linked-artifacts.js";import{explainSourceTraceability}from"./traceability/source-traceability.js";const RELATIVE_REFERENCE_SCAN_MAX_CHARS=32768;function normalizeCandidatePathForOutput(value){return normalizeLinkedPath(path.normalize(value))}async function realpathForContainment(inputPath){try{return await fs.realpath(inputPath)}catch{return path.resolve(inputPath)}}function linkedFileResolvedKey(linkedFile,projectRoot){const resolvedPath=path.isAbsolute(linkedFile.path)?path.resolve(linkedFile.path):path.resolve(projectRoot,linkedFile.path);return`${normalizeCandidatePathForOutput(resolvedPath)}::${linkedFile.scope}`}function collectTextReferences(value,fieldPath,references){if(typeof value=="string"){const trimmed=value.trim();trimmed.length>0&&references.push({field:fieldPath,value:trimmed});return}if(Array.isArray(value)){value.forEach((entry,index)=>collectTextReferences(entry,`${fieldPath}[${index}]`,references));return}if(typeof value=="object"&&value!==null)for(const[key,nested]of Object.entries(value))collectTextReferences(nested,fieldPath?`${fieldPath}.${key}`:key,references)}function collectItemTextReferences(document){const references=[];return collectTextReferences(document.metadata,"metadata",references),collectTextReferences(document.body,"body",references),references}function cleanupPathToken(value){let next=value.trim();return next=next.replace(/^[`"'<([{]+/u,""),next=next.replace(/[`"'>)\]},;!?]+$/u,""),next=next.replace(/[.]+$/u,""),next=next.replace(/:(?:\d+)(?::\d+)?$/u,""),next=next.replace(/[.]+$/u,""),next}function extractRawPathReferences(references){const rawReferences=[],absolutePattern=/(?:[A-Za-z]:[\\/]|\/)[^\s"'`<>()[\]{},;]+/gu,relativePattern=/(?:\.{1,2}[\\/])?(?:(?:[A-Za-z0-9_.@-]+[\\/])+[A-Za-z0-9_.@-]+|[A-Za-z0-9_.@-]+\.[A-Za-z0-9][A-Za-z0-9._-]*)/gu;for(const reference of references){const seenInField=new Set,boundedRelativeValue=reference.value.slice(0,RELATIVE_REFERENCE_SCAN_MAX_CHARS);for(const[pattern,input]of[[absolutePattern,reference.value],[relativePattern,boundedRelativeValue]]){pattern.lastIndex=0;for(const match of input.matchAll(pattern)){const token=cleanupPathToken(match[0]);!token||seenInField.has(token)||(seenInField.add(token),rawReferences.push({field:reference.field,value:token}))}}}return rawReferences}async function resolveDiscoveredFile(rawPath,workspaceRoot,invocationRoot=workspaceRoot){const absolutePath=path.isAbsolute(rawPath)?path.resolve(rawPath):path.resolve(invocationRoot,rawPath);let stats;try{stats=await fs.stat(absolutePath)}catch{return}if(!stats.isFile())return;const[canonicalProjectRoot,canonicalAbsolutePath]=await Promise.all([realpathForContainment(workspaceRoot),realpathForContainment(absolutePath)]);if(isPathWithinDirectory(canonicalProjectRoot,canonicalAbsolutePath)){const relativePath=path.relative(canonicalProjectRoot,canonicalAbsolutePath);return!relativePath||relativePath.startsWith("..")||path.isAbsolute(relativePath)?void 0:{path:normalizeCandidatePathForOutput(relativePath),scope:"project"}}return{path:normalizeCandidatePathForOutput(absolutePath),scope:"global"}}async function discoverReferencedFiles(document,workspaceRoot,invocationRoot=workspaceRoot){const existingResolvedKeys=new Set((document.metadata.files??[]).map(entry=>linkedFileResolvedKey(entry,workspaceRoot))),grouped=new Map,rawReferences=extractRawPathReferences(collectItemTextReferences(document)),resolvedByValue=new Map;await Promise.all([...new Set(rawReferences.map(reference=>reference.value))].map(async value=>{resolvedByValue.set(value,await resolveDiscoveredFile(value,workspaceRoot,invocationRoot))}));const resolvedReferences=rawReferences.map(reference=>({reference,resolved:resolvedByValue.get(reference.value)}));for(const{reference,resolved}of resolvedReferences){if(!resolved)continue;const key=linkedFileResolvedKey(resolved,workspaceRoot),existing=grouped.get(key)??{path:resolved.path,scope:resolved.scope,sourceFields:new Set,originalPaths:new Set,sourceCount:0};existing.sourceFields.add(reference.field),existing.originalPaths.add(reference.value),existing.sourceCount+=1,grouped.set(key,existing)}return[...grouped.entries()].map(([key,entry])=>({path:entry.path,scope:entry.scope,status:existingResolvedKeys.has(key)?"already_linked":"addable",source_count:entry.sourceCount,source_fields:[...entry.sourceFields].sort((left,right)=>left.localeCompare(right)),original_paths:[...entry.originalPaths].sort((left,right)=>left.localeCompare(right))})).sort((left,right)=>{const byStatus=left.status.localeCompare(right.status);if(byStatus!==0)return byStatus;const byPath=left.path.localeCompare(right.path);return byPath!==0?byPath:left.scope.localeCompare(right.scope)})}const _testOnly={relativeReferenceScanMaxChars:RELATIVE_REFERENCE_SCAN_MAX_CHARS,normalizeCandidatePathForOutput,realpathForContainment,linkedFileResolvedKey,collectTextReferences,collectItemTextReferences,cleanupPathToken,extractRawPathReferences,resolveDiscoveredFile,discoverReferencedFiles};async function runFiles(id,options,global2){const result=await runLinkedArtifacts(id,options,global2,{metadataKey:"files",op:"files_add",bareNoun:"file",supportsAppendStable:!0});return renameArtifactsResultKey(result,"files")}async function normalizeFilesLookupPaths(values,workspaceRoot){const canonicalWorkspaceRoot=await realpathForContainment(workspaceRoot),paths=await Promise.all(values.map(async value=>{const trimmed=value.trim();if(!trimmed)throw new PmCliError("Files lookup paths must not be empty.",EXIT_CODE.USAGE);if(!path.isAbsolute(trimmed))return normalizeLinkedPath(trimmed);const canonicalAbsolutePath=await realpathForContainment(trimmed);return isPathWithinDirectory(canonicalWorkspaceRoot,canonicalAbsolutePath)?normalizeLinkedPath(path.relative(canonicalWorkspaceRoot,canonicalAbsolutePath)):normalizeLinkedPath(canonicalAbsolutePath)})),uniquePaths=[...new Set(paths)].sort((left,right)=>left.localeCompare(right));if(uniquePaths.length===0)throw new PmCliError("Files lookup requires at least one path.",EXIT_CODE.USAGE);return uniquePaths}function resolveFilesLookupWindow(options){for(const[label,value]of[["limit",options.limit],["offset",options.offset]])if(value!==void 0&&(!Number.isInteger(value)||value<0))throw new PmCliError(`Files lookup ${label} must be a non-negative integer.`,EXIT_CODE.USAGE);const{offset=0,limit=50}=options;return{offset:Math.max(0,Math.floor(offset)),limit:options.noTruncate?void 0:Math.max(0,Math.floor(limit))}}function projectFilesLookupItem(item){return{id:item.id,title:item.title,type:item.type,status:item.status,priority:item.priority,updated_at:item.updated_at}}function compareFilesLookupCandidates(left,right){const byPriority=left.item.priority-right.item.priority;if(byPriority!==0)return byPriority;const byUpdated=right.item.updated_at.localeCompare(left.item.updated_at);return byUpdated===0?left.item.id.localeCompare(right.item.id):byUpdated}function matchingFilesLookupCandidates(params){return params.metadata.map(item=>({item,files:(item.files??[]).filter(file=>params.paths.includes(normalizeLinkedPath(file.path))&&(params.scope===void 0||file.scope===params.scope)).sort((left,right)=>{const byPath=left.path.localeCompare(right.path);return byPath===0?left.scope.localeCompare(right.scope):byPath})})).filter(match=>match.files.length>0).sort(compareFilesLookupCandidates)}async function resolveFilesLookupTraceability(params){if(params.explain)return explainSourceTraceability({workspaceRoot:params.workspaceRoot,paths:params.paths,candidates:params.matching,corpus:params.metadata,...params.lineRange?{lineRange:params.lineRange}:{},...params.decisionDepth===void 0?{}:{decisionDepth:params.decisionDepth}})}async function queryFilesLookupIndex(params){if([params.strictRead,params.noTruncate,params.explain,hasActiveOnReadHooks()].includes(!0))return null;const indexState=await readItemMetadataDerivedIndexState(params.pmRoot,[...new Set(Object.values(params.typeToFolder))]);return indexState?queryLinkedFileMetadataIndex({pmRoot:params.pmRoot,expectedSourceCursor:indexState.source_cursor,paths:params.paths,scope:params.scope,limit:params.limit,offset:params.offset}):null}async function queryFilesLookupSource(params){const warnings=[],metadata=await listAllItemMetadata(params.pmRoot,params.settings.item_format,params.typeToFolder,warnings,params.settings.schema),matching=matchingFilesLookupCandidates({metadata,paths:params.paths,scope:params.scope}),readWarnings=warnings.filter(warning=>/^item_list_(?:item|directory)_read_failed:/u.test(warning));if(params.strictRead&&readWarnings.length>0)throw new PmCliError(`Files lookup could not read every item: ${readWarnings.join("; ")}`,EXIT_CODE.GENERIC_FAILURE);const traceability=await resolveFilesLookupTraceability({explain:params.explain,workspaceRoot:params.workspaceRoot,paths:params.paths,matching,metadata,lineRange:params.lineRange,decisionDepth:params.decisionDepth}),page=(traceability?[...matching].sort((left,right)=>{const byScore=traceability.explanations.get(right.item.id).score-traceability.explanations.get(left.item.id).score;return byScore!==0?byScore:compareFilesLookupCandidates(left,right)}):matching).slice(params.offset,params.limit===void 0?void 0:params.offset+params.limit);return{paths:params.paths,total:matching.length,count:page.length,offset:params.offset,limit:params.limit??null,has_more:params.offset+page.length<matching.length,truncated:params.offset+page.length<matching.length,completeness:{status:readWarnings.length===0?"complete":"partial",source:"source_scan"},warnings,matches:page.map(match=>({item:projectFilesLookupItem(match.item),files:match.files,...traceability?{traceability:traceability.explanations.get(match.item.id)}:{}})),...traceability?{traceability_receipt:traceability.receipt}:{}}}async function runFilesLookup(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path),workspaceRoot=resolveWorkspaceRoot(pmRoot);await assertInitializedTracker(pmRoot);const paths=await normalizeFilesLookupPaths(options.paths,workspaceRoot);if(options.lineRange&&paths.length!==1)throw new PmCliError("Files lookup line attribution requires exactly one source path.",EXIT_CODE.USAGE);const settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),{offset,limit}=resolveFilesLookupWindow(options),indexed=await queryFilesLookupIndex({pmRoot,typeToFolder:typeRegistry.type_to_folder,paths,scope:options.scope,limit,offset,strictRead:options.strictRead===!0,noTruncate:options.noTruncate===!0,explain:options.explain===!0||options.lineRange!==void 0});return indexed?{paths,total:indexed.total,count:indexed.matches.length,offset,limit,has_more:offset+indexed.matches.length<indexed.total,truncated:offset+indexed.matches.length<indexed.total,completeness:{status:"unchecked",source:"index"},warnings:[],matches:indexed.matches.map(match=>({item:projectFilesLookupItem(match.item),files:match.files}))}:queryFilesLookupSource({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,paths,scope:options.scope,limit,offset,strictRead:options.strictRead===!0,workspaceRoot,explain:options.explain===!0||options.lineRange!==void 0,lineRange:options.lineRange,decisionDepth:options.decisionDepth})}async function runFilesDiscover(id,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path),workspaceRoot=resolveWorkspaceRoot(pmRoot);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located)throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND);const loaded=await readLocatedItem(located,{schema:settings.schema}),candidates=await discoverReferencedFiles(loaded.document,workspaceRoot,process.cwd()),addableCandidates=candidates.filter(candidate=>candidate.status==="addable"),skippedExisting=candidates.filter(candidate=>candidate.status==="already_linked"),requestedApply=options.apply===!0,note=options.note?.trim()||"discovered from item text";if(!requestedApply||addableCandidates.length===0){const files2=loaded.document.metadata.files??[];return{id:located.id,files:files2,changed:!1,apply:requestedApply,count:files2.length,candidate_count:candidates.length,addable_count:addableCandidates.length,added_count:0,skipped_existing_count:skippedExisting.length,candidates,added:[],skipped_existing:skippedExisting}}const author=resolveAuthor(options.author,settings.author_default),discoveredAdds=addableCandidates.map(candidate=>({path:candidate.path,scope:candidate.scope,note}));let appliedAdds=[];const appliedCandidateIndices=new Set,result=await mutateItem({pmRoot,settings,id,op:"files_discover",author,message:options.message??"Discover referenced file links",force:options.force,mutate(document){const next=[...document.metadata.files??[]],existingResolvedKeys=new Set(next.map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));appliedAdds=[],appliedCandidateIndices.clear();for(const[index,add]of discoveredAdds.entries()){const resolvedKey=linkedFileResolvedKey(add,workspaceRoot);existingResolvedKeys.has(resolvedKey)||(next.push(add),existingResolvedKeys.add(resolvedKey),appliedAdds.push(add),appliedCandidateIndices.add(index))}const deduped=dedupeLinkedArtifacts(next),normalized=options.appendStable?deduped:sortLinkedArtifacts(deduped);return normalized.length>0?document.metadata.files=normalized:delete document.metadata.files,{changedFields:appliedAdds.length>0?["files"]:[],warnings:appliedAdds.length!==discoveredAdds.length?[`files_discover_skipped_existing:${discoveredAdds.length-appliedAdds.length}`]:[]}}}),files=result.item.files??[],addedResolvedKeys=new Set(appliedAdds.map(entry=>linkedFileResolvedKey(entry,workspaceRoot))),added=files.filter(entry=>addedResolvedKeys.has(linkedFileResolvedKey(entry,workspaceRoot))),skippedDuringApply=addableCandidates.filter((_candidate,index)=>!appliedCandidateIndices.has(index)),allSkippedExisting=[...skippedExisting,...skippedDuringApply];return{id:result.item.id,files,changed:added.length>0,apply:!0,count:files.length,candidate_count:candidates.length,addable_count:addableCandidates.length,added_count:added.length,skipped_existing_count:allSkippedExisting.length,candidates,added,skipped_existing:allSkippedExisting}}export{_testOnly,runFiles,runFilesDiscover,runFilesLookup};
|
|
2
2
|
//# sourceMappingURL=files.js.map
|