@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/files.js
CHANGED
|
@@ -1,536 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/files
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm files 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]="ed504f2b-8b78-5fca-a4a7-7b0709a65533")}catch(e){}}();
|
|
8
|
-
import { assertInitializedTracker } from "./environment/tracker-preflight.js";
|
|
9
|
-
import fs from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { getActiveExtensionRegistrations, hasActiveOnReadHooks, } from "../core/extensions/index.js";
|
|
12
|
-
import { resolveItemTypeRegistry } from "../core/item/type-registry.js";
|
|
13
|
-
import { EXIT_CODE } from "../core/shared/constants.js";
|
|
14
|
-
import { PmCliError } from "../core/shared/errors.js";
|
|
15
|
-
import { locateItem, listAllItemMetadata, mutateItem, readLocatedItem, } from "../core/store/item-store.js";
|
|
16
|
-
import { readItemMetadataDerivedIndexState } from "../core/store/item-metadata-cache.js";
|
|
17
|
-
import { queryLinkedFileMetadataIndex } from "../core/store/item-metadata-query-index.js";
|
|
18
|
-
import { resolvePmRoot, resolveWorkspaceRoot, } from "../core/store/paths.js";
|
|
19
|
-
import { readSettings } from "../core/store/settings.js";
|
|
20
|
-
import { resolveAuthor } from "../core/shared/author.js";
|
|
21
|
-
import { isPathWithinDirectory } from "../core/fs/path-utils.js";
|
|
22
|
-
import { dedupeLinkedArtifacts, normalizeLinkedPath, renameArtifactsResultKey, runLinkedArtifacts, sortLinkedArtifacts, } from "./linked-artifacts.js";
|
|
23
|
-
import { explainSourceTraceability, } from "./traceability/source-traceability.js";
|
|
24
|
-
/** Bounds fuzzy relative-path scanning while preserving full absolute-path discovery. */
|
|
25
|
-
const RELATIVE_REFERENCE_SCAN_MAX_CHARS = 32_768;
|
|
26
|
-
function normalizeCandidatePathForOutput(value) {
|
|
27
|
-
return normalizeLinkedPath(path.normalize(value));
|
|
28
|
-
}
|
|
29
|
-
async function realpathForContainment(inputPath) {
|
|
30
|
-
try {
|
|
31
|
-
return await fs.realpath(inputPath);
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return path.resolve(inputPath);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function linkedFileResolvedKey(linkedFile, projectRoot) {
|
|
38
|
-
const resolvedPath = path.isAbsolute(linkedFile.path)
|
|
39
|
-
? path.resolve(linkedFile.path)
|
|
40
|
-
: path.resolve(projectRoot, linkedFile.path);
|
|
41
|
-
return `${normalizeCandidatePathForOutput(resolvedPath)}::${linkedFile.scope}`;
|
|
42
|
-
}
|
|
43
|
-
function collectTextReferences(value, fieldPath, references) {
|
|
44
|
-
if (typeof value === "string") {
|
|
45
|
-
const trimmed = value.trim();
|
|
46
|
-
if (trimmed.length > 0) {
|
|
47
|
-
references.push({ field: fieldPath, value: trimmed });
|
|
48
|
-
}
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
if (Array.isArray(value)) {
|
|
52
|
-
value.forEach((entry, index) => collectTextReferences(entry, `${fieldPath}[${index}]`, references));
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
if (typeof value === "object" && value !== null) {
|
|
56
|
-
for (const [key, nested] of Object.entries(value)) {
|
|
57
|
-
/* c8 ignore next -- root-level object traversal always carries a non-empty field path in current callers. */
|
|
58
|
-
collectTextReferences(nested, fieldPath ? `${fieldPath}.${key}` : key, references);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function collectItemTextReferences(document) {
|
|
63
|
-
const references = [];
|
|
64
|
-
collectTextReferences(document.metadata, "metadata", references);
|
|
65
|
-
collectTextReferences(document.body, "body", references);
|
|
66
|
-
return references;
|
|
67
|
-
}
|
|
68
|
-
function cleanupPathToken(value) {
|
|
69
|
-
let next = value.trim();
|
|
70
|
-
next = next.replace(/^[`"'<([{]+/u, "");
|
|
71
|
-
next = next.replace(/[`"'>)\]},;!?]+$/u, "");
|
|
72
|
-
next = next.replace(/[.]+$/u, "");
|
|
73
|
-
next = next.replace(/:(?:\d+)(?::\d+)?$/u, "");
|
|
74
|
-
next = next.replace(/[.]+$/u, "");
|
|
75
|
-
return next;
|
|
76
|
-
}
|
|
77
|
-
function extractRawPathReferences(references) {
|
|
78
|
-
const rawReferences = [];
|
|
79
|
-
const absolutePattern = /(?:[A-Za-z]:[\\/]|\/)[^\s"'`<>()[\]{},;]+/gu;
|
|
80
|
-
const relativePattern = /(?:\.{1,2}[\\/])?(?:(?:[A-Za-z0-9_.@-]+[\\/])+[A-Za-z0-9_.@-]+|[A-Za-z0-9_.@-]+\.[A-Za-z0-9][A-Za-z0-9._-]*)/gu;
|
|
81
|
-
for (const reference of references) {
|
|
82
|
-
const seenInField = new Set();
|
|
83
|
-
const boundedRelativeValue = reference.value.slice(0, RELATIVE_REFERENCE_SCAN_MAX_CHARS);
|
|
84
|
-
for (const [pattern, input] of [
|
|
85
|
-
[absolutePattern, reference.value],
|
|
86
|
-
[relativePattern, boundedRelativeValue],
|
|
87
|
-
]) {
|
|
88
|
-
pattern.lastIndex = 0;
|
|
89
|
-
for (const match of input.matchAll(pattern)) {
|
|
90
|
-
const token = cleanupPathToken(match[0]);
|
|
91
|
-
if (!token || seenInField.has(token)) {
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
seenInField.add(token);
|
|
95
|
-
rawReferences.push({ field: reference.field, value: token });
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return rawReferences;
|
|
100
|
-
}
|
|
101
|
-
async function resolveDiscoveredFile(rawPath, workspaceRoot, invocationRoot = workspaceRoot) {
|
|
102
|
-
const absolutePath = path.isAbsolute(rawPath)
|
|
103
|
-
? path.resolve(rawPath)
|
|
104
|
-
: path.resolve(invocationRoot, rawPath);
|
|
105
|
-
let stats;
|
|
106
|
-
try {
|
|
107
|
-
stats = await fs.stat(absolutePath);
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
return undefined;
|
|
111
|
-
}
|
|
112
|
-
if (!stats.isFile()) {
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
const [canonicalProjectRoot, canonicalAbsolutePath] = await Promise.all([
|
|
116
|
-
realpathForContainment(workspaceRoot),
|
|
117
|
-
realpathForContainment(absolutePath),
|
|
118
|
-
]);
|
|
119
|
-
if (isPathWithinDirectory(canonicalProjectRoot, canonicalAbsolutePath)) {
|
|
120
|
-
const relativePath = path.relative(canonicalProjectRoot, canonicalAbsolutePath);
|
|
121
|
-
if (!relativePath ||
|
|
122
|
-
relativePath.startsWith("..") ||
|
|
123
|
-
path.isAbsolute(relativePath)) {
|
|
124
|
-
return undefined;
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
path: normalizeCandidatePathForOutput(relativePath),
|
|
128
|
-
scope: "project",
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
return {
|
|
132
|
-
path: normalizeCandidatePathForOutput(absolutePath),
|
|
133
|
-
scope: "global",
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
async function discoverReferencedFiles(document, workspaceRoot, invocationRoot = workspaceRoot) {
|
|
137
|
-
const existingResolvedKeys = new Set((document.metadata.files ?? []).map((entry) => linkedFileResolvedKey(entry, workspaceRoot)));
|
|
138
|
-
const grouped = new Map();
|
|
139
|
-
const rawReferences = extractRawPathReferences(collectItemTextReferences(document));
|
|
140
|
-
const resolvedByValue = new Map();
|
|
141
|
-
await Promise.all([...new Set(rawReferences.map((reference) => reference.value))].map(async (value) => {
|
|
142
|
-
resolvedByValue.set(value, await resolveDiscoveredFile(value, workspaceRoot, invocationRoot));
|
|
143
|
-
}));
|
|
144
|
-
const resolvedReferences = rawReferences.map((reference) => ({
|
|
145
|
-
reference,
|
|
146
|
-
resolved: resolvedByValue.get(reference.value),
|
|
147
|
-
}));
|
|
148
|
-
for (const { reference, resolved } of resolvedReferences) {
|
|
149
|
-
if (!resolved) {
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
const key = linkedFileResolvedKey(resolved, workspaceRoot);
|
|
153
|
-
const existing = grouped.get(key) ?? {
|
|
154
|
-
path: resolved.path,
|
|
155
|
-
scope: resolved.scope,
|
|
156
|
-
sourceFields: new Set(),
|
|
157
|
-
originalPaths: new Set(),
|
|
158
|
-
sourceCount: 0,
|
|
159
|
-
};
|
|
160
|
-
existing.sourceFields.add(reference.field);
|
|
161
|
-
existing.originalPaths.add(reference.value);
|
|
162
|
-
existing.sourceCount += 1;
|
|
163
|
-
grouped.set(key, existing);
|
|
164
|
-
}
|
|
165
|
-
return [...grouped.entries()]
|
|
166
|
-
.map(([key, entry]) => ({
|
|
167
|
-
path: entry.path,
|
|
168
|
-
scope: entry.scope,
|
|
169
|
-
status: existingResolvedKeys.has(key)
|
|
170
|
-
? "already_linked"
|
|
171
|
-
: "addable",
|
|
172
|
-
source_count: entry.sourceCount,
|
|
173
|
-
source_fields: [...entry.sourceFields].sort((left, right) => left.localeCompare(right)),
|
|
174
|
-
original_paths: [...entry.originalPaths].sort((left, right) => left.localeCompare(right)),
|
|
175
|
-
}))
|
|
176
|
-
.sort((left, right) => {
|
|
177
|
-
const byStatus = left.status.localeCompare(right.status);
|
|
178
|
-
if (byStatus !== 0)
|
|
179
|
-
return byStatus;
|
|
180
|
-
const byPath = left.path.localeCompare(right.path);
|
|
181
|
-
if (byPath !== 0)
|
|
182
|
-
return byPath;
|
|
183
|
-
/* c8 ignore next -- path+status collisions are uncommon in deterministic fixtures. */
|
|
184
|
-
return left.scope.localeCompare(right.scope);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
188
|
-
export const _testOnly = {
|
|
189
|
-
relativeReferenceScanMaxChars: RELATIVE_REFERENCE_SCAN_MAX_CHARS,
|
|
190
|
-
normalizeCandidatePathForOutput,
|
|
191
|
-
realpathForContainment,
|
|
192
|
-
linkedFileResolvedKey,
|
|
193
|
-
collectTextReferences,
|
|
194
|
-
collectItemTextReferences,
|
|
195
|
-
cleanupPathToken,
|
|
196
|
-
extractRawPathReferences,
|
|
197
|
-
resolveDiscoveredFile,
|
|
198
|
-
discoverReferencedFiles,
|
|
199
|
-
};
|
|
200
|
-
/** Implements run files for the public runtime surface of this module. */
|
|
201
|
-
export async function runFiles(id, options, global) {
|
|
202
|
-
const result = await runLinkedArtifacts(id, options, global, {
|
|
203
|
-
metadataKey: "files",
|
|
204
|
-
op: "files_add",
|
|
205
|
-
bareNoun: "file",
|
|
206
|
-
supportsAppendStable: true,
|
|
207
|
-
});
|
|
208
|
-
return renameArtifactsResultKey(result, "files");
|
|
209
|
-
}
|
|
210
|
-
async function normalizeFilesLookupPaths(values, workspaceRoot) {
|
|
211
|
-
const canonicalWorkspaceRoot = await realpathForContainment(workspaceRoot);
|
|
212
|
-
const paths = await Promise.all(values.map(async (value) => {
|
|
213
|
-
const trimmed = value.trim();
|
|
214
|
-
if (!trimmed) {
|
|
215
|
-
throw new PmCliError("Files lookup paths must not be empty.", EXIT_CODE.USAGE);
|
|
216
|
-
}
|
|
217
|
-
if (!path.isAbsolute(trimmed))
|
|
218
|
-
return normalizeLinkedPath(trimmed);
|
|
219
|
-
const canonicalAbsolutePath = await realpathForContainment(trimmed);
|
|
220
|
-
return isPathWithinDirectory(canonicalWorkspaceRoot, canonicalAbsolutePath)
|
|
221
|
-
? normalizeLinkedPath(path.relative(canonicalWorkspaceRoot, canonicalAbsolutePath))
|
|
222
|
-
: normalizeLinkedPath(canonicalAbsolutePath);
|
|
223
|
-
}));
|
|
224
|
-
const uniquePaths = [...new Set(paths)].sort((left, right) => left.localeCompare(right));
|
|
225
|
-
if (uniquePaths.length === 0) {
|
|
226
|
-
throw new PmCliError("Files lookup requires at least one path.", EXIT_CODE.USAGE);
|
|
227
|
-
}
|
|
228
|
-
return uniquePaths;
|
|
229
|
-
}
|
|
230
|
-
function resolveFilesLookupWindow(options) {
|
|
231
|
-
for (const [label, value] of [
|
|
232
|
-
["limit", options.limit],
|
|
233
|
-
["offset", options.offset],
|
|
234
|
-
]) {
|
|
235
|
-
if (value !== undefined && (!Number.isInteger(value) || value < 0)) {
|
|
236
|
-
throw new PmCliError(`Files lookup ${label} must be a non-negative integer.`, EXIT_CODE.USAGE);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
const { offset = 0, limit = 50 } = options;
|
|
240
|
-
return {
|
|
241
|
-
offset: Math.max(0, Math.floor(offset)),
|
|
242
|
-
limit: options.noTruncate ? undefined : Math.max(0, Math.floor(limit)),
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
function projectFilesLookupItem(item) {
|
|
246
|
-
return {
|
|
247
|
-
id: item.id,
|
|
248
|
-
title: item.title,
|
|
249
|
-
type: item.type,
|
|
250
|
-
status: item.status,
|
|
251
|
-
priority: item.priority,
|
|
252
|
-
updated_at: item.updated_at,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
function compareFilesLookupCandidates(left, right) {
|
|
256
|
-
const byPriority = left.item.priority - right.item.priority;
|
|
257
|
-
if (byPriority !== 0)
|
|
258
|
-
return byPriority;
|
|
259
|
-
const byUpdated = right.item.updated_at.localeCompare(left.item.updated_at);
|
|
260
|
-
return byUpdated === 0
|
|
261
|
-
? left.item.id.localeCompare(right.item.id)
|
|
262
|
-
: byUpdated;
|
|
263
|
-
}
|
|
264
|
-
function matchingFilesLookupCandidates(params) {
|
|
265
|
-
return params.metadata
|
|
266
|
-
.map((item) => ({
|
|
267
|
-
item,
|
|
268
|
-
files: (item.files ?? [])
|
|
269
|
-
.filter((file) => params.paths.includes(normalizeLinkedPath(file.path)) &&
|
|
270
|
-
(params.scope === undefined || file.scope === params.scope))
|
|
271
|
-
.sort((left, right) => {
|
|
272
|
-
const byPath = left.path.localeCompare(right.path);
|
|
273
|
-
return byPath === 0 ? left.scope.localeCompare(right.scope) : byPath;
|
|
274
|
-
}),
|
|
275
|
-
}))
|
|
276
|
-
.filter((match) => match.files.length > 0)
|
|
277
|
-
.sort(compareFilesLookupCandidates);
|
|
278
|
-
}
|
|
279
|
-
async function resolveFilesLookupTraceability(params) {
|
|
280
|
-
if (!params.explain)
|
|
281
|
-
return undefined;
|
|
282
|
-
return explainSourceTraceability({
|
|
283
|
-
workspaceRoot: params.workspaceRoot,
|
|
284
|
-
paths: params.paths,
|
|
285
|
-
candidates: params.matching,
|
|
286
|
-
corpus: params.metadata,
|
|
287
|
-
...(params.lineRange ? { lineRange: params.lineRange } : {}),
|
|
288
|
-
...(params.decisionDepth === undefined
|
|
289
|
-
? {}
|
|
290
|
-
: { decisionDepth: params.decisionDepth }),
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
async function queryFilesLookupIndex(params) {
|
|
294
|
-
if ([
|
|
295
|
-
params.strictRead,
|
|
296
|
-
params.noTruncate,
|
|
297
|
-
params.explain,
|
|
298
|
-
hasActiveOnReadHooks(),
|
|
299
|
-
].includes(true)) {
|
|
300
|
-
return null;
|
|
301
|
-
}
|
|
302
|
-
const indexState = await readItemMetadataDerivedIndexState(params.pmRoot, [
|
|
303
|
-
...new Set(Object.values(params.typeToFolder)),
|
|
304
|
-
]);
|
|
305
|
-
if (!indexState)
|
|
306
|
-
return null;
|
|
307
|
-
return queryLinkedFileMetadataIndex({
|
|
308
|
-
pmRoot: params.pmRoot,
|
|
309
|
-
expectedSourceCursor: indexState.source_cursor,
|
|
310
|
-
paths: params.paths,
|
|
311
|
-
scope: params.scope,
|
|
312
|
-
limit: params.limit,
|
|
313
|
-
offset: params.offset,
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
async function queryFilesLookupSource(params) {
|
|
317
|
-
const warnings = [];
|
|
318
|
-
const metadata = await listAllItemMetadata(params.pmRoot, params.settings.item_format, params.typeToFolder, warnings, params.settings.schema);
|
|
319
|
-
const matching = matchingFilesLookupCandidates({
|
|
320
|
-
metadata,
|
|
321
|
-
paths: params.paths,
|
|
322
|
-
scope: params.scope,
|
|
323
|
-
});
|
|
324
|
-
const readWarnings = warnings.filter((warning) => /^item_list_(?:item|directory)_read_failed:/u.test(warning));
|
|
325
|
-
if (params.strictRead && readWarnings.length > 0) {
|
|
326
|
-
throw new PmCliError(`Files lookup could not read every item: ${readWarnings.join("; ")}`, EXIT_CODE.GENERIC_FAILURE);
|
|
327
|
-
}
|
|
328
|
-
const traceability = await resolveFilesLookupTraceability({
|
|
329
|
-
explain: params.explain,
|
|
330
|
-
workspaceRoot: params.workspaceRoot,
|
|
331
|
-
paths: params.paths,
|
|
332
|
-
matching,
|
|
333
|
-
metadata,
|
|
334
|
-
lineRange: params.lineRange,
|
|
335
|
-
decisionDepth: params.decisionDepth,
|
|
336
|
-
});
|
|
337
|
-
const ranked = traceability
|
|
338
|
-
? [...matching].sort((left, right) => {
|
|
339
|
-
const byScore = traceability.explanations.get(right.item.id).score -
|
|
340
|
-
traceability.explanations.get(left.item.id).score;
|
|
341
|
-
if (byScore !== 0)
|
|
342
|
-
return byScore;
|
|
343
|
-
return compareFilesLookupCandidates(left, right);
|
|
344
|
-
})
|
|
345
|
-
: matching;
|
|
346
|
-
const page = ranked.slice(params.offset, params.limit === undefined ? undefined : params.offset + params.limit);
|
|
347
|
-
return {
|
|
348
|
-
paths: params.paths,
|
|
349
|
-
total: matching.length,
|
|
350
|
-
count: page.length,
|
|
351
|
-
offset: params.offset,
|
|
352
|
-
limit: params.limit ?? null,
|
|
353
|
-
has_more: params.offset + page.length < matching.length,
|
|
354
|
-
truncated: params.offset + page.length < matching.length,
|
|
355
|
-
completeness: {
|
|
356
|
-
status: readWarnings.length === 0 ? "complete" : "partial",
|
|
357
|
-
source: "source_scan",
|
|
358
|
-
},
|
|
359
|
-
warnings,
|
|
360
|
-
matches: page.map((match) => ({
|
|
361
|
-
item: projectFilesLookupItem(match.item),
|
|
362
|
-
files: match.files,
|
|
363
|
-
...(traceability
|
|
364
|
-
? { traceability: traceability.explanations.get(match.item.id) }
|
|
365
|
-
: {}),
|
|
366
|
-
})),
|
|
367
|
-
...(traceability ? { traceability_receipt: traceability.receipt } : {}),
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
/** Resolve the pm items that reference one or more source paths. */
|
|
371
|
-
export async function runFilesLookup(options, global) {
|
|
372
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
373
|
-
const workspaceRoot = resolveWorkspaceRoot(pmRoot);
|
|
374
|
-
await assertInitializedTracker(pmRoot);
|
|
375
|
-
const paths = await normalizeFilesLookupPaths(options.paths, workspaceRoot);
|
|
376
|
-
if (options.lineRange && paths.length !== 1) {
|
|
377
|
-
throw new PmCliError("Files lookup line attribution requires exactly one source path.", EXIT_CODE.USAGE);
|
|
378
|
-
}
|
|
379
|
-
const settings = await readSettings(pmRoot);
|
|
380
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
381
|
-
const { offset, limit } = resolveFilesLookupWindow(options);
|
|
382
|
-
const indexed = await queryFilesLookupIndex({
|
|
383
|
-
pmRoot,
|
|
384
|
-
typeToFolder: typeRegistry.type_to_folder,
|
|
385
|
-
paths,
|
|
386
|
-
scope: options.scope,
|
|
387
|
-
limit,
|
|
388
|
-
offset,
|
|
389
|
-
strictRead: options.strictRead === true,
|
|
390
|
-
noTruncate: options.noTruncate === true,
|
|
391
|
-
explain: options.explain === true || options.lineRange !== undefined,
|
|
392
|
-
});
|
|
393
|
-
if (indexed) {
|
|
394
|
-
return {
|
|
395
|
-
paths,
|
|
396
|
-
total: indexed.total,
|
|
397
|
-
count: indexed.matches.length,
|
|
398
|
-
offset,
|
|
399
|
-
limit: limit,
|
|
400
|
-
has_more: offset + indexed.matches.length < indexed.total,
|
|
401
|
-
truncated: offset + indexed.matches.length < indexed.total,
|
|
402
|
-
completeness: { status: "unchecked", source: "index" },
|
|
403
|
-
warnings: [],
|
|
404
|
-
matches: indexed.matches.map((match) => ({
|
|
405
|
-
item: projectFilesLookupItem(match.item),
|
|
406
|
-
files: match.files,
|
|
407
|
-
})),
|
|
408
|
-
};
|
|
409
|
-
}
|
|
410
|
-
return queryFilesLookupSource({
|
|
411
|
-
pmRoot,
|
|
412
|
-
settings,
|
|
413
|
-
typeToFolder: typeRegistry.type_to_folder,
|
|
414
|
-
paths,
|
|
415
|
-
scope: options.scope,
|
|
416
|
-
limit,
|
|
417
|
-
offset,
|
|
418
|
-
strictRead: options.strictRead === true,
|
|
419
|
-
workspaceRoot,
|
|
420
|
-
explain: options.explain === true || options.lineRange !== undefined,
|
|
421
|
-
lineRange: options.lineRange,
|
|
422
|
-
decisionDepth: options.decisionDepth,
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
/** Implements run files discover for the public runtime surface of this module. */
|
|
426
|
-
export async function runFilesDiscover(id, options, global) {
|
|
427
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
428
|
-
const workspaceRoot = resolveWorkspaceRoot(pmRoot);
|
|
429
|
-
await assertInitializedTracker(pmRoot);
|
|
430
|
-
const settings = await readSettings(pmRoot);
|
|
431
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
432
|
-
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
|
|
433
|
-
/* c8 ignore next -- not-found behavior is validated by CLI integration coverage. */
|
|
434
|
-
if (!located) {
|
|
435
|
-
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
436
|
-
}
|
|
437
|
-
const loaded = await readLocatedItem(located, { schema: settings.schema });
|
|
438
|
-
const candidates = await discoverReferencedFiles(loaded.document, workspaceRoot, process.cwd());
|
|
439
|
-
const addableCandidates = candidates.filter((candidate) => candidate.status === "addable");
|
|
440
|
-
const skippedExisting = candidates.filter((candidate) => candidate.status === "already_linked");
|
|
441
|
-
const requestedApply = options.apply === true;
|
|
442
|
-
const note = options.note?.trim() || "discovered from item text";
|
|
443
|
-
if (!requestedApply || addableCandidates.length === 0) {
|
|
444
|
-
const files = loaded.document.metadata.files ?? [];
|
|
445
|
-
return {
|
|
446
|
-
id: located.id,
|
|
447
|
-
files,
|
|
448
|
-
changed: false,
|
|
449
|
-
apply: requestedApply,
|
|
450
|
-
count: files.length,
|
|
451
|
-
candidate_count: candidates.length,
|
|
452
|
-
addable_count: addableCandidates.length,
|
|
453
|
-
added_count: 0,
|
|
454
|
-
skipped_existing_count: skippedExisting.length,
|
|
455
|
-
candidates,
|
|
456
|
-
added: [],
|
|
457
|
-
skipped_existing: skippedExisting,
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
const author = resolveAuthor(options.author, settings.author_default);
|
|
461
|
-
const discoveredAdds = addableCandidates.map((candidate) => ({
|
|
462
|
-
path: candidate.path,
|
|
463
|
-
scope: candidate.scope,
|
|
464
|
-
note,
|
|
465
|
-
}));
|
|
466
|
-
let appliedAdds = [];
|
|
467
|
-
const appliedCandidateIndices = new Set();
|
|
468
|
-
const result = await mutateItem({
|
|
469
|
-
pmRoot,
|
|
470
|
-
settings,
|
|
471
|
-
id,
|
|
472
|
-
op: "files_discover",
|
|
473
|
-
author,
|
|
474
|
-
message: options.message ?? "Discover referenced file links",
|
|
475
|
-
force: options.force,
|
|
476
|
-
mutate(document) {
|
|
477
|
-
const next = [...(document.metadata.files ?? [])];
|
|
478
|
-
const existingResolvedKeys = new Set(next.map((entry) => linkedFileResolvedKey(entry, workspaceRoot)));
|
|
479
|
-
appliedAdds = [];
|
|
480
|
-
appliedCandidateIndices.clear();
|
|
481
|
-
for (const [index, add] of discoveredAdds.entries()) {
|
|
482
|
-
const resolvedKey = linkedFileResolvedKey(add, workspaceRoot);
|
|
483
|
-
/* c8 ignore next -- duplicate-key race paths are exercised in broader CLI race tests. */
|
|
484
|
-
if (existingResolvedKeys.has(resolvedKey)) {
|
|
485
|
-
continue;
|
|
486
|
-
}
|
|
487
|
-
next.push(add);
|
|
488
|
-
existingResolvedKeys.add(resolvedKey);
|
|
489
|
-
appliedAdds.push(add);
|
|
490
|
-
appliedCandidateIndices.add(index);
|
|
491
|
-
}
|
|
492
|
-
const deduped = dedupeLinkedArtifacts(next);
|
|
493
|
-
/* c8 ignore next -- appendStable branch is covered through runFiles command contract tests. */
|
|
494
|
-
const normalized = options.appendStable
|
|
495
|
-
? deduped
|
|
496
|
-
: sortLinkedArtifacts(deduped);
|
|
497
|
-
if (normalized.length > 0) {
|
|
498
|
-
document.metadata.files = normalized;
|
|
499
|
-
}
|
|
500
|
-
else {
|
|
501
|
-
delete document.metadata.files;
|
|
502
|
-
}
|
|
503
|
-
return {
|
|
504
|
-
/* c8 ignore next -- no-op mutation responses may emit empty changedFields for skipped discover batches. */
|
|
505
|
-
changedFields: appliedAdds.length > 0 ? ["files"] : [],
|
|
506
|
-
/* c8 ignore next -- warning emission is exercised by race-aware integration tests. */
|
|
507
|
-
warnings: appliedAdds.length !== discoveredAdds.length
|
|
508
|
-
? [
|
|
509
|
-
`files_discover_skipped_existing:${discoveredAdds.length - appliedAdds.length}`,
|
|
510
|
-
]
|
|
511
|
-
: [],
|
|
512
|
-
};
|
|
513
|
-
},
|
|
514
|
-
});
|
|
515
|
-
const files = result.item.files ?? [];
|
|
516
|
-
const addedResolvedKeys = new Set(appliedAdds.map((entry) => linkedFileResolvedKey(entry, workspaceRoot)));
|
|
517
|
-
const added = files.filter((entry) => addedResolvedKeys.has(linkedFileResolvedKey(entry, workspaceRoot)));
|
|
518
|
-
const skippedDuringApply = addableCandidates.filter((_candidate, index) => !appliedCandidateIndices.has(index));
|
|
519
|
-
const allSkippedExisting = [...skippedExisting, ...skippedDuringApply];
|
|
520
|
-
return {
|
|
521
|
-
id: result.item.id,
|
|
522
|
-
files,
|
|
523
|
-
changed: added.length > 0,
|
|
524
|
-
apply: true,
|
|
525
|
-
count: files.length,
|
|
526
|
-
candidate_count: candidates.length,
|
|
527
|
-
addable_count: addableCandidates.length,
|
|
528
|
-
added_count: added.length,
|
|
529
|
-
skipped_existing_count: allSkippedExisting.length,
|
|
530
|
-
candidates,
|
|
531
|
-
added,
|
|
532
|
-
skipped_existing: allSkippedExisting,
|
|
533
|
-
};
|
|
534
|
-
}
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="573da024-c791-5ff2-b3ee-3529804bab43")}catch(e2){}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,hasActiveOnReadHooks}from"../core/extensions/index.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{locateItem,listAllItemMetadata,mutateItem,readLocatedItem}from"../core/store/item-store.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{queryLinkedFileMetadataIndex}from"../core/store/item-metadata-query-index.js";import{resolvePmRoot,resolveWorkspaceRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{resolveAuthor}from"../core/shared/author.js";import{isPathWithinDirectory}from"../core/fs/path-utils.js";import{dedupeLinkedArtifacts,normalizeLinkedPath,renameArtifactsResultKey,runLinkedArtifacts,sortLinkedArtifacts}from"./linked-artifacts.js";import{explainSourceTraceability}from"./traceability/source-traceability.js";const RELATIVE_REFERENCE_SCAN_MAX_CHARS=32768;function normalizeCandidatePathForOutput(value){return normalizeLinkedPath(path.normalize(value))}async function realpathForContainment(inputPath){try{return await fs.realpath(inputPath)}catch{return path.resolve(inputPath)}}function linkedFileResolvedKey(linkedFile,projectRoot){const resolvedPath=path.isAbsolute(linkedFile.path)?path.resolve(linkedFile.path):path.resolve(projectRoot,linkedFile.path);return`${normalizeCandidatePathForOutput(resolvedPath)}::${linkedFile.scope}`}function collectTextReferences(value,fieldPath,references){if(typeof value==="string"){const trimmed=value.trim();if(trimmed.length>0){references.push({field:fieldPath,value:trimmed})}return}if(Array.isArray(value)){value.forEach((entry,index)=>collectTextReferences(entry,`${fieldPath}[${index}]`,references));return}if(typeof value==="object"&&value!==null){for(const[key,nested]of Object.entries(value)){collectTextReferences(nested,fieldPath?`${fieldPath}.${key}`:key,references)}}}function collectItemTextReferences(document){const references=[];collectTextReferences(document.metadata,"metadata",references);collectTextReferences(document.body,"body",references);return references}function cleanupPathToken(value){let next=value.trim();next=next.replace(/^[`"'<([{]+/u,"");next=next.replace(/[`"'>)\]},;!?]+$/u,"");next=next.replace(/[.]+$/u,"");next=next.replace(/:(?:\d+)(?::\d+)?$/u,"");next=next.replace(/[.]+$/u,"");return next}function extractRawPathReferences(references){const rawReferences=[];const absolutePattern=/(?:[A-Za-z]:[\\/]|\/)[^\s"'`<>()[\]{},;]+/gu;const relativePattern=/(?:\.{1,2}[\\/])?(?:(?:[A-Za-z0-9_.@-]+[\\/])+[A-Za-z0-9_.@-]+|[A-Za-z0-9_.@-]+\.[A-Za-z0-9][A-Za-z0-9._-]*)/gu;for(const reference of references){const seenInField=new Set;const boundedRelativeValue=reference.value.slice(0,RELATIVE_REFERENCE_SCAN_MAX_CHARS);for(const[pattern,input]of[[absolutePattern,reference.value],[relativePattern,boundedRelativeValue]]){pattern.lastIndex=0;for(const match of input.matchAll(pattern)){const token=cleanupPathToken(match[0]);if(!token||seenInField.has(token)){continue}seenInField.add(token);rawReferences.push({field:reference.field,value:token})}}}return rawReferences}async function resolveDiscoveredFile(rawPath,workspaceRoot,invocationRoot=workspaceRoot){const absolutePath=path.isAbsolute(rawPath)?path.resolve(rawPath):path.resolve(invocationRoot,rawPath);let stats;try{stats=await fs.stat(absolutePath)}catch{return void 0}if(!stats.isFile()){return void 0}const[canonicalProjectRoot,canonicalAbsolutePath]=await Promise.all([realpathForContainment(workspaceRoot),realpathForContainment(absolutePath)]);if(isPathWithinDirectory(canonicalProjectRoot,canonicalAbsolutePath)){const relativePath=path.relative(canonicalProjectRoot,canonicalAbsolutePath);if(!relativePath||relativePath.startsWith("..")||path.isAbsolute(relativePath)){return void 0}return{path:normalizeCandidatePathForOutput(relativePath),scope:"project"}}return{path:normalizeCandidatePathForOutput(absolutePath),scope:"global"}}async function discoverReferencedFiles(document,workspaceRoot,invocationRoot=workspaceRoot){const existingResolvedKeys=new Set((document.metadata.files??[]).map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));const grouped=new Map;const rawReferences=extractRawPathReferences(collectItemTextReferences(document));const resolvedByValue=new Map;await Promise.all([...new Set(rawReferences.map(reference=>reference.value))].map(async value=>{resolvedByValue.set(value,await resolveDiscoveredFile(value,workspaceRoot,invocationRoot))}));const resolvedReferences=rawReferences.map(reference=>({reference,resolved:resolvedByValue.get(reference.value)}));for(const{reference,resolved}of resolvedReferences){if(!resolved){continue}const key=linkedFileResolvedKey(resolved,workspaceRoot);const existing=grouped.get(key)??{path:resolved.path,scope:resolved.scope,sourceFields:new Set,originalPaths:new Set,sourceCount:0};existing.sourceFields.add(reference.field);existing.originalPaths.add(reference.value);existing.sourceCount+=1;grouped.set(key,existing)}return[...grouped.entries()].map(([key,entry])=>({path:entry.path,scope:entry.scope,status:existingResolvedKeys.has(key)?"already_linked":"addable",source_count:entry.sourceCount,source_fields:[...entry.sourceFields].sort((left,right)=>left.localeCompare(right)),original_paths:[...entry.originalPaths].sort((left,right)=>left.localeCompare(right))})).sort((left,right)=>{const byStatus=left.status.localeCompare(right.status);if(byStatus!==0)return byStatus;const byPath=left.path.localeCompare(right.path);if(byPath!==0)return byPath;return left.scope.localeCompare(right.scope)})}const _testOnly={relativeReferenceScanMaxChars:RELATIVE_REFERENCE_SCAN_MAX_CHARS,normalizeCandidatePathForOutput,realpathForContainment,linkedFileResolvedKey,collectTextReferences,collectItemTextReferences,cleanupPathToken,extractRawPathReferences,resolveDiscoveredFile,discoverReferencedFiles};async function runFiles(id,options,global2){const result=await runLinkedArtifacts(id,options,global2,{metadataKey:"files",op:"files_add",bareNoun:"file",supportsAppendStable:true});return renameArtifactsResultKey(result,"files")}async function normalizeFilesLookupPaths(values,workspaceRoot){const canonicalWorkspaceRoot=await realpathForContainment(workspaceRoot);const paths=await Promise.all(values.map(async value=>{const trimmed=value.trim();if(!trimmed){throw new PmCliError("Files lookup paths must not be empty.",EXIT_CODE.USAGE)}if(!path.isAbsolute(trimmed))return normalizeLinkedPath(trimmed);const canonicalAbsolutePath=await realpathForContainment(trimmed);return isPathWithinDirectory(canonicalWorkspaceRoot,canonicalAbsolutePath)?normalizeLinkedPath(path.relative(canonicalWorkspaceRoot,canonicalAbsolutePath)):normalizeLinkedPath(canonicalAbsolutePath)}));const uniquePaths=[...new Set(paths)].sort((left,right)=>left.localeCompare(right));if(uniquePaths.length===0){throw new PmCliError("Files lookup requires at least one path.",EXIT_CODE.USAGE)}return uniquePaths}function resolveFilesLookupWindow(options){for(const[label,value]of[["limit",options.limit],["offset",options.offset]]){if(value!==void 0&&(!Number.isInteger(value)||value<0)){throw new PmCliError(`Files lookup ${label} must be a non-negative integer.`,EXIT_CODE.USAGE)}}const{offset=0,limit=50}=options;return{offset:Math.max(0,Math.floor(offset)),limit:options.noTruncate?void 0:Math.max(0,Math.floor(limit))}}function projectFilesLookupItem(item){return{id:item.id,title:item.title,type:item.type,status:item.status,priority:item.priority,updated_at:item.updated_at}}function compareFilesLookupCandidates(left,right){const byPriority=left.item.priority-right.item.priority;if(byPriority!==0)return byPriority;const byUpdated=right.item.updated_at.localeCompare(left.item.updated_at);return byUpdated===0?left.item.id.localeCompare(right.item.id):byUpdated}function matchingFilesLookupCandidates(params){return params.metadata.map(item=>({item,files:(item.files??[]).filter(file=>params.paths.includes(normalizeLinkedPath(file.path))&&(params.scope===void 0||file.scope===params.scope)).sort((left,right)=>{const byPath=left.path.localeCompare(right.path);return byPath===0?left.scope.localeCompare(right.scope):byPath})})).filter(match=>match.files.length>0).sort(compareFilesLookupCandidates)}async function resolveFilesLookupTraceability(params){if(!params.explain)return void 0;return explainSourceTraceability({workspaceRoot:params.workspaceRoot,paths:params.paths,candidates:params.matching,corpus:params.metadata,...params.lineRange?{lineRange:params.lineRange}:{},...params.decisionDepth===void 0?{}:{decisionDepth:params.decisionDepth}})}async function queryFilesLookupIndex(params){if([params.strictRead,params.noTruncate,params.explain,hasActiveOnReadHooks()].includes(true)){return null}const indexState=await readItemMetadataDerivedIndexState(params.pmRoot,[...new Set(Object.values(params.typeToFolder))]);if(!indexState)return null;return queryLinkedFileMetadataIndex({pmRoot:params.pmRoot,expectedSourceCursor:indexState.source_cursor,paths:params.paths,scope:params.scope,limit:params.limit,offset:params.offset})}async function queryFilesLookupSource(params){const warnings=[];const metadata=await listAllItemMetadata(params.pmRoot,params.settings.item_format,params.typeToFolder,warnings,params.settings.schema);const matching=matchingFilesLookupCandidates({metadata,paths:params.paths,scope:params.scope});const readWarnings=warnings.filter(warning=>/^item_list_(?:item|directory)_read_failed:/u.test(warning));if(params.strictRead&&readWarnings.length>0){throw new PmCliError(`Files lookup could not read every item: ${readWarnings.join("; ")}`,EXIT_CODE.GENERIC_FAILURE)}const traceability=await resolveFilesLookupTraceability({explain:params.explain,workspaceRoot:params.workspaceRoot,paths:params.paths,matching,metadata,lineRange:params.lineRange,decisionDepth:params.decisionDepth});const ranked=traceability?[...matching].sort((left,right)=>{const byScore=traceability.explanations.get(right.item.id).score-traceability.explanations.get(left.item.id).score;if(byScore!==0)return byScore;return compareFilesLookupCandidates(left,right)}):matching;const page=ranked.slice(params.offset,params.limit===void 0?void 0:params.offset+params.limit);return{paths:params.paths,total:matching.length,count:page.length,offset:params.offset,limit:params.limit??null,has_more:params.offset+page.length<matching.length,truncated:params.offset+page.length<matching.length,completeness:{status:readWarnings.length===0?"complete":"partial",source:"source_scan"},warnings,matches:page.map(match=>({item:projectFilesLookupItem(match.item),files:match.files,...traceability?{traceability:traceability.explanations.get(match.item.id)}:{}})),...traceability?{traceability_receipt:traceability.receipt}:{}}}async function runFilesLookup(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);const workspaceRoot=resolveWorkspaceRoot(pmRoot);await assertInitializedTracker(pmRoot);const paths=await normalizeFilesLookupPaths(options.paths,workspaceRoot);if(options.lineRange&&paths.length!==1){throw new PmCliError("Files lookup line attribution requires exactly one source path.",EXIT_CODE.USAGE)}const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const{offset,limit}=resolveFilesLookupWindow(options);const indexed=await queryFilesLookupIndex({pmRoot,typeToFolder:typeRegistry.type_to_folder,paths,scope:options.scope,limit,offset,strictRead:options.strictRead===true,noTruncate:options.noTruncate===true,explain:options.explain===true||options.lineRange!==void 0});if(indexed){return{paths,total:indexed.total,count:indexed.matches.length,offset,limit,has_more:offset+indexed.matches.length<indexed.total,truncated:offset+indexed.matches.length<indexed.total,completeness:{status:"unchecked",source:"index"},warnings:[],matches:indexed.matches.map(match=>({item:projectFilesLookupItem(match.item),files:match.files}))}}return queryFilesLookupSource({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,paths,scope:options.scope,limit,offset,strictRead:options.strictRead===true,workspaceRoot,explain:options.explain===true||options.lineRange!==void 0,lineRange:options.lineRange,decisionDepth:options.decisionDepth})}async function runFilesDiscover(id,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);const workspaceRoot=resolveWorkspaceRoot(pmRoot);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located){throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND)}const loaded=await readLocatedItem(located,{schema:settings.schema});const candidates=await discoverReferencedFiles(loaded.document,workspaceRoot,process.cwd());const addableCandidates=candidates.filter(candidate=>candidate.status==="addable");const skippedExisting=candidates.filter(candidate=>candidate.status==="already_linked");const requestedApply=options.apply===true;const note=options.note?.trim()||"discovered from item text";if(!requestedApply||addableCandidates.length===0){const files2=loaded.document.metadata.files??[];return{id:located.id,files:files2,changed:false,apply:requestedApply,count:files2.length,candidate_count:candidates.length,addable_count:addableCandidates.length,added_count:0,skipped_existing_count:skippedExisting.length,candidates,added:[],skipped_existing:skippedExisting}}const author=resolveAuthor(options.author,settings.author_default);const discoveredAdds=addableCandidates.map(candidate=>({path:candidate.path,scope:candidate.scope,note}));let appliedAdds=[];const appliedCandidateIndices=new Set;const result=await mutateItem({pmRoot,settings,id,op:"files_discover",author,message:options.message??"Discover referenced file links",force:options.force,mutate(document){const next=[...document.metadata.files??[]];const existingResolvedKeys=new Set(next.map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));appliedAdds=[];appliedCandidateIndices.clear();for(const[index,add]of discoveredAdds.entries()){const resolvedKey=linkedFileResolvedKey(add,workspaceRoot);if(existingResolvedKeys.has(resolvedKey)){continue}next.push(add);existingResolvedKeys.add(resolvedKey);appliedAdds.push(add);appliedCandidateIndices.add(index)}const deduped=dedupeLinkedArtifacts(next);const normalized=options.appendStable?deduped:sortLinkedArtifacts(deduped);if(normalized.length>0){document.metadata.files=normalized}else{delete document.metadata.files}return{changedFields:appliedAdds.length>0?["files"]:[],warnings:appliedAdds.length!==discoveredAdds.length?[`files_discover_skipped_existing:${discoveredAdds.length-appliedAdds.length}`]:[]}}});const files=result.item.files??[];const addedResolvedKeys=new Set(appliedAdds.map(entry=>linkedFileResolvedKey(entry,workspaceRoot)));const added=files.filter(entry=>addedResolvedKeys.has(linkedFileResolvedKey(entry,workspaceRoot)));const skippedDuringApply=addableCandidates.filter((_candidate,index)=>!appliedCandidateIndices.has(index));const allSkippedExisting=[...skippedExisting,...skippedDuringApply];return{id:result.item.id,files,changed:added.length>0,apply:true,count:files.length,candidate_count:candidates.length,addable_count:addableCandidates.length,added_count:added.length,skipped_existing_count:allSkippedExisting.length,candidates,added,skipped_existing:allSkippedExisting}}export{_testOnly,runFiles,runFilesDiscover,runFilesLookup};
|
|
535
2
|
//# sourceMappingURL=files.js.map
|
|
536
|
-
//# debugId=ed504f2b-8b78-5fca-a4a7-7b0709a65533
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/flag-invocation-contracts
|
|
3
|
-
*
|
|
4
|
-
* Compiles flag vocabulary into a complete machine-readable invocation model.
|
|
5
|
-
*/
|
|
6
1
|
import type { CliFlagContract } from "./cli-contracts.js";
|
|
7
2
|
/** Supported channels through which a flag obtains its value. */
|
|
8
3
|
export type CliFlagInputSource = "argv" | "file" | "stdin";
|