@unbrained/pm-cli 2026.9.6 → 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 +218 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.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/RELEASING.md +1 -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,773 +1,13 @@
|
|
|
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]="61341599-3083-5e96-b455-65290be67c1b")}catch(e2){}})();import{pathExists,resolveItemTypeRegistry,EXIT_CODE,getSettingsPath,resolvePmRoot,readSettings,getActiveExtensionRegistrations,locateItem,runActiveServiceOverride,levenshteinDistanceWithinLimit}from"../sdk/runtime-primitives.js";import{BUILTIN_ITEM_TYPE_VALUES}from"../types/index.js";import{PM_CORE_COMMAND_NAMES,resolveSubcommandFlagContractsForCommand}from"../sdk/cli-contracts.js";import{formatCommanderErrorForDisplay,formatCommanderErrorForJson,projectLeanErrorEnvelope}from"./error-guidance.js";import{normalizeHelpCommandPath}from"./help-content.js";import{getCommandPath}from"./registration-helpers.js";import{EXECUTABLE_COMMAND_ALIASES,findBootstrapCommandTokenIndex,normalizeBootstrapInvocation,parseBootstrapHelpRequest,parseBootstrapGlobalOptions,parseBootstrapCommandName}from"./bootstrap-args.js";import{extractProvidedOptionFlags,normalizeLongFlag,renderPmCommand}from"./argv-utils.js";import{normalizeExtensionNameForMatch}from"./commands/extension/shared.js";import{rankCommandPaths}from"../sdk/agent/command-suggestions.js";import{renderMissingOptionRetry}from"../sdk/agent/command-recovery.js";import{attachOutputTokenAccounting}from"../sdk/output-token-accounting.js";const BUILTIN_TYPE_HELP_VALUES=BUILTIN_ITEM_TYPE_VALUES.join("|");const OPTIONAL_PACKAGE_INSTALL_HINTS={calendar:"calendar",cal:"calendar",reindex:"search-advanced","search-advanced":"search-advanced",guide:"guide-shell",completion:"guide-shell",templates:"templates","test-runs":"linked-test-adapters",beads:"beads",todos:"todos"};const SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS={comments:{"--body":["--add"],"--text":["--add"],"--comment":["--add"]},notes:{"--body":["--add"],"--text":["--add"],"--note":["--add"]},learnings:{"--body":["--add"],"--text":["--add"],"--learning":["--add"]},update:{"--add-tag":["--add-tags"],"--remove-tag":["--remove-tags"],"--tag":["--tags"]},create:{"--add-tag":["--add-tags"],"--tag":["--tags"]}};const SCHEMA_SUBCOMMAND_VALUES=["add-field","add-status","add-type","apply-preset","list","list-fields","remap-status","remove-field","remove-status","remove-type","rename-field","rename-type","show","show-field","show-status"];function getSemanticUnknownOptionSuggestions(commandName,unknownOption){const commandSuggestions=SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS[commandName];if(!commandSuggestions){return[]}const normalizedUnknown=normalizeLongFlag(unknownOption);for(const[flag,suggestions]of Object.entries(commandSuggestions)){if(normalizeLongFlag(flag)===normalizedUnknown){return suggestions}}return[]}function appendCommanderExtensionFailures(renderedUsage,json,failures){if(failures.length===0){return renderedUsage}if(json){const primaryFailure2=failures.find(entry=>entry.declared_command_match===true);const{token_accounting:priorAccounting,...usage}=JSON.parse(renderedUsage);const enriched={...usage,...primaryFailure2?{extension_command_failure:{code:"extension_command_activation_failed",extension:primaryFailure2.name,layer:primaryFailure2.layer,error:primaryFailure2.error,recovery_commands:primaryFailure2.recovery_commands??[]}}:{},failed_extensions:failures};return JSON.stringify(priorAccounting===void 0?enriched:attachOutputTokenAccounting(enriched,value=>`${JSON.stringify(value,null,2)}
|
|
2
|
+
`),null,2)}const details=failures.map(entry=>`- ${entry.layer}:${entry.name}: ${entry.error}`).join("\n");const primaryFailure=failures.find(entry=>entry.declared_command_match===true);if(!primaryFailure){return`${renderedUsage}
|
|
3
|
+
Extension activation failures:
|
|
4
|
+
${details}`}const recovery=(primaryFailure.recovery_commands??[]).map(command=>`- ${command}`).join("\n");return`Extension command unavailable: ${primaryFailure.layer}:${primaryFailure.name}
|
|
5
|
+
${primaryFailure.error}${recovery.length>0?`
|
|
6
|
+
Recovery:
|
|
7
|
+
${recovery}`:""}
|
|
1
8
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { BUILTIN_ITEM_TYPE_VALUES } from "../types/index.js";
|
|
5
|
-
|
|
6
|
-
import { formatCommanderErrorForDisplay, formatCommanderErrorForJson, projectLeanErrorEnvelope, } from "./error-guidance.js";
|
|
7
|
-
import { normalizeHelpCommandPath } from "./help-content.js";
|
|
8
|
-
import { getCommandPath } from "./registration-helpers.js";
|
|
9
|
-
import { EXECUTABLE_COMMAND_ALIASES, findBootstrapCommandTokenIndex, normalizeBootstrapInvocation, parseBootstrapHelpRequest, parseBootstrapGlobalOptions, parseBootstrapCommandName, } from "./bootstrap-args.js";
|
|
10
|
-
import { extractProvidedOptionFlags, normalizeLongFlag, renderPmCommand, } from "./argv-utils.js";
|
|
11
|
-
import { normalizeExtensionNameForMatch } from "./commands/extension/shared.js";
|
|
12
|
-
import { rankCommandPaths } from "../sdk/agent/command-suggestions.js";
|
|
13
|
-
import { renderMissingOptionRetry } from "../sdk/agent/command-recovery.js";
|
|
14
|
-
import { attachOutputTokenAccounting } from "../sdk/output-token-accounting.js";
|
|
15
|
-
/** Supported values accepted by the builtin type help contract. */
|
|
16
|
-
export const BUILTIN_TYPE_HELP_VALUES = BUILTIN_ITEM_TYPE_VALUES.join("|");
|
|
17
|
-
const OPTIONAL_PACKAGE_INSTALL_HINTS = {
|
|
18
|
-
calendar: "calendar",
|
|
19
|
-
cal: "calendar",
|
|
20
|
-
reindex: "search-advanced",
|
|
21
|
-
"search-advanced": "search-advanced",
|
|
22
|
-
guide: "guide-shell",
|
|
23
|
-
completion: "guide-shell",
|
|
24
|
-
templates: "templates",
|
|
25
|
-
"test-runs": "linked-test-adapters",
|
|
26
|
-
beads: "beads",
|
|
27
|
-
todos: "todos",
|
|
28
|
-
};
|
|
29
|
-
const SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS = {
|
|
30
|
-
comments: {
|
|
31
|
-
"--body": ["--add"],
|
|
32
|
-
"--text": ["--add"],
|
|
33
|
-
"--comment": ["--add"],
|
|
34
|
-
},
|
|
35
|
-
notes: {
|
|
36
|
-
"--body": ["--add"],
|
|
37
|
-
"--text": ["--add"],
|
|
38
|
-
"--note": ["--add"],
|
|
39
|
-
},
|
|
40
|
-
learnings: {
|
|
41
|
-
"--body": ["--add"],
|
|
42
|
-
"--text": ["--add"],
|
|
43
|
-
"--learning": ["--add"],
|
|
44
|
-
},
|
|
45
|
-
// pm update / pm create now accept --add-tags natively, so the singular
|
|
46
|
-
// --add-tag and the old "--tag" mistype still need to be redirected at the
|
|
47
|
-
// canonical additive flag (not at --tags, which would silently replace).
|
|
48
|
-
update: {
|
|
49
|
-
"--add-tag": ["--add-tags"],
|
|
50
|
-
"--remove-tag": ["--remove-tags"],
|
|
51
|
-
"--tag": ["--tags"],
|
|
52
|
-
},
|
|
53
|
-
create: {
|
|
54
|
-
"--add-tag": ["--add-tags"],
|
|
55
|
-
"--tag": ["--tags"],
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
const SCHEMA_SUBCOMMAND_VALUES = [
|
|
59
|
-
"add-field",
|
|
60
|
-
"add-status",
|
|
61
|
-
"add-type",
|
|
62
|
-
"apply-preset",
|
|
63
|
-
"list",
|
|
64
|
-
"list-fields",
|
|
65
|
-
"remap-status",
|
|
66
|
-
"remove-field",
|
|
67
|
-
"remove-status",
|
|
68
|
-
"remove-type",
|
|
69
|
-
"rename-field",
|
|
70
|
-
"rename-type",
|
|
71
|
-
"show",
|
|
72
|
-
"show-field",
|
|
73
|
-
"show-status",
|
|
74
|
-
];
|
|
75
|
-
function getSemanticUnknownOptionSuggestions(commandName, unknownOption) {
|
|
76
|
-
const commandSuggestions = SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS[commandName];
|
|
77
|
-
if (!commandSuggestions) {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
const normalizedUnknown = normalizeLongFlag(unknownOption);
|
|
81
|
-
for (const [flag, suggestions] of Object.entries(commandSuggestions)) {
|
|
82
|
-
if (normalizeLongFlag(flag) === normalizedUnknown) {
|
|
83
|
-
return suggestions;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return [];
|
|
87
|
-
}
|
|
88
|
-
/** Append extension activation failures to text or JSON Commander usage output. */
|
|
89
|
-
export function appendCommanderExtensionFailures(renderedUsage, json, failures) {
|
|
90
|
-
if (failures.length === 0) {
|
|
91
|
-
return renderedUsage;
|
|
92
|
-
}
|
|
93
|
-
if (json) {
|
|
94
|
-
const primaryFailure = failures.find((entry) => entry.declared_command_match === true);
|
|
95
|
-
const { token_accounting: priorAccounting, ...usage } = JSON.parse(renderedUsage);
|
|
96
|
-
const enriched = {
|
|
97
|
-
...usage,
|
|
98
|
-
...(primaryFailure
|
|
99
|
-
? {
|
|
100
|
-
extension_command_failure: {
|
|
101
|
-
code: "extension_command_activation_failed",
|
|
102
|
-
extension: primaryFailure.name,
|
|
103
|
-
layer: primaryFailure.layer,
|
|
104
|
-
error: primaryFailure.error,
|
|
105
|
-
recovery_commands: primaryFailure.recovery_commands ?? [],
|
|
106
|
-
},
|
|
107
|
-
}
|
|
108
|
-
: {}),
|
|
109
|
-
failed_extensions: failures,
|
|
110
|
-
};
|
|
111
|
-
return JSON.stringify(priorAccounting === undefined ? enriched : attachOutputTokenAccounting(enriched, (value) => `${JSON.stringify(value, null, 2)}\n`), null, 2);
|
|
112
|
-
}
|
|
113
|
-
const details = failures
|
|
114
|
-
.map((entry) => `- ${entry.layer}:${entry.name}: ${entry.error}`)
|
|
115
|
-
.join("\n");
|
|
116
|
-
const primaryFailure = failures.find((entry) => entry.declared_command_match === true);
|
|
117
|
-
if (!primaryFailure) {
|
|
118
|
-
return `${renderedUsage}\nExtension activation failures:\n${details}`;
|
|
119
|
-
}
|
|
120
|
-
const recovery = (primaryFailure.recovery_commands ?? [])
|
|
121
|
-
.map((command) => `- ${command}`)
|
|
122
|
-
.join("\n");
|
|
123
|
-
return `Extension command unavailable: ${primaryFailure.layer}:${primaryFailure.name}\n${primaryFailure.error}${recovery.length > 0 ? `\nRecovery:\n${recovery}` : ""}\n\n${renderedUsage}\nExtension activation failures:\n${details}`;
|
|
124
|
-
}
|
|
125
|
-
/** Resolve the unknown command token from help or ordinary invocation syntax. */
|
|
126
|
-
export function resolveUnknownCommanderToken(invocationArgv) {
|
|
127
|
-
const helpRequest = parseBootstrapHelpRequest(invocationArgv);
|
|
128
|
-
return (helpRequest.commandPathTokens[0] ??
|
|
129
|
-
parseBootstrapCommandName(invocationArgv) ??
|
|
130
|
-
"<command>");
|
|
131
|
-
}
|
|
132
|
-
/** Implements collect runtime command paths for the public runtime surface of this module. */
|
|
133
|
-
export function collectRuntimeCommandPaths(root, extensionDescriptors) {
|
|
134
|
-
const commandPaths = new Set();
|
|
135
|
-
const queue = [...root.commands];
|
|
136
|
-
while (queue.length > 0) {
|
|
137
|
-
const current = queue.shift();
|
|
138
|
-
if (!current) {
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
const normalizedPath = normalizeHelpCommandPath(getCommandPath(current));
|
|
142
|
-
const hasInternalSegment = normalizedPath
|
|
143
|
-
.split(" ")
|
|
144
|
-
.some((segment) => segment.startsWith("_"));
|
|
145
|
-
if (normalizedPath.length > 0 && !hasInternalSegment) {
|
|
146
|
-
commandPaths.add(normalizedPath);
|
|
147
|
-
}
|
|
148
|
-
queue.push(...current.commands);
|
|
149
|
-
}
|
|
150
|
-
for (const descriptorPath of extensionDescriptors.keys()) {
|
|
151
|
-
const normalizedPath = normalizeHelpCommandPath(descriptorPath);
|
|
152
|
-
const hasInternalSegment = normalizedPath
|
|
153
|
-
.split(" ")
|
|
154
|
-
.some((segment) => segment.startsWith("_"));
|
|
155
|
-
if (normalizedPath.length > 0 && !hasInternalSegment) {
|
|
156
|
-
commandPaths.add(normalizedPath);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return [...commandPaths].sort((left, right) => left.localeCompare(right));
|
|
160
|
-
}
|
|
161
|
-
/** Implements score command path match for the public runtime surface of this module. */
|
|
162
|
-
export function scoreCommandPathMatch(commandPath, queryToken) {
|
|
163
|
-
const normalizedPath = commandPath.trim().toLowerCase();
|
|
164
|
-
const normalizedToken = queryToken.trim().toLowerCase();
|
|
165
|
-
if (normalizedToken.length === 0) {
|
|
166
|
-
return Number.POSITIVE_INFINITY;
|
|
167
|
-
}
|
|
168
|
-
const pathSegments = normalizedPath.split(" ");
|
|
169
|
-
if (normalizedPath === normalizedToken) {
|
|
170
|
-
return 0;
|
|
171
|
-
}
|
|
172
|
-
if (pathSegments.includes(normalizedToken)) {
|
|
173
|
-
return 1;
|
|
174
|
-
}
|
|
175
|
-
if (pathSegments.some((segment) => segment.startsWith(normalizedToken))) {
|
|
176
|
-
return 2;
|
|
177
|
-
}
|
|
178
|
-
if (normalizedPath.includes(normalizedToken)) {
|
|
179
|
-
return 3;
|
|
180
|
-
}
|
|
181
|
-
// Fall back to edit distance so transposition/typo cases (e.g. "lst" -> "list") still rank.
|
|
182
|
-
const maxDistance = normalizedToken.length >= 5 ? 2 : 1;
|
|
183
|
-
let bestDistance = Number.POSITIVE_INFINITY;
|
|
184
|
-
for (const segment of pathSegments) {
|
|
185
|
-
const distance = levenshteinDistanceWithinLimit(segment, normalizedToken, maxDistance);
|
|
186
|
-
if (distance !== null) {
|
|
187
|
-
bestDistance = Math.min(bestDistance, distance);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
if (Number.isFinite(bestDistance)) {
|
|
191
|
-
return 4 + bestDistance;
|
|
192
|
-
}
|
|
193
|
-
return Number.POSITIVE_INFINITY;
|
|
194
|
-
}
|
|
195
|
-
function toComparableFlag(flag) {
|
|
196
|
-
return normalizeLongFlag(flag).slice(2).replace(/-/g, "");
|
|
197
|
-
}
|
|
198
|
-
function renderAttemptedCommand(argv) {
|
|
199
|
-
return renderPmCommand(argv);
|
|
200
|
-
}
|
|
201
|
-
function resolveOptionalPackageInstallHint(commandPath) {
|
|
202
|
-
const topLevel = commandPath.split(" ")[0]?.trim().toLowerCase();
|
|
203
|
-
if (!topLevel) {
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
const packageAlias = OPTIONAL_PACKAGE_INSTALL_HINTS[topLevel];
|
|
207
|
-
if (!packageAlias) {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
return `If this command comes from an optional package, install it with: pm install ${packageAlias}`;
|
|
211
|
-
}
|
|
212
|
-
function normalizePackageCommandAliasToken(value) {
|
|
213
|
-
let normalized = normalizeExtensionNameForMatch(value);
|
|
214
|
-
// Strip outer package/source prefixes and then the pm- package stem so scoped
|
|
215
|
-
// and builtin package guesses converge on the exported command alias.
|
|
216
|
-
for (const prefix of ["@unbrained/", "builtin-", "pm-"]) {
|
|
217
|
-
if (normalized.startsWith(prefix)) {
|
|
218
|
-
normalized = normalized.slice(prefix.length);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
return normalized;
|
|
222
|
-
}
|
|
223
|
-
function collectInstalledPackageCommandPathHints(unknownToken, extensionDescriptors) {
|
|
224
|
-
const normalizedUnknown = normalizePackageCommandAliasToken(unknownToken);
|
|
225
|
-
if (normalizedUnknown.length === 0) {
|
|
226
|
-
return [];
|
|
227
|
-
}
|
|
228
|
-
const hints = [];
|
|
229
|
-
for (const descriptor of extensionDescriptors.values()) {
|
|
230
|
-
const identifiers = new Set();
|
|
231
|
-
const source = descriptor.source;
|
|
232
|
-
if (source) {
|
|
233
|
-
for (const identifier of [source.name, source.package]) {
|
|
234
|
-
const normalizedIdentifier = normalizePackageCommandAliasToken(identifier ?? "");
|
|
235
|
-
if (normalizedIdentifier.length > 0) {
|
|
236
|
-
identifiers.add(normalizedIdentifier);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
if (identifiers.size === 0) {
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
const matches = [...identifiers].some((identifier) => identifier === normalizedUnknown ||
|
|
244
|
-
identifier.includes(normalizedUnknown) ||
|
|
245
|
-
normalizedUnknown.includes(identifier));
|
|
246
|
-
if (matches) {
|
|
247
|
-
hints.push(descriptor.command);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return [...new Set(hints)].sort((left, right) => left.localeCompare(right));
|
|
251
|
-
}
|
|
252
|
-
function collectKnownLongFlags(commandName, contractsOverride) {
|
|
253
|
-
const flags = new Set();
|
|
254
|
-
const contracts = contractsOverride ?? resolveSubcommandFlagContractsForCommand(commandName);
|
|
255
|
-
for (const contract of contracts) {
|
|
256
|
-
if (contract.flag.startsWith("--")) {
|
|
257
|
-
flags.add(normalizeLongFlag(contract.flag));
|
|
258
|
-
}
|
|
259
|
-
for (const alias of contract.aliases ?? []) {
|
|
260
|
-
if (alias.startsWith("--")) {
|
|
261
|
-
flags.add(normalizeLongFlag(alias));
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
return [...flags].sort((left, right) => left.localeCompare(right));
|
|
266
|
-
}
|
|
267
|
-
function suggestNearestLongFlags(unknownOption, knownFlags) {
|
|
268
|
-
if (!unknownOption.startsWith("--")) {
|
|
269
|
-
return [];
|
|
270
|
-
}
|
|
271
|
-
const unknownComparable = toComparableFlag(unknownOption);
|
|
272
|
-
if (unknownComparable.length === 0) {
|
|
273
|
-
return [];
|
|
274
|
-
}
|
|
275
|
-
const maxDistance = unknownComparable.length >= 8 ? 2 : 1;
|
|
276
|
-
// rank 0 = abbreviation/prefix match (e.g. --desc -> --description), rank 1 = edit-distance typo.
|
|
277
|
-
const candidates = [];
|
|
278
|
-
for (const flag of knownFlags) {
|
|
279
|
-
const flagComparable = toComparableFlag(flag);
|
|
280
|
-
if (flagComparable === unknownComparable) {
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
if (unknownComparable.length >= 3 &&
|
|
284
|
-
flagComparable.startsWith(unknownComparable)) {
|
|
285
|
-
candidates.push({
|
|
286
|
-
flag,
|
|
287
|
-
rank: 0,
|
|
288
|
-
distance: flagComparable.length - unknownComparable.length,
|
|
289
|
-
});
|
|
290
|
-
continue;
|
|
291
|
-
}
|
|
292
|
-
const distance = levenshteinDistanceWithinLimit(unknownComparable, flagComparable, maxDistance);
|
|
293
|
-
if (distance === null || distance <= 0) {
|
|
294
|
-
continue;
|
|
295
|
-
}
|
|
296
|
-
candidates.push({ flag, rank: 1, distance });
|
|
297
|
-
}
|
|
298
|
-
return candidates
|
|
299
|
-
.sort((left, right) => {
|
|
300
|
-
if (left.rank !== right.rank) {
|
|
301
|
-
return left.rank - right.rank;
|
|
302
|
-
}
|
|
303
|
-
if (left.distance !== right.distance) {
|
|
304
|
-
return left.distance - right.distance;
|
|
305
|
-
}
|
|
306
|
-
return left.flag.localeCompare(right.flag);
|
|
307
|
-
})
|
|
308
|
-
.map((entry) => entry.flag)
|
|
309
|
-
.slice(0, 3);
|
|
310
|
-
}
|
|
311
|
-
let crossCommandFlagIndexCache;
|
|
312
|
-
// Alias/shortcut command names that duplicate a canonical command. Excluding them
|
|
313
|
-
// keeps cross-command flag hints focused on the primary commands an agent should use.
|
|
314
|
-
const CROSS_COMMAND_FLAG_EXCLUSIONS = new Set([
|
|
315
|
-
"ctx",
|
|
316
|
-
"packages",
|
|
317
|
-
"list-draft",
|
|
318
|
-
"list-open",
|
|
319
|
-
"list-in-progress",
|
|
320
|
-
"list-blocked",
|
|
321
|
-
"list-closed",
|
|
322
|
-
"list-canceled",
|
|
323
|
-
"start-task",
|
|
324
|
-
"pause-task",
|
|
325
|
-
"close-task",
|
|
326
|
-
"help",
|
|
327
|
-
]);
|
|
328
|
-
// Index of long flag -> command names that accept it (in declaration order), so an
|
|
329
|
-
// unknown flag on one command can be recognised as valid elsewhere (e.g. --type is
|
|
330
|
-
// rejected on test-all but valid on create/list). Built once from core command contracts.
|
|
331
|
-
function getCrossCommandFlagIndex() {
|
|
332
|
-
if (crossCommandFlagIndexCache) {
|
|
333
|
-
return crossCommandFlagIndexCache;
|
|
334
|
-
}
|
|
335
|
-
const index = new Map();
|
|
336
|
-
for (const command of PM_CORE_COMMAND_NAMES) {
|
|
337
|
-
if (CROSS_COMMAND_FLAG_EXCLUSIONS.has(command)) {
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
for (const flag of collectKnownLongFlags(command)) {
|
|
341
|
-
const commands = index.get(flag) ?? [];
|
|
342
|
-
commands.push(command);
|
|
343
|
-
index.set(flag, commands);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
crossCommandFlagIndexCache = index;
|
|
347
|
-
return crossCommandFlagIndexCache;
|
|
348
|
-
}
|
|
349
|
-
function findOtherCommandsForFlag(unknownOption, currentCommand) {
|
|
350
|
-
if (!unknownOption.startsWith("--")) {
|
|
351
|
-
return [];
|
|
352
|
-
}
|
|
353
|
-
const commands = getCrossCommandFlagIndex().get(normalizeLongFlag(unknownOption));
|
|
354
|
-
if (!commands) {
|
|
355
|
-
return [];
|
|
356
|
-
}
|
|
357
|
-
const normalizedCurrent = currentCommand?.trim().toLowerCase();
|
|
358
|
-
const currentFlags = new Set(collectKnownLongFlags(normalizedCurrent));
|
|
359
|
-
return commands
|
|
360
|
-
.filter((command) => command !== normalizedCurrent)
|
|
361
|
-
.map((command) => ({
|
|
362
|
-
command,
|
|
363
|
-
sharedFlagCount: collectKnownLongFlags(command).filter((flag) => currentFlags.has(flag)).length,
|
|
364
|
-
}))
|
|
365
|
-
.sort((left, right) => left.sharedFlagCount !== right.sharedFlagCount
|
|
366
|
-
? right.sharedFlagCount - left.sharedFlagCount
|
|
367
|
-
: left.command.localeCompare(right.command))
|
|
368
|
-
.map(({ command }) => command);
|
|
369
|
-
}
|
|
370
|
-
function rewriteUnknownOptionArgv(argv, unknownOption, replacementFlag) {
|
|
371
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
372
|
-
const token = argv[index];
|
|
373
|
-
if (!token.startsWith("--")) {
|
|
374
|
-
continue;
|
|
375
|
-
}
|
|
376
|
-
const equalsIndex = token.indexOf("=");
|
|
377
|
-
const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;
|
|
378
|
-
if (normalizeLongFlag(key) !== normalizeLongFlag(unknownOption)) {
|
|
379
|
-
continue;
|
|
380
|
-
}
|
|
381
|
-
const next = [...argv];
|
|
382
|
-
next[index] =
|
|
383
|
-
equalsIndex >= 0
|
|
384
|
-
? `${replacementFlag}${token.slice(equalsIndex)}`
|
|
385
|
-
: replacementFlag;
|
|
386
|
-
return next;
|
|
387
|
-
}
|
|
388
|
-
return undefined;
|
|
389
|
-
}
|
|
390
|
-
function scoreRuntimeCommandCandidates(params) {
|
|
391
|
-
const commandPathSet = new Set(params.commandPaths);
|
|
392
|
-
const scoreAgainstUnknown = (candidatePath) => Math.min(scoreCommandPathMatch(candidatePath, params.normalizedUnknown), params.primaryToken !== params.normalizedUnknown
|
|
393
|
-
? scoreCommandPathMatch(candidatePath, params.primaryToken)
|
|
394
|
-
: Number.POSITIVE_INFINITY);
|
|
395
|
-
const scoresByCommandPath = new Map();
|
|
396
|
-
const recordCandidateScore = (commandPath, score) => {
|
|
397
|
-
if (!Number.isFinite(score) || !commandPathSet.has(commandPath)) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
const existing = scoresByCommandPath.get(commandPath);
|
|
401
|
-
if (existing === undefined || score < existing) {
|
|
402
|
-
scoresByCommandPath.set(commandPath, score);
|
|
403
|
-
}
|
|
404
|
-
};
|
|
405
|
-
for (const commandPath of params.commandPaths) {
|
|
406
|
-
recordCandidateScore(commandPath, scoreAgainstUnknown(commandPath));
|
|
407
|
-
}
|
|
408
|
-
for (const [aliasToken, canonicalPath] of Object.entries(EXECUTABLE_COMMAND_ALIASES)) {
|
|
409
|
-
if (aliasToken === "read") {
|
|
410
|
-
continue;
|
|
411
|
-
}
|
|
412
|
-
recordCandidateScore(canonicalPath, scoreAgainstUnknown(aliasToken));
|
|
413
|
-
}
|
|
414
|
-
return [...scoresByCommandPath.entries()]
|
|
415
|
-
.sort(([leftPath, leftScore], [rightPath, rightScore]) => leftScore !== rightScore
|
|
416
|
-
? leftScore - rightScore
|
|
417
|
-
: leftPath.localeCompare(rightPath))
|
|
418
|
-
.map(([commandPath]) => commandPath);
|
|
419
|
-
}
|
|
420
|
-
function resolveUnknownCommandCandidates(params) {
|
|
421
|
-
const semanticCandidates = rankCommandPaths(params.commandPaths, params.primaryToken);
|
|
422
|
-
const rankedCandidates = scoreRuntimeCommandCandidates(params);
|
|
423
|
-
const installedPackageCandidates = collectInstalledPackageCommandPathHints(params.primaryToken, params.extensionDescriptors).filter((commandPath) => params.commandPaths.includes(commandPath));
|
|
424
|
-
return dedupeStrings([
|
|
425
|
-
...semanticCandidates,
|
|
426
|
-
...rankedCandidates,
|
|
427
|
-
...installedPackageCandidates,
|
|
428
|
-
]);
|
|
429
|
-
}
|
|
430
|
-
function resolveUnknownCommandFallbacks(commandPaths) {
|
|
431
|
-
const topLevel = [
|
|
432
|
-
...new Set(commandPaths
|
|
433
|
-
.map((commandPath) => commandPath.split(" ")[0])
|
|
434
|
-
.filter((segment) => segment.length > 0)),
|
|
435
|
-
];
|
|
436
|
-
return topLevel.sort((left, right) => left.localeCompare(right));
|
|
437
|
-
}
|
|
438
|
-
function buildUnknownCommandExamples(suggestedPaths, hasConcreteCandidates) {
|
|
439
|
-
const suggestedExamples = suggestedPaths.map((path) => `pm ${path} --help`);
|
|
440
|
-
if (hasConcreteCandidates) {
|
|
441
|
-
return [...new Set([...suggestedExamples, "pm --help --all"])];
|
|
442
|
-
}
|
|
443
|
-
return [...new Set(["pm --help --all", ...suggestedExamples])];
|
|
444
|
-
}
|
|
445
|
-
/** Implements build unknown command guidance from runtime for the public runtime surface of this module. */
|
|
446
|
-
export function buildUnknownCommandGuidanceFromRuntime(rawMessage, root, extensionDescriptors) {
|
|
447
|
-
const unknownCommandMatch = rawMessage.match(/unknown command '([^']+)'/i);
|
|
448
|
-
if (!unknownCommandMatch || typeof unknownCommandMatch[1] !== "string") {
|
|
449
|
-
return undefined;
|
|
450
|
-
}
|
|
451
|
-
const normalizedUnknown = normalizeHelpCommandPath(unknownCommandMatch[1]);
|
|
452
|
-
if (normalizedUnknown.length === 0) {
|
|
453
|
-
return undefined;
|
|
454
|
-
}
|
|
455
|
-
const commandPaths = collectRuntimeCommandPaths(root, extensionDescriptors);
|
|
456
|
-
if (commandPaths.length === 0) {
|
|
457
|
-
return undefined;
|
|
458
|
-
}
|
|
459
|
-
const primaryToken = normalizedUnknown.split(" ")[0];
|
|
460
|
-
// Executable aliases are scored against their canonical runtime command, so a
|
|
461
|
-
// typo of an alias still points at the command path that would actually run.
|
|
462
|
-
const combinedCandidates = resolveUnknownCommandCandidates({
|
|
463
|
-
commandPaths,
|
|
464
|
-
normalizedUnknown,
|
|
465
|
-
primaryToken,
|
|
466
|
-
extensionDescriptors,
|
|
467
|
-
});
|
|
468
|
-
const fallbackTopLevel = resolveUnknownCommandFallbacks(commandPaths);
|
|
469
|
-
const suggestedPaths = (combinedCandidates.length > 0 ? combinedCandidates : fallbackTopLevel).slice(0, 3);
|
|
470
|
-
const examples = buildUnknownCommandExamples(suggestedPaths, combinedCandidates.length > 0);
|
|
471
|
-
const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);
|
|
472
|
-
const didYouMean = combinedCandidates.length > 0
|
|
473
|
-
? `Did you mean: ${suggestedPaths.join(", ")}?`
|
|
474
|
-
: null;
|
|
475
|
-
return {
|
|
476
|
-
unknownCommandExamples: examples,
|
|
477
|
-
unknownCommandNextSteps: [
|
|
478
|
-
...(didYouMean ? [didYouMean] : []),
|
|
479
|
-
'Run "pm --help --all" to list every command available in this runtime, including active extensions.',
|
|
480
|
-
"Use one of the suggested command paths above with --help to inspect valid flags and usage.",
|
|
481
|
-
...(optionalPackageHint ? [optionalPackageHint] : []),
|
|
482
|
-
],
|
|
483
|
-
};
|
|
484
|
-
}
|
|
485
|
-
function dedupeStrings(values) {
|
|
486
|
-
return Array.from(new Set(values));
|
|
487
|
-
}
|
|
488
|
-
function firstWhitespaceSeparatedToken(input) {
|
|
489
|
-
let token = "";
|
|
490
|
-
for (const character of input) {
|
|
491
|
-
if (character === " " ||
|
|
492
|
-
character === "\t" ||
|
|
493
|
-
character === "\n" ||
|
|
494
|
-
character === "\r" ||
|
|
495
|
-
character === "\f" ||
|
|
496
|
-
character === "\v") {
|
|
497
|
-
break;
|
|
498
|
-
}
|
|
499
|
-
token += character;
|
|
500
|
-
}
|
|
501
|
-
return token;
|
|
502
|
-
}
|
|
503
|
-
function trimTrailingPunctuationToken(token) {
|
|
504
|
-
let end = token.length;
|
|
505
|
-
while (end > 0) {
|
|
506
|
-
const character = token[end - 1];
|
|
507
|
-
if (character !== "," && character !== ":" && character !== ";") {
|
|
508
|
-
break;
|
|
509
|
-
}
|
|
510
|
-
end -= 1;
|
|
511
|
-
}
|
|
512
|
-
return token.slice(0, end);
|
|
513
|
-
}
|
|
514
|
-
/** Implements resolve child command by token for the public runtime surface of this module. */
|
|
515
|
-
export function resolveChildCommandByToken(parent, token) {
|
|
516
|
-
const normalizedToken = token.trim().toLowerCase();
|
|
517
|
-
return parent.commands.find((candidate) => {
|
|
518
|
-
if (candidate.name().trim().toLowerCase() === normalizedToken) {
|
|
519
|
-
return true;
|
|
520
|
-
}
|
|
521
|
-
const aliases = typeof candidate.aliases === "function" ? candidate.aliases() : [];
|
|
522
|
-
return aliases.some((alias) => alias.trim().toLowerCase() === normalizedToken);
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
/** Implements check whether known help command path for the public runtime surface of this module. */
|
|
526
|
-
export function isKnownHelpCommandPath(root, commandPathTokens) {
|
|
527
|
-
if (commandPathTokens.length === 0) {
|
|
528
|
-
return true;
|
|
529
|
-
}
|
|
530
|
-
let current = root;
|
|
531
|
-
for (const [tokenIndex, token] of commandPathTokens.entries()) {
|
|
532
|
-
const next = resolveChildCommandByToken(current, token);
|
|
533
|
-
if (!next) {
|
|
534
|
-
const declaredArguments = current.registeredArguments;
|
|
535
|
-
return (declaredArguments.length > 0 &&
|
|
536
|
-
(current.commands.length === 0 || declaredArguments[0]?.required === true) &&
|
|
537
|
-
(declaredArguments.at(-1)?.variadic === true ||
|
|
538
|
-
commandPathTokens.length - tokenIndex <= declaredArguments.length));
|
|
539
|
-
}
|
|
540
|
-
current = next;
|
|
541
|
-
}
|
|
542
|
-
return true;
|
|
543
|
-
}
|
|
544
|
-
async function resolveWorkspaceUsageContext(bootstrapGlobal, message, invocationArgv, commandName) {
|
|
545
|
-
try {
|
|
546
|
-
const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);
|
|
547
|
-
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
548
|
-
return { allowedTypes: BUILTIN_TYPE_HELP_VALUES };
|
|
549
|
-
}
|
|
550
|
-
const settings = await readSettings(pmRoot);
|
|
551
|
-
const extensionRegistrations = bootstrapGlobal.noExtensions
|
|
552
|
-
? undefined
|
|
553
|
-
: getActiveExtensionRegistrations();
|
|
554
|
-
const typeRegistry = resolveItemTypeRegistry(settings, extensionRegistrations);
|
|
555
|
-
let verifiedCollectionItemId;
|
|
556
|
-
if (/too many arguments/i.test(message) &&
|
|
557
|
-
["comments", "docs", "files", "learnings", "notes", "test"].includes(commandName ?? "")) {
|
|
558
|
-
const commandIndex = invocationArgv.findIndex((token) => token === commandName);
|
|
559
|
-
const candidate = invocationArgv[commandIndex + 2];
|
|
560
|
-
if (invocationArgv[commandIndex + 1]?.toLowerCase() === "add" &&
|
|
561
|
-
candidate !== undefined &&
|
|
562
|
-
!candidate.startsWith("-")) {
|
|
563
|
-
try {
|
|
564
|
-
verifiedCollectionItemId = (await locateItem(pmRoot, candidate, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder))?.id;
|
|
565
|
-
}
|
|
566
|
-
catch {
|
|
567
|
-
// Usage rendering remains available when tracker storage is unreadable.
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
return {
|
|
572
|
-
allowedTypes: typeRegistry.types.length > 0
|
|
573
|
-
? typeRegistry.types.join("|")
|
|
574
|
-
: BUILTIN_TYPE_HELP_VALUES,
|
|
575
|
-
pmRoot,
|
|
576
|
-
settings,
|
|
577
|
-
typeToFolder: typeRegistry.type_to_folder,
|
|
578
|
-
verifiedCollectionItemId,
|
|
579
|
-
};
|
|
580
|
-
}
|
|
581
|
-
catch {
|
|
582
|
-
/* v8 ignore start -- defensive fallback for corrupted settings during usage-error rendering; command behavior is covered through normal settings paths */
|
|
583
|
-
return { allowedTypes: BUILTIN_TYPE_HELP_VALUES };
|
|
584
|
-
/* v8 ignore stop */
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
function resolveUnknownOptionSuggestions(message, commandName) {
|
|
588
|
-
const match = message.match(/unknown option '([^']+)'/i);
|
|
589
|
-
const suggestions = match && commandName
|
|
590
|
-
? dedupeStrings([
|
|
591
|
-
...getSemanticUnknownOptionSuggestions(commandName, match[1]),
|
|
592
|
-
...suggestNearestLongFlags(match[1], collectKnownLongFlags(commandName)),
|
|
593
|
-
])
|
|
594
|
-
: undefined;
|
|
595
|
-
const otherCommands = match
|
|
596
|
-
? findOtherCommandsForFlag(match[1], commandName)
|
|
597
|
-
: [];
|
|
598
|
-
const declaredOnPath = match !== null &&
|
|
599
|
-
collectKnownLongFlags(commandName).includes(normalizeLongFlag(match[1]));
|
|
600
|
-
return {
|
|
601
|
-
match,
|
|
602
|
-
suggestions,
|
|
603
|
-
otherCommands,
|
|
604
|
-
scope: declaredOnPath
|
|
605
|
-
? "declared_on_path"
|
|
606
|
-
: otherCommands.length > 0
|
|
607
|
-
? "declared_elsewhere"
|
|
608
|
-
: "declared_nowhere",
|
|
609
|
-
};
|
|
610
|
-
}
|
|
611
|
-
function resolveSuggestedRetryForUnknownOption(invocationArgv, unknownOptionMatch, unknownOptionSuggestions) {
|
|
612
|
-
if (!unknownOptionMatch ||
|
|
613
|
-
!unknownOptionSuggestions ||
|
|
614
|
-
unknownOptionSuggestions.length === 0) {
|
|
615
|
-
return undefined;
|
|
616
|
-
}
|
|
617
|
-
const rewritten = rewriteUnknownOptionArgv(invocationArgv, unknownOptionMatch[1], unknownOptionSuggestions[0]);
|
|
618
|
-
return rewritten ? renderAttemptedCommand(rewritten) : undefined;
|
|
619
|
-
}
|
|
620
|
-
function resolveSuggestedRetryForMissingOption(message, invocationArgv) {
|
|
621
|
-
const missingRequiredOption = message.match(/required option '([^']+)' not specified/i);
|
|
622
|
-
const requiredOptionToken = missingRequiredOption?.[1]
|
|
623
|
-
? trimTrailingPunctuationToken(firstWhitespaceSeparatedToken(missingRequiredOption[1].trim()))
|
|
624
|
-
: undefined;
|
|
625
|
-
if (!requiredOptionToken?.startsWith("--")) {
|
|
626
|
-
return undefined;
|
|
627
|
-
}
|
|
628
|
-
const commandName = parseBootstrapCommandName(invocationArgv);
|
|
629
|
-
if (!commandName) {
|
|
630
|
-
return undefined;
|
|
631
|
-
}
|
|
632
|
-
return renderMissingOptionRetry(invocationArgv, commandName, [
|
|
633
|
-
requiredOptionToken,
|
|
634
|
-
]);
|
|
635
|
-
}
|
|
636
|
-
function resolveSplitSchemaSubcommand(message, invocationArgv) {
|
|
637
|
-
if (!/too many arguments/i.test(message)) {
|
|
638
|
-
return undefined;
|
|
639
|
-
}
|
|
640
|
-
if (parseBootstrapCommandName(invocationArgv) !== "schema") {
|
|
641
|
-
return undefined;
|
|
642
|
-
}
|
|
643
|
-
const schemaIndex = findBootstrapCommandTokenIndex(invocationArgv);
|
|
644
|
-
const verb = invocationArgv[schemaIndex + 1]?.trim().toLowerCase();
|
|
645
|
-
const noun = invocationArgv[schemaIndex + 2]?.trim().toLowerCase();
|
|
646
|
-
if (!verb || !noun) {
|
|
647
|
-
return undefined;
|
|
648
|
-
}
|
|
649
|
-
const joined = `${verb}-${noun}`;
|
|
650
|
-
if (!SCHEMA_SUBCOMMAND_VALUES.includes(joined)) {
|
|
651
|
-
return undefined;
|
|
652
|
-
}
|
|
653
|
-
const rewritten = [
|
|
654
|
-
...invocationArgv.slice(0, schemaIndex + 1),
|
|
655
|
-
joined,
|
|
656
|
-
...invocationArgv.slice(schemaIndex + 3),
|
|
657
|
-
];
|
|
658
|
-
return {
|
|
659
|
-
unknownSubcommandPath: "schema",
|
|
660
|
-
unknownSubcommandToken: `${verb} ${noun}`,
|
|
661
|
-
unknownSubcommandAllowedValues: [...SCHEMA_SUBCOMMAND_VALUES],
|
|
662
|
-
suggestedRetryCommand: renderAttemptedCommand(rewritten),
|
|
663
|
-
};
|
|
664
|
-
}
|
|
665
|
-
/** Implements resolve commander usage context for the public runtime surface of this module. */
|
|
666
|
-
export async function resolveCommanderUsageContext(error, rootProgram, extensionDescriptors, guidanceOverrides = {}) {
|
|
667
|
-
const rawMessage = typeof error === "object" && error !== null
|
|
668
|
-
? error.message
|
|
669
|
-
: undefined;
|
|
670
|
-
const message = rawMessage ?? "Invalid command usage";
|
|
671
|
-
const invocationArgv = normalizeBootstrapInvocation(process.argv.slice(2)).argv;
|
|
672
|
-
const bootstrapGlobal = parseBootstrapGlobalOptions(invocationArgv);
|
|
673
|
-
const commandName = parseBootstrapCommandName(invocationArgv);
|
|
674
|
-
const attemptedCommand = renderAttemptedCommand(invocationArgv);
|
|
675
|
-
const providedOptionFlags = extractProvidedOptionFlags(invocationArgv);
|
|
676
|
-
const workspaceUsage = await resolveWorkspaceUsageContext(bootstrapGlobal, message, invocationArgv, commandName);
|
|
677
|
-
const allowedTypes = workspaceUsage.allowedTypes;
|
|
678
|
-
const unknownCommandGuidance = buildUnknownCommandGuidanceFromRuntime(message, rootProgram, extensionDescriptors);
|
|
679
|
-
const unknownOption = resolveUnknownOptionSuggestions(message, commandName);
|
|
680
|
-
const splitSchemaSubcommand = resolveSplitSchemaSubcommand(message, invocationArgv);
|
|
681
|
-
const suggestedRetryCommand = splitSchemaSubcommand?.suggestedRetryCommand ??
|
|
682
|
-
resolveSuggestedRetryForUnknownOption(invocationArgv, unknownOption.match, unknownOption.suggestions) ??
|
|
683
|
-
resolveSuggestedRetryForMissingOption(message, invocationArgv);
|
|
684
|
-
return {
|
|
685
|
-
message,
|
|
686
|
-
commandName,
|
|
687
|
-
allowedTypes,
|
|
688
|
-
attemptedCommand,
|
|
689
|
-
normalizedInvocationArgs: [...invocationArgv],
|
|
690
|
-
providedOptionFlags,
|
|
691
|
-
unknownOptionSuggestions: unknownOption.suggestions,
|
|
692
|
-
unknownOptionOtherCommands: unknownOption.otherCommands.length > 0
|
|
693
|
-
? unknownOption.otherCommands.slice(0, 12)
|
|
694
|
-
: undefined,
|
|
695
|
-
unknownOptionOtherCommandsTotal: unknownOption.otherCommands.length > 0
|
|
696
|
-
? unknownOption.otherCommands.length
|
|
697
|
-
: undefined,
|
|
698
|
-
unknownOptionOtherCommandsTruncated: unknownOption.otherCommands.length > 12 || undefined,
|
|
699
|
-
unknownOptionScope: unknownOption.scope,
|
|
700
|
-
suggestedRetryCommand,
|
|
701
|
-
verifiedCollectionItemId: workspaceUsage.verifiedCollectionItemId,
|
|
702
|
-
...splitSchemaSubcommand,
|
|
703
|
-
...unknownCommandGuidance,
|
|
704
|
-
...guidanceOverrides,
|
|
705
|
-
};
|
|
706
|
-
}
|
|
707
|
-
/** Implements format commander usage message for the public runtime surface of this module. */
|
|
708
|
-
export async function formatCommanderUsageMessage(error, rootProgram, extensionDescriptors, guidanceOverrides = {}) {
|
|
709
|
-
const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors, guidanceOverrides);
|
|
710
|
-
const { message, commandName, allowedTypes, unknownCommandExamples, unknownCommandNextSteps, attemptedCommand, normalizedInvocationArgs, providedOptionFlags, unknownOptionSuggestions, unknownOptionOtherCommands, unknownOptionOtherCommandsTotal, unknownOptionOtherCommandsTruncated, unknownOptionScope, unknownSubcommandPath, unknownSubcommandToken, unknownSubcommandAllowedValues, suggestedRetryCommand, verifiedCollectionItemId, failedExtensions, } = usageContext;
|
|
711
|
-
const formatted = formatCommanderErrorForDisplay(message, commandName, allowedTypes, {
|
|
712
|
-
unknownCommandExamples,
|
|
713
|
-
unknownCommandNextSteps,
|
|
714
|
-
attemptedCommand,
|
|
715
|
-
normalizedInvocationArgs,
|
|
716
|
-
providedOptionFlags,
|
|
717
|
-
unknownOptionSuggestions,
|
|
718
|
-
unknownOptionOtherCommands,
|
|
719
|
-
unknownOptionOtherCommandsTotal,
|
|
720
|
-
unknownOptionOtherCommandsTruncated,
|
|
721
|
-
unknownOptionScope,
|
|
722
|
-
unknownSubcommandPath,
|
|
723
|
-
unknownSubcommandToken,
|
|
724
|
-
unknownSubcommandAllowedValues,
|
|
725
|
-
suggestedRetryCommand,
|
|
726
|
-
verifiedCollectionItemId,
|
|
727
|
-
failedExtensions,
|
|
728
|
-
});
|
|
729
|
-
const serviceOverride = await runActiveServiceOverride("help_format", {
|
|
730
|
-
message: formatted,
|
|
731
|
-
command: commandName,
|
|
732
|
-
allowed_types: allowedTypes,
|
|
733
|
-
});
|
|
734
|
-
if (serviceOverride.handled && typeof serviceOverride.result === "string") {
|
|
735
|
-
return serviceOverride.result;
|
|
736
|
-
}
|
|
737
|
-
return formatted;
|
|
738
|
-
}
|
|
739
|
-
/** Implements format commander usage json for the public runtime surface of this module. */
|
|
740
|
-
export async function formatCommanderUsageJson(error, rootProgram, extensionDescriptors, lean = false, guidanceOverrides = {}) {
|
|
741
|
-
const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors, guidanceOverrides);
|
|
742
|
-
const envelope = formatCommanderErrorForJson(usageContext.message, usageContext.commandName, usageContext.allowedTypes, EXIT_CODE.USAGE, {
|
|
743
|
-
unknownCommandExamples: usageContext.unknownCommandExamples,
|
|
744
|
-
unknownCommandNextSteps: usageContext.unknownCommandNextSteps,
|
|
745
|
-
attemptedCommand: usageContext.attemptedCommand,
|
|
746
|
-
normalizedInvocationArgs: usageContext.normalizedInvocationArgs,
|
|
747
|
-
providedOptionFlags: usageContext.providedOptionFlags,
|
|
748
|
-
unknownOptionSuggestions: usageContext.unknownOptionSuggestions,
|
|
749
|
-
unknownOptionOtherCommands: usageContext.unknownOptionOtherCommands,
|
|
750
|
-
unknownOptionOtherCommandsTotal: usageContext.unknownOptionOtherCommandsTotal,
|
|
751
|
-
unknownOptionOtherCommandsTruncated: usageContext.unknownOptionOtherCommandsTruncated,
|
|
752
|
-
unknownOptionScope: usageContext.unknownOptionScope,
|
|
753
|
-
unknownSubcommandPath: usageContext.unknownSubcommandPath,
|
|
754
|
-
unknownSubcommandToken: usageContext.unknownSubcommandToken,
|
|
755
|
-
unknownSubcommandAllowedValues: usageContext.unknownSubcommandAllowedValues,
|
|
756
|
-
suggestedRetryCommand: usageContext.suggestedRetryCommand,
|
|
757
|
-
verifiedCollectionItemId: usageContext.verifiedCollectionItemId,
|
|
758
|
-
failedExtensions: usageContext.failedExtensions,
|
|
759
|
-
});
|
|
760
|
-
const projected = lean ? projectLeanErrorEnvelope(envelope) : envelope;
|
|
761
|
-
const accountingRequested = parseBootstrapGlobalOptions(usageContext.normalizedInvocationArgs).tokenAccounting === true;
|
|
762
|
-
return JSON.stringify(accountingRequested ? attachOutputTokenAccounting(projected, (value) => `${JSON.stringify(value, null, 2)}\n`) : projected, null, 2);
|
|
763
|
-
}
|
|
764
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
765
|
-
export const _testOnly = {
|
|
766
|
-
collectKnownLongFlags,
|
|
767
|
-
collectInstalledPackageCommandPathHints,
|
|
768
|
-
resolveOptionalPackageInstallHint,
|
|
769
|
-
resolveSuggestedRetryForMissingOption,
|
|
770
|
-
suggestNearestLongFlags,
|
|
771
|
-
};
|
|
9
|
+
${renderedUsage}
|
|
10
|
+
Extension activation failures:
|
|
11
|
+
${details}`}function resolveUnknownCommanderToken(invocationArgv){const helpRequest=parseBootstrapHelpRequest(invocationArgv);return helpRequest.commandPathTokens[0]??parseBootstrapCommandName(invocationArgv)??"<command>"}function collectRuntimeCommandPaths(root,extensionDescriptors){const commandPaths=new Set;const queue=[...root.commands];while(queue.length>0){const current=queue.shift();if(!current){continue}const normalizedPath=normalizeHelpCommandPath(getCommandPath(current));const hasInternalSegment=normalizedPath.split(" ").some(segment=>segment.startsWith("_"));if(normalizedPath.length>0&&!hasInternalSegment){commandPaths.add(normalizedPath)}queue.push(...current.commands)}for(const descriptorPath of extensionDescriptors.keys()){const normalizedPath=normalizeHelpCommandPath(descriptorPath);const hasInternalSegment=normalizedPath.split(" ").some(segment=>segment.startsWith("_"));if(normalizedPath.length>0&&!hasInternalSegment){commandPaths.add(normalizedPath)}}return[...commandPaths].sort((left,right)=>left.localeCompare(right))}function scoreCommandPathMatch(commandPath,queryToken){const normalizedPath=commandPath.trim().toLowerCase();const normalizedToken=queryToken.trim().toLowerCase();if(normalizedToken.length===0){return Number.POSITIVE_INFINITY}const pathSegments=normalizedPath.split(" ");if(normalizedPath===normalizedToken){return 0}if(pathSegments.includes(normalizedToken)){return 1}if(pathSegments.some(segment=>segment.startsWith(normalizedToken))){return 2}if(normalizedPath.includes(normalizedToken)){return 3}const maxDistance=normalizedToken.length>=5?2:1;let bestDistance=Number.POSITIVE_INFINITY;for(const segment of pathSegments){const distance=levenshteinDistanceWithinLimit(segment,normalizedToken,maxDistance);if(distance!==null){bestDistance=Math.min(bestDistance,distance)}}if(Number.isFinite(bestDistance)){return 4+bestDistance}return Number.POSITIVE_INFINITY}function toComparableFlag(flag){return normalizeLongFlag(flag).slice(2).replace(/-/g,"")}function renderAttemptedCommand(argv){return renderPmCommand(argv)}function resolveOptionalPackageInstallHint(commandPath){const topLevel=commandPath.split(" ")[0]?.trim().toLowerCase();if(!topLevel){return null}const packageAlias=OPTIONAL_PACKAGE_INSTALL_HINTS[topLevel];if(!packageAlias){return null}return`If this command comes from an optional package, install it with: pm install ${packageAlias}`}function normalizePackageCommandAliasToken(value){let normalized=normalizeExtensionNameForMatch(value);for(const prefix of["@unbrained/","builtin-","pm-"]){if(normalized.startsWith(prefix)){normalized=normalized.slice(prefix.length)}}return normalized}function collectInstalledPackageCommandPathHints(unknownToken,extensionDescriptors){const normalizedUnknown=normalizePackageCommandAliasToken(unknownToken);if(normalizedUnknown.length===0){return[]}const hints=[];for(const descriptor of extensionDescriptors.values()){const identifiers=new Set;const source=descriptor.source;if(source){for(const identifier of[source.name,source.package]){const normalizedIdentifier=normalizePackageCommandAliasToken(identifier??"");if(normalizedIdentifier.length>0){identifiers.add(normalizedIdentifier)}}}if(identifiers.size===0){continue}const matches=[...identifiers].some(identifier=>identifier===normalizedUnknown||identifier.includes(normalizedUnknown)||normalizedUnknown.includes(identifier));if(matches){hints.push(descriptor.command)}}return[...new Set(hints)].sort((left,right)=>left.localeCompare(right))}function collectKnownLongFlags(commandName,contractsOverride){const flags=new Set;const contracts=contractsOverride??resolveSubcommandFlagContractsForCommand(commandName);for(const contract of contracts){if(contract.flag.startsWith("--")){flags.add(normalizeLongFlag(contract.flag))}for(const alias of contract.aliases??[]){if(alias.startsWith("--")){flags.add(normalizeLongFlag(alias))}}}return[...flags].sort((left,right)=>left.localeCompare(right))}function suggestNearestLongFlags(unknownOption,knownFlags){if(!unknownOption.startsWith("--")){return[]}const unknownComparable=toComparableFlag(unknownOption);if(unknownComparable.length===0){return[]}const maxDistance=unknownComparable.length>=8?2:1;const candidates=[];for(const flag of knownFlags){const flagComparable=toComparableFlag(flag);if(flagComparable===unknownComparable){continue}if(unknownComparable.length>=3&&flagComparable.startsWith(unknownComparable)){candidates.push({flag,rank:0,distance:flagComparable.length-unknownComparable.length});continue}const distance=levenshteinDistanceWithinLimit(unknownComparable,flagComparable,maxDistance);if(distance===null||distance<=0){continue}candidates.push({flag,rank:1,distance})}return candidates.sort((left,right)=>{if(left.rank!==right.rank){return left.rank-right.rank}if(left.distance!==right.distance){return left.distance-right.distance}return left.flag.localeCompare(right.flag)}).map(entry=>entry.flag).slice(0,3)}let crossCommandFlagIndexCache;const CROSS_COMMAND_FLAG_EXCLUSIONS=new Set(["ctx","packages","list-draft","list-open","list-in-progress","list-blocked","list-closed","list-canceled","start-task","pause-task","close-task","help"]);function getCrossCommandFlagIndex(){if(crossCommandFlagIndexCache){return crossCommandFlagIndexCache}const index=new Map;for(const command of PM_CORE_COMMAND_NAMES){if(CROSS_COMMAND_FLAG_EXCLUSIONS.has(command)){continue}for(const flag of collectKnownLongFlags(command)){const commands=index.get(flag)??[];commands.push(command);index.set(flag,commands)}}crossCommandFlagIndexCache=index;return crossCommandFlagIndexCache}function findOtherCommandsForFlag(unknownOption,currentCommand){if(!unknownOption.startsWith("--")){return[]}const commands=getCrossCommandFlagIndex().get(normalizeLongFlag(unknownOption));if(!commands){return[]}const normalizedCurrent=currentCommand?.trim().toLowerCase();const currentFlags=new Set(collectKnownLongFlags(normalizedCurrent));return commands.filter(command=>command!==normalizedCurrent).map(command=>({command,sharedFlagCount:collectKnownLongFlags(command).filter(flag=>currentFlags.has(flag)).length})).sort((left,right)=>left.sharedFlagCount!==right.sharedFlagCount?right.sharedFlagCount-left.sharedFlagCount:left.command.localeCompare(right.command)).map(({command})=>command)}function rewriteUnknownOptionArgv(argv,unknownOption,replacementFlag){for(let index=0;index<argv.length;index+=1){const token=argv[index];if(!token.startsWith("--")){continue}const equalsIndex=token.indexOf("=");const key=equalsIndex>=0?token.slice(0,equalsIndex):token;if(normalizeLongFlag(key)!==normalizeLongFlag(unknownOption)){continue}const next=[...argv];next[index]=equalsIndex>=0?`${replacementFlag}${token.slice(equalsIndex)}`:replacementFlag;return next}return void 0}function scoreRuntimeCommandCandidates(params){const commandPathSet=new Set(params.commandPaths);const scoreAgainstUnknown=candidatePath=>Math.min(scoreCommandPathMatch(candidatePath,params.normalizedUnknown),params.primaryToken!==params.normalizedUnknown?scoreCommandPathMatch(candidatePath,params.primaryToken):Number.POSITIVE_INFINITY);const scoresByCommandPath=new Map;const recordCandidateScore=(commandPath,score)=>{if(!Number.isFinite(score)||!commandPathSet.has(commandPath)){return}const existing=scoresByCommandPath.get(commandPath);if(existing===void 0||score<existing){scoresByCommandPath.set(commandPath,score)}};for(const commandPath of params.commandPaths){recordCandidateScore(commandPath,scoreAgainstUnknown(commandPath))}for(const[aliasToken,canonicalPath]of Object.entries(EXECUTABLE_COMMAND_ALIASES)){if(aliasToken==="read"){continue}recordCandidateScore(canonicalPath,scoreAgainstUnknown(aliasToken))}return[...scoresByCommandPath.entries()].sort(([leftPath,leftScore],[rightPath,rightScore])=>leftScore!==rightScore?leftScore-rightScore:leftPath.localeCompare(rightPath)).map(([commandPath])=>commandPath)}function resolveUnknownCommandCandidates(params){const semanticCandidates=rankCommandPaths(params.commandPaths,params.primaryToken);const rankedCandidates=scoreRuntimeCommandCandidates(params);const installedPackageCandidates=collectInstalledPackageCommandPathHints(params.primaryToken,params.extensionDescriptors).filter(commandPath=>params.commandPaths.includes(commandPath));return dedupeStrings([...semanticCandidates,...rankedCandidates,...installedPackageCandidates])}function resolveUnknownCommandFallbacks(commandPaths){const topLevel=[...new Set(commandPaths.map(commandPath=>commandPath.split(" ")[0]).filter(segment=>segment.length>0))];return topLevel.sort((left,right)=>left.localeCompare(right))}function buildUnknownCommandExamples(suggestedPaths,hasConcreteCandidates){const suggestedExamples=suggestedPaths.map(path=>`pm ${path} --help`);if(hasConcreteCandidates){return[...new Set([...suggestedExamples,"pm --help --all"])]}return[...new Set(["pm --help --all",...suggestedExamples])]}function buildUnknownCommandGuidanceFromRuntime(rawMessage,root,extensionDescriptors){const unknownCommandMatch=rawMessage.match(/unknown command '([^']+)'/i);if(!unknownCommandMatch||typeof unknownCommandMatch[1]!=="string"){return void 0}const normalizedUnknown=normalizeHelpCommandPath(unknownCommandMatch[1]);if(normalizedUnknown.length===0){return void 0}const commandPaths=collectRuntimeCommandPaths(root,extensionDescriptors);if(commandPaths.length===0){return void 0}const primaryToken=normalizedUnknown.split(" ")[0];const combinedCandidates=resolveUnknownCommandCandidates({commandPaths,normalizedUnknown,primaryToken,extensionDescriptors});const fallbackTopLevel=resolveUnknownCommandFallbacks(commandPaths);const suggestedPaths=(combinedCandidates.length>0?combinedCandidates:fallbackTopLevel).slice(0,3);const examples=buildUnknownCommandExamples(suggestedPaths,combinedCandidates.length>0);const optionalPackageHint=resolveOptionalPackageInstallHint(normalizedUnknown);const didYouMean=combinedCandidates.length>0?`Did you mean: ${suggestedPaths.join(", ")}?`:null;return{unknownCommandExamples:examples,unknownCommandNextSteps:[...didYouMean?[didYouMean]:[],'Run "pm --help --all" to list every command available in this runtime, including active extensions.',"Use one of the suggested command paths above with --help to inspect valid flags and usage.",...optionalPackageHint?[optionalPackageHint]:[]]}}function dedupeStrings(values){return Array.from(new Set(values))}function firstWhitespaceSeparatedToken(input){let token="";for(const character of input){if(character===" "||character===" "||character==="\n"||character==="\r"||character==="\f"||character==="\v"){break}token+=character}return token}function trimTrailingPunctuationToken(token){let end=token.length;while(end>0){const character=token[end-1];if(character!==","&&character!==":"&&character!==";"){break}end-=1}return token.slice(0,end)}function resolveChildCommandByToken(parent,token){const normalizedToken=token.trim().toLowerCase();return parent.commands.find(candidate=>{if(candidate.name().trim().toLowerCase()===normalizedToken){return true}const aliases=typeof candidate.aliases==="function"?candidate.aliases():[];return aliases.some(alias=>alias.trim().toLowerCase()===normalizedToken)})}function isKnownHelpCommandPath(root,commandPathTokens){if(commandPathTokens.length===0){return true}let current=root;for(const[tokenIndex,token]of commandPathTokens.entries()){const next=resolveChildCommandByToken(current,token);if(!next){const declaredArguments=current.registeredArguments;return declaredArguments.length>0&&(current.commands.length===0||declaredArguments[0]?.required===true)&&(declaredArguments.at(-1)?.variadic===true||commandPathTokens.length-tokenIndex<=declaredArguments.length)}current=next}return true}async function resolveWorkspaceUsageContext(bootstrapGlobal,message,invocationArgv,commandName){try{const pmRoot=resolvePmRoot(process.cwd(),bootstrapGlobal.path);if(!await pathExists(getSettingsPath(pmRoot))){return{allowedTypes:BUILTIN_TYPE_HELP_VALUES}}const settings=await readSettings(pmRoot);const extensionRegistrations=bootstrapGlobal.noExtensions?void 0:getActiveExtensionRegistrations();const typeRegistry=resolveItemTypeRegistry(settings,extensionRegistrations);let verifiedCollectionItemId;if(/too many arguments/i.test(message)&&["comments","docs","files","learnings","notes","test"].includes(commandName??"")){const commandIndex=invocationArgv.findIndex(token=>token===commandName);const candidate=invocationArgv[commandIndex+2];if(invocationArgv[commandIndex+1]?.toLowerCase()==="add"&&candidate!==void 0&&!candidate.startsWith("-")){try{verifiedCollectionItemId=(await locateItem(pmRoot,candidate,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder))?.id}catch{}}}return{allowedTypes:typeRegistry.types.length>0?typeRegistry.types.join("|"):BUILTIN_TYPE_HELP_VALUES,pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,verifiedCollectionItemId}}catch{return{allowedTypes:BUILTIN_TYPE_HELP_VALUES}}}function resolveUnknownOptionSuggestions(message,commandName){const match=message.match(/unknown option '([^']+)'/i);const suggestions=match&&commandName?dedupeStrings([...getSemanticUnknownOptionSuggestions(commandName,match[1]),...suggestNearestLongFlags(match[1],collectKnownLongFlags(commandName))]):void 0;const otherCommands=match?findOtherCommandsForFlag(match[1],commandName):[];const declaredOnPath=match!==null&&collectKnownLongFlags(commandName).includes(normalizeLongFlag(match[1]));return{match,suggestions,otherCommands,scope:declaredOnPath?"declared_on_path":otherCommands.length>0?"declared_elsewhere":"declared_nowhere"}}function resolveSuggestedRetryForUnknownOption(invocationArgv,unknownOptionMatch,unknownOptionSuggestions){if(!unknownOptionMatch||!unknownOptionSuggestions||unknownOptionSuggestions.length===0){return void 0}const rewritten=rewriteUnknownOptionArgv(invocationArgv,unknownOptionMatch[1],unknownOptionSuggestions[0]);return rewritten?renderAttemptedCommand(rewritten):void 0}function resolveSuggestedRetryForMissingOption(message,invocationArgv){const missingRequiredOption=message.match(/required option '([^']+)' not specified/i);const requiredOptionToken=missingRequiredOption?.[1]?trimTrailingPunctuationToken(firstWhitespaceSeparatedToken(missingRequiredOption[1].trim())):void 0;if(!requiredOptionToken?.startsWith("--")){return void 0}const commandName=parseBootstrapCommandName(invocationArgv);if(!commandName){return void 0}return renderMissingOptionRetry(invocationArgv,commandName,[requiredOptionToken])}function resolveSplitSchemaSubcommand(message,invocationArgv){if(!/too many arguments/i.test(message)){return void 0}if(parseBootstrapCommandName(invocationArgv)!=="schema"){return void 0}const schemaIndex=findBootstrapCommandTokenIndex(invocationArgv);const verb=invocationArgv[schemaIndex+1]?.trim().toLowerCase();const noun=invocationArgv[schemaIndex+2]?.trim().toLowerCase();if(!verb||!noun){return void 0}const joined=`${verb}-${noun}`;if(!SCHEMA_SUBCOMMAND_VALUES.includes(joined)){return void 0}const rewritten=[...invocationArgv.slice(0,schemaIndex+1),joined,...invocationArgv.slice(schemaIndex+3)];return{unknownSubcommandPath:"schema",unknownSubcommandToken:`${verb} ${noun}`,unknownSubcommandAllowedValues:[...SCHEMA_SUBCOMMAND_VALUES],suggestedRetryCommand:renderAttemptedCommand(rewritten)}}async function resolveCommanderUsageContext(error,rootProgram,extensionDescriptors,guidanceOverrides={}){const rawMessage=typeof error==="object"&&error!==null?error.message:void 0;const message=rawMessage??"Invalid command usage";const invocationArgv=normalizeBootstrapInvocation(process.argv.slice(2)).argv;const bootstrapGlobal=parseBootstrapGlobalOptions(invocationArgv);const commandName=parseBootstrapCommandName(invocationArgv);const attemptedCommand=renderAttemptedCommand(invocationArgv);const providedOptionFlags=extractProvidedOptionFlags(invocationArgv);const workspaceUsage=await resolveWorkspaceUsageContext(bootstrapGlobal,message,invocationArgv,commandName);const allowedTypes=workspaceUsage.allowedTypes;const unknownCommandGuidance=buildUnknownCommandGuidanceFromRuntime(message,rootProgram,extensionDescriptors);const unknownOption=resolveUnknownOptionSuggestions(message,commandName);const splitSchemaSubcommand=resolveSplitSchemaSubcommand(message,invocationArgv);const suggestedRetryCommand=splitSchemaSubcommand?.suggestedRetryCommand??resolveSuggestedRetryForUnknownOption(invocationArgv,unknownOption.match,unknownOption.suggestions)??resolveSuggestedRetryForMissingOption(message,invocationArgv);return{message,commandName,allowedTypes,attemptedCommand,normalizedInvocationArgs:[...invocationArgv],providedOptionFlags,unknownOptionSuggestions:unknownOption.suggestions,unknownOptionOtherCommands:unknownOption.otherCommands.length>0?unknownOption.otherCommands.slice(0,12):void 0,unknownOptionOtherCommandsTotal:unknownOption.otherCommands.length>0?unknownOption.otherCommands.length:void 0,unknownOptionOtherCommandsTruncated:unknownOption.otherCommands.length>12||void 0,unknownOptionScope:unknownOption.scope,suggestedRetryCommand,verifiedCollectionItemId:workspaceUsage.verifiedCollectionItemId,...splitSchemaSubcommand,...unknownCommandGuidance,...guidanceOverrides}}async function formatCommanderUsageMessage(error,rootProgram,extensionDescriptors,guidanceOverrides={}){const usageContext=await resolveCommanderUsageContext(error,rootProgram,extensionDescriptors,guidanceOverrides);const{message,commandName,allowedTypes,unknownCommandExamples,unknownCommandNextSteps,attemptedCommand,normalizedInvocationArgs,providedOptionFlags,unknownOptionSuggestions,unknownOptionOtherCommands,unknownOptionOtherCommandsTotal,unknownOptionOtherCommandsTruncated,unknownOptionScope,unknownSubcommandPath,unknownSubcommandToken,unknownSubcommandAllowedValues,suggestedRetryCommand,verifiedCollectionItemId,failedExtensions}=usageContext;const formatted=formatCommanderErrorForDisplay(message,commandName,allowedTypes,{unknownCommandExamples,unknownCommandNextSteps,attemptedCommand,normalizedInvocationArgs,providedOptionFlags,unknownOptionSuggestions,unknownOptionOtherCommands,unknownOptionOtherCommandsTotal,unknownOptionOtherCommandsTruncated,unknownOptionScope,unknownSubcommandPath,unknownSubcommandToken,unknownSubcommandAllowedValues,suggestedRetryCommand,verifiedCollectionItemId,failedExtensions});const serviceOverride=await runActiveServiceOverride("help_format",{message:formatted,command:commandName,allowed_types:allowedTypes});if(serviceOverride.handled&&typeof serviceOverride.result==="string"){return serviceOverride.result}return formatted}async function formatCommanderUsageJson(error,rootProgram,extensionDescriptors,lean=false,guidanceOverrides={}){const usageContext=await resolveCommanderUsageContext(error,rootProgram,extensionDescriptors,guidanceOverrides);const envelope=formatCommanderErrorForJson(usageContext.message,usageContext.commandName,usageContext.allowedTypes,EXIT_CODE.USAGE,{unknownCommandExamples:usageContext.unknownCommandExamples,unknownCommandNextSteps:usageContext.unknownCommandNextSteps,attemptedCommand:usageContext.attemptedCommand,normalizedInvocationArgs:usageContext.normalizedInvocationArgs,providedOptionFlags:usageContext.providedOptionFlags,unknownOptionSuggestions:usageContext.unknownOptionSuggestions,unknownOptionOtherCommands:usageContext.unknownOptionOtherCommands,unknownOptionOtherCommandsTotal:usageContext.unknownOptionOtherCommandsTotal,unknownOptionOtherCommandsTruncated:usageContext.unknownOptionOtherCommandsTruncated,unknownOptionScope:usageContext.unknownOptionScope,unknownSubcommandPath:usageContext.unknownSubcommandPath,unknownSubcommandToken:usageContext.unknownSubcommandToken,unknownSubcommandAllowedValues:usageContext.unknownSubcommandAllowedValues,suggestedRetryCommand:usageContext.suggestedRetryCommand,verifiedCollectionItemId:usageContext.verifiedCollectionItemId,failedExtensions:usageContext.failedExtensions});const projected=lean?projectLeanErrorEnvelope(envelope):envelope;const accountingRequested=parseBootstrapGlobalOptions(usageContext.normalizedInvocationArgs).tokenAccounting===true;return JSON.stringify(accountingRequested?attachOutputTokenAccounting(projected,value=>`${JSON.stringify(value,null,2)}
|
|
12
|
+
`):projected,null,2)}const _testOnly={collectKnownLongFlags,collectInstalledPackageCommandPathHints,resolveOptionalPackageInstallHint,resolveSuggestedRetryForMissingOption,suggestNearestLongFlags};export{BUILTIN_TYPE_HELP_VALUES,_testOnly,appendCommanderExtensionFailures,buildUnknownCommandGuidanceFromRuntime,collectRuntimeCommandPaths,formatCommanderUsageJson,formatCommanderUsageMessage,isKnownHelpCommandPath,resolveChildCommandByToken,resolveCommanderUsageContext,resolveUnknownCommanderToken,scoreCommandPathMatch};
|
|
772
13
|
//# sourceMappingURL=commander-usage.js.map
|
|
773
|
-
//# debugId=18758585-648f-5422-80e4-fbc7478c3cf3
|