@unbrained/pm-cli 2026.9.6 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +218 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/RELEASING.md +1 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/search-refresh-worker
|
|
3
|
-
*
|
|
4
|
-
* Owns the detached semantic-refresh worker entry used by custom mutation hosts.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8c9a34bd-b77a-55ab-a5d1-3594cecfeb3f")}catch(e){}}();
|
|
8
|
-
import { runSemanticRefreshWorker } from "../core/search/background-refresh.js";
|
|
9
|
-
import { refreshSemanticEmbeddingsForMutatedItems } from "../core/search/cache.js";
|
|
10
|
-
import { resolvePmRoot } from "../core/store/paths.js";
|
|
11
|
-
/** Drain the active workspace's pending semantic-refresh queue. */
|
|
12
|
-
export async function runSearchRefreshWorkerEntrypoint() {
|
|
13
|
-
const pmRoot = resolvePmRoot(process.cwd(), process.env.PM_PATH);
|
|
14
|
-
await runSemanticRefreshWorker(pmRoot, (root, itemIds) => refreshSemanticEmbeddingsForMutatedItems(root, itemIds, {
|
|
15
|
-
apply_runtime_defaults: true,
|
|
16
|
-
}));
|
|
17
|
-
}
|
|
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]="dd1a948a-2fa2-5d2e-a41c-31f75297f17e")}catch(e2){}})();import{runSemanticRefreshWorker}from"../core/search/background-refresh.js";import{refreshSemanticEmbeddingsForMutatedItems}from"../core/search/cache.js";import{resolvePmRoot}from"../core/store/paths.js";async function runSearchRefreshWorkerEntrypoint(){const pmRoot=resolvePmRoot(process.cwd(),process.env.PM_PATH);await runSemanticRefreshWorker(pmRoot,(root,itemIds)=>refreshSemanticEmbeddingsForMutatedItems(root,itemIds,{apply_runtime_defaults:true}))}export{runSearchRefreshWorkerEntrypoint};
|
|
18
2
|
//# sourceMappingURL=search-refresh-worker.js.map
|
|
19
|
-
//# debugId=8c9a34bd-b77a-55ab-a5d1-3594cecfeb3f
|
|
@@ -1,54 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/similarity-scoring
|
|
3
|
-
*
|
|
4
|
-
* Dependency-light deterministic scoring shared by core governance and
|
|
5
|
-
* extension packages without loading tracker query infrastructure.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
!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]="dff9b113-2b29-5154-afbf-f191f2f556a6")}catch(e){}}();
|
|
9
|
-
import { jaccardSimilarity } from "../core/shared/text-normalization.js";
|
|
10
|
-
export { jaccardSimilarity } from "../core/shared/text-normalization.js";
|
|
11
|
-
const ISSUE_CODE_PATTERN = /\b[a-z][a-z0-9]*-\d+(?:-[a-z0-9]+)*\b/giu;
|
|
12
|
-
/** Normalize title text for exact comparisons and tokenization. */
|
|
13
|
-
export function normalizeSimilarityText(value) {
|
|
14
|
-
return value.trim().toLowerCase().replace(/\s+/g, " ");
|
|
15
|
-
}
|
|
16
|
-
/** Split normalized text into unique Unicode letter/number tokens. */
|
|
17
|
-
export function tokenizeSimilarityText(value) {
|
|
18
|
-
return [
|
|
19
|
-
...new Set(normalizeSimilarityText(value).match(/[\p{L}\p{N}]+/gu) ?? []),
|
|
20
|
-
];
|
|
21
|
-
}
|
|
22
|
-
/** Precompute every deterministic title signal exactly once for repeated comparisons. */
|
|
23
|
-
export function prepareSimilarityText(value) {
|
|
24
|
-
const normalized = normalizeSimilarityText(value);
|
|
25
|
-
return {
|
|
26
|
-
normalized,
|
|
27
|
-
tokens: tokenizeSimilarityText(normalized),
|
|
28
|
-
issueCodes: [
|
|
29
|
-
...new Set(normalized
|
|
30
|
-
.match(ISSUE_CODE_PATTERN)
|
|
31
|
-
?.map((code) => code.toLowerCase()) ?? []),
|
|
32
|
-
],
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/** Score two titles through the canonical exact, issue-code, and token signals. */
|
|
36
|
-
export function scoreItemSimilarity(leftTitle, rightTitle) {
|
|
37
|
-
return scorePreparedItemSimilarity(prepareSimilarityText(leftTitle), prepareSimilarityText(rightTitle));
|
|
38
|
-
}
|
|
39
|
-
/** Score two precomputed title representations without repeating normalization or tokenization. */
|
|
40
|
-
export function scorePreparedItemSimilarity(left, right) {
|
|
41
|
-
if (left.normalized === right.normalized) {
|
|
42
|
-
return { score: 1, reason: "exact_title" };
|
|
43
|
-
}
|
|
44
|
-
const leftCodes = new Set(left.issueCodes);
|
|
45
|
-
if (right.issueCodes.some((code) => leftCodes.has(code))) {
|
|
46
|
-
return { score: 0.99, reason: "issue_code" };
|
|
47
|
-
}
|
|
48
|
-
return {
|
|
49
|
-
score: jaccardSimilarity(left.tokens, right.tokens),
|
|
50
|
-
reason: "title_token_jaccard",
|
|
51
|
-
};
|
|
52
|
-
}
|
|
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]="54784ad1-36bd-5a10-aa00-ad0b09e935a7")}catch(e2){}})();import{jaccardSimilarity}from"../core/shared/text-normalization.js";import{jaccardSimilarity as jaccardSimilarity2}from"../core/shared/text-normalization.js";const ISSUE_CODE_PATTERN=/\b[a-z][a-z0-9]*-\d+(?:-[a-z0-9]+)*\b/giu;function normalizeSimilarityText(value){return value.trim().toLowerCase().replace(/\s+/g," ")}function tokenizeSimilarityText(value){return[...new Set(normalizeSimilarityText(value).match(/[\p{L}\p{N}]+/gu)??[])]}function prepareSimilarityText(value){const normalized=normalizeSimilarityText(value);return{normalized,tokens:tokenizeSimilarityText(normalized),issueCodes:[...new Set(normalized.match(ISSUE_CODE_PATTERN)?.map(code=>code.toLowerCase())??[])]}}function scoreItemSimilarity(leftTitle,rightTitle){return scorePreparedItemSimilarity(prepareSimilarityText(leftTitle),prepareSimilarityText(rightTitle))}function scorePreparedItemSimilarity(left,right){if(left.normalized===right.normalized){return{score:1,reason:"exact_title"}}const leftCodes=new Set(left.issueCodes);if(right.issueCodes.some(code=>leftCodes.has(code))){return{score:.99,reason:"issue_code"}}return{score:jaccardSimilarity(left.tokens,right.tokens),reason:"title_token_jaccard"}}export{jaccardSimilarity2 as jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText,scoreItemSimilarity,scorePreparedItemSimilarity,tokenizeSimilarityText};
|
|
53
2
|
//# sourceMappingURL=similarity-scoring.js.map
|
|
54
|
-
//# debugId=dff9b113-2b29-5154-afbf-f191f2f556a6
|
package/dist/sdk/similarity.js
CHANGED
|
@@ -1,327 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/similarity
|
|
3
|
-
*
|
|
4
|
-
* Provides one bounded, reusable similarity contract for create-time
|
|
5
|
-
* governance and package-owned duplicate analysis.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
!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]="9baf5711-9796-57e8-99e5-8990fd481ef8")}catch(e){}}();
|
|
9
|
-
import { EXIT_CODE } from "../core/shared/constants.js";
|
|
10
|
-
import { PmCliError } from "../core/shared/errors.js";
|
|
11
|
-
import { resolveItemTypeRegistry } from "../core/item/type-registry.js";
|
|
12
|
-
import { isTerminalStatus, normalizeStatusInput } from "../core/item/status.js";
|
|
13
|
-
import { resolveRuntimeStatusRegistry } from "../core/schema/runtime-schema.js";
|
|
14
|
-
import { listAllItemMetadataLight } from "../core/store/item-store.js";
|
|
15
|
-
import { resolvePmRoot } from "../core/store/paths.js";
|
|
16
|
-
import { readSettings } from "../core/store/settings.js";
|
|
17
|
-
import { readItemMetadataDerivedIndexState } from "../core/store/item-metadata-cache.js";
|
|
18
|
-
import { querySimilarItemMetadataIndex } from "../core/store/item-metadata-query-index.js";
|
|
19
|
-
import { collectDuplicateCandidatePairs, MAX_DUPLICATE_CANDIDATE_PAIRS } from "./query/duplicate-candidates.js";
|
|
20
|
-
import { prepareSimilarityText, scoreItemSimilarity, scorePreparedItemSimilarity, tokenizeSimilarityText, } from "./similarity-scoring.js";
|
|
21
|
-
export { jaccardSimilarity, normalizeSimilarityText, prepareSimilarityText, scoreItemSimilarity, scorePreparedItemSimilarity, tokenizeSimilarityText, } from "./similarity-scoring.js";
|
|
22
|
-
const DEFAULT_SIMILARITY_LIMIT = 3;
|
|
23
|
-
const MAX_SIMILARITY_LIMIT = 20;
|
|
24
|
-
const DEFAULT_SIMILARITY_THRESHOLD = 0.8;
|
|
25
|
-
const DEFAULT_DUPLICATE_CLUSTER_LIMIT = 100;
|
|
26
|
-
const MAX_DUPLICATE_CLUSTER_LIMIT = 1_000;
|
|
27
|
-
/** Render compact warning tokens shared by create and copy results. */
|
|
28
|
-
export function similarityAdvisoryWarnings(advisory) {
|
|
29
|
-
return advisory === undefined
|
|
30
|
-
? []
|
|
31
|
-
: [
|
|
32
|
-
`likely_duplicates:${advisory.result.items
|
|
33
|
-
.map((item) => item.id)
|
|
34
|
-
.join(",")}`,
|
|
35
|
-
`likely_duplicate_recovery:${advisory.recovery.action}:${advisory.recovery.item_id}`,
|
|
36
|
-
];
|
|
37
|
-
}
|
|
38
|
-
async function resolveSimilarityRecovery(result, options) {
|
|
39
|
-
const strongest = result.items[0];
|
|
40
|
-
const pmRoot = resolvePmRoot(options.cwd ?? process.cwd(), options.pmRoot);
|
|
41
|
-
const statusRegistry = resolveRuntimeStatusRegistry((await readSettings(pmRoot)).schema);
|
|
42
|
-
if (isTerminalStatus(strongest.status, statusRegistry)) {
|
|
43
|
-
return {
|
|
44
|
-
action: "reopen",
|
|
45
|
-
item_id: strongest.id,
|
|
46
|
-
command: `pm item reopen ${strongest.id} "<recurrence reason>"`,
|
|
47
|
-
args: ["item", "reopen", strongest.id, "<recurrence reason>"],
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
action: "reuse",
|
|
52
|
-
item_id: strongest.id,
|
|
53
|
-
command: `pm get ${strongest.id} --full`,
|
|
54
|
-
args: ["get", strongest.id, "--full"],
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function validateSimilarityOptions(options) {
|
|
58
|
-
const limit = options.limit ?? DEFAULT_SIMILARITY_LIMIT;
|
|
59
|
-
const threshold = options.threshold ?? DEFAULT_SIMILARITY_THRESHOLD;
|
|
60
|
-
if (!Number.isSafeInteger(limit) ||
|
|
61
|
-
limit < 0 ||
|
|
62
|
-
limit > MAX_SIMILARITY_LIMIT) {
|
|
63
|
-
throw new PmCliError(`Similarity limit must be an integer from 0 to ${MAX_SIMILARITY_LIMIT}.`, EXIT_CODE.USAGE);
|
|
64
|
-
}
|
|
65
|
-
if (!Number.isFinite(threshold) || threshold < 0 || threshold > 1) {
|
|
66
|
-
throw new PmCliError("Similarity threshold must be a number from 0 to 1.", EXIT_CODE.USAGE);
|
|
67
|
-
}
|
|
68
|
-
return { limit, threshold };
|
|
69
|
-
}
|
|
70
|
-
function validateDuplicateClusterOptions(options) {
|
|
71
|
-
const limit = options.limit ?? DEFAULT_DUPLICATE_CLUSTER_LIMIT;
|
|
72
|
-
if (!Number.isSafeInteger(limit) ||
|
|
73
|
-
limit < 0 ||
|
|
74
|
-
limit > MAX_DUPLICATE_CLUSTER_LIMIT) {
|
|
75
|
-
throw new PmCliError(`Duplicate cluster limit must be an integer from 0 to ${MAX_DUPLICATE_CLUSTER_LIMIT}.`, EXIT_CODE.USAGE);
|
|
76
|
-
}
|
|
77
|
-
const since = options.since === undefined ? undefined : new Date(options.since);
|
|
78
|
-
if (since && Number.isNaN(since.getTime())) {
|
|
79
|
-
throw new PmCliError("Duplicate cluster --since must be a valid ISO timestamp.", EXIT_CODE.USAGE);
|
|
80
|
-
}
|
|
81
|
-
return { limit, since };
|
|
82
|
-
}
|
|
83
|
-
/** Resolve registered statuses and load the metadata population before applying status and creation-time filters. */
|
|
84
|
-
async function loadDuplicateItems(options, since) {
|
|
85
|
-
const pmRoot = resolvePmRoot(options.cwd ?? process.cwd(), options.pmRoot);
|
|
86
|
-
const settings = await readSettings(pmRoot);
|
|
87
|
-
const typeRegistry = resolveItemTypeRegistry(settings);
|
|
88
|
-
const requestedStatuses = options.statuses
|
|
89
|
-
?.map((status) => status.trim().toLowerCase())
|
|
90
|
-
.filter(Boolean);
|
|
91
|
-
if (options.statuses !== undefined && requestedStatuses?.length === 0) {
|
|
92
|
-
throw new PmCliError("Duplicate cluster statuses must include at least one lifecycle status or all.", EXIT_CODE.USAGE);
|
|
93
|
-
}
|
|
94
|
-
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
95
|
-
const normalizedStatuses = requestedStatuses?.map((status) => {
|
|
96
|
-
if (status === "all")
|
|
97
|
-
return status;
|
|
98
|
-
const normalized = normalizeStatusInput(status, statusRegistry);
|
|
99
|
-
if (!normalized) {
|
|
100
|
-
throw new PmCliError(`Unknown duplicate-cluster status "${status}". Allowed: all, ${statusRegistry.definitions.map((entry) => entry.id).join(", ")}.`, EXIT_CODE.USAGE);
|
|
101
|
-
}
|
|
102
|
-
return normalized;
|
|
103
|
-
});
|
|
104
|
-
const hasAll = normalizedStatuses?.includes("all") === true;
|
|
105
|
-
if (hasAll && normalizedStatuses?.some((status) => status !== "all")) {
|
|
106
|
-
throw new PmCliError('The "all" status cannot be combined with other statuses.', EXIT_CODE.USAGE);
|
|
107
|
-
}
|
|
108
|
-
const effectiveStatuses = hasAll ? undefined : normalizedStatuses;
|
|
109
|
-
const allowedStatuses = effectiveStatuses
|
|
110
|
-
? new Set(effectiveStatuses)
|
|
111
|
-
: undefined;
|
|
112
|
-
return {
|
|
113
|
-
items: (await listAllItemMetadataLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema))
|
|
114
|
-
.filter((item) => (!allowedStatuses || allowedStatuses.has(item.status)) &&
|
|
115
|
-
(!since || new Date(item.created_at).getTime() >= since.getTime())),
|
|
116
|
-
statuses: effectiveStatuses,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
/** Internal deterministic seams used to prove bounded batch behavior without building a million-pair fixture. */
|
|
120
|
-
export const _testOnlySimilarity = {
|
|
121
|
-
buildDuplicateClusters,
|
|
122
|
-
collectDuplicateCandidatePairs,
|
|
123
|
-
createDuplicateUnionFind,
|
|
124
|
-
};
|
|
125
|
-
function createDuplicateUnionFind(size) {
|
|
126
|
-
const parent = Array.from({ length: size }, (_entry, index) => index);
|
|
127
|
-
const findRoot = (index) => {
|
|
128
|
-
let root = index;
|
|
129
|
-
while (parent[root] !== root)
|
|
130
|
-
root = parent[root];
|
|
131
|
-
while (parent[index] !== index) {
|
|
132
|
-
const next = parent[index];
|
|
133
|
-
parent[index] = root;
|
|
134
|
-
index = next;
|
|
135
|
-
}
|
|
136
|
-
return root;
|
|
137
|
-
};
|
|
138
|
-
return { parent, findRoot };
|
|
139
|
-
}
|
|
140
|
-
function scoreDuplicateCandidates(items, candidates, threshold, union) {
|
|
141
|
-
const matches = [];
|
|
142
|
-
for (const candidate of candidates) {
|
|
143
|
-
const [leftIndex, rightIndex] = candidate
|
|
144
|
-
.split(":")
|
|
145
|
-
.map((value) => Number.parseInt(value, 10));
|
|
146
|
-
const scored = scorePreparedItemSimilarity(items[leftIndex].prepared, items[rightIndex].prepared);
|
|
147
|
-
if (scored.score < threshold)
|
|
148
|
-
continue;
|
|
149
|
-
const leftRoot = union.findRoot(leftIndex);
|
|
150
|
-
const rightRoot = union.findRoot(rightIndex);
|
|
151
|
-
if (leftRoot !== rightRoot)
|
|
152
|
-
union.parent[rightRoot] = leftRoot;
|
|
153
|
-
matches.push({
|
|
154
|
-
left_id: items[leftIndex].item.id,
|
|
155
|
-
right_id: items[rightIndex].item.id,
|
|
156
|
-
...scored,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
return matches;
|
|
160
|
-
}
|
|
161
|
-
/** Group unioned endpoints and their scored evidence once, then deterministically rank and limit complete components. */
|
|
162
|
-
function buildDuplicateClusters(items, matches, union, limit) {
|
|
163
|
-
const components = new Map();
|
|
164
|
-
for (const index of items.keys()) {
|
|
165
|
-
const root = union.findRoot(index);
|
|
166
|
-
const component = components.get(root) ?? [];
|
|
167
|
-
component.push(index);
|
|
168
|
-
components.set(root, component);
|
|
169
|
-
}
|
|
170
|
-
const rootsById = new Map(items.map(({ item }, index) => [item.id, union.findRoot(index)]));
|
|
171
|
-
const matchesByRoot = new Map();
|
|
172
|
-
for (const match of matches) {
|
|
173
|
-
// Scored matches have already joined both endpoints in the union above.
|
|
174
|
-
const root = rootsById.get(match.left_id);
|
|
175
|
-
const rows = matchesByRoot.get(root) ?? [];
|
|
176
|
-
rows.push(match);
|
|
177
|
-
matchesByRoot.set(root, rows);
|
|
178
|
-
}
|
|
179
|
-
return [...components.values()]
|
|
180
|
-
.filter((component) => component.length > 1)
|
|
181
|
-
.map((component) => {
|
|
182
|
-
const clusterMatches = (matchesByRoot.get(union.findRoot(component[0])) ?? [])
|
|
183
|
-
.sort((left, right) => right.score - left.score ||
|
|
184
|
-
left.left_id.localeCompare(right.left_id) ||
|
|
185
|
-
left.right_id.localeCompare(right.right_id));
|
|
186
|
-
return {
|
|
187
|
-
id: items[component[0]].item.id,
|
|
188
|
-
items: component.map((itemIndex) => {
|
|
189
|
-
const item = items[itemIndex].item;
|
|
190
|
-
return {
|
|
191
|
-
id: item.id,
|
|
192
|
-
title: item.title,
|
|
193
|
-
status: item.status,
|
|
194
|
-
type: item.type,
|
|
195
|
-
};
|
|
196
|
-
}),
|
|
197
|
-
matches: clusterMatches,
|
|
198
|
-
max_score: clusterMatches[0]?.score ?? 0,
|
|
199
|
-
};
|
|
200
|
-
})
|
|
201
|
-
.sort((left, right) => right.max_score - left.max_score || left.id.localeCompare(right.id))
|
|
202
|
-
.slice(0, limit);
|
|
203
|
-
}
|
|
204
|
-
function rankSimilarItems(title, candidates, excludedIds, threshold, limit) {
|
|
205
|
-
return candidates
|
|
206
|
-
.filter((item) => !excludedIds.has(item.id))
|
|
207
|
-
.map((item) => ({
|
|
208
|
-
id: item.id,
|
|
209
|
-
title: item.title,
|
|
210
|
-
status: item.status,
|
|
211
|
-
type: item.type,
|
|
212
|
-
...scoreItemSimilarity(title, item.title),
|
|
213
|
-
}))
|
|
214
|
-
.filter((item) => item.score >= threshold)
|
|
215
|
-
.sort((left, right) => right.score - left.score || left.id.localeCompare(right.id))
|
|
216
|
-
.slice(0, limit);
|
|
217
|
-
}
|
|
218
|
-
/** Find likely existing duplicates through an index-first bounded read. */
|
|
219
|
-
export async function findSimilarItems(candidate, options = {}) {
|
|
220
|
-
const title = candidate.title.trim();
|
|
221
|
-
if (title.length === 0) {
|
|
222
|
-
throw new PmCliError("Similarity candidate title must not be empty.", EXIT_CODE.USAGE);
|
|
223
|
-
}
|
|
224
|
-
const { limit, threshold } = validateSimilarityOptions(options);
|
|
225
|
-
const pmRoot = resolvePmRoot(options.cwd ?? process.cwd(), options.pmRoot);
|
|
226
|
-
const settings = await readSettings(pmRoot);
|
|
227
|
-
const typeRegistry = resolveItemTypeRegistry(settings);
|
|
228
|
-
const indexState = await readItemMetadataDerivedIndexState(pmRoot, Object.values(typeRegistry.type_to_folder));
|
|
229
|
-
const tokens = tokenizeSimilarityText(title);
|
|
230
|
-
const indexed = indexState && tokens.length > 0
|
|
231
|
-
? await querySimilarItemMetadataIndex({
|
|
232
|
-
pmRoot,
|
|
233
|
-
expectedSourceCursor: indexState.source_cursor,
|
|
234
|
-
query: tokens
|
|
235
|
-
.map((token) => `"${token.replaceAll('"', '""')}"`)
|
|
236
|
-
.join(" OR "),
|
|
237
|
-
limit: Math.max(limit * 10, 50),
|
|
238
|
-
})
|
|
239
|
-
: null;
|
|
240
|
-
const candidates = indexed === null
|
|
241
|
-
? await listAllItemMetadataLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema)
|
|
242
|
-
: indexed.items;
|
|
243
|
-
const items = rankSimilarItems(title, candidates, new Set(candidate.excludeIds ?? []), threshold, limit);
|
|
244
|
-
return {
|
|
245
|
-
items,
|
|
246
|
-
count: items.length,
|
|
247
|
-
threshold,
|
|
248
|
-
source: indexed ? "persistent_index" : "metadata_fallback",
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Cluster caller-owned metadata using the same scorer and safety bounds as the CLI.
|
|
253
|
-
* Candidate filtering is lossless; exhaustive mode provides an independent pair
|
|
254
|
-
* population for recall checks. Inputs are copied, sorted and never mutated.
|
|
255
|
-
*/
|
|
256
|
-
export function analyzeDuplicateItems(input, options = {}) {
|
|
257
|
-
const { threshold } = validateSimilarityOptions({ ...options, limit: undefined });
|
|
258
|
-
const { limit } = validateDuplicateClusterOptions(options);
|
|
259
|
-
const ids = new Set();
|
|
260
|
-
for (const item of input) {
|
|
261
|
-
if (!item.id.trim() || ids.has(item.id)) {
|
|
262
|
-
throw new PmCliError("Duplicate analysis requires unique non-empty item ids.", EXIT_CODE.USAGE);
|
|
263
|
-
}
|
|
264
|
-
ids.add(item.id);
|
|
265
|
-
}
|
|
266
|
-
const items = [...input].sort((left, right) => left.id.localeCompare(right.id))
|
|
267
|
-
.map((item) => ({ item, prepared: prepareSimilarityText(item.title) }));
|
|
268
|
-
const candidates = collectDuplicateCandidatePairs(items, MAX_DUPLICATE_CANDIDATE_PAIRS, threshold, options.exhaustive === true);
|
|
269
|
-
const union = createDuplicateUnionFind(items.length);
|
|
270
|
-
const matches = scoreDuplicateCandidates(items, candidates, threshold, union);
|
|
271
|
-
const clusters = buildDuplicateClusters(items, matches, union, limit);
|
|
272
|
-
return {
|
|
273
|
-
clusters,
|
|
274
|
-
count: clusters.length,
|
|
275
|
-
threshold,
|
|
276
|
-
cost: {
|
|
277
|
-
item_count: items.length,
|
|
278
|
-
algorithm: options.exhaustive === true || threshold === 0 ? "exhaustive" : "prefix_exact",
|
|
279
|
-
possible_pairs: items.length * (items.length - 1) / 2,
|
|
280
|
-
pair_limit: MAX_DUPLICATE_CANDIDATE_PAIRS,
|
|
281
|
-
recall_guarantee: "exact",
|
|
282
|
-
candidate_pairs: candidates.size,
|
|
283
|
-
scored_pairs: candidates.size,
|
|
284
|
-
},
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
/** Find connected duplicate clusters with one metadata read and shared package analysis. */
|
|
288
|
-
export async function findDuplicateClusters(options = {}) {
|
|
289
|
-
validateSimilarityOptions({ ...options, limit: undefined });
|
|
290
|
-
const { since } = validateDuplicateClusterOptions(options);
|
|
291
|
-
const { items, statuses } = await loadDuplicateItems(options, since);
|
|
292
|
-
return {
|
|
293
|
-
...analyzeDuplicateItems(items, options),
|
|
294
|
-
source: "metadata_scan",
|
|
295
|
-
filters: { statuses: statuses ?? null, since: options.since ?? null },
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
/** Apply off/advisory/strict mutation governance through the shared query. */
|
|
299
|
-
export async function evaluateSimilarityGovernance(candidate, options) {
|
|
300
|
-
if (options.mode === "off")
|
|
301
|
-
return undefined;
|
|
302
|
-
const result = await findSimilarItems(candidate, options);
|
|
303
|
-
if (result.count === 0)
|
|
304
|
-
return undefined;
|
|
305
|
-
const recovery = await resolveSimilarityRecovery(result, options);
|
|
306
|
-
const bypassed = options.mode === "strict" && options.allowDuplicate === true;
|
|
307
|
-
if (options.mode === "strict" && !bypassed) {
|
|
308
|
-
const candidates = result.items
|
|
309
|
-
.map((item) => `${item.id} (${item.status}): ${item.title}`)
|
|
310
|
-
.join("; ");
|
|
311
|
-
const recoveryInstruction = recovery.action === "reopen"
|
|
312
|
-
? "Reopen the canonical item"
|
|
313
|
-
: "Reuse the canonical item";
|
|
314
|
-
throw new PmCliError(`Likely duplicate item(s) found: ${candidates}. ${recoveryInstruction} or pass --allow-duplicate with explicit intent.`, EXIT_CODE.CONFLICT, {
|
|
315
|
-
code: "likely_duplicate",
|
|
316
|
-
required: `${recoveryInstruction}, or explicitly acknowledge the duplicate with --allow-duplicate.`,
|
|
317
|
-
recovery: {
|
|
318
|
-
suggested_flags: ["--allow-duplicate"],
|
|
319
|
-
suggested_retry: recovery.command,
|
|
320
|
-
suggested_retry_args: recovery.args,
|
|
321
|
-
},
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
return { mode: options.mode, bypassed, result, recovery };
|
|
325
|
-
}
|
|
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]="8d07624c-8663-5aba-8018-1b2c47997bef")}catch(e2){}})();import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isTerminalStatus,normalizeStatusInput}from"../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{listAllItemMetadataLight}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{querySimilarItemMetadataIndex}from"../core/store/item-metadata-query-index.js";import{collectDuplicateCandidatePairs,MAX_DUPLICATE_CANDIDATE_PAIRS}from"./query/duplicate-candidates.js";import{prepareSimilarityText,scoreItemSimilarity,scorePreparedItemSimilarity,tokenizeSimilarityText}from"./similarity-scoring.js";import{jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText as prepareSimilarityText2,scoreItemSimilarity as scoreItemSimilarity2,scorePreparedItemSimilarity as scorePreparedItemSimilarity2,tokenizeSimilarityText as tokenizeSimilarityText2}from"./similarity-scoring.js";const DEFAULT_SIMILARITY_LIMIT=3;const MAX_SIMILARITY_LIMIT=20;const DEFAULT_SIMILARITY_THRESHOLD=.8;const DEFAULT_DUPLICATE_CLUSTER_LIMIT=100;const MAX_DUPLICATE_CLUSTER_LIMIT=1e3;function similarityAdvisoryWarnings(advisory){return advisory===void 0?[]:[`likely_duplicates:${advisory.result.items.map(item=>item.id).join(",")}`,`likely_duplicate_recovery:${advisory.recovery.action}:${advisory.recovery.item_id}`]}async function resolveSimilarityRecovery(result,options){const strongest=result.items[0];const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);const statusRegistry=resolveRuntimeStatusRegistry((await readSettings(pmRoot)).schema);if(isTerminalStatus(strongest.status,statusRegistry)){return{action:"reopen",item_id:strongest.id,command:`pm item reopen ${strongest.id} "<recurrence reason>"`,args:["item","reopen",strongest.id,"<recurrence reason>"]}}return{action:"reuse",item_id:strongest.id,command:`pm get ${strongest.id} --full`,args:["get",strongest.id,"--full"]}}function validateSimilarityOptions(options){const limit=options.limit??DEFAULT_SIMILARITY_LIMIT;const threshold=options.threshold??DEFAULT_SIMILARITY_THRESHOLD;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_SIMILARITY_LIMIT){throw new PmCliError(`Similarity limit must be an integer from 0 to ${MAX_SIMILARITY_LIMIT}.`,EXIT_CODE.USAGE)}if(!Number.isFinite(threshold)||threshold<0||threshold>1){throw new PmCliError("Similarity threshold must be a number from 0 to 1.",EXIT_CODE.USAGE)}return{limit,threshold}}function validateDuplicateClusterOptions(options){const limit=options.limit??DEFAULT_DUPLICATE_CLUSTER_LIMIT;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_DUPLICATE_CLUSTER_LIMIT){throw new PmCliError(`Duplicate cluster limit must be an integer from 0 to ${MAX_DUPLICATE_CLUSTER_LIMIT}.`,EXIT_CODE.USAGE)}const since=options.since===void 0?void 0:new Date(options.since);if(since&&Number.isNaN(since.getTime())){throw new PmCliError("Duplicate cluster --since must be a valid ISO timestamp.",EXIT_CODE.USAGE)}return{limit,since}}async function loadDuplicateItems(options,since){const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings);const requestedStatuses=options.statuses?.map(status=>status.trim().toLowerCase()).filter(Boolean);if(options.statuses!==void 0&&requestedStatuses?.length===0){throw new PmCliError("Duplicate cluster statuses must include at least one lifecycle status or all.",EXIT_CODE.USAGE)}const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const normalizedStatuses=requestedStatuses?.map(status=>{if(status==="all")return status;const normalized=normalizeStatusInput(status,statusRegistry);if(!normalized){throw new PmCliError(`Unknown duplicate-cluster status "${status}". Allowed: all, ${statusRegistry.definitions.map(entry=>entry.id).join(", ")}.`,EXIT_CODE.USAGE)}return normalized});const hasAll=normalizedStatuses?.includes("all")===true;if(hasAll&&normalizedStatuses?.some(status=>status!=="all")){throw new PmCliError('The "all" status cannot be combined with other statuses.',EXIT_CODE.USAGE)}const effectiveStatuses=hasAll?void 0:normalizedStatuses;const allowedStatuses=effectiveStatuses?new Set(effectiveStatuses):void 0;return{items:(await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema)).filter(item=>(!allowedStatuses||allowedStatuses.has(item.status))&&(!since||new Date(item.created_at).getTime()>=since.getTime())),statuses:effectiveStatuses}}const _testOnlySimilarity={buildDuplicateClusters,collectDuplicateCandidatePairs,createDuplicateUnionFind};function createDuplicateUnionFind(size){const parent=Array.from({length:size},(_entry,index)=>index);const findRoot=index=>{let root=index;while(parent[root]!==root)root=parent[root];while(parent[index]!==index){const next=parent[index];parent[index]=root;index=next}return root};return{parent,findRoot}}function scoreDuplicateCandidates(items,candidates,threshold,union){const matches=[];for(const candidate of candidates){const[leftIndex,rightIndex]=candidate.split(":").map(value=>Number.parseInt(value,10));const scored=scorePreparedItemSimilarity(items[leftIndex].prepared,items[rightIndex].prepared);if(scored.score<threshold)continue;const leftRoot=union.findRoot(leftIndex);const rightRoot=union.findRoot(rightIndex);if(leftRoot!==rightRoot)union.parent[rightRoot]=leftRoot;matches.push({left_id:items[leftIndex].item.id,right_id:items[rightIndex].item.id,...scored})}return matches}function buildDuplicateClusters(items,matches,union,limit){const components=new Map;for(const index of items.keys()){const root=union.findRoot(index);const component=components.get(root)??[];component.push(index);components.set(root,component)}const rootsById=new Map(items.map(({item},index)=>[item.id,union.findRoot(index)]));const matchesByRoot=new Map;for(const match of matches){const root=rootsById.get(match.left_id);const rows=matchesByRoot.get(root)??[];rows.push(match);matchesByRoot.set(root,rows)}return[...components.values()].filter(component=>component.length>1).map(component=>{const clusterMatches=(matchesByRoot.get(union.findRoot(component[0]))??[]).sort((left,right)=>right.score-left.score||left.left_id.localeCompare(right.left_id)||left.right_id.localeCompare(right.right_id));return{id:items[component[0]].item.id,items:component.map(itemIndex=>{const item=items[itemIndex].item;return{id:item.id,title:item.title,status:item.status,type:item.type}}),matches:clusterMatches,max_score:clusterMatches[0]?.score??0}}).sort((left,right)=>right.max_score-left.max_score||left.id.localeCompare(right.id)).slice(0,limit)}function rankSimilarItems(title,candidates,excludedIds,threshold,limit){return candidates.filter(item=>!excludedIds.has(item.id)).map(item=>({id:item.id,title:item.title,status:item.status,type:item.type,...scoreItemSimilarity(title,item.title)})).filter(item=>item.score>=threshold).sort((left,right)=>right.score-left.score||left.id.localeCompare(right.id)).slice(0,limit)}async function findSimilarItems(candidate,options={}){const title=candidate.title.trim();if(title.length===0){throw new PmCliError("Similarity candidate title must not be empty.",EXIT_CODE.USAGE)}const{limit,threshold}=validateSimilarityOptions(options);const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings);const indexState=await readItemMetadataDerivedIndexState(pmRoot,Object.values(typeRegistry.type_to_folder));const tokens=tokenizeSimilarityText(title);const indexed=indexState&&tokens.length>0?await querySimilarItemMetadataIndex({pmRoot,expectedSourceCursor:indexState.source_cursor,query:tokens.map(token=>`"${token.replaceAll('"','""')}"`).join(" OR "),limit:Math.max(limit*10,50)}):null;const candidates=indexed===null?await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema):indexed.items;const items=rankSimilarItems(title,candidates,new Set(candidate.excludeIds??[]),threshold,limit);return{items,count:items.length,threshold,source:indexed?"persistent_index":"metadata_fallback"}}function analyzeDuplicateItems(input,options={}){const{threshold}=validateSimilarityOptions({...options,limit:void 0});const{limit}=validateDuplicateClusterOptions(options);const ids=new Set;for(const item of input){if(!item.id.trim()||ids.has(item.id)){throw new PmCliError("Duplicate analysis requires unique non-empty item ids.",EXIT_CODE.USAGE)}ids.add(item.id)}const items=[...input].sort((left,right)=>left.id.localeCompare(right.id)).map(item=>({item,prepared:prepareSimilarityText(item.title)}));const candidates=collectDuplicateCandidatePairs(items,MAX_DUPLICATE_CANDIDATE_PAIRS,threshold,options.exhaustive===true);const union=createDuplicateUnionFind(items.length);const matches=scoreDuplicateCandidates(items,candidates,threshold,union);const clusters=buildDuplicateClusters(items,matches,union,limit);return{clusters,count:clusters.length,threshold,cost:{item_count:items.length,algorithm:options.exhaustive===true||threshold===0?"exhaustive":"prefix_exact",possible_pairs:items.length*(items.length-1)/2,pair_limit:MAX_DUPLICATE_CANDIDATE_PAIRS,recall_guarantee:"exact",candidate_pairs:candidates.size,scored_pairs:candidates.size}}}async function findDuplicateClusters(options={}){validateSimilarityOptions({...options,limit:void 0});const{since}=validateDuplicateClusterOptions(options);const{items,statuses}=await loadDuplicateItems(options,since);return{...analyzeDuplicateItems(items,options),source:"metadata_scan",filters:{statuses:statuses??null,since:options.since??null}}}async function evaluateSimilarityGovernance(candidate,options){if(options.mode==="off")return void 0;const result=await findSimilarItems(candidate,options);if(result.count===0)return void 0;const recovery=await resolveSimilarityRecovery(result,options);const bypassed=options.mode==="strict"&&options.allowDuplicate===true;if(options.mode==="strict"&&!bypassed){const candidates=result.items.map(item=>`${item.id} (${item.status}): ${item.title}`).join("; ");const recoveryInstruction=recovery.action==="reopen"?"Reopen the canonical item":"Reuse the canonical item";throw new PmCliError(`Likely duplicate item(s) found: ${candidates}. ${recoveryInstruction} or pass --allow-duplicate with explicit intent.`,EXIT_CODE.CONFLICT,{code:"likely_duplicate",required:`${recoveryInstruction}, or explicitly acknowledge the duplicate with --allow-duplicate.`,recovery:{suggested_flags:["--allow-duplicate"],suggested_retry:recovery.command,suggested_retry_args:recovery.args}})}return{mode:options.mode,bypassed,result,recovery}}export{_testOnlySimilarity,analyzeDuplicateItems,evaluateSimilarityGovernance,findDuplicateClusters,findSimilarItems,jaccardSimilarity,normalizeSimilarityText,prepareSimilarityText2 as prepareSimilarityText,scoreItemSimilarity2 as scoreItemSimilarity,scorePreparedItemSimilarity2 as scorePreparedItemSimilarity,similarityAdvisoryWarnings,tokenizeSimilarityText2 as tokenizeSimilarityText};
|
|
326
2
|
//# sourceMappingURL=similarity.js.map
|
|
327
|
-
//# debugId=9baf5711-9796-57e8-99e5-8990fd481ef8
|
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/start-task-status
|
|
3
|
-
*
|
|
4
|
-
* Resolves lifecycle alias status transitions shared by CLI registration and the SDK runtime.
|
|
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]="d1930c5a-6849-5f78-8090-a436f61711ae")}catch(e){}}();
|
|
8
|
-
import { normalizeStatusInputWithRegistry, } from "../core/schema/runtime-schema.js";
|
|
9
|
-
/** Resolve the status the `start-task` lifecycle alias should move an item to. Resolves `in_progress` strictly through the workspace registry so a custom workflow that omits in_progress falls back to its open status instead of setting a status the workflow does not define. */
|
|
10
|
-
export function resolveStartTaskInProgressStatus(statusRegistry) {
|
|
11
|
-
return (normalizeStatusInputWithRegistry("in_progress", statusRegistry) ??
|
|
12
|
-
statusRegistry.open_status);
|
|
13
|
-
}
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="961c1918-75f9-5e5d-bbae-b333ca29534f")}catch(e2){}})();import{normalizeStatusInputWithRegistry}from"../core/schema/runtime-schema.js";function resolveStartTaskInProgressStatus(statusRegistry){return normalizeStatusInputWithRegistry("in_progress",statusRegistry)??statusRegistry.open_status}export{resolveStartTaskInProgressStatus};
|
|
14
2
|
//# sourceMappingURL=start-task-status.js.map
|
|
15
|
-
//# debugId=d1930c5a-6849-5f78-8090-a436f61711ae
|