@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
package/dist/sdk/dependencies.js
CHANGED
|
@@ -1,719 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/dependencies
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm deps command surface and its agent-facing runtime behavior.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="74a825f3-1301-5dc5-a887-c6ff68f6d7ec")}catch(e){}}();
|
|
8
|
-
import { assertInitializedTracker } from "./environment/tracker-preflight.js";
|
|
9
|
-
import { getActiveExtensionRegistrations } from "../core/extensions/index.js";
|
|
10
|
-
import { resolveItemTypeRegistry } from "../core/item/type-registry.js";
|
|
11
|
-
import { isTerminalStatus } from "../core/item/status.js";
|
|
12
|
-
import { resolveRuntimeStatusRegistry } from "../core/schema/runtime-schema.js";
|
|
13
|
-
import { EXIT_CODE } from "../core/shared/constants.js";
|
|
14
|
-
import { PmCliError } from "../core/shared/errors.js";
|
|
15
|
-
import { formatBuiltInOutput } from "../core/output/output.js";
|
|
16
|
-
import { listAllItemMetadataLight, locateItem, readLocatedItem, } from "../core/store/item-store.js";
|
|
17
|
-
import { resolvePmRoot } from "../core/store/paths.js";
|
|
18
|
-
import { readSettings } from "../core/store/settings.js";
|
|
19
|
-
import { estimatePmOutputTokens } from "./cli-contracts/agent-output-contracts.js";
|
|
20
|
-
import { assertProjectionModeChoice, attachOutputOmissionReceipt, } from "./output-projection.js";
|
|
21
|
-
import { assembleWorkspaceRelationshipGraph, collectDanglingDependencyReferences, resolveWorkspaceRelationshipKindRegistry, } from "./graph/assembly.js";
|
|
22
|
-
import { computeWorkspaceGraphFingerprint, workspaceGraphCache, } from "./graph/cache.js";
|
|
23
|
-
import { buildRelationshipContext, } from "./relationship-context.js";
|
|
24
|
-
import { createRelationshipKindRegistry, } from "./relationships.js";
|
|
25
|
-
/** Supported values accepted by the deps format contract. */
|
|
26
|
-
export const DEPS_FORMAT_VALUES = ["tree", "graph", "context"];
|
|
27
|
-
/** Supported values accepted by the deps collapse contract. */
|
|
28
|
-
export const DEPS_COLLAPSE_VALUES = ["none", "repeated"];
|
|
29
|
-
/** Supported values accepted by the deps graph-context direction contract. */
|
|
30
|
-
export const DEPS_DIRECTION_VALUES = ["outgoing", "incoming", "both"];
|
|
31
|
-
const DEFAULT_DEPS_TREE_MAX_DEPTH = 32;
|
|
32
|
-
const DEFAULT_DEPS_TREE_NODE_LIMIT = 200;
|
|
33
|
-
const DEFAULT_DEPS_TREE_EDGE_LIMIT = 400;
|
|
34
|
-
const DEFAULT_DEPS_TREE_TOKEN_BUDGET = 16_000;
|
|
35
|
-
function parseFormat(raw) {
|
|
36
|
-
const candidate = raw?.trim().toLowerCase() ?? "tree";
|
|
37
|
-
if (DEPS_FORMAT_VALUES.includes(candidate)) {
|
|
38
|
-
return candidate;
|
|
39
|
-
}
|
|
40
|
-
throw new PmCliError(`Invalid --format value "${raw}". Use "tree", "graph", or "context".`, EXIT_CODE.USAGE);
|
|
41
|
-
}
|
|
42
|
-
/** Parse one positive-integer graph bound, failing fast with the offending flag name. */
|
|
43
|
-
export function parsePositiveInteger(raw, flag) {
|
|
44
|
-
if (raw === undefined)
|
|
45
|
-
return undefined;
|
|
46
|
-
const value = typeof raw === "number" ? raw : Number(raw.trim());
|
|
47
|
-
if (!Number.isInteger(value) || value < 1)
|
|
48
|
-
throw new PmCliError(`Invalid --${flag} value "${raw}". Use a positive integer.`, EXIT_CODE.USAGE);
|
|
49
|
-
return value;
|
|
50
|
-
}
|
|
51
|
-
/** Parse the shared non-negative --max-depth traversal bound. */
|
|
52
|
-
export function parseMaxDepth(raw) {
|
|
53
|
-
if (raw === undefined) {
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
const normalized = typeof raw === "number" ? raw : Number(raw.trim());
|
|
57
|
-
if (!Number.isInteger(normalized) || normalized < 0) {
|
|
58
|
-
throw new PmCliError(`Invalid --max-depth value "${raw}". Use a non-negative integer.`, EXIT_CODE.USAGE);
|
|
59
|
-
}
|
|
60
|
-
return normalized;
|
|
61
|
-
}
|
|
62
|
-
function parseCollapse(raw) {
|
|
63
|
-
const candidate = raw?.trim().toLowerCase() ?? "none";
|
|
64
|
-
if (DEPS_COLLAPSE_VALUES.includes(candidate)) {
|
|
65
|
-
return candidate;
|
|
66
|
-
}
|
|
67
|
-
throw new PmCliError(`Invalid --collapse value "${raw}". Use "none" or "repeated".`, EXIT_CODE.USAGE);
|
|
68
|
-
}
|
|
69
|
-
/** Parse the shared graph traversal --direction value, defaulting to "both". */
|
|
70
|
-
export function parseDirection(raw) {
|
|
71
|
-
const candidate = raw?.trim().toLowerCase() ?? "both";
|
|
72
|
-
if (DEPS_DIRECTION_VALUES.includes(candidate)) {
|
|
73
|
-
return candidate;
|
|
74
|
-
}
|
|
75
|
-
throw new PmCliError(`Invalid --direction value "${raw}". Use "outgoing", "incoming", or "both".`, EXIT_CODE.USAGE);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Normalize repeatable and comma-separated --kind values against one
|
|
79
|
-
* relationship ontology, failing fast on unknown kinds instead of silently
|
|
80
|
-
* matching nothing (the multi-value filter-grammar trap tracked by pm-gknu).
|
|
81
|
-
*/
|
|
82
|
-
export function parseKinds(raw, registry = createRelationshipKindRegistry()) {
|
|
83
|
-
if (raw === undefined)
|
|
84
|
-
return undefined;
|
|
85
|
-
const values = (Array.isArray(raw) ? raw : [raw])
|
|
86
|
-
.flatMap((value) => value.split(","))
|
|
87
|
-
.map((value) => value.trim())
|
|
88
|
-
.filter((value) => value.length > 0);
|
|
89
|
-
if (values.length === 0)
|
|
90
|
-
return undefined;
|
|
91
|
-
const kinds = new Set();
|
|
92
|
-
for (const value of values) {
|
|
93
|
-
const definition = registry.resolve(value);
|
|
94
|
-
if (!definition) {
|
|
95
|
-
const known = registry
|
|
96
|
-
.list()
|
|
97
|
-
.map((entry) => entry.kind)
|
|
98
|
-
.join(", ");
|
|
99
|
-
throw new PmCliError(`Invalid --kind value "${value}". Registered kinds: ${known}.`, EXIT_CODE.USAGE);
|
|
100
|
-
}
|
|
101
|
-
kinds.add(definition.kind);
|
|
102
|
-
}
|
|
103
|
-
return [...kinds].sort();
|
|
104
|
-
}
|
|
105
|
-
function normalizeDependencies(dependencies) {
|
|
106
|
-
if (!dependencies || dependencies.length === 0) {
|
|
107
|
-
return [];
|
|
108
|
-
}
|
|
109
|
-
const sorted = dependencies
|
|
110
|
-
.map(({ id, kind }) => ({
|
|
111
|
-
id: id.trim(),
|
|
112
|
-
kind: kind.trim().toLowerCase(),
|
|
113
|
-
}))
|
|
114
|
-
.sort((left, right) => {
|
|
115
|
-
const byKind = left.kind.localeCompare(right.kind);
|
|
116
|
-
if (byKind !== 0)
|
|
117
|
-
return byKind;
|
|
118
|
-
return left.id.localeCompare(right.id);
|
|
119
|
-
});
|
|
120
|
-
const deduped = new Map();
|
|
121
|
-
for (const dependency of sorted) {
|
|
122
|
-
const key = `${dependency.kind.toLowerCase()}::${dependency.id.toLowerCase()}`;
|
|
123
|
-
if (!deduped.has(key)) {
|
|
124
|
-
deduped.set(key, { id: dependency.id, kind: dependency.kind });
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return [...deduped.values()];
|
|
128
|
-
}
|
|
129
|
-
function toIndexedItem(item) {
|
|
130
|
-
return {
|
|
131
|
-
id: item.id,
|
|
132
|
-
title: item.title,
|
|
133
|
-
type: item.type,
|
|
134
|
-
status: item.status,
|
|
135
|
-
dependencies: normalizeDependencies(item.dependencies),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
function estimateTreeNodeTokens(node) {
|
|
139
|
-
return estimatePmOutputTokens(new TextEncoder().encode(JSON.stringify({ ...node, dependencies: undefined })).byteLength);
|
|
140
|
-
}
|
|
141
|
-
function appendTreeDependencies(baseNode, item, index, nextLineage, maxDepth, collapse, expanded, budget, depth) {
|
|
142
|
-
for (const dependency of item.dependencies) {
|
|
143
|
-
const edgeTokens = Math.max(1, Math.ceil(JSON.stringify({
|
|
144
|
-
from: baseNode.id,
|
|
145
|
-
to: dependency.id,
|
|
146
|
-
kind: dependency.kind,
|
|
147
|
-
}).length / 3));
|
|
148
|
-
if (budget.nodes >= budget.nodeLimit) {
|
|
149
|
-
baseNode.truncated = true;
|
|
150
|
-
budget.reasons.add("node_limit");
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
if (budget.edges >= budget.edgeLimit) {
|
|
154
|
-
baseNode.truncated = true;
|
|
155
|
-
budget.reasons.add("edge_limit");
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
if (budget.estimatedTokens + edgeTokens >= budget.tokenBudget) {
|
|
159
|
-
baseNode.truncated = true;
|
|
160
|
-
budget.reasons.add("token_budget");
|
|
161
|
-
break;
|
|
162
|
-
}
|
|
163
|
-
budget.edges += 1;
|
|
164
|
-
budget.estimatedTokens += edgeTokens;
|
|
165
|
-
baseNode.dependencies.push(toTreeNode(dependency.id, index, nextLineage, maxDepth, collapse, expanded, budget, depth + 1, dependency.kind));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
function shouldStopTreeNodeExpansion(node, item, lookupId, maxDepth, collapse, expanded, budget, depth) {
|
|
169
|
-
if (budget.estimatedTokens >= budget.tokenBudget &&
|
|
170
|
-
item?.dependencies.length) {
|
|
171
|
-
node.truncated = true;
|
|
172
|
-
budget.reasons.add("token_budget");
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
if (!item || node.cycle) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
if (maxDepth !== undefined && depth >= maxDepth) {
|
|
179
|
-
if (item.dependencies.length > 0) {
|
|
180
|
-
node.truncated = true;
|
|
181
|
-
budget.reasons.add("max_depth");
|
|
182
|
-
}
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
if (collapse === "repeated" && expanded.has(lookupId)) {
|
|
186
|
-
node.collapsed = true;
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
function toTreeNode(id, index, lineage, maxDepth, collapse, expanded, budget, depth = 0, via) {
|
|
192
|
-
const lookupId = id.trim().toLowerCase();
|
|
193
|
-
const item = index.get(lookupId);
|
|
194
|
-
const baseNode = {
|
|
195
|
-
id: item?.id ?? id,
|
|
196
|
-
title: item?.title,
|
|
197
|
-
type: item?.type,
|
|
198
|
-
status: item?.status,
|
|
199
|
-
via,
|
|
200
|
-
missing: !item,
|
|
201
|
-
cycle: lineage.has(lookupId),
|
|
202
|
-
dependencies: [],
|
|
203
|
-
};
|
|
204
|
-
budget.nodes += 1;
|
|
205
|
-
budget.estimatedTokens += estimateTreeNodeTokens(baseNode);
|
|
206
|
-
if (shouldStopTreeNodeExpansion(baseNode, item, lookupId, maxDepth, collapse, expanded, budget, depth)) {
|
|
207
|
-
return baseNode;
|
|
208
|
-
}
|
|
209
|
-
if (collapse === "repeated") {
|
|
210
|
-
expanded.add(lookupId);
|
|
211
|
-
}
|
|
212
|
-
const nextLineage = new Set(lineage);
|
|
213
|
-
nextLineage.add(lookupId);
|
|
214
|
-
appendTreeDependencies(baseNode, item, index, nextLineage, maxDepth, collapse, expanded, budget, depth);
|
|
215
|
-
return baseNode;
|
|
216
|
-
}
|
|
217
|
-
function mergeGraphNode(existing, candidate) {
|
|
218
|
-
if (!existing) {
|
|
219
|
-
return candidate;
|
|
220
|
-
}
|
|
221
|
-
/* c8 ignore start -- defensive: mixed missing/non-missing duplicates only occur in malformed synthetic trees. */
|
|
222
|
-
if (existing.missing && !candidate.missing)
|
|
223
|
-
return candidate;
|
|
224
|
-
/* c8 ignore stop */
|
|
225
|
-
return {
|
|
226
|
-
...existing,
|
|
227
|
-
title: existing.title ?? candidate.title,
|
|
228
|
-
type: existing.type ?? candidate.type,
|
|
229
|
-
status: existing.status ?? candidate.status,
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
function toGraph(root) {
|
|
233
|
-
const nodesById = new Map();
|
|
234
|
-
const edgesByKey = new Map();
|
|
235
|
-
const pending = [root];
|
|
236
|
-
while (pending.length > 0) {
|
|
237
|
-
const node = pending.pop();
|
|
238
|
-
nodesById.set(node.id, mergeGraphNode(nodesById.get(node.id), {
|
|
239
|
-
id: node.id,
|
|
240
|
-
title: node.title,
|
|
241
|
-
type: node.type,
|
|
242
|
-
status: node.status,
|
|
243
|
-
missing: node.missing,
|
|
244
|
-
}));
|
|
245
|
-
for (const child of node.dependencies) {
|
|
246
|
-
nodesById.set(child.id, mergeGraphNode(nodesById.get(child.id), {
|
|
247
|
-
id: child.id,
|
|
248
|
-
title: child.title,
|
|
249
|
-
type: child.type,
|
|
250
|
-
status: child.status,
|
|
251
|
-
missing: child.missing,
|
|
252
|
-
}));
|
|
253
|
-
/* c8 ignore start -- legacy malformed dependency payloads may omit kind/via. */
|
|
254
|
-
const relationKind = child.via ?? "related";
|
|
255
|
-
const edgeKey = `${node.id}::${child.id}::${relationKind}`;
|
|
256
|
-
if (!edgesByKey.has(edgeKey)) {
|
|
257
|
-
edgesByKey.set(edgeKey, {
|
|
258
|
-
from: node.id,
|
|
259
|
-
to: child.id,
|
|
260
|
-
kind: relationKind,
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
/* c8 ignore stop */
|
|
264
|
-
if (!child.cycle) {
|
|
265
|
-
pending.push(child);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
const nodes = [...nodesById.values()].sort((left, right) => left.id.localeCompare(right.id));
|
|
270
|
-
const edges = [...edgesByKey.values()].sort((left, right) => {
|
|
271
|
-
const byFrom = left.from.localeCompare(right.from);
|
|
272
|
-
if (byFrom !== 0)
|
|
273
|
-
return byFrom;
|
|
274
|
-
const byTo = left.to.localeCompare(right.to);
|
|
275
|
-
if (byTo !== 0)
|
|
276
|
-
return byTo;
|
|
277
|
-
return left.kind.localeCompare(right.kind);
|
|
278
|
-
});
|
|
279
|
-
const missingIds = nodes
|
|
280
|
-
.filter((node) => node.missing)
|
|
281
|
-
.map((node) => node.id);
|
|
282
|
-
return {
|
|
283
|
-
root_id: root.id,
|
|
284
|
-
nodes,
|
|
285
|
-
edges,
|
|
286
|
-
missing_ids: missingIds,
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
/** Count a dependency result without allocating its potentially exponential tree payload. */
|
|
290
|
-
function countDependencyGraph(rootId, index, maxDepth) {
|
|
291
|
-
const nodeIds = new Set();
|
|
292
|
-
const edgeKeys = new Set();
|
|
293
|
-
const missingIds = new Set();
|
|
294
|
-
const expanded = new Set();
|
|
295
|
-
const pending = [{ id: rootId, depth: 0 }];
|
|
296
|
-
let pendingIndex = 0;
|
|
297
|
-
while (pendingIndex < pending.length) {
|
|
298
|
-
const current = pending[pendingIndex++];
|
|
299
|
-
const lookupId = current.id.trim().toLowerCase();
|
|
300
|
-
nodeIds.add(lookupId);
|
|
301
|
-
const item = index.get(lookupId);
|
|
302
|
-
if (!item) {
|
|
303
|
-
missingIds.add(lookupId);
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
if (maxDepth !== undefined && current.depth >= maxDepth) {
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
309
|
-
if (expanded.has(lookupId)) {
|
|
310
|
-
continue;
|
|
311
|
-
}
|
|
312
|
-
expanded.add(lookupId);
|
|
313
|
-
for (const dependency of item.dependencies) {
|
|
314
|
-
edgeKeys.add(`${lookupId}::${dependency.id.trim().toLowerCase()}::${dependency.kind}`);
|
|
315
|
-
pending.push({ id: dependency.id, depth: current.depth + 1 });
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
return {
|
|
319
|
-
node_count: nodeIds.size,
|
|
320
|
-
edge_count: edgeKeys.size,
|
|
321
|
-
edge_basis: "deduplicated_directed",
|
|
322
|
-
missing_count: missingIds.size,
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
/** Parse CLI-compatible deps context options once for packet and closure parity. */
|
|
326
|
-
function parseDepsContextOptions(options, registry = createRelationshipKindRegistry()) {
|
|
327
|
-
const maxDepth = parseMaxDepth(options.maxDepth);
|
|
328
|
-
const nodeLimit = parsePositiveInteger(options.nodeLimit, "node-limit");
|
|
329
|
-
const edgeLimit = parsePositiveInteger(options.edgeLimit, "edge-limit");
|
|
330
|
-
const tokenBudget = parsePositiveInteger(options.tokenBudget, "token-budget");
|
|
331
|
-
const kinds = parseKinds(options.kind, registry);
|
|
332
|
-
return {
|
|
333
|
-
direction: parseDirection(options.direction),
|
|
334
|
-
...(kinds === undefined ? {} : { kinds }),
|
|
335
|
-
...(maxDepth === undefined ? {} : { maxDepth }),
|
|
336
|
-
...(nodeLimit === undefined ? {} : { nodeLimit }),
|
|
337
|
-
...(edgeLimit === undefined ? {} : { edgeLimit }),
|
|
338
|
-
...(tokenBudget === undefined ? {} : { tokenBudget }),
|
|
339
|
-
...(options.cursor?.trim() ? { cursor: options.cursor.trim() } : {}),
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
/** Build one bounded context packet from an assembled deps relationship graph. */
|
|
343
|
-
function buildContextFromAssembly(assembly, rootId, options, rootEvidence) {
|
|
344
|
-
return buildRelationshipContext(assembly.graph, rootId, assembly.details.map((detail) => detail.id === rootId && rootEvidence.length > 0
|
|
345
|
-
? { ...detail, evidence: rootEvidence }
|
|
346
|
-
: detail), options);
|
|
347
|
-
}
|
|
348
|
-
/** Build the SDK-backed bounded relationship-context projection for deps. */
|
|
349
|
-
export function buildDepsRelationshipContext(rootId, items, options, rootEvidence = []) {
|
|
350
|
-
const assembly = assembleWorkspaceRelationshipGraph(items);
|
|
351
|
-
return buildContextFromAssembly(assembly, rootId, parseDepsContextOptions(options, assembly.graph.registry()), rootEvidence);
|
|
352
|
-
}
|
|
353
|
-
/** Append up to `limit` labeled pointers from one linked collection. */
|
|
354
|
-
function appendEvidencePointers(evidence, label, values, limit) {
|
|
355
|
-
for (const value of values.slice(0, limit)) {
|
|
356
|
-
const trimmed = value?.trim();
|
|
357
|
-
if (trimmed)
|
|
358
|
-
evidence.push(`${label}:${trimmed}`);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Load bounded root evidence pointers (linked files, tests, docs, and
|
|
363
|
-
* annotation counts) so the context packet answers "where is the proof"
|
|
364
|
-
* without a follow-up item read.
|
|
365
|
-
*/
|
|
366
|
-
async function collectRootEvidence(pmRoot, id, settings, typeToFolder) {
|
|
367
|
-
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);
|
|
368
|
-
// The caller already resolved the root against the light index, so a miss
|
|
369
|
-
// can only happen when storage mutates mid-read; degrade to no evidence.
|
|
370
|
-
/* c8 ignore start -- defensive: unreachable without a concurrent delete between the index scan and this read. */
|
|
371
|
-
if (!located)
|
|
372
|
-
return [];
|
|
373
|
-
/* c8 ignore stop */
|
|
374
|
-
const { document } = await readLocatedItem(located, {
|
|
375
|
-
schema: settings.schema,
|
|
376
|
-
});
|
|
377
|
-
const metadata = document.metadata;
|
|
378
|
-
const files = metadata.files ?? [];
|
|
379
|
-
const tests = metadata.tests ?? [];
|
|
380
|
-
const docs = metadata.docs ?? [];
|
|
381
|
-
const counts = [
|
|
382
|
-
["files", files.length],
|
|
383
|
-
["tests", tests.length],
|
|
384
|
-
["docs", docs.length],
|
|
385
|
-
["comments", (metadata.comments ?? []).length],
|
|
386
|
-
["notes", (metadata.notes ?? []).length],
|
|
387
|
-
["learnings", (metadata.learnings ?? []).length],
|
|
388
|
-
];
|
|
389
|
-
if (counts.every(([, count]) => count === 0))
|
|
390
|
-
return [];
|
|
391
|
-
const evidence = [
|
|
392
|
-
`linked:${counts.map(([key, count]) => `${key}=${count}`).join(",")}`,
|
|
393
|
-
];
|
|
394
|
-
appendEvidencePointers(evidence, "file", files.map((file) => file.path), 3);
|
|
395
|
-
appendEvidencePointers(evidence, "test", tests.map((test) => test.command ?? test.path), 2);
|
|
396
|
-
appendEvidencePointers(evidence, "doc", docs.map((doc) => doc.path), 2);
|
|
397
|
-
return evidence;
|
|
398
|
-
}
|
|
399
|
-
function createContextDepsResult(params) {
|
|
400
|
-
const { canonicalId, context, missingCount, missingReferences, referenceLimit, summaryOnly, } = params;
|
|
401
|
-
return {
|
|
402
|
-
id: canonicalId,
|
|
403
|
-
format: "context",
|
|
404
|
-
node_count: context.nodes.length + 1,
|
|
405
|
-
edge_count: context.edges.length,
|
|
406
|
-
edge_basis: "deduplicated_directed",
|
|
407
|
-
missing_count: missingCount,
|
|
408
|
-
missing_scope: "traversal",
|
|
409
|
-
missing_reference_count: missingReferences.length,
|
|
410
|
-
...(summaryOnly
|
|
411
|
-
? {}
|
|
412
|
-
: {
|
|
413
|
-
missing_references: missingReferences.slice(0, referenceLimit),
|
|
414
|
-
context,
|
|
415
|
-
}),
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
function includesContextMissingReference(params) {
|
|
419
|
-
const { row, missingReachableSet, packetIds, filteredKinds, registry } = params;
|
|
420
|
-
if (row.no_active_blocker_sentinel ||
|
|
421
|
-
!missingReachableSet.has(row.target_id.trim().toLowerCase()) ||
|
|
422
|
-
!packetIds.has(row.holder_id)) {
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
|
-
if (filteredKinds === undefined)
|
|
426
|
-
return true;
|
|
427
|
-
const definition = registry.resolve(row.kind);
|
|
428
|
-
return (definition !== undefined &&
|
|
429
|
-
(filteredKinds.has(definition.kind) ||
|
|
430
|
-
(definition.inverse !== undefined &&
|
|
431
|
-
filteredKinds.has(definition.inverse))));
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Settle a token count embedded in the payload whose rendered size it
|
|
435
|
-
* describes. The mapping can only change when the decimal digit width changes,
|
|
436
|
-
* so repeatedly embedding the measured value reaches a stable fixed point.
|
|
437
|
-
*/
|
|
438
|
-
function settleRenderedTokenCount(result, outputFormat, assign) {
|
|
439
|
-
let embeddedTokens;
|
|
440
|
-
for (;;) {
|
|
441
|
-
const measuredTokens = estimatePmOutputTokens(new TextEncoder().encode(formatBuiltInOutput(attachOutputOmissionReceipt("deps", result), outputFormat)).byteLength);
|
|
442
|
-
if (measuredTokens === embeddedTokens)
|
|
443
|
-
return measuredTokens;
|
|
444
|
-
assign(measuredTokens);
|
|
445
|
-
embeddedTokens = measuredTokens;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
/** Identify the context packer's controlled signal that no smaller packet fits. */
|
|
449
|
-
function isContextBudgetFloorError(error) {
|
|
450
|
-
return (error instanceof TypeError &&
|
|
451
|
-
error.message.startsWith("Relationship context tokenBudget cannot fit "));
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Build one progressively smaller context packet, returning the last rendered
|
|
455
|
-
* result when the context packer reports that no smaller structural packet fits.
|
|
456
|
-
*/
|
|
457
|
-
function buildContextAtRenderedBudget(params) {
|
|
458
|
-
try {
|
|
459
|
-
return buildContextFromAssembly(params.assembly, params.canonicalId, {
|
|
460
|
-
...params.contextOptions,
|
|
461
|
-
...(params.internalTokenBudget === undefined
|
|
462
|
-
? {}
|
|
463
|
-
: { tokenBudget: params.internalTokenBudget }),
|
|
464
|
-
}, params.rootEvidence);
|
|
465
|
-
}
|
|
466
|
-
catch (error) {
|
|
467
|
-
if (params.smallestResult !== undefined &&
|
|
468
|
-
isContextBudgetFloorError(error)) {
|
|
469
|
-
return params.smallestResult;
|
|
470
|
-
}
|
|
471
|
-
throw error;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
function enforceContextRenderedTokenBudget(params) {
|
|
475
|
-
const { assembly, canonicalId, contextOptions, rootEvidence, summaryOnly, outputFormat, missingCount, missingReferences, } = params;
|
|
476
|
-
const referenceLimit = contextOptions.edgeLimit ?? 40;
|
|
477
|
-
let emittedReferenceLimit = referenceLimit;
|
|
478
|
-
let internalTokenBudget = contextOptions.tokenBudget;
|
|
479
|
-
let requestedTokenBudget;
|
|
480
|
-
let smallestResult;
|
|
481
|
-
for (;;) {
|
|
482
|
-
const contextOrFloor = buildContextAtRenderedBudget({
|
|
483
|
-
assembly,
|
|
484
|
-
canonicalId,
|
|
485
|
-
contextOptions,
|
|
486
|
-
internalTokenBudget,
|
|
487
|
-
rootEvidence,
|
|
488
|
-
smallestResult,
|
|
489
|
-
});
|
|
490
|
-
if ("format" in contextOrFloor)
|
|
491
|
-
return contextOrFloor;
|
|
492
|
-
const context = contextOrFloor;
|
|
493
|
-
requestedTokenBudget ??= context.meta.tokenBudget;
|
|
494
|
-
internalTokenBudget ??= requestedTokenBudget;
|
|
495
|
-
const result = createContextDepsResult({
|
|
496
|
-
canonicalId,
|
|
497
|
-
context,
|
|
498
|
-
missingCount,
|
|
499
|
-
missingReferences,
|
|
500
|
-
referenceLimit: emittedReferenceLimit,
|
|
501
|
-
summaryOnly,
|
|
502
|
-
});
|
|
503
|
-
smallestResult = result;
|
|
504
|
-
if (summaryOnly)
|
|
505
|
-
return result;
|
|
506
|
-
context.meta.tokenBudget = requestedTokenBudget;
|
|
507
|
-
context.meta.usedTokens = settleRenderedTokenCount(attachDepsProjection(result, false), outputFormat, (tokens) => {
|
|
508
|
-
context.meta.usedTokens = tokens;
|
|
509
|
-
});
|
|
510
|
-
if (context.meta.usedTokens <= requestedTokenBudget)
|
|
511
|
-
return result;
|
|
512
|
-
if (emittedReferenceLimit > 0) {
|
|
513
|
-
emittedReferenceLimit -= 1;
|
|
514
|
-
continue;
|
|
515
|
-
}
|
|
516
|
-
const currentInternalBudget = internalTokenBudget;
|
|
517
|
-
const scaledInternalBudget = (currentInternalBudget * requestedTokenBudget) / context.meta.usedTokens;
|
|
518
|
-
internalTokenBudget = Math.min(currentInternalBudget - 1, Math.max(1, Math.floor(scaledInternalBudget * 0.9)));
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
/** Assemble the context-format deps result with traversal-scoped missing enumeration. */
|
|
522
|
-
function buildContextDepsResult(params) {
|
|
523
|
-
const { assembly, canonicalId, options, rootEvidence, summaryOnly, outputFormat, } = params;
|
|
524
|
-
const contextOptions = parseDepsContextOptions(options, assembly.graph.registry());
|
|
525
|
-
const reachable = assembly.graph.closure(canonicalId, {
|
|
526
|
-
direction: contextOptions.direction,
|
|
527
|
-
...(contextOptions.kinds === undefined
|
|
528
|
-
? {}
|
|
529
|
-
: { kinds: contextOptions.kinds }),
|
|
530
|
-
maxDepth: contextOptions.maxDepth ?? 3,
|
|
531
|
-
});
|
|
532
|
-
const missingReachable = reachable.value.filter((nodeId) => assembly.missingIdSet.has(nodeId.toLowerCase()));
|
|
533
|
-
const missingReachableSet = new Set(missingReachable.map((nodeId) => nodeId.toLowerCase()));
|
|
534
|
-
const relationshipRegistry = assembly.graph.registry();
|
|
535
|
-
const filteredKinds = contextOptions.kinds
|
|
536
|
-
? new Set(contextOptions.kinds.map((kind) => relationshipRegistry.require(kind).kind))
|
|
537
|
-
: undefined;
|
|
538
|
-
const packetIds = new Set([canonicalId, ...reachable.value]);
|
|
539
|
-
const missingReferences = [
|
|
540
|
-
...assembly.dangling.active,
|
|
541
|
-
...assembly.dangling.legacy_terminal,
|
|
542
|
-
].filter((row) => includesContextMissingReference({
|
|
543
|
-
row,
|
|
544
|
-
missingReachableSet,
|
|
545
|
-
packetIds,
|
|
546
|
-
filteredKinds,
|
|
547
|
-
registry: relationshipRegistry,
|
|
548
|
-
}));
|
|
549
|
-
return enforceContextRenderedTokenBudget({
|
|
550
|
-
assembly,
|
|
551
|
-
canonicalId,
|
|
552
|
-
contextOptions,
|
|
553
|
-
rootEvidence,
|
|
554
|
-
summaryOnly,
|
|
555
|
-
outputFormat,
|
|
556
|
-
missingCount: missingReachable.length,
|
|
557
|
-
missingReferences,
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
function trimDeepestDependency(tree) {
|
|
561
|
-
const pending = [tree];
|
|
562
|
-
let parentToTrim;
|
|
563
|
-
while (pending.length > 0) {
|
|
564
|
-
const current = pending.pop();
|
|
565
|
-
if (current.dependencies.length > 0) {
|
|
566
|
-
parentToTrim = current;
|
|
567
|
-
pending.push(...current.dependencies);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
if (!parentToTrim)
|
|
571
|
-
return false;
|
|
572
|
-
parentToTrim.dependencies.pop();
|
|
573
|
-
parentToTrim.truncated = true;
|
|
574
|
-
return true;
|
|
575
|
-
}
|
|
576
|
-
function buildTreeOrGraphDepsResult(id, format, options, index, maxDepth, collapse, outputFormat) {
|
|
577
|
-
const effectiveMaxDepth = maxDepth ?? DEFAULT_DEPS_TREE_MAX_DEPTH;
|
|
578
|
-
const nodeLimit = parsePositiveInteger(options.nodeLimit, "node-limit") ??
|
|
579
|
-
DEFAULT_DEPS_TREE_NODE_LIMIT;
|
|
580
|
-
const edgeLimit = parsePositiveInteger(options.edgeLimit, "edge-limit") ??
|
|
581
|
-
DEFAULT_DEPS_TREE_EDGE_LIMIT;
|
|
582
|
-
const tokenBudget = parsePositiveInteger(options.tokenBudget, "token-budget") ??
|
|
583
|
-
DEFAULT_DEPS_TREE_TOKEN_BUDGET;
|
|
584
|
-
const budget = {
|
|
585
|
-
nodeLimit,
|
|
586
|
-
edgeLimit,
|
|
587
|
-
tokenBudget,
|
|
588
|
-
nodes: 0,
|
|
589
|
-
edges: 0,
|
|
590
|
-
estimatedTokens: 0,
|
|
591
|
-
reasons: new Set(),
|
|
592
|
-
};
|
|
593
|
-
const tree = toTreeNode(id, index, new Set(), effectiveMaxDepth, format === "graph" ? "repeated" : collapse, new Set(), budget);
|
|
594
|
-
const totals = countDependencyGraph(id, index, undefined);
|
|
595
|
-
let result;
|
|
596
|
-
for (;;) {
|
|
597
|
-
const graph = toGraph(tree);
|
|
598
|
-
const truncation = budget.reasons.size === 0
|
|
599
|
-
? undefined
|
|
600
|
-
: {
|
|
601
|
-
reasons: [...budget.reasons].sort(),
|
|
602
|
-
limits: {
|
|
603
|
-
max_depth: effectiveMaxDepth,
|
|
604
|
-
node_limit: nodeLimit,
|
|
605
|
-
edge_limit: edgeLimit,
|
|
606
|
-
token_budget: tokenBudget,
|
|
607
|
-
},
|
|
608
|
-
estimated_tokens: 0,
|
|
609
|
-
total_node_count: totals.node_count,
|
|
610
|
-
total_edge_count: totals.edge_count,
|
|
611
|
-
omitted_node_count: Math.max(0, totals.node_count - graph.nodes.length),
|
|
612
|
-
omitted_edge_count: Math.max(0, totals.edge_count - graph.edges.length),
|
|
613
|
-
};
|
|
614
|
-
const baseResult = {
|
|
615
|
-
id,
|
|
616
|
-
format,
|
|
617
|
-
node_count: graph.nodes.length,
|
|
618
|
-
edge_count: graph.edges.length,
|
|
619
|
-
edge_basis: "deduplicated_directed",
|
|
620
|
-
missing_count: graph.missing_ids.length,
|
|
621
|
-
...(truncation ? { truncation } : {}),
|
|
622
|
-
};
|
|
623
|
-
result =
|
|
624
|
-
format === "tree" ? { ...baseResult, tree } : { ...baseResult, graph };
|
|
625
|
-
const settledTokens = result.truncation === undefined
|
|
626
|
-
? estimatePmOutputTokens(new TextEncoder().encode(formatBuiltInOutput(attachOutputOmissionReceipt("deps", attachDepsProjection(result, false)), outputFormat)).byteLength)
|
|
627
|
-
: settleRenderedTokenCount(attachDepsProjection(result, false), outputFormat, (tokens) => {
|
|
628
|
-
result.truncation.estimated_tokens = tokens;
|
|
629
|
-
});
|
|
630
|
-
if (settledTokens <= tokenBudget) {
|
|
631
|
-
return result;
|
|
632
|
-
}
|
|
633
|
-
if (!trimDeepestDependency(tree)) {
|
|
634
|
-
budget.reasons.add("token_budget");
|
|
635
|
-
return result;
|
|
636
|
-
}
|
|
637
|
-
budget.reasons.add("token_budget");
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
function attachDepsProjection(result, summaryOnly, legacyAliasCounts = {}) {
|
|
641
|
-
const group = {
|
|
642
|
-
name: result.format === "tree"
|
|
643
|
-
? "dependency_tree"
|
|
644
|
-
: result.format === "graph"
|
|
645
|
-
? "dependency_graph"
|
|
646
|
-
: "relationship_context",
|
|
647
|
-
restore_with: "--full",
|
|
648
|
-
};
|
|
649
|
-
return {
|
|
650
|
-
...result,
|
|
651
|
-
legacy_alias_counts: legacyAliasCounts,
|
|
652
|
-
projection: {
|
|
653
|
-
mode: summaryOnly ? "summary" : "full",
|
|
654
|
-
declared_field_groups: [group],
|
|
655
|
-
included_field_groups: summaryOnly ? [] : [group.name],
|
|
656
|
-
},
|
|
657
|
-
};
|
|
658
|
-
}
|
|
659
|
-
/** Implements run deps for the public runtime surface of this module. */
|
|
660
|
-
export async function runDeps(id, options, global) {
|
|
661
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
662
|
-
await assertInitializedTracker(pmRoot);
|
|
663
|
-
const format = parseFormat(options.format);
|
|
664
|
-
const maxDepth = parseMaxDepth(options.maxDepth);
|
|
665
|
-
const collapse = parseCollapse(options.collapse);
|
|
666
|
-
assertProjectionModeChoice(options.summary === true, options.full === true, "--summary");
|
|
667
|
-
const summaryOnly = options.summary === true;
|
|
668
|
-
const settings = await readSettings(pmRoot);
|
|
669
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
670
|
-
const items = await listAllItemMetadataLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);
|
|
671
|
-
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
672
|
-
const index = new Map(items.map((item) => [item.id.trim().toLowerCase(), toIndexedItem(item)]));
|
|
673
|
-
const dangling = collectDanglingDependencyReferences(items, (status) => isTerminalStatus(status, statusRegistry));
|
|
674
|
-
for (const reference of [...dangling.active, ...dangling.legacy_terminal]) {
|
|
675
|
-
const holder = index.get(reference.holder_id.trim().toLowerCase());
|
|
676
|
-
const referenceKind = reference.kind.trim().toLowerCase();
|
|
677
|
-
if (holder &&
|
|
678
|
-
!holder.dependencies.some((dependency) => dependency.id.trim().toLowerCase() ===
|
|
679
|
-
reference.target_id.trim().toLowerCase() &&
|
|
680
|
-
dependency.kind === referenceKind)) {
|
|
681
|
-
holder.dependencies.push({
|
|
682
|
-
id: reference.target_id,
|
|
683
|
-
kind: referenceKind,
|
|
684
|
-
});
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
if (!index.has(id.trim().toLowerCase())) {
|
|
688
|
-
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
689
|
-
}
|
|
690
|
-
if (format === "context") {
|
|
691
|
-
const canonicalId = index.get(id.trim().toLowerCase()).id;
|
|
692
|
-
const rootEvidence = summaryOnly
|
|
693
|
-
? []
|
|
694
|
-
: await collectRootEvidence(pmRoot, canonicalId, settings, typeRegistry.type_to_folder);
|
|
695
|
-
const isTerminal = (status) => isTerminalStatus(status, statusRegistry);
|
|
696
|
-
const relationshipRegistry = resolveWorkspaceRelationshipKindRegistry();
|
|
697
|
-
// Reuse the fingerprint-keyed shared cache so bounded context packets in
|
|
698
|
-
// long-lived hosts stop paying full-workspace assembly on every call.
|
|
699
|
-
const lookup = workspaceGraphCache().lookup(pmRoot, computeWorkspaceGraphFingerprint(items, isTerminal, relationshipRegistry), () => assembleWorkspaceRelationshipGraph(items, isTerminal, relationshipRegistry));
|
|
700
|
-
return attachDepsProjection(buildContextDepsResult({
|
|
701
|
-
assembly: lookup.assembly,
|
|
702
|
-
canonicalId,
|
|
703
|
-
options,
|
|
704
|
-
rootEvidence,
|
|
705
|
-
summaryOnly,
|
|
706
|
-
outputFormat: global.json === true ? "json" : "toon",
|
|
707
|
-
}), summaryOnly, lookup.assembly.legacyAliasCounts);
|
|
708
|
-
}
|
|
709
|
-
if (summaryOnly) {
|
|
710
|
-
return attachDepsProjection({
|
|
711
|
-
id,
|
|
712
|
-
format,
|
|
713
|
-
...countDependencyGraph(id, index, maxDepth),
|
|
714
|
-
}, true, Object.fromEntries(Object.entries(assembleWorkspaceRelationshipGraph(items, (status) => isTerminalStatus(status, statusRegistry)).legacyAliasCounts)));
|
|
715
|
-
}
|
|
716
|
-
return attachDepsProjection(buildTreeOrGraphDepsResult(id, format, options, index, maxDepth, collapse, global.json === true ? "json" : "toon"), false, Object.fromEntries(Object.entries(assembleWorkspaceRelationshipGraph(items, (status) => isTerminalStatus(status, statusRegistry)).legacyAliasCounts)));
|
|
717
|
-
}
|
|
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]="2f2a7df8-9c95-5ed1-bd43-33dde57dd7f0")}catch(e2){}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{getActiveExtensionRegistrations}from"../core/extensions/index.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isTerminalStatus}from"../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{formatBuiltInOutput}from"../core/output/output.js";import{listAllItemMetadataLight,locateItem,readLocatedItem}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{estimatePmOutputTokens}from"./cli-contracts/agent-output-contracts.js";import{assertProjectionModeChoice,attachOutputOmissionReceipt}from"./output-projection.js";import{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,resolveWorkspaceRelationshipKindRegistry}from"./graph/assembly.js";import{computeWorkspaceGraphFingerprint,workspaceGraphCache}from"./graph/cache.js";import{buildRelationshipContext}from"./relationship-context.js";import{createRelationshipKindRegistry}from"./relationships.js";const DEPS_FORMAT_VALUES=["tree","graph","context"];const DEPS_COLLAPSE_VALUES=["none","repeated"];const DEPS_DIRECTION_VALUES=["outgoing","incoming","both"];const DEFAULT_DEPS_TREE_MAX_DEPTH=32;const DEFAULT_DEPS_TREE_NODE_LIMIT=200;const DEFAULT_DEPS_TREE_EDGE_LIMIT=400;const DEFAULT_DEPS_TREE_TOKEN_BUDGET=16e3;function parseFormat(raw){const candidate=raw?.trim().toLowerCase()??"tree";if(DEPS_FORMAT_VALUES.includes(candidate)){return candidate}throw new PmCliError(`Invalid --format value "${raw}". Use "tree", "graph", or "context".`,EXIT_CODE.USAGE)}function parsePositiveInteger(raw,flag){if(raw===void 0)return void 0;const value=typeof raw==="number"?raw:Number(raw.trim());if(!Number.isInteger(value)||value<1)throw new PmCliError(`Invalid --${flag} value "${raw}". Use a positive integer.`,EXIT_CODE.USAGE);return value}function parseMaxDepth(raw){if(raw===void 0){return void 0}const normalized=typeof raw==="number"?raw:Number(raw.trim());if(!Number.isInteger(normalized)||normalized<0){throw new PmCliError(`Invalid --max-depth value "${raw}". Use a non-negative integer.`,EXIT_CODE.USAGE)}return normalized}function parseCollapse(raw){const candidate=raw?.trim().toLowerCase()??"none";if(DEPS_COLLAPSE_VALUES.includes(candidate)){return candidate}throw new PmCliError(`Invalid --collapse value "${raw}". Use "none" or "repeated".`,EXIT_CODE.USAGE)}function parseDirection(raw){const candidate=raw?.trim().toLowerCase()??"both";if(DEPS_DIRECTION_VALUES.includes(candidate)){return candidate}throw new PmCliError(`Invalid --direction value "${raw}". Use "outgoing", "incoming", or "both".`,EXIT_CODE.USAGE)}function parseKinds(raw,registry=createRelationshipKindRegistry()){if(raw===void 0)return void 0;const values=(Array.isArray(raw)?raw:[raw]).flatMap(value=>value.split(",")).map(value=>value.trim()).filter(value=>value.length>0);if(values.length===0)return void 0;const kinds=new Set;for(const value of values){const definition=registry.resolve(value);if(!definition){const known=registry.list().map(entry=>entry.kind).join(", ");throw new PmCliError(`Invalid --kind value "${value}". Registered kinds: ${known}.`,EXIT_CODE.USAGE)}kinds.add(definition.kind)}return[...kinds].sort()}function normalizeDependencies(dependencies){if(!dependencies||dependencies.length===0){return[]}const sorted=dependencies.map(({id,kind})=>({id:id.trim(),kind:kind.trim().toLowerCase()})).sort((left,right)=>{const byKind=left.kind.localeCompare(right.kind);if(byKind!==0)return byKind;return left.id.localeCompare(right.id)});const deduped=new Map;for(const dependency of sorted){const key=`${dependency.kind.toLowerCase()}::${dependency.id.toLowerCase()}`;if(!deduped.has(key)){deduped.set(key,{id:dependency.id,kind:dependency.kind})}}return[...deduped.values()]}function toIndexedItem(item){return{id:item.id,title:item.title,type:item.type,status:item.status,dependencies:normalizeDependencies(item.dependencies)}}function estimateTreeNodeTokens(node){return estimatePmOutputTokens(new TextEncoder().encode(JSON.stringify({...node,dependencies:void 0})).byteLength)}function appendTreeDependencies(baseNode,item,index,nextLineage,maxDepth,collapse,expanded,budget,depth){for(const dependency of item.dependencies){const edgeTokens=Math.max(1,Math.ceil(JSON.stringify({from:baseNode.id,to:dependency.id,kind:dependency.kind}).length/3));if(budget.nodes>=budget.nodeLimit){baseNode.truncated=true;budget.reasons.add("node_limit");break}if(budget.edges>=budget.edgeLimit){baseNode.truncated=true;budget.reasons.add("edge_limit");break}if(budget.estimatedTokens+edgeTokens>=budget.tokenBudget){baseNode.truncated=true;budget.reasons.add("token_budget");break}budget.edges+=1;budget.estimatedTokens+=edgeTokens;baseNode.dependencies.push(toTreeNode(dependency.id,index,nextLineage,maxDepth,collapse,expanded,budget,depth+1,dependency.kind))}}function shouldStopTreeNodeExpansion(node,item,lookupId,maxDepth,collapse,expanded,budget,depth){if(budget.estimatedTokens>=budget.tokenBudget&&item?.dependencies.length){node.truncated=true;budget.reasons.add("token_budget");return true}if(!item||node.cycle){return true}if(maxDepth!==void 0&&depth>=maxDepth){if(item.dependencies.length>0){node.truncated=true;budget.reasons.add("max_depth")}return true}if(collapse==="repeated"&&expanded.has(lookupId)){node.collapsed=true;return true}return false}function toTreeNode(id,index,lineage,maxDepth,collapse,expanded,budget,depth=0,via){const lookupId=id.trim().toLowerCase();const item=index.get(lookupId);const baseNode={id:item?.id??id,title:item?.title,type:item?.type,status:item?.status,via,missing:!item,cycle:lineage.has(lookupId),dependencies:[]};budget.nodes+=1;budget.estimatedTokens+=estimateTreeNodeTokens(baseNode);if(shouldStopTreeNodeExpansion(baseNode,item,lookupId,maxDepth,collapse,expanded,budget,depth)){return baseNode}if(collapse==="repeated"){expanded.add(lookupId)}const nextLineage=new Set(lineage);nextLineage.add(lookupId);appendTreeDependencies(baseNode,item,index,nextLineage,maxDepth,collapse,expanded,budget,depth);return baseNode}function mergeGraphNode(existing,candidate){if(!existing){return candidate}if(existing.missing&&!candidate.missing)return candidate;return{...existing,title:existing.title??candidate.title,type:existing.type??candidate.type,status:existing.status??candidate.status}}function toGraph(root){const nodesById=new Map;const edgesByKey=new Map;const pending=[root];while(pending.length>0){const node=pending.pop();nodesById.set(node.id,mergeGraphNode(nodesById.get(node.id),{id:node.id,title:node.title,type:node.type,status:node.status,missing:node.missing}));for(const child of node.dependencies){nodesById.set(child.id,mergeGraphNode(nodesById.get(child.id),{id:child.id,title:child.title,type:child.type,status:child.status,missing:child.missing}));const relationKind=child.via??"related";const edgeKey=`${node.id}::${child.id}::${relationKind}`;if(!edgesByKey.has(edgeKey)){edgesByKey.set(edgeKey,{from:node.id,to:child.id,kind:relationKind})}if(!child.cycle){pending.push(child)}}}const nodes=[...nodesById.values()].sort((left,right)=>left.id.localeCompare(right.id));const edges=[...edgesByKey.values()].sort((left,right)=>{const byFrom=left.from.localeCompare(right.from);if(byFrom!==0)return byFrom;const byTo=left.to.localeCompare(right.to);if(byTo!==0)return byTo;return left.kind.localeCompare(right.kind)});const missingIds=nodes.filter(node=>node.missing).map(node=>node.id);return{root_id:root.id,nodes,edges,missing_ids:missingIds}}function countDependencyGraph(rootId,index,maxDepth){const nodeIds=new Set;const edgeKeys=new Set;const missingIds=new Set;const expanded=new Set;const pending=[{id:rootId,depth:0}];let pendingIndex=0;while(pendingIndex<pending.length){const current=pending[pendingIndex++];const lookupId=current.id.trim().toLowerCase();nodeIds.add(lookupId);const item=index.get(lookupId);if(!item){missingIds.add(lookupId);continue}if(maxDepth!==void 0&¤t.depth>=maxDepth){continue}if(expanded.has(lookupId)){continue}expanded.add(lookupId);for(const dependency of item.dependencies){edgeKeys.add(`${lookupId}::${dependency.id.trim().toLowerCase()}::${dependency.kind}`);pending.push({id:dependency.id,depth:current.depth+1})}}return{node_count:nodeIds.size,edge_count:edgeKeys.size,edge_basis:"deduplicated_directed",missing_count:missingIds.size}}function parseDepsContextOptions(options,registry=createRelationshipKindRegistry()){const maxDepth=parseMaxDepth(options.maxDepth);const nodeLimit=parsePositiveInteger(options.nodeLimit,"node-limit");const edgeLimit=parsePositiveInteger(options.edgeLimit,"edge-limit");const tokenBudget=parsePositiveInteger(options.tokenBudget,"token-budget");const kinds=parseKinds(options.kind,registry);return{direction:parseDirection(options.direction),...kinds===void 0?{}:{kinds},...maxDepth===void 0?{}:{maxDepth},...nodeLimit===void 0?{}:{nodeLimit},...edgeLimit===void 0?{}:{edgeLimit},...tokenBudget===void 0?{}:{tokenBudget},...options.cursor?.trim()?{cursor:options.cursor.trim()}:{}}}function buildContextFromAssembly(assembly,rootId,options,rootEvidence){return buildRelationshipContext(assembly.graph,rootId,assembly.details.map(detail=>detail.id===rootId&&rootEvidence.length>0?{...detail,evidence:rootEvidence}:detail),options)}function buildDepsRelationshipContext(rootId,items,options,rootEvidence=[]){const assembly=assembleWorkspaceRelationshipGraph(items);return buildContextFromAssembly(assembly,rootId,parseDepsContextOptions(options,assembly.graph.registry()),rootEvidence)}function appendEvidencePointers(evidence,label,values,limit){for(const value of values.slice(0,limit)){const trimmed=value?.trim();if(trimmed)evidence.push(`${label}:${trimmed}`)}}async function collectRootEvidence(pmRoot,id,settings,typeToFolder){const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeToFolder);if(!located)return[];const{document}=await readLocatedItem(located,{schema:settings.schema});const metadata=document.metadata;const files=metadata.files??[];const tests=metadata.tests??[];const docs=metadata.docs??[];const counts=[["files",files.length],["tests",tests.length],["docs",docs.length],["comments",(metadata.comments??[]).length],["notes",(metadata.notes??[]).length],["learnings",(metadata.learnings??[]).length]];if(counts.every(([,count])=>count===0))return[];const evidence=[`linked:${counts.map(([key,count])=>`${key}=${count}`).join(",")}`];appendEvidencePointers(evidence,"file",files.map(file=>file.path),3);appendEvidencePointers(evidence,"test",tests.map(test=>test.command??test.path),2);appendEvidencePointers(evidence,"doc",docs.map(doc=>doc.path),2);return evidence}function createContextDepsResult(params){const{canonicalId,context,missingCount,missingReferences,referenceLimit,summaryOnly}=params;return{id:canonicalId,format:"context",node_count:context.nodes.length+1,edge_count:context.edges.length,edge_basis:"deduplicated_directed",missing_count:missingCount,missing_scope:"traversal",missing_reference_count:missingReferences.length,...summaryOnly?{}:{missing_references:missingReferences.slice(0,referenceLimit),context}}}function includesContextMissingReference(params){const{row,missingReachableSet,packetIds,filteredKinds,registry}=params;if(row.no_active_blocker_sentinel||!missingReachableSet.has(row.target_id.trim().toLowerCase())||!packetIds.has(row.holder_id)){return false}if(filteredKinds===void 0)return true;const definition=registry.resolve(row.kind);return definition!==void 0&&(filteredKinds.has(definition.kind)||definition.inverse!==void 0&&filteredKinds.has(definition.inverse))}function settleRenderedTokenCount(result,outputFormat,assign){let embeddedTokens;for(;;){const measuredTokens=estimatePmOutputTokens(new TextEncoder().encode(formatBuiltInOutput(attachOutputOmissionReceipt("deps",result),outputFormat)).byteLength);if(measuredTokens===embeddedTokens)return measuredTokens;assign(measuredTokens);embeddedTokens=measuredTokens}}function isContextBudgetFloorError(error){return error instanceof TypeError&&error.message.startsWith("Relationship context tokenBudget cannot fit ")}function buildContextAtRenderedBudget(params){try{return buildContextFromAssembly(params.assembly,params.canonicalId,{...params.contextOptions,...params.internalTokenBudget===void 0?{}:{tokenBudget:params.internalTokenBudget}},params.rootEvidence)}catch(error){if(params.smallestResult!==void 0&&isContextBudgetFloorError(error)){return params.smallestResult}throw error}}function enforceContextRenderedTokenBudget(params){const{assembly,canonicalId,contextOptions,rootEvidence,summaryOnly,outputFormat,missingCount,missingReferences}=params;const referenceLimit=contextOptions.edgeLimit??40;let emittedReferenceLimit=referenceLimit;let internalTokenBudget=contextOptions.tokenBudget;let requestedTokenBudget;let smallestResult;for(;;){const contextOrFloor=buildContextAtRenderedBudget({assembly,canonicalId,contextOptions,internalTokenBudget,rootEvidence,smallestResult});if("format"in contextOrFloor)return contextOrFloor;const context=contextOrFloor;requestedTokenBudget??=context.meta.tokenBudget;internalTokenBudget??=requestedTokenBudget;const result=createContextDepsResult({canonicalId,context,missingCount,missingReferences,referenceLimit:emittedReferenceLimit,summaryOnly});smallestResult=result;if(summaryOnly)return result;context.meta.tokenBudget=requestedTokenBudget;context.meta.usedTokens=settleRenderedTokenCount(attachDepsProjection(result,false),outputFormat,tokens=>{context.meta.usedTokens=tokens});if(context.meta.usedTokens<=requestedTokenBudget)return result;if(emittedReferenceLimit>0){emittedReferenceLimit-=1;continue}const currentInternalBudget=internalTokenBudget;const scaledInternalBudget=currentInternalBudget*requestedTokenBudget/context.meta.usedTokens;internalTokenBudget=Math.min(currentInternalBudget-1,Math.max(1,Math.floor(scaledInternalBudget*.9)))}}function buildContextDepsResult(params){const{assembly,canonicalId,options,rootEvidence,summaryOnly,outputFormat}=params;const contextOptions=parseDepsContextOptions(options,assembly.graph.registry());const reachable=assembly.graph.closure(canonicalId,{direction:contextOptions.direction,...contextOptions.kinds===void 0?{}:{kinds:contextOptions.kinds},maxDepth:contextOptions.maxDepth??3});const missingReachable=reachable.value.filter(nodeId=>assembly.missingIdSet.has(nodeId.toLowerCase()));const missingReachableSet=new Set(missingReachable.map(nodeId=>nodeId.toLowerCase()));const relationshipRegistry=assembly.graph.registry();const filteredKinds=contextOptions.kinds?new Set(contextOptions.kinds.map(kind=>relationshipRegistry.require(kind).kind)):void 0;const packetIds=new Set([canonicalId,...reachable.value]);const missingReferences=[...assembly.dangling.active,...assembly.dangling.legacy_terminal].filter(row=>includesContextMissingReference({row,missingReachableSet,packetIds,filteredKinds,registry:relationshipRegistry}));return enforceContextRenderedTokenBudget({assembly,canonicalId,contextOptions,rootEvidence,summaryOnly,outputFormat,missingCount:missingReachable.length,missingReferences})}function trimDeepestDependency(tree){const pending=[tree];let parentToTrim;while(pending.length>0){const current=pending.pop();if(current.dependencies.length>0){parentToTrim=current;pending.push(...current.dependencies)}}if(!parentToTrim)return false;parentToTrim.dependencies.pop();parentToTrim.truncated=true;return true}function buildTreeOrGraphDepsResult(id,format,options,index,maxDepth,collapse,outputFormat){const effectiveMaxDepth=maxDepth??DEFAULT_DEPS_TREE_MAX_DEPTH;const nodeLimit=parsePositiveInteger(options.nodeLimit,"node-limit")??DEFAULT_DEPS_TREE_NODE_LIMIT;const edgeLimit=parsePositiveInteger(options.edgeLimit,"edge-limit")??DEFAULT_DEPS_TREE_EDGE_LIMIT;const tokenBudget=parsePositiveInteger(options.tokenBudget,"token-budget")??DEFAULT_DEPS_TREE_TOKEN_BUDGET;const budget={nodeLimit,edgeLimit,tokenBudget,nodes:0,edges:0,estimatedTokens:0,reasons:new Set};const tree=toTreeNode(id,index,new Set,effectiveMaxDepth,format==="graph"?"repeated":collapse,new Set,budget);const totals=countDependencyGraph(id,index,void 0);let result;for(;;){const graph=toGraph(tree);const truncation=budget.reasons.size===0?void 0:{reasons:[...budget.reasons].sort(),limits:{max_depth:effectiveMaxDepth,node_limit:nodeLimit,edge_limit:edgeLimit,token_budget:tokenBudget},estimated_tokens:0,total_node_count:totals.node_count,total_edge_count:totals.edge_count,omitted_node_count:Math.max(0,totals.node_count-graph.nodes.length),omitted_edge_count:Math.max(0,totals.edge_count-graph.edges.length)};const baseResult={id,format,node_count:graph.nodes.length,edge_count:graph.edges.length,edge_basis:"deduplicated_directed",missing_count:graph.missing_ids.length,...truncation?{truncation}:{}};result=format==="tree"?{...baseResult,tree}:{...baseResult,graph};const settledTokens=result.truncation===void 0?estimatePmOutputTokens(new TextEncoder().encode(formatBuiltInOutput(attachOutputOmissionReceipt("deps",attachDepsProjection(result,false)),outputFormat)).byteLength):settleRenderedTokenCount(attachDepsProjection(result,false),outputFormat,tokens=>{result.truncation.estimated_tokens=tokens});if(settledTokens<=tokenBudget){return result}if(!trimDeepestDependency(tree)){budget.reasons.add("token_budget");return result}budget.reasons.add("token_budget")}}function attachDepsProjection(result,summaryOnly,legacyAliasCounts={}){const group={name:result.format==="tree"?"dependency_tree":result.format==="graph"?"dependency_graph":"relationship_context",restore_with:"--full"};return{...result,legacy_alias_counts:legacyAliasCounts,projection:{mode:summaryOnly?"summary":"full",declared_field_groups:[group],included_field_groups:summaryOnly?[]:[group.name]}}}async function runDeps(id,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const format=parseFormat(options.format);const maxDepth=parseMaxDepth(options.maxDepth);const collapse=parseCollapse(options.collapse);assertProjectionModeChoice(options.summary===true,options.full===true,"--summary");const summaryOnly=options.summary===true;const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const index=new Map(items.map(item=>[item.id.trim().toLowerCase(),toIndexedItem(item)]));const dangling=collectDanglingDependencyReferences(items,status=>isTerminalStatus(status,statusRegistry));for(const reference of[...dangling.active,...dangling.legacy_terminal]){const holder=index.get(reference.holder_id.trim().toLowerCase());const referenceKind=reference.kind.trim().toLowerCase();if(holder&&!holder.dependencies.some(dependency=>dependency.id.trim().toLowerCase()===reference.target_id.trim().toLowerCase()&&dependency.kind===referenceKind)){holder.dependencies.push({id:reference.target_id,kind:referenceKind})}}if(!index.has(id.trim().toLowerCase())){throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND)}if(format==="context"){const canonicalId=index.get(id.trim().toLowerCase()).id;const rootEvidence=summaryOnly?[]:await collectRootEvidence(pmRoot,canonicalId,settings,typeRegistry.type_to_folder);const isTerminal=status=>isTerminalStatus(status,statusRegistry);const relationshipRegistry=resolveWorkspaceRelationshipKindRegistry();const lookup=workspaceGraphCache().lookup(pmRoot,computeWorkspaceGraphFingerprint(items,isTerminal,relationshipRegistry),()=>assembleWorkspaceRelationshipGraph(items,isTerminal,relationshipRegistry));return attachDepsProjection(buildContextDepsResult({assembly:lookup.assembly,canonicalId,options,rootEvidence,summaryOnly,outputFormat:global2.json===true?"json":"toon"}),summaryOnly,lookup.assembly.legacyAliasCounts)}if(summaryOnly){return attachDepsProjection({id,format,...countDependencyGraph(id,index,maxDepth)},true,Object.fromEntries(Object.entries(assembleWorkspaceRelationshipGraph(items,status=>isTerminalStatus(status,statusRegistry)).legacyAliasCounts)))}return attachDepsProjection(buildTreeOrGraphDepsResult(id,format,options,index,maxDepth,collapse,global2.json===true?"json":"toon"),false,Object.fromEntries(Object.entries(assembleWorkspaceRelationshipGraph(items,status=>isTerminalStatus(status,statusRegistry)).legacyAliasCounts)))}export{DEPS_COLLAPSE_VALUES,DEPS_DIRECTION_VALUES,DEPS_FORMAT_VALUES,buildDepsRelationshipContext,parseDirection,parseKinds,parseMaxDepth,parsePositiveInteger,runDeps};
|
|
718
2
|
//# sourceMappingURL=dependencies.js.map
|
|
719
|
-
//# debugId=74a825f3-1301-5dc5-a887-c6ff68f6d7ec
|