@unbrained/pm-cli 2026.9.7 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +211 -181
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,839 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/cli-bootstrap
|
|
3
|
-
*
|
|
4
|
-
* Provides public bootstrap argument normalization for embedded CLI hosts.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3d35c0f5-e1b8-5fd8-8fd7-c754a21784a1")}catch(e){}}();
|
|
8
|
-
import { EXECUTABLE_COMMAND_ALIASES, PM_COMMAND_ALIAS_CONTRACTS, renderPmCommandAliasMigrationHint, resolvePmCommandAlias, resolveSubcommandFlagContractsForCommand, } from "./cli-contracts.js";
|
|
9
|
-
export { EXECUTABLE_COMMAND_ALIASES, PM_COMMAND_ALIAS_CONTRACTS, renderPmCommandAliasMigrationHint, resolvePmCommandAlias, };
|
|
10
|
-
import { levenshteinDistanceWithinLimit } from "../core/shared/levenshtein.js";
|
|
11
|
-
import { EXIT_CODE } from "../core/shared/constants.js";
|
|
12
|
-
import { PmCliError } from "../core/shared/errors.js";
|
|
13
|
-
import { normalizeItemAddressInvocation } from "./agent/item-addressing.js";
|
|
14
|
-
import { BOOTSTRAP_BOOLEAN_FLAGS, GLOBAL_VALUE_CONSUMING_FLAGS, consumesBootstrapValue, findBootstrapCommandTokenIndex as findContractBootstrapCommandTokenIndex, isInlineGlobalValueToken, parseBootstrapCommandName as parseContractBootstrapCommandName, } from "./cli-contracts/bootstrap-command-scanner.js";
|
|
15
|
-
const OUTPUT_VALUE_FLAGS = new Set([
|
|
16
|
-
"--output-include",
|
|
17
|
-
"--output-limit",
|
|
18
|
-
"--output-budget",
|
|
19
|
-
"--output-format",
|
|
20
|
-
"--output-session",
|
|
21
|
-
"--output-cursor",
|
|
22
|
-
]);
|
|
23
|
-
/** Consume one bootstrap-global token and update the accumulated parse state. */
|
|
24
|
-
function consumeBootstrapGlobalToken(argv, index, state) {
|
|
25
|
-
const token = argv[index];
|
|
26
|
-
if (BOOTSTRAP_BOOLEAN_FLAGS.has(token)) {
|
|
27
|
-
state.booleanFlags.add(token);
|
|
28
|
-
return 1;
|
|
29
|
-
}
|
|
30
|
-
const equalsIndex = token.indexOf("=");
|
|
31
|
-
const canonicalFlag = equalsIndex > 0 ? token.slice(0, equalsIndex) : token;
|
|
32
|
-
if (!GLOBAL_VALUE_CONSUMING_FLAGS.has(canonicalFlag))
|
|
33
|
-
return 1;
|
|
34
|
-
const inlineValue = equalsIndex > 0 ? token.slice(equalsIndex + 1) : undefined;
|
|
35
|
-
const consumesValue = inlineValue === undefined &&
|
|
36
|
-
consumesBootstrapValue(canonicalFlag, argv[index + 1]);
|
|
37
|
-
const value = inlineValue ?? (consumesValue ? argv[index + 1] : undefined);
|
|
38
|
-
if (canonicalFlag === "--author") {
|
|
39
|
-
state.author = value ?? "";
|
|
40
|
-
}
|
|
41
|
-
else if (typeof value === "string" && value.length > 0) {
|
|
42
|
-
const target = OUTPUT_VALUE_FLAGS.has(canonicalFlag)
|
|
43
|
-
? state.outputValues
|
|
44
|
-
: state.pathValues;
|
|
45
|
-
target.set(canonicalFlag, value);
|
|
46
|
-
}
|
|
47
|
-
return consumesValue ? 2 : 1;
|
|
48
|
-
}
|
|
49
|
-
/** Implements parse bootstrap global options for the public runtime surface of this module. */
|
|
50
|
-
export function parseBootstrapGlobalOptions(argv) {
|
|
51
|
-
const state = {
|
|
52
|
-
booleanFlags: new Set(),
|
|
53
|
-
outputValues: new Map(),
|
|
54
|
-
pathValues: new Map(),
|
|
55
|
-
};
|
|
56
|
-
let index = 0;
|
|
57
|
-
while (index < argv.length) {
|
|
58
|
-
if (argv[index] === "--")
|
|
59
|
-
break;
|
|
60
|
-
index += consumeBootstrapGlobalToken(argv, index, state);
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
path: state.pathValues.get("--pm-path") ?? state.pathValues.get("--path"),
|
|
64
|
-
noExtensions: state.booleanFlags.has("--no-extensions"),
|
|
65
|
-
noPager: state.booleanFlags.has("--no-pager"),
|
|
66
|
-
json: state.booleanFlags.has("--json"),
|
|
67
|
-
quiet: state.booleanFlags.has("--quiet"),
|
|
68
|
-
lean: state.booleanFlags.has("--lean"),
|
|
69
|
-
tokenAccounting: state.booleanFlags.has("--token-accounting"),
|
|
70
|
-
...(state.booleanFlags.has("--output-row-contract")
|
|
71
|
-
? { outputRowContract: true }
|
|
72
|
-
: {}),
|
|
73
|
-
...(state.outputValues.get("--output-include") === undefined
|
|
74
|
-
? {}
|
|
75
|
-
: { outputInclude: state.outputValues.get("--output-include") }),
|
|
76
|
-
...(state.outputValues.get("--output-limit") === undefined
|
|
77
|
-
? {}
|
|
78
|
-
: { outputLimit: state.outputValues.get("--output-limit") }),
|
|
79
|
-
...(state.outputValues.get("--output-budget") === undefined
|
|
80
|
-
? {}
|
|
81
|
-
: { outputBudget: state.outputValues.get("--output-budget") }),
|
|
82
|
-
...(state.outputValues.get("--output-format") === "toon" ||
|
|
83
|
-
state.outputValues.get("--output-format") === "json"
|
|
84
|
-
? {
|
|
85
|
-
outputFormat: state.outputValues.get("--output-format"),
|
|
86
|
-
}
|
|
87
|
-
: {}),
|
|
88
|
-
...(state.outputValues.get("--output-session") === undefined
|
|
89
|
-
? {}
|
|
90
|
-
: { outputSession: state.outputValues.get("--output-session") }),
|
|
91
|
-
...(state.outputValues.get("--output-cursor") === undefined
|
|
92
|
-
? {}
|
|
93
|
-
: { outputCursor: state.outputValues.get("--output-cursor") }),
|
|
94
|
-
...(state.author === ""
|
|
95
|
-
? { authorMissingValue: true }
|
|
96
|
-
: state.author !== undefined
|
|
97
|
-
? { author: state.author }
|
|
98
|
-
: {}),
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
/** Implements strip global bootstrap tokens for the public runtime surface of this module. */
|
|
102
|
-
export function stripGlobalBootstrapTokens(argv) {
|
|
103
|
-
const remaining = [];
|
|
104
|
-
let index = 0;
|
|
105
|
-
while (index < argv.length) {
|
|
106
|
-
const token = argv[index];
|
|
107
|
-
if (token === "--") {
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
if (BOOTSTRAP_BOOLEAN_FLAGS.has(token) ||
|
|
111
|
-
token === "--profile" ||
|
|
112
|
-
token === "--id-only" ||
|
|
113
|
-
token === "--full-changed-fields" ||
|
|
114
|
-
token === "--explain") {
|
|
115
|
-
index += 1;
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {
|
|
119
|
-
index += consumesBootstrapValue(token, argv[index + 1]) ? 2 : 1;
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
if (isInlineGlobalValueToken(token)) {
|
|
123
|
-
index += 1;
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
remaining.push(token);
|
|
127
|
-
index += 1;
|
|
128
|
-
}
|
|
129
|
-
return remaining;
|
|
130
|
-
}
|
|
131
|
-
/** Implements parse bootstrap help request for the public runtime surface of this module. */
|
|
132
|
-
export function parseBootstrapHelpRequest(argv) {
|
|
133
|
-
const stripped = stripGlobalBootstrapTokens(argv);
|
|
134
|
-
const first = stripped[0]?.trim().toLowerCase();
|
|
135
|
-
if (first === "help") {
|
|
136
|
-
const commandPathTokens = [];
|
|
137
|
-
for (let index = 1; index < stripped.length; index += 1) {
|
|
138
|
-
const token = stripped[index];
|
|
139
|
-
if (token.startsWith("-")) {
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
commandPathTokens.push(token.trim().toLowerCase());
|
|
143
|
-
}
|
|
144
|
-
return {
|
|
145
|
-
requested: true,
|
|
146
|
-
commandPathTokens,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
const helpFlagIndex = stripped.findIndex((token) => token === "--help" || token === "-h");
|
|
150
|
-
if (helpFlagIndex < 0) {
|
|
151
|
-
return {
|
|
152
|
-
requested: false,
|
|
153
|
-
commandPathTokens: [],
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
const commandPathTokens = [];
|
|
157
|
-
for (const token of stripped) {
|
|
158
|
-
if (token.startsWith("-")) {
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
commandPathTokens.push(token.trim().toLowerCase());
|
|
162
|
-
}
|
|
163
|
-
return {
|
|
164
|
-
requested: true,
|
|
165
|
-
commandPathTokens,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
/** Locate the command token after global bootstrap flags and their values. */
|
|
169
|
-
export function findBootstrapCommandTokenIndex(argv) {
|
|
170
|
-
return findContractBootstrapCommandTokenIndex(argv);
|
|
171
|
-
}
|
|
172
|
-
/** Resolve the normalized command name from bootstrap invocation arguments. */
|
|
173
|
-
export function parseBootstrapCommandName(argv) {
|
|
174
|
-
return parseContractBootstrapCommandName(argv);
|
|
175
|
-
}
|
|
176
|
-
function shouldDisablePagerForInvocation(argv, bootstrapGlobal) {
|
|
177
|
-
if (bootstrapGlobal.noPager) {
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
if (process.stdout.isTTY === true) {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
const helpRequest = parseBootstrapHelpRequest(argv);
|
|
184
|
-
return helpRequest.requested;
|
|
185
|
-
}
|
|
186
|
-
/** Implements apply bootstrap pager policy for the public runtime surface of this module. */
|
|
187
|
-
export function applyBootstrapPagerPolicy(argv) {
|
|
188
|
-
const pagerEnvironmentKeys = [
|
|
189
|
-
"PAGER",
|
|
190
|
-
"MANPAGER",
|
|
191
|
-
"GIT_PAGER",
|
|
192
|
-
"LESS",
|
|
193
|
-
];
|
|
194
|
-
const previousValues = pagerEnvironmentKeys.map((key) => process.env[key]);
|
|
195
|
-
const restore = () => {
|
|
196
|
-
for (const [index, key] of pagerEnvironmentKeys.entries()) {
|
|
197
|
-
const value = previousValues[index];
|
|
198
|
-
if (value === undefined) {
|
|
199
|
-
delete process.env[key];
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
process.env[key] = value;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
const bootstrapGlobal = parseBootstrapGlobalOptions(argv);
|
|
207
|
-
if (!shouldDisablePagerForInvocation(argv, bootstrapGlobal)) {
|
|
208
|
-
return restore;
|
|
209
|
-
}
|
|
210
|
-
process.env.PAGER = "cat";
|
|
211
|
-
process.env.MANPAGER = "cat";
|
|
212
|
-
process.env.GIT_PAGER = "cat";
|
|
213
|
-
if (typeof process.env.LESS !== "string" ||
|
|
214
|
-
process.env.LESS.trim().length === 0) {
|
|
215
|
-
process.env.LESS = "FRX";
|
|
216
|
-
}
|
|
217
|
-
return restore;
|
|
218
|
-
}
|
|
219
|
-
const EXTENSION_ACTION_SYNTAX_TOKENS = new Set([
|
|
220
|
-
"install",
|
|
221
|
-
"uninstall",
|
|
222
|
-
"explore",
|
|
223
|
-
"manage",
|
|
224
|
-
"doctor",
|
|
225
|
-
"adopt",
|
|
226
|
-
"adopt-all",
|
|
227
|
-
"activate",
|
|
228
|
-
"deactivate",
|
|
229
|
-
]);
|
|
230
|
-
/** Implements normalize legacy extension action syntax for the public runtime surface of this module. */
|
|
231
|
-
export function normalizeLegacyExtensionActionSyntax(argv) {
|
|
232
|
-
const extensionIndex = findBootstrapCommandTokenIndex(argv);
|
|
233
|
-
if (extensionIndex === undefined || argv[extensionIndex] !== "extension") {
|
|
234
|
-
return [...argv];
|
|
235
|
-
}
|
|
236
|
-
const actionToken = argv[extensionIndex + 1];
|
|
237
|
-
if (!actionToken || actionToken.startsWith("-")) {
|
|
238
|
-
return [...argv];
|
|
239
|
-
}
|
|
240
|
-
if (!EXTENSION_ACTION_SYNTAX_TOKENS.has(actionToken)) {
|
|
241
|
-
return [...argv];
|
|
242
|
-
}
|
|
243
|
-
if (argv.includes("--help") || argv.includes("-h")) {
|
|
244
|
-
return [...argv];
|
|
245
|
-
}
|
|
246
|
-
const forcedActionFlag = `--${actionToken}`;
|
|
247
|
-
if (argv.includes(forcedActionFlag)) {
|
|
248
|
-
return [...argv];
|
|
249
|
-
}
|
|
250
|
-
return [
|
|
251
|
-
...argv.slice(0, extensionIndex + 1),
|
|
252
|
-
forcedActionFlag,
|
|
253
|
-
...argv.slice(extensionIndex + 2),
|
|
254
|
-
];
|
|
255
|
-
}
|
|
256
|
-
const CLI_EXECUTABLE_ALIASES = new Set(["pm", "pm-cli"]);
|
|
257
|
-
/**
|
|
258
|
-
* Remove a package-runner-injected executable token from the command position.
|
|
259
|
-
* Both published CLI bin names are accepted so `npx <package> pm init` and
|
|
260
|
-
* `bunx <package> pm-cli init` behave like direct executable invocations.
|
|
261
|
-
*/
|
|
262
|
-
function stripLeadingExecutableAlias(argv, trace) {
|
|
263
|
-
const index = findBootstrapCommandTokenIndex(argv);
|
|
264
|
-
if (index === undefined) {
|
|
265
|
-
return argv;
|
|
266
|
-
}
|
|
267
|
-
const token = argv[index];
|
|
268
|
-
if (!CLI_EXECUTABLE_ALIASES.has(token.trim().toLowerCase())) {
|
|
269
|
-
return argv;
|
|
270
|
-
}
|
|
271
|
-
trace.push({
|
|
272
|
-
from: token,
|
|
273
|
-
to: [],
|
|
274
|
-
reason: "executable_alias",
|
|
275
|
-
confidence: "high",
|
|
276
|
-
});
|
|
277
|
-
return [...argv.slice(0, index), ...argv.slice(index + 1)];
|
|
278
|
-
}
|
|
279
|
-
/** Executable command aliases: a leading command token here is rewritten to its canonical command BEFORE commander parses, so the alias actually runs instead of merely being suggested. These are the highest-frequency aliases real agents type (telemetry: `pm show <id>` alone is the single most common unknown-command) and each target takes the same positional/flags as the alias (with `--comment`/ `--note`/`--learning` flag-aliased to `--add` on the target command). Keeping this in one place means the alias is consistent across registration, commander dispatch, telemetry, and error handling — all of which read the normalized argv. */
|
|
280
|
-
/**
|
|
281
|
-
* Rewrite a leading command-alias token (e.g. `show` -> `get`) in place. Only the
|
|
282
|
-
* command position is considered — the same token appearing later as an argument
|
|
283
|
-
* (`pm get show`) is left untouched — and only when it is not preceded by `--` or a
|
|
284
|
-
* value-consuming global flag, mirroring {@link parseBootstrapCommandName}.
|
|
285
|
-
*/
|
|
286
|
-
function rewriteCommandAlias(argv, trace) {
|
|
287
|
-
const index = findBootstrapCommandTokenIndex(argv);
|
|
288
|
-
if (index === undefined) {
|
|
289
|
-
return argv;
|
|
290
|
-
}
|
|
291
|
-
const token = argv[index];
|
|
292
|
-
const canonical = EXECUTABLE_COMMAND_ALIASES[token.trim().toLowerCase()];
|
|
293
|
-
if (!canonical) {
|
|
294
|
-
return argv;
|
|
295
|
-
}
|
|
296
|
-
const rewritten = [...argv];
|
|
297
|
-
rewritten[index] = canonical;
|
|
298
|
-
trace.push({
|
|
299
|
-
from: token,
|
|
300
|
-
to: [canonical],
|
|
301
|
-
reason: "command_alias",
|
|
302
|
-
confidence: "high",
|
|
303
|
-
});
|
|
304
|
-
return rewritten;
|
|
305
|
-
}
|
|
306
|
-
function normalizeFlagKeyToken(raw) {
|
|
307
|
-
const withoutPrefix = raw.replace(/^--?/, "");
|
|
308
|
-
return withoutPrefix
|
|
309
|
-
.replace(/_/g, "-")
|
|
310
|
-
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
311
|
-
.toLowerCase();
|
|
312
|
-
}
|
|
313
|
-
function toComparableFlagKey(raw) {
|
|
314
|
-
return normalizeFlagKeyToken(raw).replace(/-/g, "");
|
|
315
|
-
}
|
|
316
|
-
function markUnambiguousFlag(map, key, canonicalFlag) {
|
|
317
|
-
const existing = map.get(key);
|
|
318
|
-
if (existing === undefined) {
|
|
319
|
-
map.set(key, canonicalFlag);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
if (existing !== canonicalFlag) {
|
|
323
|
-
map.set(key, null);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
function collectLongFlagCandidates(contract) {
|
|
327
|
-
const candidates = [];
|
|
328
|
-
const pushLongFlag = (value) => {
|
|
329
|
-
if (typeof value !== "string") {
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
if (!value.startsWith("--")) {
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
candidates.push(value);
|
|
336
|
-
};
|
|
337
|
-
pushLongFlag(contract.flag);
|
|
338
|
-
for (const alias of contract.aliases ?? []) {
|
|
339
|
-
pushLongFlag(alias);
|
|
340
|
-
}
|
|
341
|
-
return candidates;
|
|
342
|
-
}
|
|
343
|
-
function buildFlagLookup(commandName, contractsOverride) {
|
|
344
|
-
const contracts = contractsOverride ?? resolveSubcommandFlagContractsForCommand(commandName);
|
|
345
|
-
const canonicalByNormalized = new Map();
|
|
346
|
-
const canonicalByCompact = new Map();
|
|
347
|
-
const canonicalComparablesMap = new Map();
|
|
348
|
-
const listCanonicalFlags = new Set();
|
|
349
|
-
for (const contract of contracts) {
|
|
350
|
-
const longCandidates = collectLongFlagCandidates(contract);
|
|
351
|
-
if (longCandidates.length === 0) {
|
|
352
|
-
continue;
|
|
353
|
-
}
|
|
354
|
-
const canonicalFlag = `--${normalizeFlagKeyToken(longCandidates[0])}`;
|
|
355
|
-
for (const candidate of longCandidates) {
|
|
356
|
-
markUnambiguousFlag(canonicalByNormalized, normalizeFlagKeyToken(candidate), canonicalFlag);
|
|
357
|
-
markUnambiguousFlag(canonicalByCompact, toComparableFlagKey(candidate), canonicalFlag);
|
|
358
|
-
}
|
|
359
|
-
const comparable = toComparableFlagKey(canonicalFlag);
|
|
360
|
-
if (!canonicalComparablesMap.has(canonicalFlag)) {
|
|
361
|
-
canonicalComparablesMap.set(canonicalFlag, comparable);
|
|
362
|
-
}
|
|
363
|
-
if (contract.list === true) {
|
|
364
|
-
listCanonicalFlags.add(canonicalFlag);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
return {
|
|
368
|
-
canonicalByNormalized,
|
|
369
|
-
canonicalByCompact,
|
|
370
|
-
canonicalComparables: [...canonicalComparablesMap.entries()].map(([canonicalFlag, comparable]) => ({
|
|
371
|
-
canonicalFlag,
|
|
372
|
-
comparable,
|
|
373
|
-
})),
|
|
374
|
-
listCanonicalFlags,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
function resolveCanonicalFlag(rawKey, lookup) {
|
|
378
|
-
const normalizedKey = normalizeFlagKeyToken(rawKey);
|
|
379
|
-
const direct = lookup.canonicalByNormalized.get(normalizedKey);
|
|
380
|
-
if (typeof direct === "string") {
|
|
381
|
-
return {
|
|
382
|
-
flag: direct,
|
|
383
|
-
reason: "flag_alias",
|
|
384
|
-
confidence: "high",
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
const comparableKey = normalizedKey.replace(/-/g, "");
|
|
388
|
-
const compactMatch = lookup.canonicalByCompact.get(comparableKey);
|
|
389
|
-
if (typeof compactMatch === "string") {
|
|
390
|
-
return {
|
|
391
|
-
flag: compactMatch,
|
|
392
|
-
reason: "flag_alias",
|
|
393
|
-
confidence: "high",
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
const maxDistance = comparableKey.length >= 8 ? 2 : 1;
|
|
397
|
-
let bestDistance = Number.POSITIVE_INFINITY;
|
|
398
|
-
let bestFlag;
|
|
399
|
-
let tied = false;
|
|
400
|
-
for (const candidate of lookup.canonicalComparables) {
|
|
401
|
-
const distance = levenshteinDistanceWithinLimit(comparableKey, candidate.comparable, maxDistance);
|
|
402
|
-
if (distance === null) {
|
|
403
|
-
continue;
|
|
404
|
-
}
|
|
405
|
-
if (distance < bestDistance) {
|
|
406
|
-
bestDistance = distance;
|
|
407
|
-
bestFlag = candidate.canonicalFlag;
|
|
408
|
-
tied = false;
|
|
409
|
-
continue;
|
|
410
|
-
}
|
|
411
|
-
if (distance === bestDistance && bestFlag !== candidate.canonicalFlag) {
|
|
412
|
-
tied = true;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
if (!bestFlag ||
|
|
416
|
-
tied ||
|
|
417
|
-
!Number.isFinite(bestDistance) ||
|
|
418
|
-
bestDistance <= 0) {
|
|
419
|
-
return null;
|
|
420
|
-
}
|
|
421
|
-
return {
|
|
422
|
-
flag: bestFlag,
|
|
423
|
-
reason: "flag_typo",
|
|
424
|
-
confidence: bestDistance >= 2 ? "medium" : "high",
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
/** Implements list alias plural keys for the public runtime surface of this module. */
|
|
428
|
-
export function listAliasPluralKeys(normalizedKey) {
|
|
429
|
-
const candidates = [`${normalizedKey}s`];
|
|
430
|
-
if (normalizedKey.endsWith("y") && normalizedKey.length > 1) {
|
|
431
|
-
candidates.push(`${normalizedKey.slice(0, -1)}ies`);
|
|
432
|
-
}
|
|
433
|
-
return candidates;
|
|
434
|
-
}
|
|
435
|
-
function parseBareKeyValueToken(token, preserve = false) {
|
|
436
|
-
if (preserve || token.includes("://")) {
|
|
437
|
-
return null;
|
|
438
|
-
}
|
|
439
|
-
const match = token.match(/^([A-Za-z][A-Za-z0-9_-]{1,63})([:=])(.*)$/);
|
|
440
|
-
if (!match) {
|
|
441
|
-
return null;
|
|
442
|
-
}
|
|
443
|
-
const key = match[1];
|
|
444
|
-
const value = match[3];
|
|
445
|
-
if (value.length === 0) {
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
448
|
-
return {
|
|
449
|
-
key,
|
|
450
|
-
value,
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
function normalizeLongOptionToken(token, lookup, preserve = false) {
|
|
454
|
-
if (preserve || !token.startsWith("--")) {
|
|
455
|
-
return { tokens: [token] };
|
|
456
|
-
}
|
|
457
|
-
const equalsIndex = token.indexOf("=");
|
|
458
|
-
const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;
|
|
459
|
-
const inlineValue = equalsIndex >= 0 ? token.slice(equalsIndex + 1) : undefined;
|
|
460
|
-
const resolution = resolveCanonicalFlag(key, lookup);
|
|
461
|
-
if (!resolution) {
|
|
462
|
-
return { tokens: [token] };
|
|
463
|
-
}
|
|
464
|
-
const normalizedToken = inlineValue === undefined
|
|
465
|
-
? resolution.flag
|
|
466
|
-
: `${resolution.flag}=${inlineValue}`;
|
|
467
|
-
if (normalizedToken === token) {
|
|
468
|
-
return { tokens: [token] };
|
|
469
|
-
}
|
|
470
|
-
return {
|
|
471
|
-
tokens: [normalizedToken],
|
|
472
|
-
event: {
|
|
473
|
-
from: token,
|
|
474
|
-
to: [normalizedToken],
|
|
475
|
-
reason: resolution.reason,
|
|
476
|
-
confidence: resolution.confidence,
|
|
477
|
-
},
|
|
478
|
-
};
|
|
479
|
-
}
|
|
480
|
-
/** Locate global path-value tokens that normalization must preserve literally. */
|
|
481
|
-
function collectBootstrapPathValueIndices(argv) {
|
|
482
|
-
const indices = new Set();
|
|
483
|
-
let expectsValue = false;
|
|
484
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
485
|
-
if (expectsValue) {
|
|
486
|
-
indices.add(index);
|
|
487
|
-
expectsValue = false;
|
|
488
|
-
continue;
|
|
489
|
-
}
|
|
490
|
-
const token = argv[index];
|
|
491
|
-
expectsValue = token === "--path" || token === "--pm-path";
|
|
492
|
-
}
|
|
493
|
-
return indices;
|
|
494
|
-
}
|
|
495
|
-
// Global option flags whose value may legitimately begin with "--" (commander
|
|
496
|
-
// accepts such values). Their value token must not be reinterpreted as a list
|
|
497
|
-
// flag during coalescing. `--pm-path <dir>` and its legacy `--path <dir>`
|
|
498
|
-
// alias are the documented cases; other globals
|
|
499
|
-
// (--json/--quiet/--no-extensions/--no-pager/--profile) are boolean.
|
|
500
|
-
function splitCanonicalListToken(token) {
|
|
501
|
-
if (!token.startsWith("--")) {
|
|
502
|
-
return null;
|
|
503
|
-
}
|
|
504
|
-
const equalsIndex = token.indexOf("=");
|
|
505
|
-
if (equalsIndex < 0) {
|
|
506
|
-
return { flag: token };
|
|
507
|
-
}
|
|
508
|
-
return {
|
|
509
|
-
flag: token.slice(0, equalsIndex),
|
|
510
|
-
inlineValue: token.slice(equalsIndex + 1),
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
function copyValueConsumingFlag(argv, index, result) {
|
|
514
|
-
result.push(argv[index]);
|
|
515
|
-
const next = argv[index + 1];
|
|
516
|
-
if (typeof next === "string" && next !== "--") {
|
|
517
|
-
result.push(next);
|
|
518
|
-
return index + 2;
|
|
519
|
-
}
|
|
520
|
-
return index + 1;
|
|
521
|
-
}
|
|
522
|
-
function readListFlagOccurrence(argv, index, parsed, multiValueListFlags) {
|
|
523
|
-
if (parsed.inlineValue !== undefined) {
|
|
524
|
-
return {
|
|
525
|
-
originalTokens: [argv[index]],
|
|
526
|
-
value: parsed.inlineValue,
|
|
527
|
-
consumed: 1,
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
const values = [];
|
|
531
|
-
let valueIndex = index + 1;
|
|
532
|
-
while (valueIndex < argv.length &&
|
|
533
|
-
argv[valueIndex] !== "--" &&
|
|
534
|
-
!argv[valueIndex].startsWith("-") &&
|
|
535
|
-
(values.length === 0 || multiValueListFlags.has(parsed.flag))) {
|
|
536
|
-
values.push(argv[valueIndex]);
|
|
537
|
-
valueIndex += 1;
|
|
538
|
-
}
|
|
539
|
-
const consumed = values.length === 0 ? 1 : 1 + values.length;
|
|
540
|
-
return {
|
|
541
|
-
originalTokens: argv.slice(index, index + consumed),
|
|
542
|
-
value: values.length === 0 ? undefined : values.join(","),
|
|
543
|
-
consumed,
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
function recordListFlagOccurrence(slots, result, flag, occurrence) {
|
|
547
|
-
const existing = slots.get(flag);
|
|
548
|
-
if (existing) {
|
|
549
|
-
existing.values.push(occurrence.value);
|
|
550
|
-
existing.occurrences += 1;
|
|
551
|
-
return;
|
|
552
|
-
}
|
|
553
|
-
slots.set(flag, {
|
|
554
|
-
outputIndex: result.length,
|
|
555
|
-
originalTokens: occurrence.originalTokens,
|
|
556
|
-
values: [occurrence.value],
|
|
557
|
-
occurrences: 1,
|
|
558
|
-
});
|
|
559
|
-
// Reserve the anchor position; finalized after the walk so we know the full
|
|
560
|
-
// merged value or can restore the original token form for single uses.
|
|
561
|
-
result.push(null);
|
|
562
|
-
}
|
|
563
|
-
function buildListFlagCoalescingSplices(slots, multiValueListFlags) {
|
|
564
|
-
const events = [];
|
|
565
|
-
const splices = [];
|
|
566
|
-
for (const [flag, slot] of slots) {
|
|
567
|
-
const shouldMerge = slot.occurrences >= 2 ||
|
|
568
|
-
(multiValueListFlags.has(flag) && slot.originalTokens.length > 2);
|
|
569
|
-
if (!shouldMerge) {
|
|
570
|
-
splices.push({
|
|
571
|
-
outputIndex: slot.outputIndex,
|
|
572
|
-
tokens: slot.originalTokens,
|
|
573
|
-
});
|
|
574
|
-
continue;
|
|
575
|
-
}
|
|
576
|
-
const mergedToken = `${flag}=${slot.values.join(",")}`;
|
|
577
|
-
splices.push({ outputIndex: slot.outputIndex, tokens: [mergedToken] });
|
|
578
|
-
events.push({
|
|
579
|
-
from: `${flag} (x${slot.occurrences})`,
|
|
580
|
-
to: [mergedToken],
|
|
581
|
-
reason: "list_merge",
|
|
582
|
-
confidence: "high",
|
|
583
|
-
});
|
|
584
|
-
}
|
|
585
|
-
return { events, splices };
|
|
586
|
-
}
|
|
587
|
-
function applyListFlagSplices(result, splices) {
|
|
588
|
-
splices.sort((a, b) => b.outputIndex - a.outputIndex);
|
|
589
|
-
for (const splice of splices) {
|
|
590
|
-
result.splice(splice.outputIndex, 1, ...splice.tokens);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
/**
|
|
594
|
-
* Coalesce repeated occurrences of comma-separated list flags into a single
|
|
595
|
-
* `--flag=v1,v2,v3` token anchored at the FIRST occurrence. Without this,
|
|
596
|
-
* Commander treats these flags as scalars and silently keeps only the last
|
|
597
|
-
* value (data loss). Both `--flag value` and `--flag=value` forms are merged;
|
|
598
|
-
* a value-less occurrence is preserved untouched, and a `--` terminator stops
|
|
599
|
-
* coalescing (remainder is passed through verbatim).
|
|
600
|
-
*
|
|
601
|
-
* `valueConsumingFlags` lists option flags (e.g. global `--pm-path`) whose value
|
|
602
|
-
* may itself begin with `--`. Their value token is emitted verbatim so a
|
|
603
|
-
* list-flag-looking value (`--path --tags`) is never reinterpreted as a flag
|
|
604
|
-
* nor allowed to swallow the following command/positional token.
|
|
605
|
-
*/
|
|
606
|
-
export function coalesceRepeatedListFlags(argv, listFlags, valueConsumingFlags = new Set(), multiValueListFlags = new Set()) {
|
|
607
|
-
if (listFlags.size === 0) {
|
|
608
|
-
return { argv: [...argv], events: [] };
|
|
609
|
-
}
|
|
610
|
-
const result = [];
|
|
611
|
-
const slots = new Map();
|
|
612
|
-
let index = 0;
|
|
613
|
-
while (index < argv.length) {
|
|
614
|
-
const token = argv[index];
|
|
615
|
-
if (token === "--") {
|
|
616
|
-
result.push(...argv.slice(index));
|
|
617
|
-
break;
|
|
618
|
-
}
|
|
619
|
-
// A value-consuming option in space form owns the next token as its value,
|
|
620
|
-
// even when that value begins with "--". Emit both verbatim so the value is
|
|
621
|
-
// never misread as a list-flag occurrence.
|
|
622
|
-
if (valueConsumingFlags.has(token)) {
|
|
623
|
-
index = copyValueConsumingFlag(argv, index, result);
|
|
624
|
-
continue;
|
|
625
|
-
}
|
|
626
|
-
const parsed = splitCanonicalListToken(token);
|
|
627
|
-
if (!parsed || !listFlags.has(parsed.flag)) {
|
|
628
|
-
result.push(token);
|
|
629
|
-
index += 1;
|
|
630
|
-
continue;
|
|
631
|
-
}
|
|
632
|
-
const occurrence = readListFlagOccurrence(argv, index, parsed, multiValueListFlags);
|
|
633
|
-
if (occurrence.value === undefined) {
|
|
634
|
-
// Value-less occurrence: leave untouched, do not coalesce.
|
|
635
|
-
result.push(token);
|
|
636
|
-
index += occurrence.consumed;
|
|
637
|
-
continue;
|
|
638
|
-
}
|
|
639
|
-
recordListFlagOccurrence(slots, result, parsed.flag, {
|
|
640
|
-
originalTokens: occurrence.originalTokens,
|
|
641
|
-
value: occurrence.value,
|
|
642
|
-
});
|
|
643
|
-
index += occurrence.consumed;
|
|
644
|
-
}
|
|
645
|
-
// Apply anchor splices from the end so earlier indices stay valid when a
|
|
646
|
-
// single-occurrence anchor expands back into two tokens.
|
|
647
|
-
const { events, splices } = buildListFlagCoalescingSplices(slots, multiValueListFlags);
|
|
648
|
-
applyListFlagSplices(result, splices);
|
|
649
|
-
return { argv: result, events };
|
|
650
|
-
}
|
|
651
|
-
/** Linked-test entry keys accepted in the two-token form `pm test <id> --add command "npm test -- parser"` (GH-191). Only entry-identity keys are merged: `command`/`cmd` name the shell command and `path` names the test file, so a single key=value entry is meaningful for them. Other structured keys (scope, env_set, assertions, ...) cannot form a valid standalone entry and are left for the normal parser to reject. `--remove` matches existing entries by `command=`/`path=` only, so `cmd` is excluded there. Key names mirror STRUCTURED_LINKED_TEST_KEYS in src/cli/commands/linked-test-entry.ts. */
|
|
652
|
-
const LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG = new Map([
|
|
653
|
-
["--add", new Set(["command", "cmd", "path"])],
|
|
654
|
-
["--remove", new Set(["command", "path"])],
|
|
655
|
-
]);
|
|
656
|
-
/** Sandbox-safe linked-test commands legitimately start with env assignments (`PM_PATH=... PM_GLOBAL_PATH=... vitest run -- parser`), which look like bare key=value settings tokens. When the two preceding tokens are a linked-test flag plus a bare two-token key (`--add command <value>`), the value must be left intact for mergeLinkedTestTwoTokenEntries instead of being rewritten into a canonical flag (e.g. PM_PATH= -> --pm-path), which would silently corrupt the command into `--add command --pm-path ...`. */
|
|
657
|
-
function isLinkedTestTwoTokenValuePosition(commandName, emittedTokens) {
|
|
658
|
-
if (commandName !== "test" || emittedTokens.length < 2) {
|
|
659
|
-
return false;
|
|
660
|
-
}
|
|
661
|
-
const key = emittedTokens[emittedTokens.length - 1];
|
|
662
|
-
const flag = emittedTokens[emittedTokens.length - 2];
|
|
663
|
-
const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(flag);
|
|
664
|
-
return keys !== undefined && keys.has(key);
|
|
665
|
-
}
|
|
666
|
-
function shouldPreserveBareKeyValueToken(commandName, emittedTokens) {
|
|
667
|
-
return (commandName === "search" ||
|
|
668
|
-
isLinkedTestTwoTokenValuePosition(commandName, emittedTokens));
|
|
669
|
-
}
|
|
670
|
-
/** Accept the two-token linked-test form `pm test <id> --add command "npm test -- parser"` by merging the bare key token and its single quoted value into the documented `--add command=...` shape. Without this merge Commander binds the bare key as the option value and treats the quoted command as an excess positional, failing with "too many arguments" (GH-191). The merge only fires when EXACTLY ONE non-flag token follows the bare key, i.e. the value was quoted into one shell token — an unquoted multi-token value stays ambiguous (it may swallow the item id), still fails fast, and is routed to targeted quoting guidance by the commander error classifier instead. */
|
|
671
|
-
export function mergeLinkedTestTwoTokenEntries(argv, commandName, trace) {
|
|
672
|
-
if (commandName !== "test") {
|
|
673
|
-
return argv;
|
|
674
|
-
}
|
|
675
|
-
const result = [];
|
|
676
|
-
let index = 0;
|
|
677
|
-
while (index < argv.length) {
|
|
678
|
-
const token = argv[index];
|
|
679
|
-
if (token === "--") {
|
|
680
|
-
result.push(...argv.slice(index));
|
|
681
|
-
return result;
|
|
682
|
-
}
|
|
683
|
-
const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(token);
|
|
684
|
-
const key = keys ? argv[index + 1] : undefined;
|
|
685
|
-
if (!keys || typeof key !== "string" || !keys.has(key)) {
|
|
686
|
-
result.push(token);
|
|
687
|
-
index += 1;
|
|
688
|
-
continue;
|
|
689
|
-
}
|
|
690
|
-
let runEnd = index + 2;
|
|
691
|
-
while (runEnd < argv.length && !argv[runEnd].startsWith("-")) {
|
|
692
|
-
runEnd += 1;
|
|
693
|
-
}
|
|
694
|
-
if (runEnd - (index + 2) !== 1) {
|
|
695
|
-
result.push(token);
|
|
696
|
-
index += 1;
|
|
697
|
-
continue;
|
|
698
|
-
}
|
|
699
|
-
const value = argv[index + 2];
|
|
700
|
-
const mergedValue = `${key}=${value}`;
|
|
701
|
-
result.push(token, mergedValue);
|
|
702
|
-
trace.push({
|
|
703
|
-
from: `${token} ${key} ${value}`,
|
|
704
|
-
to: [token, mergedValue],
|
|
705
|
-
reason: "bare_key_value",
|
|
706
|
-
confidence: "high",
|
|
707
|
-
});
|
|
708
|
-
index += 3;
|
|
709
|
-
}
|
|
710
|
-
return result;
|
|
711
|
-
}
|
|
712
|
-
/** Normalize option spellings and bare key-value tokens before list coalescing. */
|
|
713
|
-
function normalizeBootstrapTokens(argv, lookup, commandName, trace) {
|
|
714
|
-
const normalizedArgv = [];
|
|
715
|
-
const pathValueIndices = collectBootstrapPathValueIndices(argv);
|
|
716
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
717
|
-
const token = argv[index];
|
|
718
|
-
if (token === "--") {
|
|
719
|
-
normalizedArgv.push(...argv.slice(index));
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
const preserveCurrentToken = pathValueIndices.has(index);
|
|
723
|
-
const previous = normalizedArgv[normalizedArgv.length - 1];
|
|
724
|
-
if (token.startsWith("--")) {
|
|
725
|
-
const normalizedToken = normalizeLongOptionToken(token, lookup, preserveCurrentToken);
|
|
726
|
-
normalizedArgv.push(...normalizedToken.tokens);
|
|
727
|
-
if (normalizedToken.event)
|
|
728
|
-
trace.push(normalizedToken.event);
|
|
729
|
-
continue;
|
|
730
|
-
}
|
|
731
|
-
const bareKeyValue = parseBareKeyValueToken(token, preserveCurrentToken);
|
|
732
|
-
if (bareKeyValue &&
|
|
733
|
-
!(typeof previous === "string" && previous.startsWith("-")) &&
|
|
734
|
-
!shouldPreserveBareKeyValueToken(commandName, normalizedArgv)) {
|
|
735
|
-
const resolution = resolveCanonicalFlag(bareKeyValue.key, lookup);
|
|
736
|
-
if (resolution) {
|
|
737
|
-
const replacement = [resolution.flag, bareKeyValue.value];
|
|
738
|
-
normalizedArgv.push(...replacement);
|
|
739
|
-
trace.push({
|
|
740
|
-
from: token,
|
|
741
|
-
to: replacement,
|
|
742
|
-
reason: "bare_key_value",
|
|
743
|
-
confidence: resolution.confidence,
|
|
744
|
-
});
|
|
745
|
-
continue;
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
normalizedArgv.push(token);
|
|
749
|
-
}
|
|
750
|
-
return normalizedArgv;
|
|
751
|
-
}
|
|
752
|
-
/** Implements normalize bootstrap invocation for the public runtime surface of this module. */
|
|
753
|
-
export function normalizeBootstrapInvocation(argv) {
|
|
754
|
-
const trace = [];
|
|
755
|
-
const executableNormalized = stripLeadingExecutableAlias(argv, trace);
|
|
756
|
-
const legacyNormalized = normalizeLegacyExtensionActionSyntax(executableNormalized);
|
|
757
|
-
if (legacyNormalized.length !== executableNormalized.length ||
|
|
758
|
-
legacyNormalized.some((token, index) => token !== executableNormalized[index])) {
|
|
759
|
-
trace.push({
|
|
760
|
-
from: executableNormalized.join(" "),
|
|
761
|
-
to: [...legacyNormalized],
|
|
762
|
-
reason: "legacy_extension_action",
|
|
763
|
-
confidence: "high",
|
|
764
|
-
});
|
|
765
|
-
}
|
|
766
|
-
const aliasNormalized = rewriteCommandAlias(legacyNormalized, trace);
|
|
767
|
-
const itemAddress = normalizeItemAddressInvocation(aliasNormalized);
|
|
768
|
-
if (itemAddress.conflict) {
|
|
769
|
-
throw new PmCliError("Provide the item id either positionally or with --id, not both.", EXIT_CODE.USAGE);
|
|
770
|
-
}
|
|
771
|
-
if (itemAddress.changed) {
|
|
772
|
-
trace.push({
|
|
773
|
-
from: `--id ${itemAddress.itemId}`,
|
|
774
|
-
to: [itemAddress.itemId],
|
|
775
|
-
reason: "item_id_alias",
|
|
776
|
-
confidence: "high",
|
|
777
|
-
});
|
|
778
|
-
}
|
|
779
|
-
const commandName = parseBootstrapCommandName(itemAddress.argv);
|
|
780
|
-
const commandPathName = parseBootstrapCommandPathName(itemAddress.argv);
|
|
781
|
-
const lookup = buildFlagLookup(commandPathName ?? commandName);
|
|
782
|
-
const normalizedArgv = normalizeBootstrapTokens(itemAddress.argv, lookup, commandName, trace);
|
|
783
|
-
const linkedTestNormalized = mergeLinkedTestTwoTokenEntries(normalizedArgv, commandName, trace);
|
|
784
|
-
const coalesced = coalesceRepeatedListFlags(linkedTestNormalized, lookup.listCanonicalFlags, GLOBAL_VALUE_CONSUMING_FLAGS, commandName === "create" ? new Set(["--tags"]) : new Set());
|
|
785
|
-
for (const event of coalesced.events) {
|
|
786
|
-
trace.push(event);
|
|
787
|
-
}
|
|
788
|
-
return {
|
|
789
|
-
argv: coalesced.argv,
|
|
790
|
-
commandName,
|
|
791
|
-
trace,
|
|
792
|
-
};
|
|
793
|
-
}
|
|
794
|
-
function parseBootstrapCommandPathName(argv) {
|
|
795
|
-
const stripped = stripGlobalBootstrapTokens(argv);
|
|
796
|
-
const first = stripped[0]?.trim().toLowerCase();
|
|
797
|
-
const second = stripped[1]?.trim().toLowerCase();
|
|
798
|
-
if ((first === "extension" || first === "package" || first === "packages") &&
|
|
799
|
-
typeof second === "string" &&
|
|
800
|
-
second.length > 0 &&
|
|
801
|
-
!second.startsWith("-")) {
|
|
802
|
-
return `${first} ${second}`;
|
|
803
|
-
}
|
|
804
|
-
return first;
|
|
805
|
-
}
|
|
806
|
-
/** Implements parse bootstrap type value for the public runtime surface of this module. */
|
|
807
|
-
export function parseBootstrapTypeValue(argv) {
|
|
808
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
809
|
-
const token = argv[index];
|
|
810
|
-
if (token === "--") {
|
|
811
|
-
break;
|
|
812
|
-
}
|
|
813
|
-
if (token === "--type") {
|
|
814
|
-
const candidate = argv[index + 1];
|
|
815
|
-
if (typeof candidate === "string" && candidate.trim().length > 0) {
|
|
816
|
-
return candidate.trim();
|
|
817
|
-
}
|
|
818
|
-
continue;
|
|
819
|
-
}
|
|
820
|
-
if (token.startsWith("--type=")) {
|
|
821
|
-
const candidate = token.slice("--type=".length).trim();
|
|
822
|
-
if (candidate.length > 0) {
|
|
823
|
-
return candidate;
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
return undefined;
|
|
828
|
-
}
|
|
829
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
830
|
-
export const _testOnly = {
|
|
831
|
-
buildFlagLookup,
|
|
832
|
-
collectBootstrapPathValueIndices,
|
|
833
|
-
collectLongFlagCandidates,
|
|
834
|
-
markUnambiguousFlag,
|
|
835
|
-
normalizeLongOptionToken,
|
|
836
|
-
resolveCanonicalFlag,
|
|
837
|
-
};
|
|
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]="fcffdf9d-a396-5ee2-b170-31cba062fee4")}catch(e2){}})();import{EXECUTABLE_COMMAND_ALIASES,PM_COMMAND_ALIAS_CONTRACTS,renderPmCommandAliasMigrationHint,resolvePmCommandAlias,resolveSubcommandFlagContractsForCommand}from"./cli-contracts.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{resolvePmHistoryOperation}from"./cli-contracts/command-aliases.js";import{normalizeItemAddressInvocation}from"./agent/item-addressing.js";import{BOOTSTRAP_BOOLEAN_FLAGS,GLOBAL_VALUE_CONSUMING_FLAGS,consumesBootstrapValue,findBootstrapCommandTokenIndex as findContractBootstrapCommandTokenIndex,isInlineGlobalValueToken,parseBootstrapCommandName as parseContractBootstrapCommandName}from"./cli-contracts/bootstrap-command-scanner.js";const OUTPUT_VALUE_FLAGS=new Set(["--output-include","--output-limit","--output-budget","--output-format","--output-session","--output-cursor"]);function consumeBootstrapGlobalToken(argv,index,state){const token=argv[index];if(BOOTSTRAP_BOOLEAN_FLAGS.has(token)){state.booleanFlags.add(token);return 1}const equalsIndex=token.indexOf("=");const canonicalFlag=equalsIndex>0?token.slice(0,equalsIndex):token;if(!GLOBAL_VALUE_CONSUMING_FLAGS.has(canonicalFlag))return 1;const inlineValue=equalsIndex>0?token.slice(equalsIndex+1):void 0;const consumesValue=inlineValue===void 0&&consumesBootstrapValue(canonicalFlag,argv[index+1]);const value=inlineValue??(consumesValue?argv[index+1]:void 0);if(canonicalFlag==="--author"){state.author=value??""}else if(typeof value==="string"&&value.length>0){const target=OUTPUT_VALUE_FLAGS.has(canonicalFlag)?state.outputValues:state.pathValues;target.set(canonicalFlag,value)}return consumesValue?2:1}function parseBootstrapGlobalOptions(argv){const state={booleanFlags:new Set,outputValues:new Map,pathValues:new Map};let index=0;while(index<argv.length){if(argv[index]==="--")break;index+=consumeBootstrapGlobalToken(argv,index,state)}return{path:state.pathValues.get("--pm-path")??state.pathValues.get("--path"),noExtensions:state.booleanFlags.has("--no-extensions"),noPager:state.booleanFlags.has("--no-pager"),json:state.booleanFlags.has("--json"),quiet:state.booleanFlags.has("--quiet"),lean:state.booleanFlags.has("--lean"),tokenAccounting:state.booleanFlags.has("--token-accounting"),...state.booleanFlags.has("--output-row-contract")?{outputRowContract:true}:{},...state.outputValues.get("--output-include")===void 0?{}:{outputInclude:state.outputValues.get("--output-include")},...state.outputValues.get("--output-limit")===void 0?{}:{outputLimit:state.outputValues.get("--output-limit")},...state.outputValues.get("--output-budget")===void 0?{}:{outputBudget:state.outputValues.get("--output-budget")},...state.outputValues.get("--output-format")==="toon"||state.outputValues.get("--output-format")==="json"?{outputFormat:state.outputValues.get("--output-format")}:{},...state.outputValues.get("--output-session")===void 0?{}:{outputSession:state.outputValues.get("--output-session")},...state.outputValues.get("--output-cursor")===void 0?{}:{outputCursor:state.outputValues.get("--output-cursor")},...state.author===""?{authorMissingValue:true}:state.author!==void 0?{author:state.author}:{}}}function stripGlobalBootstrapTokens(argv){const remaining=[];let index=0;while(index<argv.length){const token=argv[index];if(token==="--"){break}if(BOOTSTRAP_BOOLEAN_FLAGS.has(token)||token==="--profile"||token==="--id-only"||token==="--full-changed-fields"||token==="--explain"){index+=1;continue}if(GLOBAL_VALUE_CONSUMING_FLAGS.has(token)){index+=consumesBootstrapValue(token,argv[index+1])?2:1;continue}if(isInlineGlobalValueToken(token)){index+=1;continue}remaining.push(token);index+=1}return remaining}function parseBootstrapHelpRequest(argv){const stripped=stripGlobalBootstrapTokens(argv);const first=stripped[0]?.trim().toLowerCase();if(first==="help"){const commandPathTokens2=[];for(let index=1;index<stripped.length;index+=1){const token=stripped[index];if(token.startsWith("-")){break}commandPathTokens2.push(token.trim().toLowerCase())}return{requested:true,commandPathTokens:commandPathTokens2}}const helpFlagIndex=stripped.findIndex(token=>token==="--help"||token==="-h");if(helpFlagIndex<0){return{requested:false,commandPathTokens:[]}}const commandPathTokens=[];for(const token of stripped){if(token.startsWith("-")){break}commandPathTokens.push(token.trim().toLowerCase())}return{requested:true,commandPathTokens}}function findBootstrapCommandTokenIndex(argv){return findContractBootstrapCommandTokenIndex(argv)}function parseBootstrapCommandName(argv){return parseContractBootstrapCommandName(argv)}function shouldDisablePagerForInvocation(argv,bootstrapGlobal){if(bootstrapGlobal.noPager){return true}if(process.stdout.isTTY===true){return false}const helpRequest=parseBootstrapHelpRequest(argv);return helpRequest.requested}function applyBootstrapPagerPolicy(argv){const pagerEnvironmentKeys=["PAGER","MANPAGER","GIT_PAGER","LESS"];const previousValues=pagerEnvironmentKeys.map(key=>process.env[key]);const restore=()=>{for(const[index,key]of pagerEnvironmentKeys.entries()){const value=previousValues[index];if(value===void 0){delete process.env[key]}else{process.env[key]=value}}};const bootstrapGlobal=parseBootstrapGlobalOptions(argv);if(!shouldDisablePagerForInvocation(argv,bootstrapGlobal)){return restore}process.env.PAGER="cat";process.env.MANPAGER="cat";process.env.GIT_PAGER="cat";if(typeof process.env.LESS!=="string"||process.env.LESS.trim().length===0){process.env.LESS="FRX"}return restore}const EXTENSION_ACTION_SYNTAX_TOKENS=new Set(["install","uninstall","explore","manage","doctor","adopt","adopt-all","activate","deactivate"]);function normalizeLegacyExtensionActionSyntax(argv){const extensionIndex=findBootstrapCommandTokenIndex(argv);if(extensionIndex===void 0||argv[extensionIndex]!=="extension"){return[...argv]}const actionToken=argv[extensionIndex+1];if(!actionToken||actionToken.startsWith("-")){return[...argv]}if(!EXTENSION_ACTION_SYNTAX_TOKENS.has(actionToken)){return[...argv]}if(argv.includes("--help")||argv.includes("-h")){return[...argv]}const forcedActionFlag=`--${actionToken}`;if(argv.includes(forcedActionFlag)){return[...argv]}return[...argv.slice(0,extensionIndex+1),forcedActionFlag,...argv.slice(extensionIndex+2)]}const CLI_EXECUTABLE_ALIASES=new Set(["pm","pm-cli"]);function stripLeadingExecutableAlias(argv,trace){const index=findBootstrapCommandTokenIndex(argv);if(index===void 0){return argv}const token=argv[index];if(!CLI_EXECUTABLE_ALIASES.has(token.trim().toLowerCase())){return argv}trace.push({from:token,to:[],reason:"executable_alias",confidence:"high"});return[...argv.slice(0,index),...argv.slice(index+1)]}function rewriteCommandAlias(argv,trace){const index=findBootstrapCommandTokenIndex(argv);if(index===void 0){return argv}const token=argv[index];const canonical=EXECUTABLE_COMMAND_ALIASES[token.trim().toLowerCase()];if(!canonical){return argv}const rewritten=[...argv];rewritten[index]=canonical;trace.push({from:token,to:[canonical],reason:"command_alias",confidence:"high"});return rewritten}function normalizeFlagKeyToken(raw){const withoutPrefix=raw.replace(/^--?/,"");return withoutPrefix.replace(/_/g,"-").replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function toComparableFlagKey(raw){return normalizeFlagKeyToken(raw).replace(/-/g,"")}function markUnambiguousFlag(map,key,canonicalFlag){const existing=map.get(key);if(existing===void 0){map.set(key,canonicalFlag);return}if(existing!==canonicalFlag){map.set(key,null)}}function collectLongFlagCandidates(contract){const candidates=[];const pushLongFlag=value=>{if(typeof value!=="string"){return}if(!value.startsWith("--")){return}candidates.push(value)};pushLongFlag(contract.flag);for(const alias of contract.aliases??[]){pushLongFlag(alias)}return candidates}function buildFlagLookup(commandName,contractsOverride){const contracts=contractsOverride??resolveSubcommandFlagContractsForCommand(commandName);const canonicalByNormalized=new Map;const canonicalByCompact=new Map;const canonicalComparablesMap=new Map;const listCanonicalFlags=new Set;for(const contract of contracts){const longCandidates=collectLongFlagCandidates(contract);if(longCandidates.length===0){continue}const canonicalFlag=`--${normalizeFlagKeyToken(longCandidates[0])}`;for(const candidate of longCandidates){markUnambiguousFlag(canonicalByNormalized,normalizeFlagKeyToken(candidate),canonicalFlag);markUnambiguousFlag(canonicalByCompact,toComparableFlagKey(candidate),canonicalFlag)}const comparable=toComparableFlagKey(canonicalFlag);if(!canonicalComparablesMap.has(canonicalFlag)){canonicalComparablesMap.set(canonicalFlag,comparable)}if(contract.list===true){listCanonicalFlags.add(canonicalFlag)}}return{canonicalByNormalized,canonicalByCompact,canonicalComparables:[...canonicalComparablesMap.entries()].map(([canonicalFlag,comparable])=>({canonicalFlag,comparable})),listCanonicalFlags}}function resolveCanonicalFlag(rawKey,lookup){const normalizedKey=normalizeFlagKeyToken(rawKey);const direct=lookup.canonicalByNormalized.get(normalizedKey);if(typeof direct==="string"){return{flag:direct,reason:"flag_alias",confidence:"high"}}const comparableKey=normalizedKey.replace(/-/g,"");const compactMatch=lookup.canonicalByCompact.get(comparableKey);if(typeof compactMatch==="string"){return{flag:compactMatch,reason:"flag_alias",confidence:"high"}}const maxDistance=comparableKey.length>=8?2:1;let bestDistance=Number.POSITIVE_INFINITY;let bestFlag;let tied=false;for(const candidate of lookup.canonicalComparables){const distance=levenshteinDistanceWithinLimit(comparableKey,candidate.comparable,maxDistance);if(distance===null){continue}if(distance<bestDistance){bestDistance=distance;bestFlag=candidate.canonicalFlag;tied=false;continue}if(distance===bestDistance&&bestFlag!==candidate.canonicalFlag){tied=true}}if(!bestFlag||tied||!Number.isFinite(bestDistance)||bestDistance<=0){return null}return{flag:bestFlag,reason:"flag_typo",confidence:bestDistance>=2?"medium":"high"}}function listAliasPluralKeys(normalizedKey){const candidates=[`${normalizedKey}s`];if(normalizedKey.endsWith("y")&&normalizedKey.length>1){candidates.push(`${normalizedKey.slice(0,-1)}ies`)}return candidates}function parseBareKeyValueToken(token,preserve=false){if(preserve||token.includes("://")){return null}const match=token.match(/^([A-Za-z][A-Za-z0-9_-]{1,63})([:=])(.*)$/);if(!match){return null}const key=match[1];const value=match[3];if(value.length===0){return null}return{key,value}}function normalizeLongOptionToken(token,lookup,preserve=false){if(preserve||!token.startsWith("--")){return{tokens:[token]}}const equalsIndex=token.indexOf("=");const key=equalsIndex>=0?token.slice(0,equalsIndex):token;const inlineValue=equalsIndex>=0?token.slice(equalsIndex+1):void 0;const resolution=resolveCanonicalFlag(key,lookup);if(!resolution){return{tokens:[token]}}const normalizedToken=inlineValue===void 0?resolution.flag:`${resolution.flag}=${inlineValue}`;if(normalizedToken===token){return{tokens:[token]}}return{tokens:[normalizedToken],event:{from:token,to:[normalizedToken],reason:resolution.reason,confidence:resolution.confidence}}}function collectBootstrapPathValueIndices(argv){const indices=new Set;let expectsValue=false;for(let index=0;index<argv.length;index+=1){if(expectsValue){indices.add(index);expectsValue=false;continue}const token=argv[index];expectsValue=token==="--path"||token==="--pm-path"}return indices}function splitCanonicalListToken(token){if(!token.startsWith("--")){return null}const equalsIndex=token.indexOf("=");if(equalsIndex<0){return{flag:token}}return{flag:token.slice(0,equalsIndex),inlineValue:token.slice(equalsIndex+1)}}function copyValueConsumingFlag(argv,index,result){result.push(argv[index]);const next=argv[index+1];if(typeof next==="string"&&next!=="--"){result.push(next);return index+2}return index+1}function readListFlagOccurrence(argv,index,parsed,multiValueListFlags){if(parsed.inlineValue!==void 0){return{originalTokens:[argv[index]],value:parsed.inlineValue,consumed:1}}const values=[];let valueIndex=index+1;while(valueIndex<argv.length&&argv[valueIndex]!=="--"&&!argv[valueIndex].startsWith("-")&&(values.length===0||multiValueListFlags.has(parsed.flag))){values.push(argv[valueIndex]);valueIndex+=1}const consumed=values.length===0?1:1+values.length;return{originalTokens:argv.slice(index,index+consumed),value:values.length===0?void 0:values.join(","),consumed}}function recordListFlagOccurrence(slots,result,flag,occurrence){const existing=slots.get(flag);if(existing){existing.values.push(occurrence.value);existing.occurrences+=1;return}slots.set(flag,{outputIndex:result.length,originalTokens:occurrence.originalTokens,values:[occurrence.value],occurrences:1});result.push(null)}function buildListFlagCoalescingSplices(slots,multiValueListFlags){const events=[];const splices=[];for(const[flag,slot]of slots){const shouldMerge=slot.occurrences>=2||multiValueListFlags.has(flag)&&slot.originalTokens.length>2;if(!shouldMerge){splices.push({outputIndex:slot.outputIndex,tokens:slot.originalTokens});continue}const mergedToken=`${flag}=${slot.values.join(",")}`;splices.push({outputIndex:slot.outputIndex,tokens:[mergedToken]});events.push({from:`${flag} (x${slot.occurrences})`,to:[mergedToken],reason:"list_merge",confidence:"high"})}return{events,splices}}function applyListFlagSplices(result,splices){splices.sort((a,b)=>b.outputIndex-a.outputIndex);for(const splice of splices){result.splice(splice.outputIndex,1,...splice.tokens)}}function coalesceRepeatedListFlags(argv,listFlags,valueConsumingFlags=new Set,multiValueListFlags=new Set){if(listFlags.size===0){return{argv:[...argv],events:[]}}const result=[];const slots=new Map;let index=0;while(index<argv.length){const token=argv[index];if(token==="--"){result.push(...argv.slice(index));break}if(valueConsumingFlags.has(token)){index=copyValueConsumingFlag(argv,index,result);continue}const parsed=splitCanonicalListToken(token);if(!parsed||!listFlags.has(parsed.flag)){result.push(token);index+=1;continue}const occurrence=readListFlagOccurrence(argv,index,parsed,multiValueListFlags);if(occurrence.value===void 0){result.push(token);index+=occurrence.consumed;continue}recordListFlagOccurrence(slots,result,parsed.flag,{originalTokens:occurrence.originalTokens,value:occurrence.value});index+=occurrence.consumed}const{events,splices}=buildListFlagCoalescingSplices(slots,multiValueListFlags);applyListFlagSplices(result,splices);return{argv:result,events}}const LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG=new Map([["--add",new Set(["command","cmd","path"])],["--remove",new Set(["command","path"])]]);function isLinkedTestTwoTokenValuePosition(commandName,emittedTokens){if(commandName!=="test"||emittedTokens.length<2){return false}const key=emittedTokens[emittedTokens.length-1];const flag=emittedTokens[emittedTokens.length-2];const keys=LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(flag);return keys!==void 0&&keys.has(key)}function shouldPreserveBareKeyValueToken(commandName,emittedTokens){return commandName==="search"||isLinkedTestTwoTokenValuePosition(commandName,emittedTokens)}function mergeLinkedTestTwoTokenEntries(argv,commandName,trace){if(commandName!=="test"){return argv}const result=[];let index=0;while(index<argv.length){const token=argv[index];if(token==="--"){result.push(...argv.slice(index));return result}const keys=LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(token);const key=keys?argv[index+1]:void 0;if(!keys||typeof key!=="string"||!keys.has(key)){result.push(token);index+=1;continue}let runEnd=index+2;while(runEnd<argv.length&&!argv[runEnd].startsWith("-")){runEnd+=1}if(runEnd-(index+2)!==1){result.push(token);index+=1;continue}const value=argv[index+2];const mergedValue=`${key}=${value}`;result.push(token,mergedValue);trace.push({from:`${token} ${key} ${value}`,to:[token,mergedValue],reason:"bare_key_value",confidence:"high"});index+=3}return result}function normalizeBootstrapTokens(argv,lookup,commandName,trace){const normalizedArgv=[];const pathValueIndices=collectBootstrapPathValueIndices(argv);for(let index=0;index<argv.length;index+=1){const token=argv[index];if(token==="--"){normalizedArgv.push(...argv.slice(index));break}const preserveCurrentToken=pathValueIndices.has(index);const previous=normalizedArgv[normalizedArgv.length-1];if(token.startsWith("--")){const normalizedToken=normalizeLongOptionToken(token,lookup,preserveCurrentToken);normalizedArgv.push(...normalizedToken.tokens);if(normalizedToken.event)trace.push(normalizedToken.event);continue}const bareKeyValue=parseBareKeyValueToken(token,preserveCurrentToken);if(bareKeyValue&&!(typeof previous==="string"&&previous.startsWith("-"))&&!shouldPreserveBareKeyValueToken(commandName,normalizedArgv)){const resolution=resolveCanonicalFlag(bareKeyValue.key,lookup);if(resolution){const replacement=[resolution.flag,bareKeyValue.value];normalizedArgv.push(...replacement);trace.push({from:token,to:replacement,reason:"bare_key_value",confidence:resolution.confidence});continue}}normalizedArgv.push(token)}return normalizedArgv}function normalizeBootstrapInvocation(argv){const trace=[];const executableNormalized=stripLeadingExecutableAlias(argv,trace);const legacyNormalized=normalizeLegacyExtensionActionSyntax(executableNormalized);if(legacyNormalized.length!==executableNormalized.length||legacyNormalized.some((token,index)=>token!==executableNormalized[index])){trace.push({from:executableNormalized.join(" "),to:[...legacyNormalized],reason:"legacy_extension_action",confidence:"high"})}const aliasNormalized=rewriteCommandAlias(legacyNormalized,trace);const itemAddress=normalizeItemAddressInvocation(aliasNormalized);if(itemAddress.conflict){throw new PmCliError("Provide the item id either positionally or with --id, not both.",EXIT_CODE.USAGE)}if(itemAddress.changed){trace.push({from:`--id ${itemAddress.itemId}`,to:[itemAddress.itemId],reason:"item_id_alias",confidence:"high"})}const commandName=parseBootstrapCommandName(itemAddress.argv);const commandPathName=parseBootstrapCommandPathName(itemAddress.argv);const lookup=buildFlagLookup(commandPathName??commandName);const normalizedArgv=normalizeBootstrapTokens(itemAddress.argv,lookup,commandName,trace);const linkedTestNormalized=mergeLinkedTestTwoTokenEntries(normalizedArgv,commandName,trace);const coalesced=coalesceRepeatedListFlags(linkedTestNormalized,lookup.listCanonicalFlags,GLOBAL_VALUE_CONSUMING_FLAGS,commandName==="create"?new Set(["--tags"]):new Set);for(const event of coalesced.events){trace.push(event)}return{argv:coalesced.argv,commandName,trace}}function parseBootstrapCommandPathName(argv){const stripped=stripGlobalBootstrapTokens(argv);const first=stripped[0]?.trim().toLowerCase();const second=stripped[1]?.trim().toLowerCase();const historyPath=`${first} ${second}`;if(first==="history"&&resolvePmHistoryOperation(historyPath)!==historyPath)return historyPath;if((first==="extension"||first==="package"||first==="packages")&&typeof second==="string"&&second.length>0&&!second.startsWith("-")){return`${first} ${second}`}return first}function parseBootstrapTypeValue(argv){for(let index=0;index<argv.length;index+=1){const token=argv[index];if(token==="--"){break}if(token==="--type"){const candidate=argv[index+1];if(typeof candidate==="string"&&candidate.trim().length>0){return candidate.trim()}continue}if(token.startsWith("--type=")){const candidate=token.slice("--type=".length).trim();if(candidate.length>0){return candidate}}}return void 0}const _testOnly={buildFlagLookup,collectBootstrapPathValueIndices,collectLongFlagCandidates,markUnambiguousFlag,normalizeLongOptionToken,resolveCanonicalFlag};export{EXECUTABLE_COMMAND_ALIASES,PM_COMMAND_ALIAS_CONTRACTS,_testOnly,applyBootstrapPagerPolicy,coalesceRepeatedListFlags,findBootstrapCommandTokenIndex,listAliasPluralKeys,mergeLinkedTestTwoTokenEntries,normalizeBootstrapInvocation,normalizeLegacyExtensionActionSyntax,parseBootstrapCommandName,parseBootstrapGlobalOptions,parseBootstrapHelpRequest,parseBootstrapTypeValue,renderPmCommandAliasMigrationHint,resolvePmCommandAlias,stripGlobalBootstrapTokens};
|
|
838
2
|
//# sourceMappingURL=cli-bootstrap.js.map
|
|
839
|
-
//# debugId=3d35c0f5-e1b8-5fd8-8fd7-c754a21784a1
|